<?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>JQueryTools</name>
	<version>1.4.0.3</version>
    <mincmsversion>2.1.5</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgaXMgdGhpcz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhZGRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuanF1ZXJ5LmNvbSI+alF1ZXJ5PC9hPiBhbmQgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdG8gQ01TIE1hZGUgU2ltcGxlIHBhZ2UsIGFuZCBtb2R1bGVzIChldmVuIGluIHRoZSBhZG1pbiBzZWN0aW9uKSwgY29udmVuaWVudGx5IGFuZCBlYXNpbHkuICBJdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgYW5kIHNpbXBsZSB3YXkgdG8gaW5jbHVkZSBqcXVlcnkgYW5kIGpxdWVyeSBkZXBlbmRlbnQgbGlicmFyaWVzIGludG8geW91ciBDTVNNUyBjb250ZW50IHBhZ2UuPC9wPgo8aDM+SG93IGRvIEkgdXNlIGl0PzwvaDM+CjxwPkVuYWJsaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhIHR3byBzdGVwIHByb2Nlc3M6PC9wPgo8dWw+CiAgPGxpPjEuICBFbmFibGUgdGhlIGpxdWVyeSBsaWJyYXJpZXMgdGhhdCB5b3Ugd2FudCBieSBjYWxsaW5nIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9JnF1b3Q7bGlicmFyeSBuYW1lJnF1b3Q7IG5vY2FjaGV9PC9jb2RlPiBpbiB5b3VyIHBhZ2UgY29udGVudC4KICAgIDxwPlRoaXMgdGFnIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gZW5hYmxlIG11bHRpcGxlIGxpYnJhcmllcy4gIHRoZSBsaWIgYXJndW1lbnQgYWxzbyBzdXBwb3J0cyBwYXNzaW5nIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGlicmFyeSBuYW1lcy48L3A+CiAgPC9saT4KICA8bGk+Mi4gIENhbGwgPGNvZGU+e0pRdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4gaW4gdGhlIGFwcHJvcHJpYXRlIHBhcnQgb2YgeW91ciBwYWdlIHRlbXBsYXRlLgogICAgPHVsPgogICAgICA8bGk+VG8gZW5hYmxlIEpRdWVyeVRvb2xzIGZvciBhIHNwZWNpZmljIHBhZ2UgaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIHBsYWNlIHRoZSA8Y29kZT57SlF1ZXJ5VG9vbHMgYWN0aW9uPXBsYWNlbWFya2VyIG5vY2FjaGV9PC9jb2RlPiB0YWcgaW4gdGhlIHBhZ2Ugc3BlY2lmaWMgbWV0YWRhdGEgZmllbGQgb2YgZWFjaCBjb250ZW50IHBhZ2UuPC9saT4KICAgICAgPGxpPlRvIGVuYWJsZSBKUXVlcnlUb29scyBvbiBhIHNpdGUgd2lkZSBiYXNpcyB0aGUgPGNvZGU+e0pxdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4gdGFnIGNhbiBiZSBwbGFzZWQgaW4gdGhlIGdsb2JhbCBtZXRhZGF0YSBmaWVsZCBpbiB0aGUgZ2xvYmFsIHNldHRpbmdzLjwvbGk+CiAgICAgIDxsaT5Zb3UgbWF5IGFsc28gcGxhY2UgdGhlIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXJ9PC9jb2RlPiB0YWcgaW4gZWFjaCBzcGVjaWZpYyBwYWdlIHRlbXBsYXRlLCBhdCB0aGUgYm90b29tIG9mIHRoZSB0ZW1wbGF0ZSBhYm92ZSA8L2JvZHk+IG9yIGFueXdoZXJlIGluIHRoaGUgaGVhZCBzZWN0aW9uLjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CjwvdWw+CjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IHByb3ZpZGUgc2FtcGxlcyBhbmQgaW5zdHJ1Y3Rpb25zIGFzIHRvIGhvdyB0byB1c2UganF1ZXJ5IG9yIHRoZSB2YXJpb3VzIGFkZG9uIGxpYnJhcmllcyB0aGF0IHdlIGluY2x1ZGUuICB0byBsZWFybiBob3cgdG8gdXNlIHRoZXNlIGxpYnJhcmllcyB5b3Ugd2lsbCBuZWVkIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBwbHVnaW5zIGF0IHRoZWlyIHJlc3BlY3RpdmUgaG9tZSBwYWdlLjwvcD4KCjxoMz5XaGF0IGpxdWVyeSB2ZXJzaW9uIGlzIGluY2x1ZGVkPzwvaDM+CjxwPkN1cnJlbnRseSBKUXVlcnlUb29scyB1c2VzIGpxdWVyeSAxLjguMzwvcD4KPGgzPldoYXQgSlF1ZXJ5IHBsdWdpbnMgYXJlIGluY2x1ZGVkPC9oMz4KPHVsPgogIDxsaT50YWJsZXNvcnRlciA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vdGFibGVzb3J0ZXIuY29tIj5odHRwOi8vdGFibGVzb3J0ZXIuY29tPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+CjxwPi0tIFRvIGFsbG93IHNvcnRpbmcgeW91ciB0YWJsZXMsIGdpdmUgdGhlIGZvbGx3aW5nIGNsYXNzZXMgdG8gdGhlIHRhYmxlIGRlZmluaXRpb246IGNtc19zb3J0YWJsZSB0YWJsZXNvcnRlci4gaS5lOiA8Y29kZT4mbHQ7dGFibGUgY2xhc3M9ImNtc19zb3J0YWJsZSB0YWJsZXNvcnRlciImZ3Q7Li4uJmx0Oy90YWJsZSZndDs8L2NvZGU+PC9wPgogIDwvbGk+CiAgPGxpPmpxdWVyeTwvbGk+CiAgPGxpPmpxdWVyeSB1aSAtIHNtb290aG5lc3MgdGhlbWUuPC9saT4KICA8bGk+Y2x1ZXRpcCA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC8iPmh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwLzwvYT4gZm9yIHVzYWdlIGluc3RydWN0aW9ucyk8L2VtPjwvbGk+CiAgPGxpPmZvcm0gPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL21hbHN1cC5jb20vanF1ZXJ5L2Zvcm0vIj5odHRwOi8vbWFsc3VwLmNvbS9qcXVlcnkvZm9ybS88L2E+IGZvciB1c2FnZSBpbnN0cnVjdGlvbnMpPC9lbT48L2xpPgogIDxsaT5mYW5jeWJveCA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vZmFuY3kua2xhZGUubHYvIj5odHRwOi8vZmFuY3kua2xhZGUubHYvPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+PC9saT4KICA8bGk+anNvbjwvbGk+CiAgPGxpPmxpZ2h0Ym94PC9saT4KICA8bGk+ZmlsZXVwbG9hZCAtIFRoZSBibHVlaW1wIGpxdWVyeSBmaWxlIHVwbG9hZCBsaWJyYXJ5LjwvbGk+CjwvdWw+CjxoMz5FeGFtcGxlOjwvaDM+CiA8cD5TbyB5b3UgaGF2ZSB1cGxvYWRlZCBzb21lIGZpbGVzIHRvIGEgY2F0ZWdvcnkgaW4gdGhlIHVwbG9hZHMgbW9kdWxlLCBhbmQgeW91IHdhbnQgdG8gdXNlIGZhbmN5Ym94IHRvIHByZXZpZXcgdGhlIGltYWdlcyBmcm9tIGFuIFVwbG9hZHMgbW9kdWxlIHN1bW1hcnkgdmlldy4gVGhpcyBpcyBhIHNpbXBsZSAzIHN0ZXAgcHJvY2Vzczo8L3A+CjxvbD4KICAgPGxpPk1vZGlmeSB5b3VyIHVwbG9hZHMgc3VtbWFyeSB0ZW1wbGF0ZSB0byBzb21ldGhpbmcgc2ltaWxhciB0byB0aGlzOgo8cHJlPjxjb2RlPjxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9ZmFuY3lib3ggbm9jYWNoZX08L3NwYW4+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09J2VudHJ5JyBuYW1lPSd1cGxvYWRzJ30KICAmbHQ7ZGl2IGNsYXNzPSJ1cGxvYWQiIHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDMzJTsiJmd0OwogIHtpZiBpc3NldCgkZW50cnktPnRodW1ibmFpbF91cmwpfQogICZsdDthIGNsYXNzPSJmYW5jeWJveCIgaHJlZj0ieyRlbnRyeS0+b3JpZ2ZpbGVfdXJsfSIgdGl0bGU9InskZW50cnktPnVwbG9hZF9uYW1lfSImZ3Q7Jmx0O2ltZyBzcmM9InskZW50cnktPnRodW1ibmFpbF91cmx9IiBhbHQ9IiIvJmd0OyZsdDsvYSZndDsKICB7L2lmfQogICZsdDsvZGl2Jmd0Owp7L2ZvcmVhY2h9CiZsdDtkaXYgc3R5bGU9ImNsZWFyOiBib3RoOyImZ3Q7Jmd0Oy9kaXYmbHQ7PC9jb2RlPjwvcHJlPgogICA8cD5Ob3RlIHRoZSBjYWxsIHRvIEpRdWVyeVRvb2xzIHRvIGluY2x1ZGUgdGhlIGZhbmN5Ym94IGxpYnJhcnkuIEFkZGl0aW9uYWxseSwgbm90ZSB0aGUgY2xhc3MgZ2l2ZW4gdG8gdGhlIDxlbT5hPC9lbT4gdGFnLjwvcD4KICA8L2xpPgogIDxsaT5DYWxsIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+CiAgICA8cD5UaGVyZSBhcmUgYXQgbGVhc3QgZm91ciBsb2NhdGlvbnMgd2hlcmUgdGhpcyB0YWcgY2FuIGJlIGNhbGxlZDo8L3A+CiAgICA8dWw+CiAgICAgIDxsaT5JbiB0aGUgcGFnZSB0ZW1wbGF0ZSBkaXJlY3RseSBiZWZvcmUgdGhlIDxjb2RlPiZsdDsvYm9keSZndDs8L2NvZGU+IHRhZy48L2xpPgogICAgICA8bGk+SW4gdGhlIHBhZ2UgdGVtcGxhdGUgZGlyZWN0bHkgYmVmb3JlIHRoZSA8Y29kZT4mbHQ7L2hlYWQmZ3Q7PC9jb2RlPiB0YWcuPC9saT4KICAgICAgPGxpPkluIHRoZSBwYWdlIG1ldGFkYXRhIGZpZWxkIHdoZW4gZWRpdGluZyBjb250ZW50LjwvbGk+CiAgICAgIDxsaT5JbiB0aGUgZ2xvYmFsIG1ldGFkYXRhIGZpZWxkIGluIHRoZSBnbG9iYWwgc2V0dGluZ3MgcGFnZS48L2xpPgogICAgPC91bD4KICA8L2xpPgogIDxsaT5DYWxsIHRoZSBVcGxvYWRzIG1vZHVsZSBmcm9tIGEgcGFnZS4gIGkuZTo8YnIvPgogICAgPHByZT48Y29kZT57VXBsb2FkcyBjYXRlZ29yeT1jYXRlZ29yeV9uYW1lfTwvY29kZT48L3ByZT4KICA8L2xpPgo8L29sPgo8aDM+QnVpbHQgaW4gUmVhZHkgU2NyaXB0czwvaDM+CjxwPlRoaXMgbW9kdWxlIHN1cHBvcnRzIHNvbWUgc2ltcGxlIHJlYWR5IHN0YXRlcyB0byBlYXNlIGluIGRldmVsb3BtZW50LiAgQWxsIG9mIHRoZXNlIGNhbiBiZSBvdmVyd3JpdHRlbiBpbiB5b3VyIG93biBqYXZhc2NyaXB0OjwvcD4KPHVsPgogICAgPGxpPmZhbmN5Ym94IC0gZmFuY3lib3ggd2lsbCB3b3JrIG9uIGFueSBhIHRhZyB3aXRoIGEgY2xhc3Mgb2YgZmFuY3lib3g6ICAkKCdhLmZhbmN5Ym94JykuZmFuY3lib3goKQogICAgICA8cHJlPjxjb2RlPiZsdDthIGNsYXNzPSZxdW90O2ZhbmN5Ym94JnF1b3Q7IGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5teXNpdGUuY29tL3VwbG9hZHMvaW1hZ2VzL2ltYWdlLmpwZyZxdW90OyZndDsmbHQ7aW1nIHNyYz0mcXVvdDtodHRwOi8vd3d3Lm15c2l0ZS5jb20vdXBsb2Fkcy9pbWFnZXMvdGh1bWJfaW1hZ2UuanBnJnF1b3Q7LyZndDsmbHQ7YSZndDs8L2NvZGU+PC9wcmU+CgkJICAgIDxwPjxzdHJvbmc+SGludDo8L3N0cm9uZz4gVXNlIENHU21hcnRJbWFnZSB0byBhdm9pZCBoYXZpbmcgdG8gY3JlYXRlIGFuZCBtYW5hZ2UgdGh1bWJuYWlscyA8ZW0+KHJlcXVpcmVzIGRvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSBDR1NtYXJ0SW1hZ2UgbW9kdWxlKTwvZW0+OjwvcD4KCQkgICAgPHByZT48Y29kZT4mbHQ7YSBjbGFzcz0mcXVvdDtmYW5jeWJveCZxdW90OyBocmVmPSZxdW90O3tDR1NtYXJ0SW1hZ2Ugc3JjPSdpbWFnZXMvaW1hZ2UuanBnJyBub2VtYmVkPTF9JnF1b3Q7Jmd0O3tDR1NtYXJ0SW1hZ2Ugc3JjPSdpbWFnZXMvaW1hZ2UuanBnJyB3aWR0aD0xMDAgaGVpZ2h0PTEwMH0mbHQ7YSZndDs8L3ByZT48L2NvZGU+CiAgICA8L2xpPgogICAgPGxpPmxpZ2h0Ym94IC0gbGlnaHRib3ggd2lsbCB3b3JrIG9uIGFueSBhIHRhZyB3aXRoIGEgY2xhc3Mgb2YgbGlnaHRib3g6ICAkKCdhLmxpZ2h0Ym94JykubGlnaHRib3goKTwvbGk+CiAgICA8bGk+Y2x1ZXRpcCAtIGNsdWV0aXAgd2lsbCB3b3JrIG9uIGFueSBhIHRhZyB3aXRoIGEgY2xhc3Mgb2YgY2x1ZXRpcDogICQoJ2EuY2x1ZXRpcCcpLmNsdWV0aXAoKTwvbGk+CiAgICA8bGk+dGFibGVzb3J0ZXIgLSB0YWJsZXNvcnRlciB3aWxsIHdvcmsgb24gYW55IHRhYmxlIHRhZyB3aXRoIGEgY2xhc3Mgb2YgY21zX3NvcnRhYmxlOiAkKCd0YWJsZS5jbXNfc29ydGFibGUnKS50YWJsZVNvcnRlcigpPC9saT4KPC91bD4KPGgzPkFib3V0IHNtYXJ0eSBjYWNoaW5nPC9oMz4KPHA+VGhlIHJlcXVpcmUsIGFuZCBwbGFjZW1hcmtlciBhY3Rpb25zIGRvIG5vdCBzdXBwb3J0IHNtYXJ0eSBjYWNoaW5nLiAgSXQgaXMgdGhlcmVmZXJlIGNyaXRpY2FsIHRoYXQgdGhlIG5vY2FjaGUgYXR0cmlidXRlIGJlIHVzZWQgb24gY2FsbHMgdG8gdGhlIEpRdWVyeVRvb2xzIG1vZHVsZS48L3A+CjxoMz5BYm91dCB0aGUgcGxhY2VtYXJrZXIgYWN0aW9uLjwvaDM+CjxwPlRoZSBwbGFjZW1hcmtlciBhY3Rpb24gZG9lcyB0aGUgam9iIG9mIGdlbmVyYXRpbmcgdGhlIGh0bWwgdG8gaW5zZXJ0IHRoZSBqcXVlcnkgc2NyaXB0cywgYW5kIHRoZSB2YXJpb3VzIGFkZG9uIGxpYnJhcmllcyB0aGF0IHdlcmUgcmVxdWVzdGVkIHZpYSB0aGUgcmVxdWlyZSBhY3Rpb24uICBUaGVyZWZvcmUgdGhlIHBsYWNlbWFya2VyIGFjdGlvbiBtdXN0IGJlIGNhbGxlZCBBRlRFUiBhbGwgY2FsbHMgdG8gdGhlIHJlcXVpcmUgYWN0aW9uLiAgIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCBDTVNNUyBkaXZpZGVzIHBhZ2UgdGVtcGxhdGVzIGludG8gdGhyZWUgcG9ydGlvbnMgYW5kIHByb2Nlc3NlcyB0aGVtIGluIHRoaXMgb3JkZXI6ICBUaGUgdG9wIHBvcnRpb24gb2YgdGhlIHBhZ2UgYmVmb3JlIHRoZSAmbHQ7aHRtbCZndDsgdGFnLiAgVGhlIGJvZHkgc2VjdGlvbiwgYW5kIHRoZSBoZWFkIHNlY3Rpb24uPC9wPgoKPGgzPlN1cHBvcnQ8L2gzPgo8cD5UaGUgbW9kdWxlIGF1dGhvciBpcyBpbiBubyB3YXkgb2JsaWdhdGVkIHRvIHByaXZpZGUgc3VwcG9ydCBmb3IgdGhpcyBjb2RlIGluIGFueSBmYXNoaW9uLiAgSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkEgYnVnIHRyYWNraW5nIGFuZCBmZWF0dXJlIHJlcXVlc3Qgc3lzdGVtIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgbW9kdWxlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvanF1ZXJ5dG9vbHMiPmhlcmU8L2E+LiAgUGxlYXNlIGJlIHZlcmJvc2UgYW5kIGRlc2NyaXB0aXZlIHdoZW4gc3VibWl0dGluZyBidWcgcmVwb3J0cyBhbmQgZmVhdHVyZSByZXF1ZXN0cywgYW5kIGZvciBidWcgcmVwb3J0cyBlbnN1cmUgdGhhdCB5b3UgaGF2ZSBwcm92aWRlZCBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIHJlbGlhYmx5IHJlcHJvZHVjZSB0aGUgaXNzdWUuPC9saT4KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi4gIFdoZW4gZGVzY3JpYmluZyBhbiBpc3N1ZSBwbGVhc2UgbWFrZSBhbiBlZmZvcnQgdG8gcHJpdmlkZSBhbGwgcmVsYXZhbnQgaW5mb3JtYXRpb24sIGEgdGhvcm91Z2ggZGVzY3JpcHRpb24gb2YgeW91ciBpc3N1ZSwgYW5kIHN0ZXBzIHRvIHJlcHJvZHVjZSBpdCBvciB5b3VyIGRpc2N1c3Npb24gbWF5IGJlIGlnbm9yZWQuPC9saT4KPGxpPlRoZSBhdXRob3IsIGNhbGd1eTEwMDAsIGNhbiBvZnRlbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvciBkaXJlY3RseS4gIEhvd2V2ZXIsIHBsZWFzZSB1c2UgdGhpcyBhcyBhIGxhc3QgcmVzb3J0LCBhbmQgZW5zdXJlIHRoYXQgeW91IGhhdmUgZm9sbG93ZWQgYWxsIGFwcGxpY2FibGUgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBmb3JnZSwgaW4gdGhlIGZvcnVtcywgZXRjLjwvbGk+CjwvdWw+CgoKPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgUm9iZXJ0IENhbXBiZWwgPGEgaHJlZj0ibWFpbHRvOmNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmciPiZsdDtjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJmd0OzwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi48L3A+CjxwPkhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAphcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwpNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4Kc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCk9yIHJlYWQgaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5vbmxpbmU8L2E+PC9wPgo8aDM+RGVwZW5kZW5jaWVzPC9oMz48dWw+PGxpPkNHRXh0ZW5zaW9ucyA9Jmd0OyAxLjU0LjQ8L2xpPjwvdWw+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBhY3Rpb249IiIgLSBTcGVjaWZ5IHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTo8dWw+PGxpPnJlcXVpcmUgLSBNYXJrcyB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwYWdlIEhUTUwuICBTZWUgdGhlIGxpc3QgYWJvdmUgZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsaWJyYXJpZXMuPC9saT48bGk+cGxhY2VtYXJrZXIgLSBJbmRpY2F0ZXMgdGhlIHBsYWNlIGluIHRoZSBIVE1MIG91dHB1dCB3aGVyZSB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIHNob3VsZCBiZSBpbmNsdWRlZC48L2xpPjxsaT5pbmNqcyAtIDxlbT4oZGVwcmVjYXRlZCk8L2VtPiBJbmNsdWRlIHJlcXVpcmVkIGphdmFzY3JpcHQgZmlsZXMuPC9saT48bGk+cmVhZHkgLSA8ZW0+KGRlcHJlY2F0ZWQpPC9lbT4gT3V0cHV0IGRlZmF1bHQgcmVhZHkgZnVuY3Rpb24uPC9saT48L3VsPjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gZXhjbHVkZT0iIiAtIEFwcGxpY2FibGUgb25seSB0byB0aGUgcGxhY2VtYXJrZXIgYW5kIGluY2pzIGFjdGlvbnMsIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleGNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyBmcm9tIHRoZSBvdXRwdXQgZ2VuZXJhdGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbGliPSIiIC0gQXBwbGljYWJsZSBvbmx5IHRvIHRoZSByZXF1aXJlIGFjdGlvbiwgdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIHNwZWNpZnlpbmcgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBqcXVlcnkgbGlicmFyaWVzIHRvIGluc3RhbGwuPC9saT48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBub19jc3M9IiIgLSBBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHdpbGwgZXhjbHVkZSBjc3MgdGFncyBmcm9tIGJlaW5nIG91dHB1dDwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbm9fY2RuPSIiIC0gQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIHByZXZlbnQgSlF1ZXJ5VG9vbHMgZnJvbSB1c2luZyBhIENETiBVUkwgZm9yIHRoZSBqYXZhc2NyaXB0IGxpYnJhcmllcywgaWYgb25lIGlzIGF2YWlsYWJsZSAobm90IGFsbCBsaWJyYXJpZXMgYXJlIGF2YWlsYWJsZSBieSBhIENETjwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbm9fanM9IiIgLSBBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHdpbGwgZXhjbHVkZSBzY3JpcHQgdGFncyBmcm9tIGJlaW5nIG91dHB1dDwvbGk+PGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbm9fanF1ZXJ5PSIiIC0gQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUganF1ZXJ5IGZyb20gYmVpbmcgaW5jbHVkZWQ8L2xpPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IG5vX3JlYWR5PSIiIC0gQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhY3Rpb25zLCB0aGlzIHdpbGwgZXhjbHVkZSBhbnkgcmVhZHkgZnVuY3Rpb25zIGZyb20gYmVpbmcgb3V0cHV0LjwvbGk+PC91bD4=]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBjYWxndXkxMDAwICZsdDtjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDEuNC4wLjM8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz48dWw+CiAgPGxpPjEuMC40IC0gT2N0b2JlciAyMDA5CiAgICA8cD5BZGRzIGpzb24gc3VwcG9ydC48L3A+CiAgPC9saT4KICA8bGk+MS4wLjUgLSBOb3ZlbWJlciAyMDA5CiAgICA8cD5BZGRzIG5vX2NzcyBhbmQgbm9fanMgb3B0aW9ucyB0byB0aGUgaW5janMgYWN0aW9uLjwvcD4KICA8L2xpPgogIDxsaT4xLjAuNiAtIEFwcmlsIDIwMTAKICAgIDxwPkFkZHMgY2FsZ3V5cyBkYXRlIHV0aWxzIHBsdWdpbi48L3A+CiAgPC9saT4KICA8bGk+MS4wLjkgLSBTZXB0ZW1iZXIgMjAxMAogICAgPHA+QWRkcyBub19qcXVlcnkgb3B0aW9uIHRvIHRoZSBpbmNqcyBhY3Rpb24uPC9wPgogICAgPFA+RG8gbm90IG91dHB1dCBqcXVlcnkgdGFncyBmb3IgYW55IG1vZHVsZSBhY3Rpb25zIG9yIGFkbWluIGFjdGlvbnMgaWYgQ01TIFZlcnNpb24gaXMgPj0gQ01TIDEuOS1iZXRhMTwvcD4KICA8L2xpPgogIDxsaT4xLjAuMTAgLQogICAgPHA+TWlub3IgZml4ZXMuPC9wPgogIDwvbGk+CiAgPGxpPjEuMC4xMSAtIEp1bmUgMjAxMQogICAgPHVsPgogICAgICA8bGk+TWlub3IgRml4ZXMuPC9saT4KICAgICAgPGxpPk1vdmVzIENoYW5nZWxvZyBFeHRlcm5hbC48L2xpPgogICAgICA8bGk+TWlub3IgY2hhbmdlIGZvciAxLjEwIGNvbXBhdGliaWxpdHkuPC9saT4KICAgICAgPGxpPlVwZGF0ZSBkZXBlbmRlbmNpZXMuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KICA8bGk+MS4xIC0gSnVseSAyMDEyCiAgIDx1bD4KICAgICA8bGk+TW92ZSBoZWxwIGV4dGVybmFsLjwvbGk+CiAgICAgPGxpPlVwZ3JhZGUganF1ZXJ5IGFuZCBmYW5jeWJveC48L2xpPgogICA8dWw+CiAgPC9saT4KICA8bGk+MS4yIC0gSmFudWFyeSAyMDEzCiAgICA8dWw+CiAgICAgIDxsaT5BZGRzIHRoZSByZXF1aXJlIGFuZCBwbGFjZW1hcmtlciBhY3Rpb25zLjwvbGk+CiAgICAgIDxsaT5VcGdyYWRlcyBhbGwgbGlicmFyaWVzIGFuZCByZWZvcm1hdHMgdGhlbSBpbnRvIGEgZGlmZmVyZW50IHN0cnVjdHVyZS48L2xpPgogICAgICA8bGk+QWRkcyBqcXVlcnkgdWksICBhbmQgQ0ROIHN1cHBvcnQuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KICA8bGk+djEuMyAtIEp1bmUgMjAxNAogICAgICA8dWw+CiAgICAgICAgPGxpPkFkZHMgc3VwcG9ydCBmb3IgdGhlIGNnanNfcmVxdWlyZSBzdHVmZiBpbiBDR0V4dGVuc2lvbnMuPC9saT4KCTxsaT5BZGRzIGEgbmV3IGNvbWJvYm94IHBsdWdpbi48L2xpPgoJPGxpPkFkZHMganN2aWV3cyBwbHVnaW4uPC9saT4KICAgICAgPC91bD4KICAgIDwvdWw+CiAgPC9saT4KICA8bGk+djEuMyw1CiAgICAgIDx1bD4KICAgICAgICA8bGk+TWlub3IgaW1wcm92ZW1lbnRzLjwvbGk+CiAgICAgIDwvdWw+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPnYxLjMuNgogICAgPHVsPgogICAgICA8bGk+Tm93IGZsYWcgZGlmZmVyZW50IG1pbmlmaWNhdGlvbnMgZm9yIGRpZmZlcmVudCBsaWJyYXJpZXMgKHdoZW4gdXNpbmcgY2dqc19yZW5kZXIpPC9saT4KICAgICAgPGxpPlVwZ3JhZGUganF1ZXJ5IHRvIDEuMTEuMzwvbGk+CiAgICAgIDxsaT5VcGdyYWRlIGpxdWVyeS11aSB0byAxLjExLjQ8L2xpPgogICAgPC91bD4KICA8L2xpPgogIDxsaT52MS4zLjgKICAgIDxwPk1pbm9yIGJ1ZyBmaXhlcy48L3A+CiAgPC9saT4KICA8bGk+djEuMy45CiAgICA8dWw+CiAgICAgIDxsaT5VcGdyYWRlIHRoZSBqcXVlcnkgZmlsZSB1cGxvYWQgbGlicmFyeS48L2xpPgogICAgPC91bD4KICA8L2xpPgo8L3VsPgo8YnIgLz4=]]></about>
	<description><![CDATA[A toolbox of Jquery utilities to aide in creating dynamic and fancy CMS Made Simple modules and websites]]></description>
	<requires>
	  <requiredname>CGExtensions</requiredname>
	  <requiredversion>1.54.4</requiredversion>
	</requires>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.incjs.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEEgdG9vbGJveCBvZiBjb252ZW5pZW5jZXMgdG8gcHJvdmlkZSBkeW5hbWljIGphdmFzY3JpcHR5IGZ1bmN0aW9uYWxpdHkKIyAgZm9yIENNUyBtb2R1bGVzIGFuZCB3ZWJzaXRlIGRlc2lnbmVycy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0cyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbgojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKaWYoICFpc3NldCgkZ0NtcykgKSBleGl0OwoKJGNvbmZpZyA9IFxjbXNfY29uZmlnOjpnZXRfaW5zdGFuY2UoKTsKJGJhc2VkaXIgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLicvbGliJzsKJGRpcnMgPSBnbG9iKCRiYXNlZGlyLicvKi5saWInKTsKCiRsaWJyYXJpZXMgPSBhcnJheSgpOwppZiggaXNfYXJyYXkoJGRpcnMpICYmIGNvdW50KCRkaXJzKSApIHsKICAgIGZvcmVhY2goICRkaXJzIGFzICRvbmUgKSB7CiAgICAgICAgaWYoICFpc19kaXIoJG9uZSkgKSBjb250aW51ZTsKICAgICAgICBpZiggIWZpbGVfZXhpc3RzKCRvbmUuJy9pbmZvLmRhdCcpICkgY29udGludWU7CiAgICAgICAgJGJuID0gYmFzZW5hbWUoJG9uZSk7CiAgICAgICAgJG5hbWUgPSBzdWJzdHIoJGJuLDAsLTQpOwogICAgICAgIGluY2x1ZGVfb25jZSgkb25lLicvaW5mby5kYXQnKTsKCiAgICAgICAgJGluZm9bJ2Jhc2VfZGlyJ10gPSAkb25lOwogICAgICAgICRpbmZvWydiYXNlX3VybCddID0gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKS4iL2xpYi8kYm4iOwogICAgICAgICRsaWJyYXJpZXNbJG5hbWVdID0gJGluZm87CgogICAgICAgIHVuc2V0KCRpbmZvKTsKICAgIH0KfQoKLy8gbG9vcCB0aHJvdWdoIHRoZSBsaWJyYXJpZXMKLy8gZmluZCB0aGUgb25lcyB3aXRoIG5vIGRlcGVuZGVuY2llcwoKJGJhc2V1cmwgPSAkY29uZmlnLT5zbWFydF9yb290X3VybCgpLicvbW9kdWxlcy8nLiR0aGlzLT5HZXROYW1lKCkuJy9saWIvJzsKJGZtdCA9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIlcyI+PC9zY3JpcHQ+Jy4iXG4iOwokZG9fY3NzID0gMTsKJGRvX2pzID0gMTsKJGV4Y2x1ZGVzID0gYXJyYXkoKTsKJGRvX2pxdWVyeSA9IDE7CgppZiggIWNtc21zKCktPmlzX2Zyb250ZW5kX3JlcXVlc3QoKSApIHsKICAkZXhjbHVkZXNbXSA9ICdqcXVlcnknOwogICRleGNsdWRlc1tdID0gJ3VpJzsKICAkZXhjbHVkZXNbXSA9ICdmaWxldXBsb2FkJzsgLy8gdGhpcyBtYXkgYmUgaW5jbHVkZWQgaW4gc29tZSBhZG1pbiB0aGVtZXMuCn0KaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2pxdWVyeSddKSApIHsKICAkZXhjbHVkZXNbXSA9ICdqcXVlcnknOwp9CmlmKCBpc3NldCgkcGFyYW1zWydub19jc3MnXSkgKSB7CiAgJGRvX2NzcyA9IDA7Cn0KaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2pzJ10pICkgewogICRkb19qcyA9IDA7Cn0KCmlmKCBpc3NldCgkcGFyYW1zWydleGNsdWRlJ10pICkgewogICRleGNsdWRlID0gZXhwbG9kZSgnLCcsJHBhcmFtc1snZXhjbHVkZSddKTsKICAkZXhjbHVkZXMgPSBhcnJheV9tZXJnZSgkZXhjbHVkZXMsJGV4Y2x1ZGUpOwp9CiRleGNsdWRlcyA9IGFycmF5X3VuaXF1ZSgkZXhjbHVkZXMpOwoKLy8gYXNzZW1ibGUgdGhlIGxpc3Qgb2YgbGlicmFyaWVzIGFuZCBjc3MgZmlsZXMuCiRsaWJzID0gYXJyYXkoKTsKJGNzcyA9IGFycmF5KCk7CmlmKCAhZnVuY3Rpb25fZXhpc3RzKCdqcXVlcnl0b29sc19pbmNqcycpICkgewogICAgZnVuY3Rpb24ganF1ZXJ5dG9vbHNfaW5janMoJG5hbWUsJiRsaWJyYXJpZXMsJGV4Y2x1ZGVzLCYkbGlicywmJGNzcywkZG9fanMsJGRvX2NzcykgewogICAgICAgIGlmKCAhaXNzZXQoJGxpYnJhcmllc1skbmFtZV0pICkgcmV0dXJuOwogICAgICAgIGlmKCBpbl9hcnJheSgkbmFtZSwkZXhjbHVkZXMpICkgcmV0dXJuOwoKICAgICAgICAkaW5mbyA9JiAkbGlicmFyaWVzWyRuYW1lXTsKICAgICAgICBpZiggaXNzZXQoJGluZm9bJ2hhbmRsZWQnXSkgJiYgJGluZm9bJ2hhbmRsZWQnXSA9PSAxICkgcmV0dXJuOwoKICAgICAgICAvLyBkbyBkZXBlbmRlbmNpZXMgZmlyc3QKICAgICAgICBpZiggaXNzZXQoJGluZm9bJ2RlcGVuZHMnXSkgJiYgJGluZm9bJ2RlcGVuZHMnXSApIHsKICAgICAgICAgICAgaWYoICFpc19hcnJheSgkaW5mb1snZGVwZW5kcyddKSApICRpbmZvWydkZXBlbmRzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snZGVwZW5kcyddKTsKCiAgICAgICAgICAgIGZvcmVhY2goICRpbmZvWydkZXBlbmRzJ10gYXMgJGRlcGVuZGVuY3kgKSB7CiAgICAgICAgICAgICAgICBqcXVlcnl0b29sc19pbmNqcygkZGVwZW5kZW5jeSwkbGlicmFyaWVzLCRleGNsdWRlcywkbGlicywkY3NzLCRkb19qcywkZG9fY3NzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gdGhlbiB0aGlzIGxpYnJhcnkKICAgICAgICBpZiggJGRvX2pzICYmIGlzc2V0KCRpbmZvWydqcyddKSAmJiAkaW5mb1snanMnXSApIHsKICAgICAgICAgICAgaWYoICFpc19hcnJheSgkaW5mb1snanMnXSkgKSAkaW5mb1snanMnXSA9IGV4cGxvZGUoJywnLCRpbmZvWydqcyddKTsKCiAgICAgICAgICAgIGlmKCBpc3NldCgkaW5mb1snY2RuJ10pICYmIGNtc21zKCktPmlzX2Zyb250ZW5kX3JlcXVlc3QoKSApIHsKICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBvbmx5IG9uZSByZWNvcmQuCiAgICAgICAgICAgICAgICAkYm4gPSBiYXNlbmFtZSgkaW5mb1snY2RuJ10pOwogICAgICAgICAgICAgICAgaWYoICFpc3NldCgkbGlic1skYm5dKSApICRsaWJzWyRibl0gPSAkaW5mb1snY2RuJ107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCAkaW5mb1snanMnXSBhcyAkb25lX2pzICkgewogICAgICAgICAgICAgICAgICAgICRibiA9IGJhc2VuYW1lKCRvbmVfanMpOwogICAgICAgICAgICAgICAgICAgIGlmKCAhaXNzZXQoJGxpYnNbJGJuXSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR1cmwgPSAkaW5mb1snYmFzZV91cmwnXS4nLycuJG9uZV9qczsKICAgICAgICAgICAgICAgICAgICAgICAgJGxpYnNbJGJuXSA9ICR1cmw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiggJGRvX2NzcyAmJiBpc3NldCgkaW5mb1snY3NzJ10pICYmICRpbmZvWydjc3MnXSApIHsKICAgICAgICAgICAgaWYoICFpc19hcnJheSgkaW5mb1snY3NzJ10pICkgJGluZm9bJ2NzcyddID0gZXhwbG9kZSgnLCcsJGluZm9bJ2NzcyddKTsKCiAgICAgICAgICAgIGZvcmVhY2goICRpbmZvWydjc3MnXSBhcyAkb25lX2NzcyApIHsKICAgICAgICAgICAgICAgICRibiA9IGJhc2VuYW1lKCRvbmVfY3NzKTsKICAgICAgICAgICAgICAgIGlmKCBpc3NldCgkY3NzWyRibl0pICkgY29udGludWU7CgogICAgICAgICAgICAgICAgJHVybCA9ICRpbmZvWydiYXNlX3VybCddLicvJy4kb25lX2NzczsKICAgICAgICAgICAgICAgICRjc3NbJGJuXSA9ICR1cmw7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRpbmZvWydoYW5kbGVkJ10gPSAxOwogICAgfQp9CgokdGhpcy0+X2xpYnMgPSBhcnJheV9rZXlzKCRsaWJyYXJpZXMpOwpmb3JlYWNoKCAkdGhpcy0+X2xpYnMgYXMgJG9uZSApIHsKICAgIGpxdWVyeXRvb2xzX2luY2pzKCRvbmUsJGxpYnJhcmllcywkZXhjbHVkZXMsJGxpYnMsJGNzcywkZG9fanMsJGRvX2Nzcyk7Cn0KCiRsaWJzID0gYXJyYXlfdW5pcXVlKCRsaWJzKTsKJGNzcyA9IGFycmF5X3VuaXF1ZSgkY3NzKTsKCmlmKCBjb3VudCgkbGlicykgJiYgJGRvX2pzICkgJHNtYXJ0eS0+YXNzaWduKCdsaWJzJywkbGlicyk7CmlmKCBjb3VudCgkY3NzKSAmJiAkZG9fY3NzICkgJHNtYXJ0eS0+YXNzaWduKCdjc3MnLCRjc3MpOwoKaWYoIGNvdW50KCRjc3MpIHx8IGNvdW50KCRsaWJzKSApIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnaW5janMudHBsJyk7CgojCiMgRU9GCiMKPz4K]]></data>
	</file>
	<file>
	  <filename>/action.placemarker.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEEgdG9vbGJveCBvZiBjb252ZW5pZW5jZXMgdG8gcHJvdmlkZSBkeW5hbWljIGphdmFzY3JpcHR5IGZ1bmN0aW9uYWxpdHkKIyAgZm9yIENNUyBtb2R1bGVzIGFuZCB3ZWJzaXRlIGRlc2lnbmVycy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBIb3dldmVyLCBhcyBhIHNwZWNpYWwgZXhjZXB0aW9uIHRvIHRoZSBHUEwsIHRoaXMgc29mdHdhcmUgaXMgZGlzdHJpYnV0ZWQKIyBhcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKIyBpbiBhbnkgTm9uIEdQTCB2ZXJzaW9uIG9mIENNUyBNYWRlIHNpbXBsZSwgb3IgaW4gYW55IHZlcnNpb24gb2YgQ01TCiMgTWFkZSBzaW1wbGUgdGhhdCBkb2VzIG5vdCBpbmRpY2F0ZSBjbGVhcmx5IGFuZCBvYnZpb3VzbHkgaW4gaXRzIGFkbWluCiMgc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiMgT3IgcmVhZCBpdCBvbmxpbmU6IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNFTkRfTElDRU5TRQppZiggIWlzc2V0KCRnQ21zKSApIGV4aXQ7CgovLyBjaGVjayBpZiB0aGVyZSBpcyBhbnl0aGluZyB0byBkby4KaWYoICghaXNfYXJyYXkoJHRoaXMtPl9saWJzKSB8fCBjb3VudCgkdGhpcy0+X2xpYnMpID09IDApICkgcmV0dXJuOwoKLy8gbG9hZCBhbGwgdGhlIGxpYnJhcmllcy4KJGJhc2VkaXIgPSAkdGhpcy0+R2V0TW9kdWxlUGF0aCgpLicvbGliJzsKJGRpcnMgPSBnbG9iKCRiYXNlZGlyLicvKi5saWInKTsKJGxpYnJhcmllcyA9IFtdOwppZiggaXNfYXJyYXkoJGRpcnMpICYmIGNvdW50KCRkaXJzKSApIHsKICAgIGZvcmVhY2goICRkaXJzIGFzICRvbmUgKSB7CiAgICAgICAgaWYoICFpc19kaXIoJG9uZSkgKSBjb250aW51ZTsKICAgICAgICBpZiggIWZpbGVfZXhpc3RzKCRvbmUuJy9pbmZvLmRhdCcpICkgY29udGludWU7CiAgICAgICAgJGJuID0gYmFzZW5hbWUoJG9uZSk7CiAgICAgICAgJG5hbWUgPSBzdWJzdHIoJGJuLDAsLTQpOwogICAgICAgIGluY2x1ZGVfb25jZSgkb25lLicvaW5mby5kYXQnKTsKCiAgICAgICAgJGluZm9bJ2Jhc2VfZGlyJ10gPSAkb25lOwogICAgICAgICRpbmZvWydiYXNlX3VybCddID0gJHRoaXMtPkdldE1vZHVsZVVSTFBhdGgoKS4iL2xpYi8kYm4iOwogICAgICAgICRsaWJyYXJpZXNbJG5hbWVdID0gJGluZm87CgogICAgICAgIHVuc2V0KCRpbmZvKTsKICAgIH0KfQoKLy8gbG9vcCB0aHJvdWdoIHRoZSBsaWJyYXJpZXMKLy8gZmluZCB0aGUgb25lcyB3aXRoIG5vIGRlcGVuZGVuY2llcwoKJGJhc2V1cmwgPSAkY29uZmlnLT5zbWFydF9yb290X3VybCgpLicvbW9kdWxlcy8nLiR0aGlzLT5HZXROYW1lKCkuJy9saWIvJzsKJGZtdCA9ICc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSIlcyI+PC9zY3JpcHQ+Jy4iXG4iOwokZG9fY3NzID0gMTsKJGRvX2NkbiA9IDE7CiRkb19qcyA9IDE7CiRleGNsdWRlcyA9IGFycmF5KCk7CiRkb19qcXVlcnkgPSAxOwoKaWYoICFjbXNtcygpLT5pc19mcm9udGVuZF9yZXF1ZXN0KCkgKSB7CiAgICAkZXhjbHVkZXNbXSA9ICdqcXVlcnknOwogICAgJGV4Y2x1ZGVzW10gPSAndWknOwogICAgJGV4Y2x1ZGVzW10gPSAnZmlsZXVwbG9hZCc7Cn0KaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2pxdWVyeSddKSApICRleGNsdWRlc1tdID0gJ2pxdWVyeSc7CmlmKCBpc3NldCgkcGFyYW1zWydub19jc3MnXSkgKSAkZG9fY3NzID0gMDsKaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2pzJ10pICkgJGRvX2pzID0gMDsKaWYoIGlzc2V0KCRwYXJhbXNbJ25vX2NkbiddKSApICRkb19jZG4gPSAwOwoKaWYoIGlzc2V0KCRwYXJhbXNbJ2V4Y2x1ZGUnXSkgKSB7CiAgICAkZXhjbHVkZSA9IGV4cGxvZGUoJywnLCRwYXJhbXNbJ2V4Y2x1ZGUnXSk7CiAgICAkZXhjbHVkZXMgPSBhcnJheV9tZXJnZSgkZXhjbHVkZXMsJGV4Y2x1ZGUpOwp9CiRleGNsdWRlcyA9IGFycmF5X3VuaXF1ZSgkZXhjbHVkZXMpOwoKLy8gYXNzZW1ibGUgdGhlIGxpc3Qgb2YgbGlicmFyaWVzIGFuZCBjc3MgZmlsZXMuCiRsaWJzID0gYXJyYXkoKTsKJGNzcyA9IGFycmF5KCk7CmlmKCAhZnVuY3Rpb25fZXhpc3RzKCdqcXVlcnl0b29sc19pbmNqcycpICkgewogICAgZnVuY3Rpb24ganF1ZXJ5dG9vbHNfaW5janMoJG5hbWUsJiRsaWJyYXJpZXMsJGV4Y2x1ZGVzLCYkbGlicywmJGNzcywkZG9fanMsJGRvX2NzcywkZG9fY2RuKSB7CiAgICAgICAgaWYoICFpc3NldCgkbGlicmFyaWVzWyRuYW1lXSkgKSByZXR1cm47CiAgICAgICAgaWYoIGluX2FycmF5KCRuYW1lLCRleGNsdWRlcykgKSByZXR1cm47CgogICAgICAgICRpbmZvID0mICRsaWJyYXJpZXNbJG5hbWVdOwogICAgICAgIGlmKCBpc3NldCgkaW5mb1snaGFuZGxlZCddKSAmJiAkaW5mb1snaGFuZGxlZCddID09IDEgKSByZXR1cm47CgogICAgICAgIC8vIGRvIGRlcGVuZGVuY2llcyBmaXJzdAogICAgICAgIGlmKCBpc3NldCgkaW5mb1snZGVwZW5kcyddKSAmJiAkaW5mb1snZGVwZW5kcyddICkgewogICAgICAgICAgICBpZiggIWlzX2FycmF5KCRpbmZvWydkZXBlbmRzJ10pICkgJGluZm9bJ2RlcGVuZHMnXSA9IGV4cGxvZGUoJywnLCRpbmZvWydkZXBlbmRzJ10pOwoKICAgICAgICAgICAgZm9yZWFjaCggJGluZm9bJ2RlcGVuZHMnXSBhcyAkZGVwZW5kZW5jeSApIHsKICAgICAgICAgICAgICAgIGpxdWVyeXRvb2xzX2luY2pzKCRkZXBlbmRlbmN5LCRsaWJyYXJpZXMsJGV4Y2x1ZGVzLCRsaWJzLCRjc3MsJGRvX2pzLCRkb19jc3MsJGRvX2Nkbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIHRoZW4gdGhpcyBsaWJyYXJ5CiAgICAgICAgaWYoICRkb19qcyAmJiBpc3NldCgkaW5mb1snanMnXSkgJiYgJGluZm9bJ2pzJ10gKSB7CiAgICAgICAgICAgIGlmKCAhaXNfYXJyYXkoJGluZm9bJ2pzJ10pICkgJGluZm9bJ2pzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snanMnXSk7CgogICAgICAgICAgICBpZiggaXNzZXQoJGluZm9bJ2NkbiddKSAmJiBjbXNtcygpLT5pc19mcm9udGVuZF9yZXF1ZXN0KCkgJiYgJGRvX2NkbiApIHsKICAgICAgICAgICAgICAgIC8vIGFzc3VtZSBvbmx5IG9uZSByZWNvcmQuCiAgICAgICAgICAgICAgICAkYm4gPSBiYXNlbmFtZSgkaW5mb1snY2RuJ10pOwogICAgICAgICAgICAgICAgaWYoICFpc3NldCgkbGlic1skYm5dKSApICRsaWJzWyRibl0gPSAkaW5mb1snY2RuJ107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoKCAkaW5mb1snanMnXSBhcyAkb25lX2pzICkgewogICAgICAgICAgICAgICAgICAgICRibiA9IGJhc2VuYW1lKCRvbmVfanMpOwogICAgICAgICAgICAgICAgICAgIGlmKCAhaXNzZXQoJGxpYnNbJGJuXSkgKSAkbGlic1skYm5dID0gJGluZm9bJ2Jhc2VfdXJsJ10uJy8nLiRvbmVfanM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKCAkZG9fY3NzICYmIGlzc2V0KCRpbmZvWydjc3MnXSkgJiYgJGluZm9bJ2NzcyddICkgewogICAgICAgICAgICBpZiggIWlzX2FycmF5KCRpbmZvWydjc3MnXSkgKSAkaW5mb1snY3NzJ10gPSBleHBsb2RlKCcsJywkaW5mb1snY3NzJ10pOwoKICAgICAgICAgICAgZm9yZWFjaCggJGluZm9bJ2NzcyddIGFzICRvbmVfY3NzICkgewogICAgICAgICAgICAgICAgJGJuID0gYmFzZW5hbWUoJG9uZV9jc3MpOwogICAgICAgICAgICAgICAgaWYoIGlzc2V0KCRjc3NbJGJuXSkgKSBjb250aW51ZTsKCiAgICAgICAgICAgICAgICAkdXJsID0gJGluZm9bJ2Jhc2VfdXJsJ10uJy8nLiRvbmVfY3NzOwogICAgICAgICAgICAgICAgJGNzc1skYm5dID0gJHVybDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJGluZm9bJ2hhbmRsZWQnXSA9IDE7CiAgICB9Cn0KCmlmKCAhaXNfYXJyYXkoJHRoaXMtPl9saWJzKSApICR0aGlzLT5fbGlicyA9IGFycmF5X2tleXMoJGxpYnJhcmllcyk7Cgpmb3JlYWNoKCAkdGhpcy0+X2xpYnMgYXMgJG9uZSApIHsKICAgIGpxdWVyeXRvb2xzX2luY2pzKCRvbmUsJGxpYnJhcmllcywkZXhjbHVkZXMsJGxpYnMsJGNzcywkZG9fanMsJGRvX2NzcywkZG9fY2RuKTsKfQoKJGxpYnMgPSBhcnJheV91bmlxdWUoJGxpYnMpOwokY3NzID0gYXJyYXlfdW5pcXVlKCRjc3MpOwoKaWYoIGNvdW50KCRsaWJzKSAmJiAkZG9fanMgKSAkc21hcnR5LT5hc3NpZ24oJ2xpYnMnLCRsaWJzKTsKaWYoIGNvdW50KCRjc3MpICYmICRkb19jc3MgKSAkc21hcnR5LT5hc3NpZ24oJ2NzcycsJGNzcyk7CgppZiggY291bnQoJGNzcykgfHwgY291bnQoJGxpYnMpICkgewogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdpbmNqcy50cGwnKTsKICAgICRyZWFkeSA9IFRSVUU7CiAgICBpZiggaXNzZXQoJHBhcmFtc1snbm9fcmVhZHknXSkgKSAkcmVhZHkgPSAhY21zX3RvX2Jvb2woJHBhcmFtc1snbm9fcmVhZHknXSk7CiAgICBpZiggJHJlYWR5ICkgJHRoaXMtPkRvQWN0aW9uKCdyZWFkeScsJ2pxdHInLGFycmF5KCkpOwp9CgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/action.ready.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEEgdG9vbGJveCBvZiBjb252ZW5pZW5jZXMgdG8gcHJvdmlkZSBkeW5hbWljIGphdmFzY3JpcHR5IGZ1bmN0aW9uYWxpdHkKIyAgZm9yIENNUyBtb2R1bGVzIGFuZCB3ZWJzaXRlIGRlc2lnbmVycy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiMgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAojIGFzIGFuIGFkZG9uIG1vZHVsZSB0byBDTVMgTWFkZSBTaW1wbGUuICBZb3UgbWF5IG5vdCB1c2UgdGhpcyBzb2Z0d2FyZQojIGluIGFueSBOb24gR1BMIHZlcnNpb24gb2YgQ01TIE1hZGUgc2ltcGxlLCBvciBpbiBhbnkgdmVyc2lvbiBvZiBDTVMKIyBNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4KIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKCiR0X2xpYnMgPSBhcnJheSgpOwppZiggaXNfYXJyYXkoJHRoaXMtPl9saWJzKSApIHsKICBmb3JlYWNoKCR0aGlzLT5fbGlicyBhcyAkb25lKSB7CiAgICAkdF9saWJzWyRvbmVdID0gMTsKICB9Cn0KaWYoIGNvdW50KCR0X2xpYnMpICkgewogICRzbWFydHktPmFzc2lnbignanF1ZXJ5X2xpYnMnLCR0X2xpYnMpOwogIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgncmVhZHkudHBsJyk7Cn0KCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.require.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCmlmKCAhaXNzZXQoJGdDbXMpICkgZXhpdDsKaWYoICFpc3NldCgkcGFyYW1zWydsaWInXSkgfHwgJHBhcmFtc1snbGliJ10gPT0gJycgKSByZXR1cm47CgppZiggIWlzX2FycmF5KCR0aGlzLT5fbGlicykgKSAkdGhpcy0+X2xpYnMgPSBhcnJheSgpOwokbGlicyA9IGV4cGxvZGUoJywnLCRwYXJhbXNbJ2xpYiddKTsKZm9yZWFjaCggJGxpYnMgYXMgJGxpYiApIHsKICAkdGhpcy0+X2xpYnNbXSA9IHN0cnRvbG93ZXIodHJpbSgkbGliKSk7Cn0KCi8vIHRoYXQncyBpdCwgbm90aGluZyBtb3JlLgovLyByZW1lbWJlciB0byBjYWxsIHRoaXMgd2l0aCBub2NhY2hlIGF0dHJpYnV0ZS4KCiMKIyBFT0YKIwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/changelog.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT4xLjAuNCAtIE9jdG9iZXIgMjAwOQogICAgPHA+QWRkcyBqc29uIHN1cHBvcnQuPC9wPgogIDwvbGk+CiAgPGxpPjEuMC41IC0gTm92ZW1iZXIgMjAwOQogICAgPHA+QWRkcyBub19jc3MgYW5kIG5vX2pzIG9wdGlvbnMgdG8gdGhlIGluY2pzIGFjdGlvbi48L3A+CiAgPC9saT4KICA8bGk+MS4wLjYgLSBBcHJpbCAyMDEwCiAgICA8cD5BZGRzIGNhbGd1eXMgZGF0ZSB1dGlscyBwbHVnaW4uPC9wPgogIDwvbGk+CiAgPGxpPjEuMC45IC0gU2VwdGVtYmVyIDIwMTAKICAgIDxwPkFkZHMgbm9fanF1ZXJ5IG9wdGlvbiB0byB0aGUgaW5janMgYWN0aW9uLjwvcD4KICAgIDxQPkRvIG5vdCBvdXRwdXQganF1ZXJ5IHRhZ3MgZm9yIGFueSBtb2R1bGUgYWN0aW9ucyBvciBhZG1pbiBhY3Rpb25zIGlmIENNUyBWZXJzaW9uIGlzID49IENNUyAxLjktYmV0YTE8L3A+CiAgPC9saT4KICA8bGk+MS4wLjEwIC0KICAgIDxwPk1pbm9yIGZpeGVzLjwvcD4KICA8L2xpPgogIDxsaT4xLjAuMTEgLSBKdW5lIDIwMTEKICAgIDx1bD4KICAgICAgPGxpPk1pbm9yIEZpeGVzLjwvbGk+CiAgICAgIDxsaT5Nb3ZlcyBDaGFuZ2Vsb2cgRXh0ZXJuYWwuPC9saT4KICAgICAgPGxpPk1pbm9yIGNoYW5nZSBmb3IgMS4xMCBjb21wYXRpYmlsaXR5LjwvbGk+CiAgICAgIDxsaT5VcGRhdGUgZGVwZW5kZW5jaWVzLjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPjEuMSAtIEp1bHkgMjAxMgogICA8dWw+CiAgICAgPGxpPk1vdmUgaGVscCBleHRlcm5hbC48L2xpPgogICAgIDxsaT5VcGdyYWRlIGpxdWVyeSBhbmQgZmFuY3lib3guPC9saT4KICAgPHVsPgogIDwvbGk+CiAgPGxpPjEuMiAtIEphbnVhcnkgMjAxMwogICAgPHVsPgogICAgICA8bGk+QWRkcyB0aGUgcmVxdWlyZSBhbmQgcGxhY2VtYXJrZXIgYWN0aW9ucy48L2xpPgogICAgICA8bGk+VXBncmFkZXMgYWxsIGxpYnJhcmllcyBhbmQgcmVmb3JtYXRzIHRoZW0gaW50byBhIGRpZmZlcmVudCBzdHJ1Y3R1cmUuPC9saT4KICAgICAgPGxpPkFkZHMganF1ZXJ5IHVpLCAgYW5kIENETiBzdXBwb3J0LjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPnYxLjMgLSBKdW5lIDIwMTQKICAgICAgPHVsPgogICAgICAgIDxsaT5BZGRzIHN1cHBvcnQgZm9yIHRoZSBjZ2pzX3JlcXVpcmUgc3R1ZmYgaW4gQ0dFeHRlbnNpb25zLjwvbGk+Cgk8bGk+QWRkcyBhIG5ldyBjb21ib2JveCBwbHVnaW4uPC9saT4KCTxsaT5BZGRzIGpzdmlld3MgcGx1Z2luLjwvbGk+CiAgICAgIDwvdWw+CiAgICA8L3VsPgogIDwvbGk+CiAgPGxpPnYxLjMsNQogICAgICA8dWw+CiAgICAgICAgPGxpPk1pbm9yIGltcHJvdmVtZW50cy48L2xpPgogICAgICA8L3VsPgogICAgPC91bD4KICA8L2xpPgogIDxsaT52MS4zLjYKICAgIDx1bD4KICAgICAgPGxpPk5vdyBmbGFnIGRpZmZlcmVudCBtaW5pZmljYXRpb25zIGZvciBkaWZmZXJlbnQgbGlicmFyaWVzICh3aGVuIHVzaW5nIGNnanNfcmVuZGVyKTwvbGk+CiAgICAgIDxsaT5VcGdyYWRlIGpxdWVyeSB0byAxLjExLjM8L2xpPgogICAgICA8bGk+VXBncmFkZSBqcXVlcnktdWkgdG8gMS4xMS40PC9saT4KICAgIDwvdWw+CiAgPC9saT4KICA8bGk+djEuMy44CiAgICA8cD5NaW5vciBidWcgZml4ZXMuPC9wPgogIDwvbGk+CiAgPGxpPnYxLjMuOQogICAgPHVsPgogICAgICA8bGk+VXBncmFkZSB0aGUganF1ZXJ5IGZpbGUgdXBsb2FkIGxpYnJhcnkuPC9saT4KICAgIDwvdWw+CiAgPC9saT4KPC91bD4K]]></data>
	</file>
	<file>
	  <filename>/help.inc</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGgzPldoYXQgaXMgdGhpcz88L2gzPgo8cD5UaGlzIG1vZHVsZSBhZGRzIHRoZSBmdW5jdGlvbmFsaXR5IG9mIDxhIGhyZWY9Imh0dHA6Ly93d3cuanF1ZXJ5LmNvbSI+alF1ZXJ5PC9hPiBhbmQgdmFyaW91cyBhZGRvbiBsaWJyYXJpZXMgdG8gQ01TIE1hZGUgU2ltcGxlIHBhZ2UsIGFuZCBtb2R1bGVzIChldmVuIGluIHRoZSBhZG1pbiBzZWN0aW9uKSwgY29udmVuaWVudGx5IGFuZCBlYXNpbHkuICBJdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgYW5kIHNpbXBsZSB3YXkgdG8gaW5jbHVkZSBqcXVlcnkgYW5kIGpxdWVyeSBkZXBlbmRlbnQgbGlicmFyaWVzIGludG8geW91ciBDTVNNUyBjb250ZW50IHBhZ2UuPC9wPgo8aDM+SG93IGRvIEkgdXNlIGl0PzwvaDM+CjxwPkVuYWJsaW5nIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhIHR3byBzdGVwIHByb2Nlc3M6PC9wPgo8dWw+CiAgPGxpPjEuICBFbmFibGUgdGhlIGpxdWVyeSBsaWJyYXJpZXMgdGhhdCB5b3Ugd2FudCBieSBjYWxsaW5nIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9JnF1b3Q7bGlicmFyeSBuYW1lJnF1b3Q7IG5vY2FjaGV9PC9jb2RlPiBpbiB5b3VyIHBhZ2UgY29udGVudC4KICAgIDxwPlRoaXMgdGFnIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgdG8gZW5hYmxlIG11bHRpcGxlIGxpYnJhcmllcy4gIHRoZSBsaWIgYXJndW1lbnQgYWxzbyBzdXBwb3J0cyBwYXNzaW5nIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbGlicmFyeSBuYW1lcy48L3A+CiAgPC9saT4KICA8bGk+Mi4gIENhbGwgPGNvZGU+e0pRdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4gaW4gdGhlIGFwcHJvcHJpYXRlIHBhcnQgb2YgeW91ciBwYWdlIHRlbXBsYXRlLgogICAgPHVsPgogICAgICA8bGk+VG8gZW5hYmxlIEpRdWVyeVRvb2xzIGZvciBhIHNwZWNpZmljIHBhZ2UgaXQgaXMgb2Z0ZW4gdXNlZnVsIHRvIHBsYWNlIHRoZSA8Y29kZT57SlF1ZXJ5VG9vbHMgYWN0aW9uPXBsYWNlbWFya2VyIG5vY2FjaGV9PC9jb2RlPiB0YWcgaW4gdGhlIHBhZ2Ugc3BlY2lmaWMgbWV0YWRhdGEgZmllbGQgb2YgZWFjaCBjb250ZW50IHBhZ2UuPC9saT4KICAgICAgPGxpPlRvIGVuYWJsZSBKUXVlcnlUb29scyBvbiBhIHNpdGUgd2lkZSBiYXNpcyB0aGUgPGNvZGU+e0pxdWVyeVRvb2xzIGFjdGlvbj1wbGFjZW1hcmtlciBub2NhY2hlfTwvY29kZT4gdGFnIGNhbiBiZSBwbGFzZWQgaW4gdGhlIGdsb2JhbCBtZXRhZGF0YSBmaWVsZCBpbiB0aGUgZ2xvYmFsIHNldHRpbmdzLjwvbGk+CiAgICAgIDxsaT5Zb3UgbWF5IGFsc28gcGxhY2UgdGhlIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXJ9PC9jb2RlPiB0YWcgaW4gZWFjaCBzcGVjaWZpYyBwYWdlIHRlbXBsYXRlLCBhdCB0aGUgYm90b29tIG9mIHRoZSB0ZW1wbGF0ZSBhYm92ZSA8L2JvZHk+IG9yIGFueXdoZXJlIGluIHRoaGUgaGVhZCBzZWN0aW9uLjwvbGk+CiAgICA8L3VsPgogIDwvbGk+CjwvdWw+CjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IHByb3ZpZGUgc2FtcGxlcyBhbmQgaW5zdHJ1Y3Rpb25zIGFzIHRvIGhvdyB0byB1c2UganF1ZXJ5IG9yIHRoZSB2YXJpb3VzIGFkZG9uIGxpYnJhcmllcyB0aGF0IHdlIGluY2x1ZGUuICB0byBsZWFybiBob3cgdG8gdXNlIHRoZXNlIGxpYnJhcmllcyB5b3Ugd2lsbCBuZWVkIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBwbHVnaW5zIGF0IHRoZWlyIHJlc3BlY3RpdmUgaG9tZSBwYWdlLjwvcD4KCjxoMz5XaGF0IGpxdWVyeSB2ZXJzaW9uIGlzIGluY2x1ZGVkPzwvaDM+CjxwPkN1cnJlbnRseSBKUXVlcnlUb29scyB1c2VzIGpxdWVyeSAxLjguMzwvcD4KPGgzPldoYXQgSlF1ZXJ5IHBsdWdpbnMgYXJlIGluY2x1ZGVkPC9oMz4KPHVsPgogIDxsaT50YWJsZXNvcnRlciA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vdGFibGVzb3J0ZXIuY29tIj5odHRwOi8vdGFibGVzb3J0ZXIuY29tPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+CjxwPi0tIFRvIGFsbG93IHNvcnRpbmcgeW91ciB0YWJsZXMsIGdpdmUgdGhlIGZvbGx3aW5nIGNsYXNzZXMgdG8gdGhlIHRhYmxlIGRlZmluaXRpb246IGNtc19zb3J0YWJsZSB0YWJsZXNvcnRlci4gaS5lOiA8Y29kZT4mbHQ7dGFibGUgY2xhc3M9ImNtc19zb3J0YWJsZSB0YWJsZXNvcnRlciImZ3Q7Li4uJmx0Oy90YWJsZSZndDs8L2NvZGU+PC9wPgogIDwvbGk+CiAgPGxpPmpxdWVyeTwvbGk+CiAgPGxpPmpxdWVyeSB1aSAtIHNtb290aG5lc3MgdGhlbWUuPC9saT4KICA8bGk+Y2x1ZXRpcCA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC8iPmh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwLzwvYT4gZm9yIHVzYWdlIGluc3RydWN0aW9ucyk8L2VtPjwvbGk+CiAgPGxpPmZvcm0gPGVtPihzZWUgPGEgaHJlZj0iaHR0cDovL21hbHN1cC5jb20vanF1ZXJ5L2Zvcm0vIj5odHRwOi8vbWFsc3VwLmNvbS9qcXVlcnkvZm9ybS88L2E+IGZvciB1c2FnZSBpbnN0cnVjdGlvbnMpPC9lbT48L2xpPgogIDxsaT5mYW5jeWJveCA8ZW0+KHNlZSA8YSBocmVmPSJodHRwOi8vZmFuY3kua2xhZGUubHYvIj5odHRwOi8vZmFuY3kua2xhZGUubHYvPC9hPiBmb3IgdXNhZ2UgaW5zdHJ1Y3Rpb25zKTwvZW0+PC9saT4KICA8bGk+anNvbjwvbGk+CiAgPGxpPmxpZ2h0Ym94PC9saT4KICA8bGk+ZmlsZXVwbG9hZCAtIFRoZSBibHVlaW1wIGpxdWVyeSBmaWxlIHVwbG9hZCBsaWJyYXJ5LjwvbGk+CjwvdWw+CjxoMz5FeGFtcGxlOjwvaDM+CiA8cD5TbyB5b3UgaGF2ZSB1cGxvYWRlZCBzb21lIGZpbGVzIHRvIGEgY2F0ZWdvcnkgaW4gdGhlIHVwbG9hZHMgbW9kdWxlLCBhbmQgeW91IHdhbnQgdG8gdXNlIGZhbmN5Ym94IHRvIHByZXZpZXcgdGhlIGltYWdlcyBmcm9tIGFuIFVwbG9hZHMgbW9kdWxlIHN1bW1hcnkgdmlldy4gVGhpcyBpcyBhIHNpbXBsZSAzIHN0ZXAgcHJvY2Vzczo8L3A+CjxvbD4KICAgPGxpPk1vZGlmeSB5b3VyIHVwbG9hZHMgc3VtbWFyeSB0ZW1wbGF0ZSB0byBzb21ldGhpbmcgc2ltaWxhciB0byB0aGlzOgo8cHJlPjxjb2RlPjxzcGFuIHN0eWxlPSJjb2xvcjogYmx1ZTsiPntKUXVlcnlUb29scyBhY3Rpb249cmVxdWlyZSBsaWI9ZmFuY3lib3ggbm9jYWNoZX08L3NwYW4+Cntmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09J2VudHJ5JyBuYW1lPSd1cGxvYWRzJ30KICAmbHQ7ZGl2IGNsYXNzPSJ1cGxvYWQiIHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDMzJTsiJmd0OwogIHtpZiBpc3NldCgkZW50cnktPnRodW1ibmFpbF91cmwpfQogICZsdDthIGNsYXNzPSJmYW5jeWJveCIgaHJlZj0ieyRlbnRyeS0+b3JpZ2ZpbGVfdXJsfSIgdGl0bGU9InskZW50cnktPnVwbG9hZF9uYW1lfSImZ3Q7Jmx0O2ltZyBzcmM9InskZW50cnktPnRodW1ibmFpbF91cmx9IiBhbHQ9IiIvJmd0OyZsdDsvYSZndDsKICB7L2lmfQogICZsdDsvZGl2Jmd0Owp7L2ZvcmVhY2h9CiZsdDtkaXYgc3R5bGU9ImNsZWFyOiBib3RoOyImZ3Q7Jmd0Oy9kaXYmbHQ7PC9jb2RlPjwvcHJlPgogICA8cD5Ob3RlIHRoZSBjYWxsIHRvIEpRdWVyeVRvb2xzIHRvIGluY2x1ZGUgdGhlIGZhbmN5Ym94IGxpYnJhcnkuIEFkZGl0aW9uYWxseSwgbm90ZSB0aGUgY2xhc3MgZ2l2ZW4gdG8gdGhlIDxlbT5hPC9lbT4gdGFnLjwvcD4KICA8L2xpPgogIDxsaT5DYWxsIDxjb2RlPntKUXVlcnlUb29scyBhY3Rpb249cGxhY2VtYXJrZXIgbm9jYWNoZX08L2NvZGU+CiAgICA8cD5UaGVyZSBhcmUgYXQgbGVhc3QgZm91ciBsb2NhdGlvbnMgd2hlcmUgdGhpcyB0YWcgY2FuIGJlIGNhbGxlZDo8L3A+CiAgICA8dWw+CiAgICAgIDxsaT5JbiB0aGUgcGFnZSB0ZW1wbGF0ZSBkaXJlY3RseSBiZWZvcmUgdGhlIDxjb2RlPiZsdDsvYm9keSZndDs8L2NvZGU+IHRhZy48L2xpPgogICAgICA8bGk+SW4gdGhlIHBhZ2UgdGVtcGxhdGUgZGlyZWN0bHkgYmVmb3JlIHRoZSA8Y29kZT4mbHQ7L2hlYWQmZ3Q7PC9jb2RlPiB0YWcuPC9saT4KICAgICAgPGxpPkluIHRoZSBwYWdlIG1ldGFkYXRhIGZpZWxkIHdoZW4gZWRpdGluZyBjb250ZW50LjwvbGk+CiAgICAgIDxsaT5JbiB0aGUgZ2xvYmFsIG1ldGFkYXRhIGZpZWxkIGluIHRoZSBnbG9iYWwgc2V0dGluZ3MgcGFnZS48L2xpPgogICAgPC91bD4KICA8L2xpPgogIDxsaT5DYWxsIHRoZSBVcGxvYWRzIG1vZHVsZSBmcm9tIGEgcGFnZS4gIGkuZTo8YnIvPgogICAgPHByZT48Y29kZT57VXBsb2FkcyBjYXRlZ29yeT1jYXRlZ29yeV9uYW1lfTwvY29kZT48L3ByZT4KICA8L2xpPgo8L29sPgo8aDM+QnVpbHQgaW4gUmVhZHkgU2NyaXB0czwvaDM+CjxwPlRoaXMgbW9kdWxlIHN1cHBvcnRzIHNvbWUgc2ltcGxlIHJlYWR5IHN0YXRlcyB0byBlYXNlIGluIGRldmVsb3BtZW50LiAgQWxsIG9mIHRoZXNlIGNhbiBiZSBvdmVyd3JpdHRlbiBpbiB5b3VyIG93biBqYXZhc2NyaXB0OjwvcD4KPHVsPgogICAgPGxpPmZhbmN5Ym94IC0gZmFuY3lib3ggd2lsbCB3b3JrIG9uIGFueSBhIHRhZyB3aXRoIGEgY2xhc3Mgb2YgZmFuY3lib3g6ICAkKCdhLmZhbmN5Ym94JykuZmFuY3lib3goKQogICAgICA8cHJlPjxjb2RlPiZsdDthIGNsYXNzPSZxdW90O2ZhbmN5Ym94JnF1b3Q7IGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5teXNpdGUuY29tL3VwbG9hZHMvaW1hZ2VzL2ltYWdlLmpwZyZxdW90OyZndDsmbHQ7aW1nIHNyYz0mcXVvdDtodHRwOi8vd3d3Lm15c2l0ZS5jb20vdXBsb2Fkcy9pbWFnZXMvdGh1bWJfaW1hZ2UuanBnJnF1b3Q7LyZndDsmbHQ7YSZndDs8L2NvZGU+PC9wcmU+CgkJICAgIDxwPjxzdHJvbmc+SGludDo8L3N0cm9uZz4gVXNlIENHU21hcnRJbWFnZSB0byBhdm9pZCBoYXZpbmcgdG8gY3JlYXRlIGFuZCBtYW5hZ2UgdGh1bWJuYWlscyA8ZW0+KHJlcXVpcmVzIGRvd25sb2FkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSBDR1NtYXJ0SW1hZ2UgbW9kdWxlKTwvZW0+OjwvcD4KCQkgICAgPHByZT48Y29kZT4mbHQ7YSBjbGFzcz0mcXVvdDtmYW5jeWJveCZxdW90OyBocmVmPSZxdW90O3tDR1NtYXJ0SW1hZ2Ugc3JjPSdpbWFnZXMvaW1hZ2UuanBnJyBub2VtYmVkPTF9JnF1b3Q7Jmd0O3tDR1NtYXJ0SW1hZ2Ugc3JjPSdpbWFnZXMvaW1hZ2UuanBnJyB3aWR0aD0xMDAgaGVpZ2h0PTEwMH0mbHQ7YSZndDs8L3ByZT48L2NvZGU+CiAgICA8L2xpPgogICAgPGxpPmxpZ2h0Ym94IC0gbGlnaHRib3ggd2lsbCB3b3JrIG9uIGFueSBhIHRhZyB3aXRoIGEgY2xhc3Mgb2YgbGlnaHRib3g6ICAkKCdhLmxpZ2h0Ym94JykubGlnaHRib3goKTwvbGk+CiAgICA8bGk+Y2x1ZXRpcCAtIGNsdWV0aXAgd2lsbCB3b3JrIG9uIGFueSBhIHRhZyB3aXRoIGEgY2xhc3Mgb2YgY2x1ZXRpcDogICQoJ2EuY2x1ZXRpcCcpLmNsdWV0aXAoKTwvbGk+CiAgICA8bGk+dGFibGVzb3J0ZXIgLSB0YWJsZXNvcnRlciB3aWxsIHdvcmsgb24gYW55IHRhYmxlIHRhZyB3aXRoIGEgY2xhc3Mgb2YgY21zX3NvcnRhYmxlOiAkKCd0YWJsZS5jbXNfc29ydGFibGUnKS50YWJsZVNvcnRlcigpPC9saT4KPC91bD4KPGgzPkFib3V0IHNtYXJ0eSBjYWNoaW5nPC9oMz4KPHA+VGhlIHJlcXVpcmUsIGFuZCBwbGFjZW1hcmtlciBhY3Rpb25zIGRvIG5vdCBzdXBwb3J0IHNtYXJ0eSBjYWNoaW5nLiAgSXQgaXMgdGhlcmVmZXJlIGNyaXRpY2FsIHRoYXQgdGhlIG5vY2FjaGUgYXR0cmlidXRlIGJlIHVzZWQgb24gY2FsbHMgdG8gdGhlIEpRdWVyeVRvb2xzIG1vZHVsZS48L3A+CjxoMz5BYm91dCB0aGUgcGxhY2VtYXJrZXIgYWN0aW9uLjwvaDM+CjxwPlRoZSBwbGFjZW1hcmtlciBhY3Rpb24gZG9lcyB0aGUgam9iIG9mIGdlbmVyYXRpbmcgdGhlIGh0bWwgdG8gaW5zZXJ0IHRoZSBqcXVlcnkgc2NyaXB0cywgYW5kIHRoZSB2YXJpb3VzIGFkZG9uIGxpYnJhcmllcyB0aGF0IHdlcmUgcmVxdWVzdGVkIHZpYSB0aGUgcmVxdWlyZSBhY3Rpb24uICBUaGVyZWZvcmUgdGhlIHBsYWNlbWFya2VyIGFjdGlvbiBtdXN0IGJlIGNhbGxlZCBBRlRFUiBhbGwgY2FsbHMgdG8gdGhlIHJlcXVpcmUgYWN0aW9uLiAgIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCBDTVNNUyBkaXZpZGVzIHBhZ2UgdGVtcGxhdGVzIGludG8gdGhyZWUgcG9ydGlvbnMgYW5kIHByb2Nlc3NlcyB0aGVtIGluIHRoaXMgb3JkZXI6ICBUaGUgdG9wIHBvcnRpb24gb2YgdGhlIHBhZ2UgYmVmb3JlIHRoZSAmbHQ7aHRtbCZndDsgdGFnLiAgVGhlIGJvZHkgc2VjdGlvbiwgYW5kIHRoZSBoZWFkIHNlY3Rpb24uPC9wPgoKPGgzPlN1cHBvcnQ8L2gzPgo8cD5UaGUgbW9kdWxlIGF1dGhvciBpcyBpbiBubyB3YXkgb2JsaWdhdGVkIHRvIHByaXZpZGUgc3VwcG9ydCBmb3IgdGhpcyBjb2RlIGluIGFueSBmYXNoaW9uLiAgSG93ZXZlciwgdGhlcmUgYXJlIGEgbnVtYmVyIG9mIHJlc291cmNlcyBhdmFpbGFibGUgdG8gaGVscCB5b3Ugd2l0aCBpdDo8L3A+Cjx1bD4KPGxpPkEgYnVnIHRyYWNraW5nIGFuZCBmZWF0dXJlIHJlcXVlc3Qgc3lzdGVtIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgbW9kdWxlIDxhIGhyZWY9Imh0dHA6Ly9kZXYuY21zbWFkZXNpbXBsZS5vcmcvcHJvamVjdHMvanF1ZXJ5dG9vbHMiPmhlcmU8L2E+LiAgUGxlYXNlIGJlIHZlcmJvc2UgYW5kIGRlc2NyaXB0aXZlIHdoZW4gc3VibWl0dGluZyBidWcgcmVwb3J0cyBhbmQgZmVhdHVyZSByZXF1ZXN0cywgYW5kIGZvciBidWcgcmVwb3J0cyBlbnN1cmUgdGhhdCB5b3UgaGF2ZSBwcm92aWRlZCBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHRvIHJlbGlhYmx5IHJlcHJvZHVjZSB0aGUgaXNzdWUuPC9saT4KPGxpPkFkZGl0aW9uYWwgZGlzY3Vzc2lvbiBvZiB0aGlzIG1vZHVsZSBtYXkgYWxzbyBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnIj5DTVMgTWFkZSBTaW1wbGUgRm9ydW1zPC9hPi4gIFdoZW4gZGVzY3JpYmluZyBhbiBpc3N1ZSBwbGVhc2UgbWFrZSBhbiBlZmZvcnQgdG8gcHJpdmlkZSBhbGwgcmVsYXZhbnQgaW5mb3JtYXRpb24sIGEgdGhvcm91Z2ggZGVzY3JpcHRpb24gb2YgeW91ciBpc3N1ZSwgYW5kIHN0ZXBzIHRvIHJlcHJvZHVjZSBpdCBvciB5b3VyIGRpc2N1c3Npb24gbWF5IGJlIGlnbm9yZWQuPC9saT4KPGxpPlRoZSBhdXRob3IsIGNhbGd1eTEwMDAsIGNhbiBvZnRlbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC8jY21zIj5DTVMgSVJDIENoYW5uZWw8L2E+LjwvbGk+CjxsaT5MYXN0bHksIHlvdSBtYXkgaGF2ZSBzb21lIHN1Y2Nlc3MgZW1haWxpbmcgdGhlIGF1dGhvciBkaXJlY3RseS4gIEhvd2V2ZXIsIHBsZWFzZSB1c2UgdGhpcyBhcyBhIGxhc3QgcmVzb3J0LCBhbmQgZW5zdXJlIHRoYXQgeW91IGhhdmUgZm9sbG93ZWQgYWxsIGFwcGxpY2FibGUgaW5zdHJ1Y3Rpb25zIG9uIHRoZSBmb3JnZSwgaW4gdGhlIGZvcnVtcywgZXRjLjwvbGk+CjwvdWw+CgoKPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAxMiwgUm9iZXJ0IENhbXBiZWwgPGEgaHJlZj0ibWFpbHRvOmNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmciPiZsdDtjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJmd0OzwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi48L3A+CjxwPkhvd2V2ZXIsIGFzIGEgc3BlY2lhbCBleGNlcHRpb24gdG8gdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBkaXN0cmlidXRlZAphcyBhbiBhZGRvbiBtb2R1bGUgdG8gQ01TIE1hZGUgU2ltcGxlLiAgWW91IG1heSBub3QgdXNlIHRoaXMgc29mdHdhcmUKaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwpNYWRlIHNpbXBsZSB0aGF0IGRvZXMgbm90IGluZGljYXRlIGNsZWFybHkgYW5kIG9idmlvdXNseSBpbiBpdHMgYWRtaW4Kc2VjdGlvbiB0aGF0IHRoZSBzaXRlIHdhcyBidWlsdCB3aXRoIENNUyBNYWRlIHNpbXBsZS48L3A+CjxwPlRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCmFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCkZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCk9yIHJlYWQgaXQgPGEgaHJlZj0iaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMIj5vbmxpbmU8L2E+PC9wPgo=]]></data>
	</file>
	<file>
	  <filename>/JQueryTools.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA2IGJ5IFJvYmVydCBDYW1wYmVsbAojICAgICAgICAgKGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcpCiMgIEEgdG9vbGJveCBvZiBjb252ZW5pZW5jZXMgdG8gcHJvdmlkZSBkeW5hbWljIGphdmFzY3JpcHR5IGZ1bmN0aW9uYWxpdHkKIyAgZm9yIENNUyBtb2R1bGVzIGFuZCB3ZWJzaXRlIGRlc2lnbmVycy4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIENNUyAtIENNUyBNYWRlIFNpbXBsZSBpcyAoYykgMjAwNSBieSBUZWQgS3VscCAod2lzaHlAY21zbWFkZXNpbXBsZS5vcmcpCiMgVGhpcyBwcm9qZWN0cyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbgojIHNlY3Rpb24gdGhhdCB0aGUgc2l0ZSB3YXMgYnVpbHQgd2l0aCBDTVMgTWFkZSBzaW1wbGUuCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojRU5EX0xJQ0VOU0UKCi8qCmlmKCAhY2xhc3NfZXhpc3RzKCdDR0V4dGVuc2lvbnMnKSApIHsKICAkY2dleHRlbnNpb25zID0gY21zX2pvaW5fcGF0aChjbXNtcygpLT5jb25maWdbJ3Jvb3RfcGF0aCddLCdtb2R1bGVzJywnQ0dFeHRlbnNpb25zJywnQ0dFeHRlbnNpb25zLm1vZHVsZS5waHAnKTsKICBpZiggIWlzX3JlYWRhYmxlKCAkY2dleHRlbnNpb25zICkgKSB7CiAgICBlY2hvICc8aDE+PGZvbnQgY29sb3I9InJlZCI+RVJST1I6IFRoZSBDR0V4dGVuc2lvbnMgbW9kdWxlIGNvdWxkIG5vdCBiZSBmb3VuZCA1LjwvZm9udD48L2gxPic7CiAgICByZXR1cm47CiAgfQogIHJlcXVpcmVfb25jZSgkY2dleHRlbnNpb25zKTsKfQoqLwoKY2xhc3MgSlF1ZXJ5VG9vbHMgZXh0ZW5kcyBDR0V4dGVuc2lvbnMKewogIHByaXZhdGUgJF9yZXF1aXJlZF9saWJzOwoKICBmdW5jdGlvbiBHZXROYW1lKCkgeyByZXR1cm4gJ0pRdWVyeVRvb2xzJzsgfQogIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKTsgfQogIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7IHJldHVybiAnMS40LjAuMyc7IH0KICBmdW5jdGlvbiBHZXRIZWxwKCkgeyByZXR1cm4gZmlsZV9nZXRfY29udGVudHMoX19ESVJfXy4nL2hlbHAuaW5jJyk7IH0KICBmdW5jdGlvbiBHZXRBdXRob3IoKSB7IHJldHVybiAnY2FsZ3V5MTAwMCc7IH0KICBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsgcmV0dXJuICdjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnJzsgfQogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsgcmV0dXJuIEBmaWxlX2dldF9jb250ZW50cyhfX0RJUl9fLicvY2hhbmdlbG9nLmluYycpOyB9CiAgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7IHJldHVybiB0cnVlOyB9CiAgZnVuY3Rpb24gSGFzQWRtaW4oKSB7IHJldHVybiBmYWxzZTsgfQogIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpIHsgcmV0dXJuICdleHRlbnNpb25zJzsgfQogIGZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7IHJldHVybiAkdGhpcy0+TGFuZygnbW9kZGVzY3JpcHRpb24nKTsgfQogIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsgcmV0dXJuIGZhbHNlOyB9CiAgZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzKCkgeyByZXR1cm4gYXJyYXkoJ0NHRXh0ZW5zaW9ucyc9PicxLjU0LjQnKTsgfQogIGZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgeyByZXR1cm4gJzIuMS41JzsgfQogIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOyB9CiAgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7IHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOyB9CiAgZnVuY3Rpb24gVW5pbnN0YWxsUHJlTWVzc2FnZSgpIHsgcmV0dXJuICR0aGlzLT5MYW5nKCdwcmV1bmluc3RhbGwnKTsgfQogIGZ1bmN0aW9uIEFsbG93QXV0b0luc3RhbGwoKSB7IHJldHVybiBGQUxTRTsgfQogIGZ1bmN0aW9uIEFsbG93QXV0b1VwZ3JhZGUoKSB7IHJldHVybiBGQUxTRTsgfQoKICBmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKQogIHsKICAgICR0aGlzLT5SZXN0cmljdFVua25vd25QYXJhbXMoKTsKICAgICR0aGlzLT5SZWdpc3Rlck1vZHVsZVBsdWdpbigpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ2V4Y2x1ZGUnLENMRUFOX1NUUklORyk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbm9fY3NzJyxDTEVBTl9JTlQpOwogICAgJHRoaXMtPlNldFBhcmFtZXRlclR5cGUoJ25vX2NkbicsQ0xFQU5fSU5UKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdub19qcycsQ0xFQU5fSU5UKTsKICAgICR0aGlzLT5TZXRQYXJhbWV0ZXJUeXBlKCdub19qcXVlcnknLENMRUFOX0lOVCk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbm9fcmVhZHknLENMRUFOX0lOVCk7CiAgICAkdGhpcy0+U2V0UGFyYW1ldGVyVHlwZSgnbGliJyxDTEVBTl9TVFJJTkcpOwogIH0KCiAgZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkKICB7CiAgICAkdGhpcy0+UmVnaXN0ZXJNb2R1bGVQbHVnaW4oKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2FjdGlvbicsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fYWN0aW9uJykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignZXhjbHVkZScsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fZXhjbHVkZScpKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ2xpYicsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fbGliJykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbm9fY3NzJyxudWxsLCR0aGlzLT5MYW5nKCdwYXJhbV9ub19jc3MnKSk7CiAgICAkdGhpcy0+Q3JlYXRlUGFyYW1ldGVyKCdub19jZG4nLG51bGwsJHRoaXMtPkxhbmcoJ3BhcmFtX25vX2NkbicpKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ25vX2pzJyxudWxsLCR0aGlzLT5MYW5nKCdwYXJhbV9ub19qcycpKTsKICAgICR0aGlzLT5DcmVhdGVQYXJhbWV0ZXIoJ25vX2pxdWVyeScsbnVsbCwkdGhpcy0+TGFuZygncGFyYW1fbm9fanF1ZXJ5JykpOwogICAgJHRoaXMtPkNyZWF0ZVBhcmFtZXRlcignbm9fcmVhZHknLG51bGwsJHRoaXMtPkxhbmcoJ3BhcmFtX25vX3JlYWR5JykpOwogIH0KCiAgcHJvdGVjdGVkIGZ1bmN0aW9uIFJlZ2lzdGVyTGlicmFyaWVzKCRmb3JjZSA9IGZhbHNlKQogIHsKICAgICAgJF9mdWxscGF0aCA9IGZ1bmN0aW9uKCRkaXIsJGluKSB7CiAgICAgICAgICBpZiggIWlzX2FycmF5KCRpbikgKSAkaW4gPSBhcnJheSgkaW4pOwogICAgICAgICAgJF9vd2Q9Z2V0Y3dkKCk7CiAgICAgICAgICBjaGRpcigkZGlyKTsKICAgICAgICAgICRvdXQgPSBhcnJheSgpOwogICAgICAgICAgZm9yZWFjaCggJGluIGFzICRvbmUgKSB7CiAgICAgICAgICAgICAgaWYoIGlzX2ZpbGUoJG9uZSkgKSAkb3V0W10gPSAiJGRpci8kb25lIjsKICAgICAgICAgIH0KICAgICAgICAgIGNoZGlyKCRfb3dkKTsKICAgICAgICAgIHJldHVybiAkb3V0OwogICAgICB9OwoKICAgICAgLy8gY29udmVydCBhIHZlcmlmaWVkIGZpeCBwYXRoIHRvIGEgc21hcnR5IHRlbXBsYXRlIHdpdGggeyRyb290X3BhdGh9CiAgICAgIC8vIHRvIGhhbmRsZSBzaXRlIG1vdmVzIGFuZCBjcnVmdC4KICAgICAgJF90b3JlbHBhdGggPSBmdW5jdGlvbigkZm4pIHsKICAgICAgICAgIGlmKCAhaXNfYXJyYXkoJGZuKSApICRpbiA9IGFycmF5KCRmbik7CiAgICAgICAgICAkY29uZmlnID0gY21zX2NvbmZpZzo6Z2V0X2luc3RhbmNlKCk7CiAgICAgICAgICAkb3V0ID0gYXJyYXkoKTsKICAgICAgICAgIGZvcmVhY2goICRmbiBhcyAkb25lICkgewogICAgICAgICAgICAgIGlmKCBzdGFydHN3aXRoKCRvbmUsJGNvbmZpZ1sncm9vdF9wYXRoJ10pICkgewogICAgICAgICAgICAgICAgICAkb3V0W10gPSBzdHJfcmVwbGFjZSgkY29uZmlnWydyb290X3BhdGgnXSwneyRyb290X3BhdGh9Jywkb25lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gJG91dDsKICAgICAgfTsKCiAgICAgICRiYXNlZGlyID0gJHRoaXMtPkdldE1vZHVsZVBhdGgoKS4nL2xpYic7CiAgICAgICRkaXJzID0gZ2xvYigkYmFzZWRpci4nLyoubGliJyk7CiAgICAgICRsaWJyYXJpZXMgPSBhcnJheSgpOwogICAgICBpZiggaXNfYXJyYXkoJGRpcnMpICYmIGNvdW50KCRkaXJzKSApIHsKCgkgIGNtc191dGlsczo6Z2V0X21vZHVsZSgnQ0dFeHRlbnNpb25zJyk7CiAgICAgICAgICBmb3JlYWNoKCAkZGlycyBhcyAkZGlyICkgewogICAgICAgICAgICAgIGlmKCAhaXNfZGlyKCRkaXIpICkgY29udGludWU7CiAgICAgICAgICAgICAgaWYoICFpc19maWxlKCRkaXIuJy9pbmZvLmRhdCcpICkgY29udGludWU7CiAgICAgICAgICAgICAgJGJuID0gYmFzZW5hbWUoJGRpcik7CiAgICAgICAgICAgICAgJG5hbWUgPSBzdHJ0b2xvd2VyKHN1YnN0cigkYm4sMCwtNCkpOwogICAgICAgICAgICAgIGluY2x1ZGUoJGRpci4nL2luZm8uZGF0Jyk7CgogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICRsb2FkZXIgPSBuZXcgXENHRXh0ZW5zaW9uc1xqc2xvYWRlclxsaWJkZWZuKCRuYW1lKTsKICAgICAgICAgICAgICAgICAgJGxvYWRlci0+bW9kdWxlID0gJHRoaXMtPkdldE5hbWUoKTsKICAgICAgICAgICAgICAgICAgaWYoIGlzc2V0KCRpbmZvWydqc19ub21pbmlmeSddKSAmJiAkaW5mb1snanNfbm9taW5pZnknXSApICRsb2FkZXItPmpzX25vbWluaWZ5ID0gMTsKICAgICAgICAgICAgICAgICAgaWYoIGlzc2V0KCRpbmZvWydjc3Nfbm9taW5pZnknXSkgJiYgJGluZm9bJ2Nzc19ub21pbmlmeSddICkgJGxvYWRlci0+Y3NzX25vbWluaWZ5ID0gMTsKICAgICAgICAgICAgICAgICAgaWYoIGlzc2V0KCRpbmZvWydqcyddKSApIHsKICAgICAgICAgICAgICAgICAgICAgICR0bXAgPSAkX2Z1bGxwYXRoKCRkaXIsJGluZm9bJ2pzJ10pOwogICAgICAgICAgICAgICAgICAgICAgJHRtcCA9ICRfdG9yZWxwYXRoKCR0bXApOwogICAgICAgICAgICAgICAgICAgICAgJGxvYWRlci0+anNmaWxlID0gJHRtcDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiggaXNzZXQoJGluZm9bJ2NzcyddKSApIHsKICAgICAgICAgICAgICAgICAgICAgICR0bXAgPSAkX2Z1bGxwYXRoKCRkaXIsJGluZm9bJ2NzcyddKTsKICAgICAgICAgICAgICAgICAgICAgICRsb2FkZXItPmNzc2ZpbGUgPSAkX3RvcmVscGF0aCgkdG1wKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiggaXNzZXQoJGluZm9bJ2RlcGVuZHMnXSkgKSAkbG9hZGVyLT5kZXBlbmRzID0gJGluZm9bJ2RlcGVuZHMnXTsKICAgICAgICAgICAgICAgICAgXENHRXh0ZW5zaW9uc1xqc2xvYWRlclxqc2xvYWRlcjo6cmVnaXN0ZXIoJGxvYWRlciwkZm9yY2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjYXRjaCggXEV4Y2VwdGlvbiAkZSApIHsKICAgICAgICAgICAgICAgICAgZGVidWdfZGlzcGxheSgkZS0+R2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgICAgICAgZGVidWdfdG9fbG9nKCRlLT5HZXRNZXNzYWdlKCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1bnNldCgkaW5mbyk7CiAgICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIG5vdyBtYW51YWxseSByZWdpc3RlciBzb21lIGxpYnJhcmllcy4KICAgICAgJGxvYWRlciA9IG5ldyBcQ0dFeHRlbnNpb25zXGpzbG9hZGVyXGxpYmRlZm4oJ2NnX2RhdGVwaWNrZXInKTsKICAgICAgJGxvYWRlci0+Y2FsbGJhY2sgPSAnXEpRdWVyeVRvb2xzXGRhdGVwaWNrZXJfcGx1Z2luOjpsb2FkJzsKICAgICAgXENHRXh0ZW5zaW9uc1xqc2xvYWRlclxqc2xvYWRlcjo6cmVnaXN0ZXIoJGxvYWRlciwkZm9yY2UpOwogIH0KfSAvLyBjbGFzcwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0EKCgojQgoKCiNDCgojRAokbGFuZ1snZHBfdG9kYXknXSA9ICdUb2RheSc7CiRsYW5nWydkcF9jbG9zZSddID0gJ0Nsb3NlJzsKJGxhbmdbJ2RwX2Nob29zZSddID0gJ0Nob29zZSc7CiRsYW5nWydkcF9uZXh0J10gPSAnTmV4dCc7CiRsYW5nWydkcF9wcmV2J10gPSAnUHJldic7CgojRQoKCiNGCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdKUXVlcnkgVG9vbGJveCc7CgoKI0cKCgojSAoKCiNJCgoKI0oKCgojSwoKCiNMCgoKI00KJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSB0b29sYm94IG9mIEpxdWVyeSB1dGlsaXRpZXMgdG8gYWlkZSBpbiBjcmVhdGluZyBkeW5hbWljIGFuZCBmYW5jeSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlcyBhbmQgd2Vic2l0ZXMnOwoKI04KCgojTwoKCiNQCiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdTcGVjaWZ5IHRoZSBhY3Rpb24gdG8gYmUgY2FsbGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTo8dWw+PGxpPnJlcXVpcmUgLSBNYXJrcyB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBwYWdlIEhUTUwuICBTZWUgdGhlIGxpc3QgYWJvdmUgZm9yIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsaWJyYXJpZXMuPC9saT48bGk+cGxhY2VtYXJrZXIgLSBJbmRpY2F0ZXMgdGhlIHBsYWNlIGluIHRoZSBIVE1MIG91dHB1dCB3aGVyZSB0aGUgc2VsZWN0ZWQgbGlicmFyaWVzIHNob3VsZCBiZSBpbmNsdWRlZC48L2xpPjxsaT5pbmNqcyAtIDxlbT4oZGVwcmVjYXRlZCk8L2VtPiBJbmNsdWRlIHJlcXVpcmVkIGphdmFzY3JpcHQgZmlsZXMuPC9saT48bGk+cmVhZHkgLSA8ZW0+KGRlcHJlY2F0ZWQpPC9lbT4gT3V0cHV0IGRlZmF1bHQgcmVhZHkgZnVuY3Rpb24uPC9saT48L3VsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyBwYXJhbWV0ZXIgYWxsb3dzIGV4Y2x1ZGluZyBjZXJ0YWluIGpxdWVyeSBwbHVnaW5zIGZyb20gdGhlIG91dHB1dCBnZW5lcmF0ZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlOiB0YWJsZXNvcnRlcixjbHVldGlwLGZvcm0uJzsKJGxhbmdbJ3BhcmFtX2xpYiddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgcmVxdWlyZSBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBzcGVjaWZ5aW5nIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YganF1ZXJ5IGxpYnJhcmllcyB0byBpbnN0YWxsLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHdpbGwgZXhjbHVkZSBjc3MgdGFncyBmcm9tIGJlaW5nIG91dHB1dCc7CiRsYW5nWydwYXJhbV9ub19jZG4nXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFuZCBpbmNqcyBhY3Rpb25zLCB0aGlzIHdpbGwgcHJldmVudCBKUXVlcnlUb29scyBmcm9tIHVzaW5nIGEgQ0ROIFVSTCBmb3IgdGhlIGphdmFzY3JpcHQgbGlicmFyaWVzLCBpZiBvbmUgaXMgYXZhaWxhYmxlIChub3QgYWxsIGxpYnJhcmllcyBhcmUgYXZhaWxhYmxlIGJ5IGEgQ0ROJzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUgc2NyaXB0IHRhZ3MgZnJvbSBiZWluZyBvdXRwdXQnOwokbGFuZ1sncGFyYW1fbm9fanF1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUganF1ZXJ5IGZyb20gYmVpbmcgaW5jbHVkZWQnOwokbGFuZ1sncGFyYW1fbm9fcmVhZHknXSA9ICdBcHBsaWNhYmxlIG9ubHkgdG8gdGhlIHBsYWNlbWFya2VyIGFjdGlvbnMsIHRoaXMgd2lsbCBleGNsdWRlIGFueSByZWFkeSBmdW5jdGlvbnMgZnJvbSBiZWluZyBvdXRwdXQuJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnVGhlIEpRdWVyeVRvb2xzIG1vZHVsZSBoYXMgYmVlbiBpbnN0YWxsZWQuLi4uIGdldCBjcmFja2luJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdUaGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGhhcyBiZWVuIHVuaW5zdGFsbGVkJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1JlbW92aW5nIHRoaXMgbW9kdWxlIGNvdWxkIGRhbWFnZSB0aGUgYXBwZWFyYW5jZSBhbmQgZnVuY3Rpb25hbGl0eSBvZiB5b3VyIHdlYnNpdGUuICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/JzsKCiNRCgoKI1IKCgojUwoKCiNUCgoKI1UKCgojVgoKCiNXCgoKI1gKCgojWQoKCiNaCgoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeS1Ub29sYm94JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCBrJm91bWw7bm5lbiBiZXN0aW1tdGUgalF1ZXJ5LVBsdWdpbnMgdm9uIGRlciBBdXNnYWJlIGF1c2dlc2NobG9zc2VuIHdlcmRlbi4gTSZvdW1sO2dsaWNoZSBXZXJ0ZSBzaW5kOiB0YWJsZXNvcnRlciwgY2x1ZXRpcCwgZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0thbm4gbnVyIG1pdCBkZXIgQWt0aW9uICZxdW90O2luY2pzJnF1b3Q7IHZlcndlbmRldCB3ZXJkZW4uIERhbWl0IGsmb3VtbDtubmVuIGJlc3RpbW10ZSBqUXVlcnktUGx1Z2lucyBlaW5nZXNjaGxvc3NlbiB3ZXJkZW4sIHcmYXVtbDtocmVuZGRlc3NlbiBhbGxlIGFuZGVyZW4gYXVzZ2VzY2hsb3NzZW4gc2luZC4gV2lyZCBkaWVzZXIgUGFyYW1ldGVyIGFuZ2VnZWJlbiwgd2lyZCBkZXIgZXhjbHVkZS1QYXJhbWV0ZXIgaWdub3JpZXJ0LiBNJm91bWw7Z2xpY2hlIFdlcnRlIHNpbmQ6IHRhYmxlc29ydGVyLCBjbHVldGlwLCBmb3JtLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3ZXJkZW4gZGllIENTUy1UYWdzIHZvbiBkZXIgQXVzZ2FiZSBhdXNnZXNjaGxvc3Nlbi4nOwokbGFuZ1sncGFyYW1fbm9fanMnXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3ZXJkZW4gZGllIHNjcmlwdC1UYWdzIHZvbiBkZXIgQXVzZ2FiZSBhdXNnZXNjaGxvc3Nlbi4nOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdLYW5uIG51ciBtaXQgZGVyIEFrdGlvbiAmcXVvdDtpbmNqcyZxdW90OyB2ZXJ3ZW5kZXQgd2VyZGVuLiBEYW1pdCB3aXJkIGpRdWVyeSB2b20gTGFkZW4gYXVzZ2VzY2hsb3NzZW4uJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGllIGpRdWVyeS1Ub29scyB3dXJkZW4gaW5zdGFsbGllcnQgLi4uIGxvcyBnZWh0JiMwMzk7cyEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0RpZSBqUXVlcnktVG9vbHMgd3VyZGVuIGRlaW5zdGFsbGllcnQuJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0RpZSBFbnRmZXJudW5nIGRpZXNlcyBNb2R1bHMga2FubiBkYXMgRXJzY2hlaW51bmdzYmlsZCB1bmQgZGllIEZ1bmt0aW9uYWxpdCZhdW1sO3QgSWhyZXIgV2Vic2VpdGUgZXJoZWJsaWNoIGJlZWludHImYXVtbDtjaHRpZ2VuLiBXb2xsZW4gU2llIGRhcyB3aXJrbGljaD8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fa_FA.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSDYrNi52KjZhyDYp9io2LLYp9ixJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSB0b29sYm94IG9mIEpxdWVyeSB1dGlsaXRpZXMgdG8gYWlkZSBpbiBjcmVhdGluZyBkeW5hbWljIGFuZCBmYW5jeSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlcyBhbmQgd2Vic2l0ZXMnOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6PHVsPjxsaT5pbmNqcyAtIEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD4nOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhwbGljaXRseSBpbmNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyB3aGlsc3QgZXhjbHVkaW5nIGFsbCBvdGhlcnMuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBleGNsdWRlIHBhcmFtZXRlciB3aWxsIGJlIGlnbm9yZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGNzcyB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIHNjcmlwdCB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGpxdWVyeSBmcm9tIGJlaW5nIGluY2x1ZGVkJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnVGhlIEpRdWVyeVRvb2xzIG1vZHVsZSBoYXMgYmVlbiBpbnN0YWxsZWQuLi4uIGdldCBjcmFja2luJzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICdUaGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGhhcyBiZWVuIHVuaW5zdGFsbGVkJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1JlbW92aW5nIHRoaXMgbW9kdWxlIGNvdWxkIGRhbWFnZSB0aGUgYXBwZWFyYW5jZSBhbmQgZnVuY3Rpb25hbGl0eSBvZiB5b3VyIHdlYnNpdGUuICBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY29udGludWU/JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0JvJmljaXJjO3RlICZhZ3JhdmU7IG91dGlscyBKUXVlcnknOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdVbmUgYm8maWNpcmM7dGUgJmFncmF2ZTsgb3V0aWxzIGRlcyB1dGlsaXRhaXJlcyBKcXVlcnkgcG91ciBhaWRlciAmYWdyYXZlOyBsYSBjciZlYWN1dGU7YXRpb24gZGUgbW9kdWxlcyBldCBkZSBzaXRlcyB3ZWIgZHluYW1pcXVlcyBldCBzb3BoaXN0aXF1JmVhY3V0ZTtzIENNUyBNYWRlIFNpbXBsZSc7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdTcCZlYWN1dGU7Y2lmaWVyIGwmIzAzOTthY3Rpb24gJmFncmF2ZTsgcyZlYWN1dGU7bGVjdGlvbm5lci4gIExlcyB2YWxldXJzIHBvc3NpYmxlcyBzb250IDo8dWw+PGxpPmluY2pzIC0gSW5jbHV0IGxlcyBmaWNoaWVycyBqYXZhc2NyaXB0IHJlcXVpcy48L2xpPjxsaT5yZWFkeSAtIGZvbmN0aW9uIEpRdWVyeSAmIzAzOTtyZWFkeSYjMDM5OyBwYXIgZCZlYWN1dGU7ZmF1dC48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdWYWxhYmxlIHNldWxlbWVudCBwb3VyIGwmIzAzOTthY3Rpb24gaW5janMsIGNlIHBhcmFtJmVncmF2ZTt0cmUgcGVybWV0IGwmIzAzOTtleGNsdXNpb24gZGUgY2VydGFpbnMgcGx1Z2ljaWVscyBqcXVlcnkgZHUgY29udGVudSBnJmVhY3V0ZTtuJmVhY3V0ZTtyJmVhY3V0ZTsuICBMZXMgdmFsZXVycyBwb3NzaWJsZXMgc29udCA6IHRhYmxlc29ydGVyLCBjbHVldGlwLCBmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnVmFsYWJsZSBzZXVsZW1lbnQgcG91ciBsJiMwMzk7YWN0aW9uIGluY2pzLCBjZSBwYXJhbSZlZ3JhdmU7dHJlIHBlcm1ldCBsJiMwMzk7aW5jbHVzaW9uIGV4cGxpY2l0ZSBkZSBjZXJ0YWlucyBwbHVnaWNpZWxzIGpxdWVyeSB0b3V0IGVuIGV4Y2x1YW50IHRvdXMgbGVzIGF1dHJlcy4gU2kgY2UgcGFyYW0mZWdyYXZlO3RyZSBlc3QgciZlYWN1dGU7ZiZlYWN1dGU7cmVuYyZlYWN1dGU7LCBsZSBwYXJhbSZlZ3JhdmU7dHJlIGQmIzAzOTtleGNsdXNpb24gc2VyYSBpZ25vciZlYWN1dGU7LiAgTGVzIHZhbGV1cnMgcG9zc2libGVzIHNvbnQgdGFibGVzb3J0ZXIsIGNsdWV0aXAsIGZvcm0uJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ1ZhbGFibGUgc2V1bGVtZW50IHBvdXIgbCYjMDM5O2FjdGlvbiBpbmNqcywgY2VjaSBlbXAmZWNpcmM7Y2hlIGxlcyBiYWxpc2VzIGNzcyBkJiMwMzk7JmVjaXJjO3RyZSBnJmVhY3V0ZTtuJmVhY3V0ZTtyJmVhY3V0ZTtlcyc7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ1ZhbGFibGUgc2V1bGVtZW50IHBvdXIgbCYjMDM5O2FjdGlvbiBpbmNqcywgY2VjaSBlbXAmZWNpcmM7Y2hlIGxlcyBiYWxpc2VzIHNjcmlwdHMgZCYjMDM5OyZlY2lyYzt0cmUgZyZlYWN1dGU7biZlYWN1dGU7ciZlYWN1dGU7ZXMnOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdWYWxhYmxlIHNldWxlbWVudCBwb3VyIGwmIzAzOTthY3Rpb24gaW5janMsIGNlY2kgZW1wJmVjaXJjO2NoZSBKcXVlcnkgZCYjMDM5OyZlY2lyYzt0cmUgaW5jbHV0JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnTGUgbW9kdWxlIEpRdWVyeVRvb2xzIGEgJmVhY3V0ZTt0JmVhY3V0ZTsgaW5zdGFsbCZlYWN1dGU7Li4uLiBwYXNzZXogJmFncmF2ZTsgbCYjMDM5O2FjdGlvbic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnTGUgbW9kdWxlIEpRdWVyeVRvb2xzIGEgJmVhY3V0ZTt0JmVhY3V0ZTsgZCZlYWN1dGU7c2ludGFsbCZlYWN1dGU7JzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1N1cHByaW1lciBjZSBtb2R1bGUgcG91cnJhaXQgZW5kb21tYWdlciBsJiMwMzk7YXBwYXJlbmNlIGV0IGxhIGZvbmN0aW9ubmFsaXQmZWFjdXRlOyBkZSB2b3RyZSBzaXRlIHdlYi4gICZFY2lyYzt0ZXMtdm91cyBjZXJ0YWluZSBkZSB2b3Vsb2lyIHBvdXJzdWl2cmU/JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/hu_HU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBFc3prJm91bWw7enQmYWFjdXRlO3InOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdKcXVlcnkgZXN6ayZvdW1sO3omb3VtbDtrIHQmYWFjdXRlO3JoJmFhY3V0ZTt6YSwgYW1pIHNlZyZpYWN1dGU7dCB2b256Jm9hY3V0ZTsgJmVhY3V0ZTtzIGRpbmFtaWt1cyBDTVMgTWFkZSBTaW1wbGUgbW9kdWxvayAmZWFjdXRlO3Mgc2l0ZS1vayBrJmVhY3V0ZTtzeiZpYWN1dGU7dCZlYWN1dGU7cyZlYWN1dGU7YmVuLic7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdBZGQgbWVnIGEgbWVnaCZpYWN1dGU7dmFuZCZvYWN1dGU7IGFrY2kmb2FjdXRlO3QuIExlaGV0cyZlYWN1dGU7Z2VzICZlYWN1dGU7cnQmZWFjdXRlO2tlazo8dWw+PGxpPmluY2pzIC0gU3omdXVtbDtrcyZlYWN1dGU7Z2VzIGphdmFzY3JpcHQgZiZhYWN1dGU7amxvayBpbmNsdWRlLW9sJmFhY3V0ZTtzYS48L2xpPjxsaT5yZWFkeSAtIEFsYXAmZWFjdXRlO3J0ZWxtZXpldHQgcmVhZHkgZiZ1dW1sO2dndiZlYWN1dGU7bnkgdiZlYWN1dGU7Z3JlaGFqdCZhYWN1dGU7c2EuPC9saT48L3VsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleGNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyBmcm9tIHRoZSBvdXRwdXQgZ2VuZXJhdGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleHBsaWNpdGx5IGluY2x1ZGluZyBjZXJ0YWluIGpxdWVyeSBwbHVnaW5zIHdoaWxzdCBleGNsdWRpbmcgYWxsIG90aGVycy4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlIGV4Y2x1ZGUgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0EgSlF1ZXJ5VG9vbHMgbW9kdWx0IHNpa2VyZXNlbiB0ZWxlcCZpYWN1dGU7dGV0dCZ1dW1sO2suLi4ga2V6ZMWRZGhldCBhIGNyYWNrLWVsJmVhY3V0ZTtzISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnQSBKUXVlcnlUb29scyBtb2R1bHQgc2lrZXJlc2VuIGVsdCZhYWN1dGU7dm9sJmlhY3V0ZTt0b3R0dWsnOwokbGFuZ1sncHJldW5pbnN0YWxsJ10gPSAnRW5uZWsgYSBtb2R1bG5hayBheiBlbHQmYWFjdXRlO3ZvbCZpYWN1dGU7dCZhYWN1dGU7c2EgdCZvdW1sO25rcmV0ZWhldGkgYSBzaXRlIG1lZ2plbGVuJmVhY3V0ZTtzJmVhY3V0ZTt0IC8gZnVua2Npb25hbGl0JmFhY3V0ZTtzJmFhY3V0ZTt0LiBCaXp0b3MgZm9seXRhdG9kPyc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/it_IT.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnVW4ga2l0IGRpIHV0aWxpdCZhZ3JhdmU7IEpxdWVyeSBwZXIgYWl1dGFyZSBuZWxsYSBjcmVhemlvbmUgZGkgc2l0aSBlIG1vZHVsaSBDTVMgTWFkZSBTaW1wbGUgZGluYW1pY2kgZSBhY2NhdHRpdmFudGknOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3BlY2lmaWNhdGUgbCYjMDM5O2F6aW9uZSBkYSByaWNoaWFtYXJlLiBWYWxvcmkgcG9zc2liaWxpIHNvbm86PHVsPjxsaT5yZXF1aXJlIC0gQ29udHJhc3NlZ25hIGxlIGxpYnJlcmllIHNlbGV6aW9uYXJlIHBlciBsJiMwMzk7aW5jbHVzaW9uZSBuZWxsYSBwYWdpbmEgSFRNTC4gRmF0ZSByaWZlcmltZW50byBhbGxhIGxpc3RhIHNvdnJhc3RhbnRlIHBlciBsJiMwMzk7ZWxlbmNvIGRpIGxpYnJlcmllIGRpc3BvbmliaWxpLjwvbGk+IDxsaT5wbGFjZW1ha2VyIC0gSW5kaWNhIGxhIHBvc2l6aW9uZSBpbiBjdWkgdmVycmFubm8gaW5zZXJpdGUgbGUgbGlicmVyaWUgc2VsZXppb25hdGUgbmVsbCYjMDM5O291dHB1dCBIVE1MLjwvbGk+PGxpPmluY2pzIC0gPGVtPihkZXByZWNhdG8pPC9lbT4gSW5jbHVkZSBpIGZpbGUgamF2YXNjcmlwdCBuZWNlc3NhcmkuPC9saT48bGk+cmVhZHkgLSA8ZW0+KGRlcHJlY2F0byk8L2VtPiBJbnNlcmlzY2UgbGEgZnVuemlvbmUgcmVhZHkgcHJlZGVmaW5pdGEuPC9saT48L3VsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJpbGUgc29sbyBhbGwmIzAzOTthemlvbmUgcGxhY2VtYXJrZXIgZSBpbmNqcywgcXVlc3RvIHBhcmFtZXRybyBwZXJtZXR0ZSBsJiMwMzk7ZXNjbHVzaW9uZSBkaSBhbGN1bmkgcGx1Z2luIGpxdWVyeSBkYWxsJiMwMzk7b3V0cHV0IGdlbmVyYXRvLiBWYWxvcmkgcG9zc2liaWxpIHNvbm86IHRhYmxlc29ydGVyLCBjbHVldGlwLCBmb3JtLic7CiRsYW5nWydwYXJhbV9saWInXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSByZXF1aXJlLCBwZXJtZXR0ZSBkaSBzcGVjaWZpY2FyZSB1biYjMDM5O2VsZW5jbyBkaSBsaWJyZXJpZSBqcXVlcnkgc2VwYXJhdGUgZGEgdmlyZ29sYSBkYSBpbnN0YWxsYXJlLic7CiRsYW5nWydwYXJhbV9ub19jc3MnXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBwbGFjZW1hcmtlciBlIGluY2pzLCBlc2NsdWRlciZhZ3JhdmU7IGkgdGFnIGNzcyBkYWxsJiMwMzk7ZXNzZXJlIGVsYWJvcmF0aSBuZWxsJiMwMzk7b3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2NkbiddID0gJ0FwcGxpY2FiaWxlIHNvbG8gYWxsJiMwMzk7YXppb25lIHBsYWNlbWFya2VyIGUgaW5janMsIGltcGVkaXImYWdyYXZlOyBjaGUgSlF1ZXJ5VG9vbHMgdXRpbGl6emkgdW4gVVJMIENETiBwZXIgbGUgbGlicmVyaWUgamF2YXNjcmlwdCwgc2UgdmUgbmUgJmVncmF2ZTsgdW5hIGRpc3BvbmliaWxlIChub24gdHV0dGUgbGUgbGlicmVyaWUgc29ubyBkaXNwb25pYmlsaSB0cmFtaXRlIHVuIENETiknOwokbGFuZ1sncGFyYW1fbm9fanMnXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBwbGFjZW1hcmtlciBlIGluY2pzLCBlc2NsdWRlciZhZ3JhdmU7IGkgdGFnIHNjcmlwdCBkYWxsJiMwMzk7ZXNzZXJlIGVsYWJvcmF0aSBuZWxsJiMwMzk7b3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2pxdWVyeSddID0gJ0FwcGxpY2FiaWxlIHNvbG8gYWxsJiMwMzk7YXppb25lIHBsYWNlbWFya2VyIGUgaW5janMsIHNlcnZlIHBlciB0cmFsYXNjaWFyZSBsJiMwMzk7aW5jbHVzaW9uZSBkaSBqcXVlcnknOwokbGFuZ1sncGFyYW1fbm9fcmVhZHknXSA9ICdBcHBsaWNhYmlsZSBzb2xvIGFsbCYjMDM5O2F6aW9uZSBwbGFjZW1hcmtlciwgZXNjbHVkZXImYWdyYXZlOyBsJiMwMzk7ZXNlY3V6aW9uZSBkaSBxdWFsc2lhc2kgYXppb25lIHJlYWR5IG5lbGwmIzAzOTtvdXRwdXQuJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSWwgbW9kdWxvIEpRdWVyeVRvb2xzICZlZ3JhdmU7IHN0YXRvIGluc3RhbGxhdG8nOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0lsIG1vZHVsbyBKUXVlcnlUb29scyAmZWdyYXZlOyBzdGF0byBkaXNpbnN0YWxsYXRvJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ1JpbXVvdmVyZSBxdWVzdG8gbW9kdWxvIHBvdHJlYmJlIGRhbm5lZ2dpYXJlIGwmIzAzOTthc3BldHRvIGUgbGUgZnVuemlvbmFsaXQmYWdyYXZlOyBkZWwgdm9zdHJvIHNpdG8uIFNpZXRlIGNlcnRpIGRpIHZvbGVyZSBjb250aW51YXJlPyc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2RwX3RvZGF5J10gPSAnSSBkYWcnOwokbGFuZ1snZHBfY2xvc2UnXSA9ICdMdWtrJzsKJGxhbmdbJ2RwX2Nob29zZSddID0gJ1ZlbGcnOwokbGFuZ1snZHBfbmV4dCddID0gJ05lc3RlJzsKJGxhbmdbJ2RwX3ByZXYnXSA9ICdGb3JyaWdlJzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnRW4gdmVya3TDuHlrYXNzZSBtZWQgSnF1ZXJ5IHZlcmt0w7h5IHNvbSBiaXN0w6VyIGkgb3BwcmV0dGVsc2UgYXYgZHluYW1pc2tlIG9nIGZhbmN5IENNUyBNYWRlIFNpbXBsZSBtb2R1bGVyIGdvIG5ldHRzdGVkZXInOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0t1biBneWxkaWcgdGlsIGluY2pzIGhhbmRsaW5nZW4uIERlbm5lIHBhcmFtZXRlcmVuIHRpbGxhdGVyIMOlIHV0ZWx1a2tlIGJlc3RlbXRlIGpxdWVyeSBwcm9ncmFtdGlsbGVnZyBmcmEgdmlzbmluZ2VuIHNvbSBnZW5lcmVyZXMuIE11bGlnZSB2ZXJkaWVyIGVyOiB0YWJsZXNvcnRlcixjbHVldGlwLGZvcm0uJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ0dqZWxkZXIga3VuIHRpbCBpbmNqcyBoYW5kbGluZ2VuLCBkZXR0ZSB2aWwgZWtza2x1ZGVyZSBjc3Mga29kZXIgZnJhIMOlIGJsaSBzZW5kdCB1dCc7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ0dqZWxkZXIga3VuIHRpbCBpbmNqcyBoYW5kbGluZ2VuLCBkZXR0ZSB2aWwgZWtza2x1ZGVyZSBzY3JpcHQta29kZXIgZnJhIMOlIGJsaSBzZW5kdCB1dCc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0pRdWVyeVRvb2xzIG1vZHVsZW4gYWhyIGJsaXR0IGluc3RhbGxlcnQuLi4uIHByw7h2IGRlbic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWxlbiBoYXIgYmxpdHQgYXZpbnN0YWxsZXJ0JzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ8OFIGZqZXJuZSBkZW5uZSBtb2R1bGVuIGthbiBza2FkZSBvcHBmw7hyc2VsZW4gb2cgZnVua3Nqb25hbGl0ZXRlbiBww6UgZGl0dCBuZXR0c3RlZC4gRXIgZHUgc2lra2VyIHDDpSBhdCBkdSB2aWwgZm9ydHNldHRlIGF2aW5zdGFsbGFzam9uZW4/JzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBUb29sYm94ICc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0VlbiB2ZXJ6YW1lbGluZyB2YW4gSnF1ZXJ5IHRvb2xzLCBhbHMgaHVscCBiaWogaGV0IGNyZSZldW1sO3JlbiB2YW4gZHluYW1pc2NoZSBlbiBkZWNvcmF0aWV2ZSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlcyBlbiB3ZWJzaXRlcyc7CiRsYW5nWydwYXJhbV9hY3Rpb24nXSA9ICdHZWVmIGRlIGJld2Vya2luZyBvcCBkaWUgbW9ldCB3b3JkZW4gYWFuZ2Vyb2VwZW4uICBNb2dlbGlqa2Ugd2FhcmRlbiB6aWpuOjx1bD48bGk+aW5janMgLSBWb2VnIGRlIGJlbm9kaWdkZSBqYXZhc2NyaXB0IGJlc3RhbmRlbiB0b2UuPC9saT48bGk+cmVhZHkgLSBVaXRnYW5nIHN0YW5kYWFyZCBnZXJlZWQgZnVuY3RpZS48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdVaXRzbHVpdGVuZCB2YW4gdG9lcGFzc2luZyBvcCBkZSBpbmNqcyBiZXdlcmtpbmcsIERlemUgcGFyYW1ldGVyIG1hYWt0IGhldCBtb2dlbGlqayBtZXQgdWl0em9uZGVyaW5nIHZhbiBiZXBhYWxkZSBqcXVlcnkgcGx1Z2lucyB1aXQgdGUgc2x1aXRlbi4gTW9nZWxpamtlIHdhYXJkZW4gemlqbjogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnVWl0c2x1aXRlbmQgdmFuIHRvZXBhc3Npbmcgb3AgZGUgaW5janMgYmV3ZXJraW5nLCBEZXplIHBhcmFtZXRlciBtYWFrdCBoZXQgbW9nZWxpamsgbWV0IHVpdHpvbmRlcmluZyB2YW4gYmVwYWFsZGUganF1ZXJ5IHBsdWdpbnMgaW4gdGUgc2x1aXRlbiBlbiBkYWFybWVlIGFsbGUgYW5kZXJlIHBhcmFtZXRlcnMgdWl0IHRlIHNsdWl0ZW4gYWxzIGRlemUgemlqbiBvcGdlZ2V2ZW4uIE1vZ2VsaWprZSB3YWFyZGVuIHppam46IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkZXplIHphbCBkZSBjc3MgdGFncyB1aXRzbHVpdGVuJzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkZXplIHphbCBkZSBzY3JpcHQgdGFncyB1aXRzbHVpdGVuJzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQWxsZWVuIHRvZSB0ZSBwYXNzZW4gaW4gZGUgaW5janMgYmV3ZXJraW5nLCBkaXQgemFsIGpxdWVyeSB1aXRzbHVpdGVuIHZhbiBpbnRlZ3JhdGllJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnRGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnRGUgSlF1ZXJ5VG9vbHMgbW9kdWxlIGlzIGdlZGUmaXVtbDtuc3RhbGxlZXJkJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0hldCB2ZXJ3aWpkZXJlbiB2YW4gZGV6ZSBtb2R1bGUga2FuIGRlIHZlcnRvbmluZyBlbiBkZSBmdW5jdGlvbmFsaXRlaXQgdmFuIHV3IHdlYnNpdGUgc2NoYWRlIHRvZSBicmVuZ2VuLiBXaWx0IHUgemVrZXIgZGF0IHUgd2lsdCBkb29yZ2Fhbj8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ro_RO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1Rvb2xib3ggSlF1ZXJ5JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICdBcGxpY2FiaWwgbnVtYWkgYWN0aXVuaWkgaW5janMsIGFjZXN0IHBhcmFtZXRydSBwZXJtaXRlIGV4Y2x1ZGVyZWEgdW5vciBwbHVnaW4tdXJpIGpxdWVyeSBkZSBsYSBvdXRwdXQtdWwgZ2VuZXJhdC4gVmFsb3JpIHBvc2liaWxlIHN1bnQ6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwbGljYWJpbCBudW1haSBhY3RpdW5paSBpbmNqcywgYWNlc3QgcGFyYW1ldHJ1IHBlcm1pdGUgaW5jbHVkZXJlYSBleHBsaWNpdGEgYSB1bm9yIHBsdWdpbi11cmkganF1ZXJ5IGluIHRpbXAgY2UgdG9hdGUgY2VsZWxhbHRlIHN1bnQgZXhjbHVzZS4gRGFjYSBhY2VzdCBwYXJhbWV0cnUgZXN0ZSBzcGVjaWZpY2F0LCBwYXJhbWV0cnVsIGV4Y2x1ZGUgdmEgZmkgaWdub3JhdC4gIFZhbG9yaSBwb3NpYmlsZSBzdW50OiB0YWJsZXNvcnRlcixjbHVldGlwLGZvcm0uJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ1NlIGFwbGljYSBudW1haSBhY3RpdW5paSBpbmNqcywgdmEgZXhjbHVkZSBhZmlzYXJlYSB0YWd1cmlsb3IgY3NzJzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnU2UgYXBsaWNhIG51bWFpIGFjdGl1bmlpIGluY2pzLCB2YSBleGNsdWRlIGFmaXNhcmVhIHRhZ3VyaWxvciBzY3JvW3QnOwokbGFuZ1sncGFyYW1fbm9fcXVlcnknXSA9ICdTZSBhcGxpY2EgbnVtYWkgYWN0aXVuaWkgaW5janMsIHZhIGV4Y2x1ZGUgaW5jbHVkZXJlYSBsaWJyYXJpZWkganF1ZXJ5JzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnTW9kdWx1bCBKUXVlcnlUb29scyBhIGZvc3QgaW5zdGFsYXQuLi4uIGxhIHRyZWFiYSEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsdWwgSlF1ZXJ5VG9vbHMgYSBmb3N0IGRlemluc3RhbGF0JzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0RhY2EgaW5sYXR1cmF0aSBhY2VzdCBtb2R1bCBwdXRldGkgc3RyaWNhIGZ1bmN0aW9uYWxpdGF0ZSBzYXUgYXNwZWN0IGxlZ2F0ZSBkZSBzaXRlLiBTaWd1ciBkb3JpdGkgc2EgY29udGludWF0aT8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ru_RU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ9CY0L3RgdGC0YDRg9C80LXQvdGC0LDRgNC40LkgSlF1ZXJ5JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAn0JjQvdGB0YLRgNGD0LzQtdC90YLQsNGA0LjQuSDRg9GC0LjQu9C40YLRiyBKUXVlcnkg0L/QvtC80L7QttC10YIg0LIg0YHQvtC30LTQsNC90LjQuCDQtNC40L3QsNC80LjRh9C90YvRhSDQuCDQv9GA0LjRh9GD0LTQu9C40LLRi9GFIENNUyBNYWRlIFNpbXBsZSDQvNC+0LTRg9C70LXQuSDQuCDQstC10LEg0YHQsNC50YLQvtCyJzsKJGxhbmdbJ3BhcmFtX2FjdGlvbiddID0gJ9Cj0LrQsNC20LjRgtC1INC00LXQudGB0YLQstC40LUsINC60L7RgtC+0YDQvtC1INCx0YPQtNC10YIg0LLRi9C30LLQsNC90L4uICDQktC+0LfQvNC+0LbQvdGL0LUg0LfQvdCw0YfQtdC90LjRjzo8dWw+PGxpPmluY2pzIC0g0J/QvtC00LrQu9GO0YfQsNC10Lwg0L3QtdC+0LHRhdC+0LTQuNC80YvQtSBqYXZhc2NyaXB0INGE0LDQudC70YsuPC9saT48bGk+cmVhZHkgLSBPdXRwdXQgZGVmYXVsdCByZWFkeSBmdW5jdGlvbi48L2xpPjwvdWw+JzsKJGxhbmdbJ3BhcmFtX2V4Y2x1ZGUnXSA9ICfQn9GA0LjQvNC10L3Rj9C10YLRgdGPINGC0L7Qu9GM0LrQviDQuiDQtNC10LnRgdGC0LLQuNGOIGluY2pzLCDRjdGC0L7RgiDQv9Cw0YDQsNC80LXRgtGAINC/0L7Qt9Cy0L7Qu9GP0LXRgiDQuNGB0LrQu9GO0YfQuNGC0Ywg0L3QtdC60L7RgtC+0YDRi9C1INC/0LvQsNCz0LjQvdGLIGpxdWVyeSDQs9C10L3QtdGA0LjRgNGD0LXQvNGL0LUg0L3QsCDQstGL0YXQvtC00LUuICDQktC+0LfQvNC+0LbQvdGL0LUg0LfQvdCw0YfQtdC90LjRjzogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9saWInXSA9ICfQn9GA0LjQvNC10L3Rj9C10YLRgdGPINGC0L7Qu9GM0LrQviDQuiDRgtGA0LXQsdGD0LXQvNC+0LzRgyDQtNC10LnRgdGC0LLQuNGOLCDRjdGC0L7RgiDQv9Cw0YDQsNC80LXRgtGAINC/0L7Qt9Cy0L7Qu9GP0LXRgiDQt9Cw0LTQsNGC0Ywg0YHQv9C40YHQvtC6INGA0LDQt9C00LXQu9C10L3QvdGL0YUg0LfQsNC/0Y/RgtGL0LzQuCBKUXVlcnkg0LHQuNCx0LvQuNC+0YLQtdC6INC00LvRjyDRg9GB0YLQsNC90L7QstC60LguJzsKJGxhbmdbJ3BhcmFtX25vX2NzcyddID0gJ9Cf0YDQuNC80LXQvdGP0LXRgtGB0Y8g0YLQvtC70YzQutC+INC6INC00LXQudGB0YLQstC40Y4gaW5janMsINC40YHQutC70Y7Rh9Cw0LXRgiBjc3Mg0YLQtdCz0Lgg0LjQtyDQstGL0YXQvtC00LAnOwokbGFuZ1sncGFyYW1fbm9fY2RuJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIHByZXZlbnQgSlF1ZXJ5VG9vbHMgZnJvbSB1c2luZyBhIENETiBVUkwgZm9yIHRoZSBqYXZhc2NyaXB0IGxpYnJhcmllcywgaWYgb25lIGlzIGF2YWlsYWJsZSAobm90IGFsbCBsaWJyYXJpZXMgYXJlIGF2YWlsYWJsZSBieSBhIENETic7CiRsYW5nWydwYXJhbV9ub19qcyddID0gJ9Cf0YDQuNC80LXQvdGP0LXRgtGB0Y8g0YLQvtC70YzQutC+INC6INC00LXQudGB0YLQstC40Y4gaW5janMsINC40YHQutC70Y7Rh9Cw0LXRgiBzY3JpcHQg0YLQtdCz0Lgg0LjQtyDQstGL0YXQvtC00LAnOwokbGFuZ1sncGFyYW1fbm9fanF1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBwbGFjZW1hcmtlciBhbmQgaW5janMgYWN0aW9ucywgdGhpcyB3aWxsIGV4Y2x1ZGUganF1ZXJ5IGZyb20gYmVpbmcgaW5jbHVkZWQnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICfQnNC+0LTRg9C70YwgSlF1ZXJ5VG9vbHMg0LHRi9C7INGD0YHRgtCw0L3QvtCy0LvQtdC9JzsKJGxhbmdbJ3Bvc3R1bmluc3RhbGwnXSA9ICfQnNC+0LTRg9C70YwgSlF1ZXJ5VG9vbHMg0LHRi9C7INGD0LTQsNC70LXQvSc7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICfQo9C00LDQu9C10L3QuNC1INC80L7QtNGD0LvRjyDQvNC+0LbQtdGCINC/0L7QstGA0LXQtNC40YLRjCDQstC90LXRiNC90LjQuSDQstC40LQg0Lgg0YTRg9C90LrRhtC40L7QvdCw0LvRjNC90L7RgdGC0Ywg0LLQsNGI0LXQs9C+INGB0LDQudGC0LAuINCS0Ysg0YPQstC10YDQtdC90YssINGH0YLQviDRhdC+0YLQuNGC0LUg0L/RgNC+0LTQvtC70LbQuNGC0Yw/JzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTM1NzY5NTM1Mi4xLjEudXRtY2NuPShkaXJlY3QpfHV0bWNzcj0oZGlyZWN0KXx1dG1jbWQ9KG5vbmUpJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMjExMDAxNDgyMC4xMzU3Njk1MzUyLjEzNTc3MzAyMzIuMTM1Nzc1MjQyNC41JzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sr_YU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeSBhbGF0aSc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ1NrdXAgcG9tb8SHbmloIGpRdWVyeSBhbGF0YSBrb2ppIHRyZWJhIGRhIHByaXBvbW9nbnUga3JlaXJhbmplIGRpbmFtacSNbmloIGkgbW9kZXJuaWggQ01TIE1hZGUgU2ltcGxlIG1vZHVsYSBpIHNhanRvdmEnOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnU3BlY2lmeSB0aGUgYWN0aW9uIHRvIGJlIGNhbGxlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6PHVsPjxsaT5pbmNqcyAtIEluY2x1ZGUgcmVxdWlyZWQgamF2YXNjcmlwdCBmaWxlcy48L2xpPjxsaT5yZWFkeSAtIE91dHB1dCBkZWZhdWx0IHJlYWR5IGZ1bmN0aW9uLjwvbGk+PC91bD4nOwokbGFuZ1sncGFyYW1fZXhjbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhjbHVkaW5nIGNlcnRhaW4ganF1ZXJ5IHBsdWdpbnMgZnJvbSB0aGUgb3V0cHV0IGdlbmVyYXRlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1faW5jbHVkZSddID0gJ0FwcGxpY2FibGUgb25seSB0byB0aGUgaW5janMgYWN0aW9uLCB0aGlzIHBhcmFtZXRlciBhbGxvd3MgZXhwbGljaXRseSBpbmNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyB3aGlsc3QgZXhjbHVkaW5nIGFsbCBvdGhlcnMuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBleGNsdWRlIHBhcmFtZXRlciB3aWxsIGJlIGlnbm9yZWQuICBQb3NzaWJsZSB2YWx1ZXMgYXJlIHRhYmxlc29ydGVyLGNsdWV0aXAsZm9ybS4nOwokbGFuZ1sncGFyYW1fbm9fY3NzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGNzcyB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX2pzJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIHNjcmlwdCB0YWdzIGZyb20gYmVpbmcgb3V0cHV0JzsKJGxhbmdbJ3BhcmFtX25vX3F1ZXJ5J10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgd2lsbCBleGNsdWRlIGpxdWVyeSBmcm9tIGJlaW5nIGluY2x1ZGVkJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWwgamUgaW5zdGFsaXJhbic7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnSlF1ZXJ5VG9vbHMgbW9kdWwgamUgZGVpbnN0YWxpcmFuJzsKJGxhbmdbJ3ByZXVuaW5zdGFsbCddID0gJ0JyaXNhbmplIG92b2cgbW9kdWxhIG1vxb5lIG5hJnNjYXJvbjtrb2RpdGkgaXpnbGVkdSBpIGZ1bmtjaW9uYWxub3N0aSBWYSZzY2Fyb247ZWcgc2FqdGEuIERhIGxpIHN0ZSBzaWd1cm5pIGRhIMW+ZWxpdGUgbmFzdGF2aXRpPyc7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0pRdWVyeS1Ub29sYm94JzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnRW4gdmVya3R5Z3NsJmFyaW5nO2RhIHRpbGwgSnF1ZXJ5IGYmb3VtbDtyIGF0dCBza2FwYSBkeW5hbWlza2Egb2NoIHZhY2tyYSBDTVMgTWFkZSBTaW1wbGUgbW9kdWxlciBvY2ggd2ViYnBsYXRzZXInOwokbGFuZ1sncGFyYW1fYWN0aW9uJ10gPSAnQW5nZSB2aWxrYSAmYXJpbmc7dGcmYXVtbDtyZGVyIHNvbSBza2FsbCBrYWxsYXMuIE0mb3VtbDtqbGlnYSB2JmF1bWw7cmRlbiAmYXVtbDtyOiA8dWw+IDxsaT4gaW5janMgLSBJbmtsdWRlcmluZyBrciZhdW1sO3ZzIGYmb3VtbDtyIGphdmFzY3JpcHQgZmlsZXIuIDwvIExpPiA8bGk+IHJlZG8gLSBSZXN1bHRhdHN0YW5kYXJkcyBmdW5rdGlvbi4gPC8gTGk+IDwvIHVsPic7CiRsYW5nWydwYXJhbV9leGNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleGNsdWRpbmcgY2VydGFpbiBqcXVlcnkgcGx1Z2lucyBmcm9tIHRoZSBvdXRwdXQgZ2VuZXJhdGVkLiAgUG9zc2libGUgdmFsdWVzIGFyZTogdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwYXJhbV9pbmNsdWRlJ10gPSAnQXBwbGljYWJsZSBvbmx5IHRvIHRoZSBpbmNqcyBhY3Rpb24sIHRoaXMgcGFyYW1ldGVyIGFsbG93cyBleHBsaWNpdGx5IGluY2x1ZGluZyBjZXJ0YWluIGpxdWVyeSBwbHVnaW5zIHdoaWxzdCBleGNsdWRpbmcgYWxsIG90aGVycy4gIElmIHRoaXMgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCwgdGhlIGV4Y2x1ZGUgcGFyYW1ldGVyIHdpbGwgYmUgaWdub3JlZC4gIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGFibGVzb3J0ZXIsY2x1ZXRpcCxmb3JtLic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0pRdWVyeVRvb2xzIG1vZHVsZW4gJmF1bWw7ciBudSBpbnN0YWxsZXJhZCEnOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ0pRdWVyeVRvb2xzIG1vZHVsZW4gJmF1bWw7ciBudSBhdmluc3RhbGxlcmFkISc7CiRsYW5nWydwcmV1bmluc3RhbGwnXSA9ICdCb3J0dGFnbmluZyBhdiBkZW4gaCZhdW1sO3IgbW9kdWxlbiBrYW4gc2thZGEgdXRzZWVuZGV0IG9jaCBmdW5rdGlvbmFsaXRldGVuIHAmYXJpbmc7IGRpbiB3ZWJicGxhdHMuICZBdW1sO3IgZHUgcyZhdW1sO2tlciBwJmFyaW5nOyBhdHQgZHUgdmlsbCBmb3J0cyZhdW1sO3R0YT8nOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cgform.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cgform.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmNnZm9ybS5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/cgform.lib/jquery.cgform.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpewogICQuZm4ucGFyc2Vfc2VyaWFsaXplZCA9IGZ1bmN0aW9uKGRhdGEpICB7CiAgICB2YXIgcGFybXM9ZGF0YS5yZXBsYWNlKC9hbXA7L2csJycpOwogICAgaWYoIGRhdGEubWF0Y2goL1w/KC4rKSQvKSApIHsKICAgICAgcGFybXMgPSBSZWdFeHAuJDE7CiAgICB9CiAgICB2YXIgcEFyciA9IHBhcm1zLnNwbGl0KCcmJyk7CiAgICB2YXIgcEhhc2ggPSB7fTsKICAgIGZvciggdmFyIGkgPSAwOyBpIDwgcEFyci5sZW5ndGg7IGkrKyApIHsKICAgICAgdmFyIHRtcCA9IHBBcnJbaV0uc3BsaXQoJz0nKTsKICAgICAgcEhhc2hbdG1wWzBdXSA9IHVuZXNjYXBlKHRtcFsxXSk7CiAgICB9CiAgICByZXR1cm4gcEhhc2g7CiAgfQoKCiAgJC5mbi5mb3JtX3BvcHVsYXRlID0gZnVuY3Rpb24oZGF0YSkgewogICAgdmFyIGNvbnRhaW5lciA9ICQodGhpcyk7CiAgICAkLmVhY2goZGF0YSwgZnVuY3Rpb24obmFtZSx2YWx1ZSkgewogICAgICB2YXIgZXhwciA9ICI6aW5wdXRbbmFtZT0nIituYW1lKyInXTpub3QoOmJ1dHRvbiw6cmVzZXQsOnN1Ym1pdCw6aW1hZ2UpIjsKICAgICAgdmFyIGlucHV0ID0gY29udGFpbmVyLmZpbmQoZXhwcik7CiAgICAgIGlucHV0LnZhbCggKCEkLmlzQXJyYXkodmFsdWUpICYmIChpbnB1dC5pcygnOmNoZWNrYm94OicpIHx8IGlucHV0LmlzKCc6cmFkaW8nKSkpID8gW3ZhbHVlXSA6IHZhbHVlICk7CiAgICB9KTsKICB9OwoKCiAgJC5mbi5mb3JtX3BvcHVsYXRlX3NlcmlhbGl6ZWQgPSBmdW5jdGlvbihkYXRhKSB7CiAgICB2YXIgdG1wID0gJCh0aGlzKS5wYXJzZV9zZXJpYWxpemVkKGRhdGEpOwogICAgJCh0aGlzKS5mb3JtX3BvcHVsYXRlKHRtcCk7CiAgfTsKCiAgJC5mbi5zZXJpYWxpemVPYmplY3QgPSBmdW5jdGlvbigpIHsKICAgIHZhciBvID0ge307CiAgICB2YXIgYSA9IHRoaXMuc2VyaWFsaXplQXJyYXkoKTsKICAgICQuZWFjaChhLCBmdW5jdGlvbigpIHsKICAgICAgICBpZiAob1t0aGlzLm5hbWVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKCFvW3RoaXMubmFtZV0ucHVzaCkgewogICAgICAgICAgICAgICAgb1t0aGlzLm5hbWVdID0gW29bdGhpcy5uYW1lXV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb1t0aGlzLm5hbWVdLnB1c2godGhpcy52YWx1ZSB8fCAnJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb1t0aGlzLm5hbWVdID0gdGhpcy52YWx1ZSB8fCAnJzsKICAgICAgICB9CiAgICB9KTsKICAgIHJldHVybiBvOwogIH07CgogICQuZm4uc2VyaWFsaXplQW55dGhpbmcgPSBmdW5jdGlvbigpIHsKICAgIHZhciB0b1JldHVybiAgICA9IFtdOwogICAgdmFyIGVscyAgICAgICAgID0gJCh0aGlzKS5maW5kKCc6aW5wdXQnKS5nZXQoKTsKICAgICQuZWFjaChlbHMsIGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmICh0aGlzLmNoZWNrZWQgfHwgL3NlbGVjdHx0ZXh0YXJlYS9pLnRlc3QodGhpcy5ub2RlTmFtZSkgfHwgL3RleHR8aGlkZGVufHBhc3N3b3JkL2kudGVzdCh0aGlzLnR5cGUpKSkgewogICAgICAgIHZhciB2YWwgPSAkKHRoaXMpLnZhbCgpOwogICAgICAgIHRvUmV0dXJuLnB1c2goIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLm5hbWUpICsgIj0iICsgZW5jb2RlVVJJQ29tcG9uZW50KCB2YWwgKSApOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0b1JldHVybi5qb2luKCImIikucmVwbGFjZSgvJTIwL2csICIgIik7CiAgfTsKCgogICQuZm4uZm9ybV9nZXRfZGF0ZXRpbWUgPSBmdW5jdGlvbihwcmVmaXgsZG9fdGltZSkgewogICAgZG9fdGltZSA9IHR5cGVvZihkb190aW1lKSAhPSAndW5kZWZpbmVkJyA/IGRvX3RpbWUgOiAwOwoKICAgIHZhciBrZXkgPSAiOmlucHV0W25hbWU9JyIrcHJlZml4KyJZZWFyJ10iOwogICAgdmFyIHllYXIgPSB0aGlzLmZpbmQoa2V5KS52YWwoKTsKICAgIHZhciBtb250aCA9IHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJNb250aCddIikudmFsKCk7CiAgICB2YXIgZGF5ID0gdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIkRheSddIikudmFsKCk7CiAgICB2YXIgc3RyID0gbW9udGgrJy8nK2RheSsnLycreWVhcjsKICAgIHZhciBob3VyID0gMDsKICAgIHZhciBtaW51dGUgPSAwOwoKICAgIGlmKCBkb190aW1lICkKICAgICAgewoJdmFyIGhvdXIgPSB0aGlzLmZpbmQoIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiSG91ciddIikudmFsKCk7Cgl2YXIgbWludXRlID0gdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIk1pbnV0ZSddIikudmFsKCk7CiAgICAgICAgc3RyICs9ICcgJytob3VyKyc6JyttaW51dGUrJzowMCc7CiAgICAgIH0KICAgIHJldHVybiBzdHI7CiAgfTsKCgogICQuZm4uZm9ybV9zZXRfZGF0ZXRpbWUgPSBmdW5jdGlvbihpbl9kYXRlLHByZWZpeCxkb190aW1lKSB7CiAgICBkb190aW1lID0gdHlwZW9mKGRvX3RpbWUpICE9ICd1bmRlZmluZWQnID8gZG9fdGltZSA6IDA7CgogICAgdmFyIHplcm9wYWQgPSBmdW5jdGlvbihudW0sbGVuKQogICAgewogICAgICB2YXIgcmVzID0gbnVtLnRvU3RyaW5nKCk7CiAgICAgIHdoaWxlKCByZXMubGVuZ3RoIDwgbGVuICkKCXsKCSAgcmVzID0gJzAnK3JlczsKCX0KICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICB2YXIgZGF0ZSA9ICcnOwogICAgdmFyIHRtcCA9IHBhcnNlSW50KGluX2RhdGUpOwogICAgaWYoIHRtcCA+IDAgKQogICAgICB7CiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKHRtcCAqIDEwMDApOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKICAgICAgICBkYXRlID0gbmV3IERhdGUoaW5fZGF0ZSk7CiAgICAgIH0KCiAgICB0aGlzLmZpbmQoIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiWWVhciddIikudmFsKGRhdGUuZ2V0RnVsbFllYXIoKSk7CiAgICB0aGlzLmZpbmQoIjppbnB1dFtuYW1lPSciK3ByZWZpeCsiTW9udGgnXSIpLnZhbCh6ZXJvcGFkKGRhdGUuZ2V0TW9udGgoKSsxLDIpKTsKICAgIHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJEYXknXSIpLnZhbChkYXRlLmdldERhdGUoKSk7CiAgICBpZiggZG9fdGltZSApCiAgICB7CiAgICAgIHRoaXMuZmluZCgiOmlucHV0W25hbWU9JyIrcHJlZml4KyJIb3VyJ10iKS52YWwoZGF0ZS5nZXRIb3VycygpKTsKICAgICAgdGhpcy5maW5kKCI6aW5wdXRbbmFtZT0nIitwcmVmaXgrIk1pbnV0ZSddIikudmFsKGRhdGUuZ2V0TWludXRlcygpKTsKICAgIH0KCiAgfTsKfSkoalF1ZXJ5KQo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.datepicker_plugin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCm5hbWVzcGFjZSBKUXVlcnlUb29sczsKCmZpbmFsIGNsYXNzIGRhdGVwaWNrZXJfcGx1Z2luCnsKICAgIHByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQoKICAgIHByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIF9nZXRfbG9jYWxlSW5mbygpCiAgICB7CiAgICAgICAgJG91dCA9IGFycmF5KCk7CiAgICAgICAgJG91dCA9IGFycmF5KCk7CiAgICAgICAgJG91dFsnbW9udGhOYW1lcyddID0gYXJyYXkoKTsKICAgICAgICAkb3V0Wydtb250aE5hbWVzU2hvcnQnXSA9IGFycmF5KCk7CiAgICAgICAgZm9yKCAkaSA9IDA7ICRpIDwgMTI7ICRpKysgKSB7CiAgICAgICAgICAgICRvdXRbJ21vbnRoTmFtZXMnXVtdID0gc3RyZnRpbWUoJyVCJyxta3RpbWUoMSwwLDAsJGkrMSwxLDIwMDApKTsKICAgICAgICAgICAgJG91dFsnbW9udGhOYW1lc1Nob3J0J11bXSA9IHN0cmZ0aW1lKCclYicsbWt0aW1lKDEsMCwwLCRpKzEsMSwyMDAwKSk7CiAgICAgICAgfQoKICAgICAgICAkZm10ID0gJ2xhc3Qgc3VuZGF5ICsgJWQgZGF5cyc7CiAgICAgICAgJG91dFsnZGF5TmFtZXMnXSA9IGFycmF5KCk7CiAgICAgICAgJG91dFsnZGF5TmFtZXNTaG9ydCddID0gYXJyYXkoKTsKICAgICAgICAkY3VyZGF5ID0gKGludClkYXRlKCd3Jyk7CiAgICAgICAgZm9yKCAkaSA9IDA7ICRpIDwgNzsgJGkrKyApIHsKICAgICAgICAgICAgJG91dFsnZGF5TmFtZXMnXVtdID0gc3RyZnRpbWUoJyVBJyxzdHJ0b3RpbWUoc3ByaW50ZigkZm10LCRpKSkpOwogICAgICAgICAgICAkb3V0WydkYXlOYW1lc1Nob3J0J11bXSA9IHN0cmZ0aW1lKCclYScsc3RydG90aW1lKHNwcmludGYoJGZtdCwkaSkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkKCRsaWJuYW1lKQogICAgewogICAgICAgIGlmKCAkbGlibmFtZSAhPSAnY2dfZGF0ZXBpY2tlcicgKSByZXR1cm47CgogICAgICAgIC8vIGdvdHRhIHJldHVybiBjb2RlCiAgICAgICAgJG1vZCA9IFxjbXNfdXRpbHM6OmdldF9tb2R1bGUoJ0pRdWVyeVRvb2xzJyk7CiAgICAgICAgJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwogICAgICAgICRzbWFydHkgPSBjbXNtcygpLT5HZXRTbWFydHkoKTsKICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ21vZCcsJG1vZCk7CiAgICAgICAgJHNtYXJ0eS0+YXNzaWduKCdjb25maWcnLCRjb25maWcpOwogICAgICAgICRzbWFydHktPmFzc2lnbignbG9jYWxlSW5mbycsc2VsZjo6X2dldF9sb2NhbGVJbmZvKCkpOwogICAgICAgICRkYXRlZm9ybWF0ID0gJ2RkL21tL3l5JzsKICAgICAgICBpZiggXENtc05sc09wZXJhdGlvbnM6OmdldF9jdXJyZW50X2xhbmd1YWdlKCkgPT0gJ2VuX1VTJyApIHsKICAgICAgICAgICAgJGRhdGVmb3JtYXQgPSAnbW0vZGQveXknOwogICAgICAgIH0KICAgICAgICAkc21hcnR5LT5hc3NpZ24oJ2RhdGVmb3JtYXQnLCRkYXRlZm9ybWF0KTsKICAgICAgICAkY29kZSA9ICRtb2QtPlByb2Nlc3NUZW1wbGF0ZSgnZGF0ZXBpY2tlcl9wbHVnaW4uanMnKTsKICAgICAgICAkb2JqID0gbmV3IFxTdGRDbGFzczsKICAgICAgICAkb2JqLT5jb2RlID0gJGNvZGU7CiAgICAgICAgcmV0dXJuICRvYmo7CiAgICB9Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/changelog.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CjEuMi4yIC8gMjAxMS0wOS0wMQo9PT09PT09PT09PT09PT09PT0KCiAgKiBmaXggdHlwbyB3aGVuIGNoZWNraW5nIGluZGV4T2Y7IHJlbW92ZSBib3gtc2hhZG93IGlubGluZSBzdHlsZSB3aGVuIGRyb3BTaGFkb3cgb3B0aW9uIGlzIGZhbHNlIG9yIGRyb3BTaGFkb3dTdGVwcyBpcyAwLgogICogb25seSBzaGlmdCBvZmYgaGVhZGluZyBvZiB0aXBQYXJ0cyBpZiBvcHRzLnNob3dUaXRsZSBpcyB0cnVlLiBmaXhlcyAjNTUKICAqIHRyaXZpYWwgY2xlYW51cAo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAMzMzP///yH5BAEAAAEALAAAAAAWAAsAAAIchI+pEOsZ4nuxTlXzPbnvDk7g6IwmZp5cmhpsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAMzMzP///yH5BAEAAAEALAAAAAALABYAAAIjjI+AC7rWHIsvtmmTvXBzT4HiKAZkBx6l6mGUK2lcNdNPUgAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAMzMzP///yH5BAEAAAEALAAAAAALABYAAAIkRI4JlrqN1oNyutqqvDrqHXyYSJZkeKKf17Ggy3CQOqN1eAcFADs=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/arrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAPcBAMzMzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAEALAAAAAAWAAsAAAgyAAMIHEgQAACCCBMWNHhQocMADBk+TBgx4sSBFStezJjxIUeOCj9+RChSJMaSJlGiDAgAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/bl.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhzwPJA/eVAKzG16zI2qm3vaa7xqa2vq3J26nBzazI2avE06/K27XO3ejv8rnR38TY4rHM3L7V4KS3wMnb46zJ2qW3wMrc5K3I2b/V4bLN3K/L26vD07rS38TZ4rjQ3rbP3qq4vazF067K27XP3cXZ46rBzbDL3LLM3Ke7x+jv8ePp666/yLTL2fT296zI2K/J2rrM1LXHz8HV3rjL1bPGz6i3vrLCyPj5+rHL2rLJ1aq5v8jZ4MrW2q28w8fW3LbN2bXDyK/I2Ke3vrfQ3qq3vb7Q19bc3rrGy8rb4rHJ2LPN3crb4a+7wPP19qvBzrDH1efu8ai8x7S/w7nO2qW4wK7I2bHFz6y/yKa4wai/zMXQ1Ke5wbXK1sTY4avF1rzP2LvT37DAyP7+/qi5wam4vsDT3LnQ3LzM0q7Dzsvc5L3L0MbY4fX4+K3CzrTO3aa3vr3S3bbO26a6xqW2vbnHzcDJzarD0q3F067H16i6wrTM28PU2+rv8ay6wK3K263F1Kq+x63H17rGysDQ1sDW4bK/xK67wOft8MXX38XT2bvS3+bt773T3s3V2MHW4au4vau7w/Hz9LfHzqi9x6nAza++xKvI2v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAJUALAAAAADPA8kDAAj/ABecEWFBQ4cLGAoEoMSwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzZscFFDZYYBCiRIICNoMKHUq0qNGjSJMqXcq0qdOnUKN+xNngAQMFDn5K3cq1q9evYMOKHUu2rNmzERdEqHo1K1C0cOPKnUu3rt27ePOaVcsWq1a9gAMLHky4sOHDiI3yter3beLHkCNLnky5suWli9v+vcy5s+fPoEOLBpy58ejTqFOrXs26NcnSbl3Lnk27tu3bg2Fvxs27t+/fwIPH1O1YuPHjyJMr9018ufPn0KNLh9x8uvXr2LNrl1p9u/fv4MOL/x/Zfbz58+jTay+vvr379/Bts49Pv779+5Ln49/Pv7//s/r9J+CABBZYVIAGJqjgggyGhGCDEEYoIYQPTmjhhRjeV2GGHHboIXgbfijiiCQmF2KJKKaoomwnrujiizBe1mKMNNZoY2Az3qjjjjySlWOPQAYpJGZrMRbbkEgmqSSRfR255JNQRgnTj1JWaeWVEFGJ5ZZcLqlll2CGueOXYpZp5opknqnmmh2myeabcDboZpx01vnfnHbmqWd8eO7p55/j9QnooIReJ2ihiCZqYpGaFafoo5B6d2iklFba2qSWZqopaJhu6umn+TFqGqiklupap6amqmpdqK7q6qs+iv/qJKy01lpYq7bmqmtSuO7q66819QrssMSuJGyxyCbroKy7Kevss0MdC+201DokbbXYPnttttwWu2234Pr6bbjk1jpuueiuem667JK6brvwavpuvPRGOm+9+CJ6b778/rlvvwDb+W/ABL85cMEIm3lwwgx3uXDDEFv5cMQUPzlxxRgPeXHGHPO4cccg1/hxyCS7OHLJKJd4csose7hyyzBf+HLMNFPIrKM15yzmzDr3PCDPPgfNH9BCF10f0UYn7R7SSjd9HtNORw3izVJX7THVVmctMtZad20y116HrTLYYpftMtlmpy0z2mq3bXOTzbot94JQz203a3Xfrfdpee//7fdnff8tuGWBD254ZIUfrvhhiS/uuGCNPy45XpFPbvlclV+uOYBsb+75cpl/LrpXoY9uelSln646U6mv7vpRrb8uu1Cxz277TLXfrrtLue/ue0q9/y78a50Pb3yocON8/PLUFc/884QFD/30E0lP/fXWOo/99nJZzz313n8PffjiM09++cefj/7w6q//e/vu7w5//LfPT//s9t//ev76r85//6f7HwBHJ8ABfq6ABtwcAhN4uQUycHIOfODjIijBxVGwgoe7IAYHp8EN/q2DHtwbCEN4txGScG4mPKHbUqhCtbGwhWZ7IQzFJsMZeq2GNtQaDnNotR3yUGo+/KHT/4IoRKURsYhGOyIShabEJfqsiU7UGRSjWLMpUjFmVrxiy7KoxZRxsYsl+yIYQybGMXasjGbMGBrTWLE1sjFibnxjw+Iox4TRsY4FuyMeA6bHPfarj37MFyADWa9BEjJehjxkuxKpyHQxspHleiQkwyXJSXarkpbMFiYzWa1NcnJanvyktrQnyvuFspTJOiUqvUXKVa5Pla4EFixjKa5W0vJ7s7xlrnKpS3PZspfX4yUwXyXMYarrl8Z8XjGTaaplMtNdyHym8ZwpTU9Rs5ryiiY2fXfNbVaqm960lzbDaTtwklNR5jynvsapTtels52Deic8/cXOeZpOnvbUEz7zKf+wevLTc/v8Z5wCKlCD+bOgliMoQtWk0IUq7KAOdVxDIxqmiVLUYRC9qOEsqlEscbSjEssoSP320ZFGqaQmtZhIU2o3lLI0SS59qcZWKtO2xbSmQLopTq+WvJ0ClKY+pSFQg3rDoRJVh0Y9ag+TqlQgMrWpQ3wqVI0o1akmsapWZSJWs/rErXJVil79ahXDKlYskrWsWzwrWr2o1rWGsa1uJSNc43rGudJVjXa9axvzqlc48rWvc/wrYO0o2MHmsbCG5SNiE/vHxTJWkI59bCEjK1lEUrayi7wsZh2p2c1GsrOepSRoQ3vJ0ZJWk6Y9bSdTq1pQsra1o+wpbJum09n/+qe2th3aa3PLStnyVqu+/W1XgytcsBK3uGM9LnLNqtzlprW5zmUrdKP71ulSV67WvW5ds6tdvHK3u3v9Lnj9Kt7xBra85iUsetN72PWyV7HufW9j4ytfyNK3vpO9L34tq9/9Zra//uUsgAP82QETWLQGPnBpE6xg1DK4wat9MIRdK+EJx9ZIcbPwfDGsPA3bl8Mebi+IQwzfEZN4w406McBwq+LjsLjFwnkxjIEj4xkzZ7c23lONc4ybHfNYPjj+cZ18LOTZELnIpwoykg1a4SW76shOVg2Uo4yaKVN5NFa+cmiyrGXAKbnLFf0ymDHa5DFbU8xm9iia0xzSMrPZ/1JcfvNk4ixnxK25zip1M54fRec9I6bPfjYMoAMdvTsTWkiDPjSODK3oHiW60Xl5NKTvIulJs4rRlrZRpTPdPUxzOkab/jRaQi3qvXi61Gg6NapTROpVi6XVrgYLrGNNOlXTWkSzvvVWcq1r1Nm61xziNbCdIuxhs+7XxrZQsZPNK2QzO0LLfrZinC1tBkW72tGiNrYTdO1t26Tb3qYJuMMtk3GTe0raPved0q3u/pi73Sx5N7xVIu95o6Te9jYJvvNNPD3zO0j7/vey/C1wnpq44HQKOMJvwu6Ft0fhDtcIxCOOkYlT3CIWvzhFMq5xiXC841lqOMjD8/GRN6TkJv+nBMpNvvKRtxzkL+94zDU+84vXnOI3j3jOHb7zhfcc4T8veNAFPvR/F53fR8930u299Hk3Hd5Pb3fU1T31c1ed3FcPd9a9vfVtdx3bX6922KU99meXndlnT3bajb32Ybcd2G/vddx1Pfdb153Wd4913l2991X3HdV/L3XgRT34Txee04fPdOItvfhJNx7Sj2905BU9+UNXntCXD3Tm/bz5PXcez5+vc+jlPPo3l57Np09z6s28+jG3Hsyv73LstTz7K9eeyrePcu6dvPsl9x7Jvy9y8IU8/B8Xn8fHz3Hybbz8GTcfxs9vcfRVPP0TV5/E1w9x9j28fQ1338Lfn3D/+CE8/gaXX8HnP3D6Cbz+ALffv+/fb/zxO//61l++939v/tm7//T237z/N14BCF4D2F0FqF0HeF0JSF0LGF0N6FwPuFwRiFwTWFwVKFwX+FsZyFsbmFsdaFsfOFshCFsj2FolqFoneFopSForGFot6FkvuFkxiFkzWFk1KFk3+Fg5yFg7mFg9aFg/OFhBCFhD2FdFqFdHeFdJSFdLGFdN6FZPuFZRiFZTWFZVKFZX+FVZyFVbmFVdaFVfOFVhCFVj2FRlqFRneFRpSFRrGFRt6FNvuFNxiFNzWFN1KFN3+FJ5yFJ7mFJ9aFJ/OFKBCFKD2FGFqFGHeFGJSFGLGFGN/+hQj7hQkYhQk1hQlShQl/hPmchPm5hPnWhPnzhPoQhPo9hOpahOp3hOqUhOqxhOrehNr7hNsYhNs1hNtShNt/hMuchMu5hMvWhMvzhMwQhMw9hLxahLx3hLyUhLyxhLzehKz7hK0YhK01hK1ShK1/hJ2chJ25hJ3WhJ3zhJ4QhJ49hI5ahI53hI6UhI6xhI7ehH77hH8YhH81hH9ShH9/hG+chG+5hG/WhG/zhGAQlGA9lFBalFB3lFCUlFCxlFDelED7lEEYlEE1lEFSlEF/lDGclDG5lDHWlDHzlDIQlDI9lCJalCJ3lCKUlCKxlCLelBL7lBMYlBM1lBNSlBN//5QDnJQDuZQD1pQD85QEEJQEPZP0WpP0dpSiKXctuRlPTjlPEDle4jla+0lEyZHVSJPllZPlspPl2JS1Z5lYYSlmI5HV/JPWe5PWmJPWsZTGRZltHRluDzlnD5HHI5PXc5PnRZl6Czl3y5KAT3l8Hml4JpHHmpTIRZmMFxmOaTmIr5G4y5PJGZPo75mL0xmdNUmZbZY5q5mUAWmJ75NgcXmojWmaTJIqZ5mpeSmqq5GpjJPqzZmqnxmsJDm+8Tm7LJN7iZm6Jhm9y0m7zJKcAZnJ7hm/IznMTJGcapO8tZP8iZnITznNBJGc1ZTtI5ncgzmtj5NaC5nfhRnfhznd7/mRjgKTvluT/iOZ6Mk57qeSvs2Z658Z7wuWjdOZ/vcZ7uJJ/2GWn6uZ+U1p/+eWn1GaDogZ/+A6AE2mkDmqCBgqAMOmoO+qCmtqAS+h0GqjoXGkARWqFjkaH3tKEcGhYeSkAgGqJfMaKig6IHVKIm2hUq+lMU2qJjGaMyapYsWqO+RqM4Ch0vqkA3uqPE9qNAemw6OqTK0aOag6QNJKRG2mxF2qQuxqRQOm1POqWLKaVWmm1VmqU3tqVcyhtKmlBY+qXBMqZkijtmeqbDkaZq+hJhCkFs2qYt8aaSQ6cTFKdyaix4mqfAs6d8ehJ2KlF++qclEagWNKiESh6ImqgD/6edjJoehqo4kZpBi/qoHjGpG1WplsoRmMpBmrqpEvepoFpxojqqGFeqprpxqJqqHreqrBpyXvqqndGpgkOrH+SqsnpyuJqrKreruWqrJOWrsgqsIiSsr0qseoOsJWSsrKqsLcWsqeqsKAStpiqtcmOtK0Sto4qtNqWtoMqtLuStmwquaUOuMSSulmquZaOuQhWrvFoZ7Bo28VpU7vquc4aujzqvXaOvSFWv9mpn/vqvj8GvWUOwSxWwAvtn+MqoBls1DetUCJuwgrawifqwUWOxURWxEltoGruxkEOxhIqxtAWyfyqyVNWxHksaJMunJps0LXtVKJuy/BmzMvufNP9bswLqqDiLHC9bND0LXDq7s4a5snn6s0FjtMMVtEJ7pTe7tHCBtD0DtcaltE7bpVRbtWBKtHIqtTnDtcl1tVh7G15LM2PLXGAbtrVRtjCjts91tmhrZFrbpmzLMnMrXW77tknWtHgronGrpnWLMn9bXXe7t67Zt2cauCSDuNg1uIQ7m4ZLpooLMpG7XYzbuLqpt5bLFZPLMZvrXZWbuVv2uF/auRhDuuH1uaDrZZibulBhuhTjuuSFuqyrnKLLpbALMbd7XrI7u9G5urxLpLv7u/fqu8LrpMFbvM1DvMhLpce7vAqrvM6rpc0bve4JvdT7bbWbpbnLMNurXtN7vR//a73gi6biO75rWr7m66bZa6XdizDtK2Iplr6hi77yG2/rO6XvSzD5W2LxW7/Feb9QShXf6791cQI5wRg+0WEELBknEAEEoQEhgBAKscCc4QRG0AAFcRAJsRAUbBmFkARbIAheEARIQAJ8IAEdbBmJkANpwAiIwAFs4AAgMMEpPBl6wAOGAAOKwAEKcAEkMMMSEMQSEABEXMRGfMRInMRKvMRM3MRO/MRQHMVSPMVUXMVWfMVYnMVavMVc3MVe/MVgHMZiPMZkXMZmfMZonMZqvMZs3MZNLMRqcAh5MAZuQAZvgAc20AJTUAF8fAB+/MeAHMiCPMiEXMiGfMiInMiK/7zIjNzIjvzIkBzJkjzJlFzJlnzJmJzJmrzJnNzJnvzJoBzKojzKpFzKpnzKiVwBLFAJOhAIQ9AFUdADKnAEP2AHfwAAuJzLurzLvNzLvvzLwBzMwjzMxFzMxnzMyJzMyrzMzNzMzvzM0BzN0jzN1FzN1nzN2JzN2rzN3NzN3vzN4BzOxswFlYACaFAGLhADWnADTdAHdfABH4AA8jzP9FzP9nzP+JzP+rzP/NzP/vzPAB3QAj3QBF3QBn3QCJ3QCr3QDN3QDv3QEB3REj3RFF3RFn3RGJ3RGr3R/JwBHk0HlQAGWCAHkPACMkAFZrAGTDACI2AALv3SMB3TMj3TNP9d0zZ90zid0zq90zzd0z7900Ad1EI91ERd1EZ91Eid1Eq91Ezd1E791FAd1VI91VRd1VZ91TotCVdQCZWwAkXgAzTwBSlQBX4QCU9gAiYwAGq91mzd1m791nAd13I913Rd13Z913id13q913zd137914Ad2II92IRd2IZ92Iid2Iq92Izd2I792JAd2ZI92XYNB1xdCY8ACIMwCTvgCHcQBllgBRMw2hMAAaZ92qid2qq92qzd2q792rAd27I927Rd27Z927id27q927zd277928Ad3MI93MRd3MZ93Mid3Mq93Mzd3M793KtN2hMgBZddCTWwCEpACHuAA2IwA0Ca0AYEEN7iPd7kXd7mfd7ond7qvd7s3d7u/d7wHd/yPd/0Xd/2fd/4nd/6vd/83d/+/d8AHuACPuAEXuAGfuAInuAKzt5xQADVzdVLQARzAAWN4AEeIAAYnuEavuEc3uEe/uEgHuIiPuIkXuImfuIonuIqvuIs3uIu/uIwHuMyPuM0XuM2fuM4nuM6vuM83uM+/uNAHuQlLgQBAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/bl.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA88AAAPJCAMAAAAbDOrsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAcJQTFRFrMbXrMjaqbe9prvGpra+rcnbqcHNrMjZq8TTr8rbtc7d6O/yudHfxNjisczcvtXgpLfAydvjrMnapbfAytzkrcjZv9Xhss3cr8vbq8PTutLfxNniuNDets/eqri9rMXTrsrbtc/dxdnjqsHNsMvcsszcp7vH6O/x4+nrrr/ItMvZ9Pb3rMjYr8nauszUtcfPwdXeuMvVs8bPqLe+ssLI+Pn6scvassnVqrm/yNngytbarbzDx9bcts3ZtcPIr8jYp7e+t9Deqre9vtDX1tzeusbLytviscnYs83dytvhr7vA8/X2q8HOsMfV5+7xqLzHtL/Duc7apbjArsjZscXPrL/IprjBqL/MxdDUp7nBtcrWxNjhq8XWvM/Yu9PfsMDI/v7+qLnBqbi+wNPcudDcvMzSrsPOy9zkvcvQxtjh9fj4rcLOtM7dpre+vdLdts7bprrGpba9ucfNwMnNqsPSrcXTrsfXqLrCtMzbw9Tb6u/xrLrArcrbrcXUqr7HrcfXusbKwNDWwNbhsr/ErrvA5+3wxdffxdPZu9Lf5u3vvdPezdXYwdbhq7i9q7vD8fP0t8fOqL3HqcDNr77Eq8ja////LL4G4QAAAJZ0Uk5T//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AaRLOegAACStJREFUeNrs1QVyFFEARdEeyCAxSBjJTFxxd3d3d5fg7i7BXf5+6bAKftc5S3hVt15SN9hTqraXW/K5P0DckrpCa6m+u39s3haQgZ4bxtXXNuoZstBzk55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ9Kxn0DOgZ0DPgJ5Bz4CeAT0Degb0DHoG9AzoGdAz6BnQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oGPesZ9AzoGdAzoGfQM6BnQM+AngE9g54BPQN6BvQMegb0DOgZ0DOgZ9AzoGdAz4CeQc96Bj0Degb0DOgZ9AzoGdAzoGdAz6BnQM+AngE9g54BPQN6BvQM6Bn0DOgZ0DOgZ9CznkHPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6Bn0rGfQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oGPesZ9AzoGdAzoGfQM6BnQM+AngE9g54BPQN6BvQMegb0DOgZ0DOgZ9AzoGdAz4CeAT2DngE9A3oG9Ax6BvQM6BnQM6Bn0DOgZ0DPgJ5Bz3oGPQN6BvQM6Bn0DOgZ0DOgZ0DPoGdAz4CeAT2DngE9A3oG9AzoGfQM6BnQM6Bn0LOeQc+AngE9A3oGPQN6BvQM6BnQM+gZ0DOgZ0DPoGdAz4CeAT0DegY9A3oG9AzoGfSsZ9AzoGdAz4CeQc+AngE9A3oG9Ax6BvQM6BnQM+gZ0DOgZ0DPgJ5Bz4CeAT0DegY96xn0DOgZ0DOgZ9AzoGdAz4CeAT2DngE9A3oG9Ax6BvQM6BnQM6Bn0DOgZ0DPgJ5Bz3oGPQN6BvQM6Bn0DOgZ0DOgZ0DPoGdAz4CeAT2DngE9A3oG9AzoGfQM6BnQM6BnQM+gZ0DPgJ4BPYOeAT0Degb0DOgZ9AzoGdAzoGfQs55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ9Kxn0DOgZ0DPgJ5Bz4CeAT0Degb0DHoG9AzoGdAz6BnQM6BnQM+AnkHPgJ4BPQN6Bj3rGfQM6BnQM6Bn0DOgZ0DPgJ4BPYOeAT0Degb0DHoG9AzoGdAzoGfQM6BnQM+AnkHPegY9A3oG9AzoGfQM6BnQM6BnQM+gZ0DPgJ4BPYOeAT0Degb0DOgZ9AzoGdAzoGfQs55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6Bn0rGfQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oGPesZ9AzoGdAzoGfQM6BnQM+AngE9g54BPQN6BvQMegb0DOgZ0DOgZ9AzoGdAz4CeQc96Bj0Degb0DOgZ9AzoGdAzoGdAz6BnQM+AngE9g54BPQN6BvQM6Bn0DOgZ0DOgZ9CznkHPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6Bn0rGfQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oG9Ax6BvQM6BnQM+gZ0DOgZ0DPgJ5Bz4CeAT0DegY96xn0DOgZ0DOgZ9AzoGdAz4CeAT2DngE9A3oG9Ax6BvQM6BnQM6Bn0DOgZ0DPgJ5Bz3oGPQN6BvQM6Bn0DOgZ0DOgZ0DPoGdAz4CeAT2DngE9A3oG9AzoGfQM6BnQM6Bn0LOeQc+AngE9A3oGPQN6BvQM6BnQM+gZ0DOgZ0DPoGdAz4CeAT0DegY9A3oG9AzoGfSsZ9AzoGdAz4CeQc+AngE9A3oG9Ax6BvQM6BnQM+gZ0DOgZ0DPgJ5Bz4CeAT0DegY96xn0DOgZ0DOgZ9AzoGdAz4CeAT2DngE9A3oG9Ax6BvQM6BnQM6Bn0DOgZ0DPgJ4BPYOeAT0Degb0DHoG9AzoGdAzoGfQM6BnQM+AnkHPegY9A3oG9AzoGfQM6BnQM6BnQM+gZ0DPgJ4BPYOeAT0Degb0DOgZ9AzoGdAzoGfQs55Bz4CeAT0DegY9A3oG9AzoGdAz6BnQM6BnQM+gZ0DPgJ4BPQN6Bj0Degb0DOgZ9Kxn0DOgZ0DPgJ5Bz4CeAT0Degb0DHoG9AzoGdAz6BnQM6BnQM+AnkHPgJ4BPQN6Bj3rGfQM6BnQM6Bn0DOgZ0DPgJ4BPYOeAT0Degb0DHoG9AzoGdAzoGfQM6BnQM+AnkHPegY9A3oG9AzoGfQM6BnQM6BnQM+gZ0DPgJ4BPYOeAT0Degb0DOgZ9AzoGdAzoGdAz6BnQM+AngE9g54BPQN6BvQM6Bn0DOgZ0DOgZ9CznkHPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6Bn0rGfQM6BnQM+AnkHPgJ4BPQN6BvQMegb0DOgZ0DPoGdAzoGdAz4CeQc+AngE9A3oGPesZ9AzoGdAzoGfQM6BnQM+AngE9g54BPQN6BvQMegb0DOgZ0DOgZ9AzoGdAz4CeQc96Bj0Degb0DOgZ9AzoGdAzoGdAz6BnQM+AngE9g54BPQN6BvQM6Bn0DOgZ0DOgZ9CznkHPgJ4BPQN6Bj0Degb0DOgZ0DPoGdAzoGdAz6BnQM+AngE9A3oGPQN6BvQM6BnQM+gZ+C97LugZstLzxEJr2nO/niELPTf1lKrd5ZZ8zhgQe887NjSUqu16hiz0/Hbz0dcnVm/qe9psDIi954+LL3350Ha1sctBQ/Q9P172btanttpyX1e+OZUD4pT2m1x+/+js9XM3Hi6YvrdYLI4GYlWcloQlr9Ye3718ysaV918kQMSOJWHSxfMzZh9ZuP3Zvc7OMUCkKpXK3SScOnT7x8w5+y5c2dbbOwqI1q+DSQhT16+Yd3Ly/uc/dw4MjASidTPtOXx/+eb30m8PTh8+MCE1HojPcLx7hnsO8z9vGXqy6MzcVddqgFjdqvnXcwhb193Z9bWjYwQQrzV/BRgAKUYs9eGcDMIAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/br.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDADJA/eAAKzJ2qu+x6u4vKe2vaq4va7J2a7G1K7K26S2v67Dz6vI2aW1vaq3vKm3vau5v/7+/qzG16rE06W3wKW2v6q7wqW5w6a2vqrD0aW5xa3J2qzCzqa8yKzD0LzGyqe5w6rD0qq9xq7H167F06m/y6a8x6i5wazH16a4wK27wK3F0qnC0am3vLDH1LC7wKrBz8nR1OHm56zE06a6xKe+zKW4wKO2v6q4vKW1vq7H1azH2avG1azCzaq9x6y5v6W5xKS4wbjDxqi4v6u7w9bc3+Lm6KW4wrbBxazI2K3I2Ku4vbvFyaa2vam5wKi9yKi3va3H1qvI2Ke2vNDX2qjAzaa7x6rAzanBz6rF1ae9yazBzaq/y/Hz9Ky/yOPn6am5v6vBzqi+y63H16e9yqzG1KvF1P39/avD0am7xa26vqy5vqi6w6zI2ai/zae3vrDJ2Ki2vKa1vKm4vqi7xsbP0qm+yKe9yKq+x63Dzq/H1Ky6wKzI2q3K26q6wq/I2K/J2qvI2v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAIAALAAAAAAMAMkDAAj/AP8IBHDAjxsWCbgIQSHwD0E/ffAkCEAhT0MAeyDiuROAj0WBejJG5OixYUiNJD/+OTnSTkmQIje6VMlS5suVMe/MNJlzJ0yUPnECvVlTJ9GeR4fSRLpUKU+nP1smldqU6lOrUW1W1XqVa1ajW8F2Ffs1aFGzTMeihSoUa1uvb8nGXev27FS4dsPSxZu27F25edX+3Qu479zBiPUmFqy4MePHfh1HhnxYcmXKgSdrvrw5M+fPnkMbFs2WdN3RqEunPq26NevXfF3Hhl1Ydm3ahHMv7rx6tu/bv3VbNh18N+jewJMLx4x8OW/bzo9DN05cOfXm16cPx75dO3Pvz3Fn/xffnfx38+GLl1d/nn166+vht5f/Pnp1+9zn4wcvHX1/9//RF+B+/t03HoAGxkcggvnVd6CACer34IIQNjjghBgqmKGEGnbI4YcOehgiiBeKWCKJEY6o4okrpsjiiy7GaKGM/NFY4Iw41pjjjTr2yOOPDPoYJJAVClkkkRQmuWGLOw7p5JFPKmmijVEuCWOTUGYpJYpYbsmkkV5eCaaVVGpJZpdnjjklmmuqyaWbXyKZppxt0vmmnXFWWaeed/KZp5l7AtqnoH+GWaahbA6KKJxi4tmon48SGumijh46J6SWBkoppokWeqmkmSr66aagdjrpqKhqmqqoqrbK6queuv8aK6ynylorraHOquutu+bK66++BmuqsIwSW+mwyBab7LHKNsvss5w6Gy20pUpbLbWkZrtqr8tO6+2132prq7Hhbgtst+CmKy6u6K7LrbXunguvueSqS2+79847Lr776suuv+9im6/A/RL8r8EBl1uwwgcznLC9C0PcsMQPx1uvxfxOTKkBKV1lgAYdqYQRRB935MBFBxQQggg78EDByQNlUMATKWQBAh89XCQzDhxocQYTaZiERBgxfEGHGl4ksZICa5gwhhkjyFFCHC0okAMUEJBxQRVNeBAEAUAcAcEVEajARh0ynNAGAS/oEMEHVsywgQ80WOCEADBc4MIUYlBNUYEEEwxAgBFlgIEFCRj8UMMNAzQgABGAYFBBEQggsAAcjksBCCASIDDBAktEwQAaQzywuQUDDPDGCgJ0sMXmmzNggwBKzNGF6bADEhAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/br.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAwAAAPJCAMAAAARZjlPAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAYNQTFRFrMnaq77Hq7i8p7a9qri9rsnZrsbUrsrbpLa/rsPPq8jZpbW9qre8qbe9q7m//v7+rMbXqsTTpbfApba/qrvCpbnDpra+qsPRpbnFrcnarMLOprzIrMPQvMbKp7nDqsPSqr3GrsfXrsXTqb/LprzHqLnBrMfXprjArbvArcXSqcLRqbe8sMfUsLvAqsHPydHU4ebnrMTTprrEp77MpbjAo7a/qri8pbW+rsfVrMfZq8bVrMLNqr3HrLm/pbnEpLjBuMPGqLi/q7vD1tzf4ubopbjCtsHFrMjYrcjYq7i9u8XJpra9qbnAqL3IqLe9rcfWq8jYp7a80NfaqMDNprvHqsDNqcHPqsXVp73JrMHNqr/L8fP0rL/I4+fpqbm/q8HOqL7LrcfXp73KrMbUq8XU/f39q8PRqbvFrbq+rLm+qLrDrMjZqL/Np7e+sMnYqLa8prW8qbi+qLvGxs/Sqb7Ip73Iqr7HrcPOr8fUrLrArMjarcrbqrrCr8jYr8naq8ja////7sj6uQAAAIF0Uk5T//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AksjjTwAAAQtJREFUeNrs28VaQgEYhOGfcwBJ6bC7u1vs7u7u7kD0nEsXgYU71z7PN6t5N3MHI5qmSdrXTbV1a6Bckvh8sxr87wl8xPFqiCUQ/QMvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4nzD//giYM1OQFNKTjwNTQWFXtz+JDNNsxXp+rCeF9uyN06nzxMDYfsPu08XOuGhR22Xp4UnRQ8l9jdg65txHoeXp3H5jn4y6Vz2VV8+NZdfGOun05K00ZfU2B2eUegnVLh4sBbw+1ThyLHtrxeFIS5vqVIZ0CQeGLRb7nVNZ0HXxWnz2yXnH2aArjqCq3lYpOZt6POJoVSYet10/Xf8WYACiIq1QmLEJbAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAIeHav///yH5BAEAAAEALAAAAAAWAAsAAAIchI+pEOsZ4nuxTlXzPbnvDk7g6IwmZp5cmhpsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAIeHav///yH5BAEAAAEALAAAAAALABYAAAIjjI+AC7rWHIsvtmmTvXBzT4HiKAZkBx6l6mGUK2lcNdNPUgAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAIABAIeHav///yH5BAEAAAEALAAAAAALABYAAAIkRI4JlrqN1oNyutqqvDrqHXyYSJZkeKKf17Ggy3CQOqN1eAcFADs=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/darrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAIABAIeHav///yH5BAEAAAEALAAAAAAWAAsAAAIcjI8AyJ26nAwQzlbrPTnv3k0g6IwjY5pcqrJsAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/itunes.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAFYAAAAmCAIAAADRFvthAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+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/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAACaZJREFUeNrcWn2sFFcVP3d3Zmdnd9/j4ZbHZ4svtHlQaF4jiY3WopZaWkukgcqXGghNsUi0ttQWYrStSKRaUhNoTQ2iobSmPmoKgVRKSUHAWpQv+RAIIEHk9UGXt8vszM7Xvcc/7s7dO7OzC9p/3uvNy77dmXtn5vzu7/zOPWcuYYwBAEqNMSY+5QYDrZFwSyQS4lM0AFCE/dxmSimra/zsgINA2BxpyWSSH+cwKcJ+3nzfp5TyT974cUrpgIMgmUwKm3lTFCWZTHJ0xKci7OeW+77vBY3/5Ch4njfgIFBVlduvKIqiKGrQEFFRFMGUKgTcfs/zXNd1HMd13SVLlsAnq61atSqVSnG/lvUiBIHrurZt27ZdqVQA4JX1G4OOwYg6TWwgkhh3jlzrITFyTXI9vRv8JuFLPDrv6+VyWdd1br+skYrwAs/zHMexbds0TdM0AeDfBYtfBBvfH2Nuj83MAgBCGmAUDCFIGp0V9yVhqKTrkQbwGYbBRV3WSMZYlQXCCyqVimmahmEAAKOszh6sGYFNJuT6Img9p0gUYBILanAU+XOQ0GAOAMHoAG6UUAcukIgYZYEMAWW0egOMfWrS2Ni6SUFoxhMSC0kwHq/D6aSJD66HkQGGYSQSCVkXue1RLXAcx7KscrkMAKwaCDFkFkY97p//OFgqXhk74fa2T+Wx2i/K+6hDNPXjmg0C6Bi/CukTxqgHisH8bLlcVlU1nU67risiHSJGIwKXA8uyBAR1Xhs8RUC8tatX7v9gz8o16/PtQx+ZOaUR69d2v9Nxc2fsVGI8STDi0diYCVXeI4mHFQEALMvSdd1xHB7voxBEiMAjAmVU+DY2jguTp0ztHHfr8JEj03p22kNz+cEjh/afPX1yzC1jJ3R9hh9pbRnEKAtJRRwXUBY3ItyI1IDC+CCDIHeVWBCcqlQqPN4L+2sQCBTE0shxnMYsiMgXfnX67CQhjkcZ4JM//hkX6DUvLD97+uRnPz/pO0/8kPetOH6wxMTQ/GJzJw93xHi1jwcz3MT8+74v7A85Qn1EaLAojvJz5TNPnTh6aPFTz43vmmj41SGUMn4Fw7JFzz9t+sPm7le/8sD0B2fPB4AXVyw7feLY95Yu7xzftee9bb9f99LnJt1z89gJr69bU7HMGd94+L6vzeQ37O35zysv/vT4kQNpPTPpngfmffv7yUQSAI4e+vs7WzYe/NtfKKXtw0f+/OUNqpqKARarcpjL5XK5nOu6nufVHKFJzGKMxQcDDK0WLvVcOHfmlGOVmQQZdx3EEI5G8cq5M6dKfR8xSoHApYsXzp055VQsRqlllM6dOQWIm7tfHd0x5szJ479atfzOL03JZHOWaTzxyEzbtubMW3j8yKE3X1s7qG3wg7PmWWb5mScX+tRf9NjTyWTy6OGDjFKaoNdYtdVnU03O8Sypli+JPxZ8MsoCvUBEcYQxWoUAqjLD/wKvQsaoWHTw9JT3v/ThxZd++8bLv+u+9bbbfc87cuADRumWN18v9hUm3zt1zvxFjy99DgB2btvMKO0rXLbtSktL6x1fmHz/tFlLf/KLpJIUD8D/seDxm5jZnAW0Ps5jdWUttAu5unF3kgMGACBDObIG1ECui1wVhVsCwKTJUwa3jyyUyvkb2gHAc21G6fkzpwDg5Iljzz79XSBACOm5eIEyOnzUTbd1TTxyeP+CWffddff90+csGDZiFPyvHLgGBJQFwSa0NIyVokhCjcj4kGpYCQCpTjuTcaGMUWRcO5jr+jWwGNKAaBk9c9PoTwNAx/yFiEh9j1L2/Jp13Rt+88aGdTvefmvPe9ueX7N+5I0dGL+o/HgsqNNsEloLIwIAQyZrRzUbq7GAkycBAMbVEqO058L5f50+VWUBpRwdAOQ3DfjCGKWjO8bs2bndcZ1vPrxYXKpccQCpYdLpcxdMe2jOs0sfO7R/3653t86at6g+iSH48SHAcJQichBHhOBxGcUaAvw8SjjCuAldALB3146Eou7buzORTAIAY0iFdiAySjEAnTPr3qkzNm187eTxIyt+9IM77vqyVTZOnzw279ElF86f3bV96/iuicNGjOJL0Hw+z4fXZbf4f0PAqtY1z3EwmD4x4Rh1e96r45Zxd37x7vd379y94+3Fjy/buqn76OEDyBijDBmGfEQMZ1RN6yt/+evVL6z46+533//zdkVRR4y6kTEfkB3ct3f7lj8isvZhI2bM/taUqTNsj8YvKpqUGIvFYqVSKZfLpVKpUChcvny5t7e3p6fnxIkTcxcti82MAYm8Xhrcmk2pyaJhOq4vDrdk05m0ZtmOYdry4LZcxrHNbLalXHEy6ZSqJPuumq7n6+lUa1av2G6pbAFAW0tW09SSYdm2CwCqkmzN6b7nlUpXhgwZhgCFYjmZJG2tWd/zSsW+/A3ttuuVrQpi/AKye+0LY8eOHT58+NChQ4cMGZLP5wcNGpTL5XRdVyIlV/kLZZTE5ElRKhT6rtbnLSXDLBlmKHtBBIArJSORIGahCACWVRFXK5uVslkR171SuiqSYABwXHr5iguEJNRMb6HIR/kUei/3ASEJRfvwo76gCkEwXESoKULYupAjyBVl+bukZKTmUhiTFGMdBHHaWe3MaB2OGNsR45YqkfQHqwcb1aYwBEGsmUqk6i7KKRIERE5SQLYXMS7/ra3jZf2sVezwGpU3bCpjjXKscJElhrTCNGF8lQUyKqLkzAusNAxB5KpEylswqOBE6inRbFekegSbB+2GKozXLkvJJRi5G68URVAghCix9nMI3lq/+pNUQeZ21aOgyPaLerumaZ2dnYVCoVgsGoZhmqbINMVitr+9YhOzKqpjmqZls9mWlpa2trZ8Pq9pmqqq3EYZBSUy/6lUStM0XdczmYzjOL7v89cy/PsAgkBRFE3TMpkMT5AzmYyu65qmpVKpCBeqEHD7OXLpdFrYz1+8aJoWqbf1cwjEdOq6zonAUUin04ILHIUoBJwCmUyGVxS4/6TTadu25XpbP7RfRkGeUT6duVyutbWVoxAhAiFEEV7AKaDrOmc7538qlcpkMrzMIrygn7NAloNUKpVOp7PZbC6Xa2lpyWaz3B1UVRW+oEQG6LrO7U8kEvxnfcm1P+81EBDIrq3rOvcIDkEqleK+EMMC4eccFM6i+pJrP3eEWIEXQAg5iLKAv1oSrxw5IoL/YqPBgNhuIhNBcIEDIT5j5FAeL/xC3l8g77sZEBDUL/bEezR5jRSFQMZPVVV5l0m/VcFr6mL9LhOxNKpBAMGWEzmoRPYaQbAlaUCsheUUoMleI97tvwMAb9/jcL6xmmYAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowdown.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAAWAAsAAAVuYCd2zsadaLo5Y+eJgGAsWm3XiyEAoud3G0SBoKBYjhaKglBAbFw+HyRSSEwwj0DggZkkChFIdLzJXA6YSqNRwRwumc14Xj5jtG64fE43WxgMFnp8hAAIEgQEEggAhI4DMjoDjpQdAwNQlI49lCEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowleft.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAALABYAAAVooCeOZEeenXmKqXpCG+COW4QIzrllRWFspN0lQVhwRoDM5TBRaI6eAWKJwVCeno5AYsFUHpZnZ2AgMAKNQJgzLp/T6+y2+41Hp4fqFepJLptYNEpERjo8PkA6NjgrHjAyjVkpkZKUWSEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowright.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhCwAWAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAALABYAAAVlYOeNZNmJpXmmZAdsEOs5AhJt7GYURYaXnAUhcfEBNYrJoQggcTQUDGaJGIyelkcFY5EIRNhAI8AgGAad8Lh8Tmuy2+7X84xOL9UrUsl0ColGJDo8gSQ0Nj8mLzEsJyiNj40yJCEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/rarrowup.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFgALAMQeAM/f5q7K28jb5NDg5rnR377V4MPY4rTO3cXZ47jQ3rfQ3sHW4bLM3KzI2tHh56/L29Lh58fb473U4LPN3bbP3q3J27XO3bvT37DL3MTY4r/V4c7f5sze5dTj6P///wAAACH5BAEAAB4ALAAAAAAWAAsAAAVuoCeOZNeRaFoOw6m+3iAYhjDAKYBIBCEhANxok7lYGAzLJbMREi8HTCCAOSybr2e00mhUqlcVJFJITDCP6QMzSRQiEFRngygQFBSL3kJREAoIGy4eJgAzCxqJiokLNQAmhCYdDhsclpeYGw6SHSEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tl.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhzwMMAOZCAMXZ47/V4a/L27bP3rPN3brS373U4LLN3KzI2s7f5qzJ2sHW4bXP3bfQ3sbZ463K27HM3LvS37DL3NLh59Dg5sjb5NHh58LX4q7K28rc5MPY4sDW4ejv8szd5c/f5s3e5cnb5Mfa49Pi6LzT4P3+/vL298ba47vT3+Pt8NPh58vd5NTi6Pn7/Ozy9P7+/vj6+8ze5fH2+Ozy9eHr7+Ls8Orx9M7f5enw88TZ4r7V4LXO3a/K27LM3LnR363J28vd5e3z9avI2v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEIALAAAAADPAwwAAAf/gEKCg0IuMUCIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjpKWmp6ipqqusra6vsLGZMoRCLDQrExQJHzAdP8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6cwdhDciFgk/ICEmAPY4+Pn6+/z9/v8AAwocSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQwq0NwjFBA8/KgDQsGBDgJc5YsqcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rd+VJQjQkJMji4EMDAiAgFCvRYy7at27dw/+PKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnkzZblohL0R4yABggYEIPRoMGM2AgY7TqFOrXs26tevXsGPLnk27tu3buHPr3s27t+/fwIMLH068uPHjyJMrX868ufPn0F+XHiBkhoUfDjyH1kGAwIEDPMKLH0++vPnz6NOrX8++vfv38OPLn0+/vv37+PPr38+/v///AAYo4IAEFmjggQgmqGB7B5CQQgIVXGBADwMQAIEEEgggwA4cdujhhyCGKOKIJJZo4okopqjiiiy26OKLMMYo44w01mjjjTjmqOOOPPbo449ABinkkEQWeaKGJVDwA8wAAUTQgIUCYPCAD1RWaeWVWGap5ZZcdunll2CGKeaYZJZp5plopqnmmmy26eabcMYp55x01mnnnXjmqeeefPY5Zgs2gKDBhDpAIMADCiiAAAJBNOroo5BGKumklFZq6aWYZqrpppx26umnoIYq6qiklmrqqaimquqqrLbq6quwxirrrLTWaiumi3LwQQgLnPCkBBgocOuwxBZr7LHIJqvsssw26+yz0EYr7bSfcqCCAxsUMMABhwpL7bfghivuuOSWa+656Kar7rqQBgIAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tl.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAA88AAAAMCAMAAABrwX92AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMlQTFRFxdnjv9Xhr8vbts/es83dutLfvdTgss3crMjazt/mrMnawdbhtc/dt9Dextnjrcrbsczcu9LfsMvc0uHn0ODmyNvk0eHnwtfirsrbytzkw9jiwNbh6O/yzN3lz9/mzd7lydvkx9rj0+LovNPg/f7+8vb3xtrju9Pf4+3w0+Hny93k1OLo+fv87PL0/v7++Pr7zN7l8fb47PL14evv4uzw6vH0zt/l6fDzxNnivtXgtc7dr8rbsszcudHfrcnby93l7fP1q8ja////pkJuwAAAAEN0Uk5T////////////////////////////////////////////////////////////////////////////////////////AEFiBO8AAADcSURBVHja7NUHTsNAFITht9XdcUnvCZ0UejMsC77/obDCKZ403xFG+jXU/js+/AAAb490qnn/vKv70ep+4QGArcWp57ftMPLrzSURvQMAU13AXc7X9dIPaJrMhBAfAMCUEF3PL3U0yUfCnpXGOADgyhhq77bLCSW2dJlSKk0bAGApTRW1T0OfJ9ZljdZB8AUAbAV0fhMNRtYpXVSVlJ8AwJWUdNH3JMpMF3Lc+wYAzujwup5a1xSyF8dh+AsAXIUhzVeb5CrT1TjGHADM0fw2nxkVdPeMMQCY+xNgAGxG2LimrQDhAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tr.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDAAyAOZsAK7K26zJ2qu+x7DL3LLN3K3J26+8wbrS37bP3rjQ3rDJ2K7Dz8DW4bHJ2LrR3cjb5MXY4Mnb48nb4bjK0rDFz7TAxb3S3rHCyrbI0bvT37zT4LfO3LHM3LrO17fO2rC/xbfM1rvS38ze5bTK1c3d5LfQ3rTH0bLG0L7N0sDR2MHO1MnZ37TO3bbFy7LL28DV4LHK2q/AybPJ1a/Ez6u7w8nX3ay/yKq7wrDI1LvQ3LXM2sTY4b7S3K27wL7V4L3Q17O/xa2/yMLU3c/e5LTM27vM0q67wK/K28PX4bPN3bDK2q6+xLjFyr3Kz7XO3bPDysTU26/L26y8w83c4rjGy8fa48LR1628w66/yMHV3rLK2bHI1cLX4rPAxcbV2rDH1MbZ48zd5Kq+x63Dzqq6wq3K26y6wKzI2q/I2K/H1K/J2qvI2gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAGwALAAAAAAMADIAAAf9gGyCg4SCImEkQ1M1hWxgVQ8REiteKoQMDFxIOxBQVk2DBxkaPi9ZQikoTIIIJQkHIRY8P0VUQGwESSwICQ45HRMtFWxRAxwEThseIBhPXWwFAAADBEQ6IyYXHwZnAdEDLloyJzFLBmtrZwVHMA1bFFhX5+gBAEoKODNBUkboa/VqFHxZYINGD38A0aRZIOCGGYRl1CgcI4DMQ3RnIk6seDGdxjQULfrLKBGkGJEYP4452ZHkRJYjVcJMWXIlSo81Z+J8edOlyZ4ygeYUyrNlUKNDkRaNmZTpUppPd/5UOtVpVahXpdqkutVqV6xfter0GZbs2KNezzYFq7ZoIAA7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/tr.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAwAAAAyCAMAAABf28oIAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAUdQTFRFrsrbrMnaq77HsMvcss3crcnbr7zButLfts/euNDesMnYrsPPwNbhscnYutHdyNvkxdjgydvjydvhuMrSsMXPtMDFvdLescLKtsjRu9PfvNPgt87csczcus7Xt87asL/Ft8zWu9LfzN7ltMrVzd3kt9DetMfRssbQvs3SwNHYwc7UydnftM7dtsXLssvbwNXgscrar8DJs8nVr8TPq7vDydfdrL/IqrvCsMjUu9DctczaxNjhvtLcrbvAvtXgvdDXs7/Frb/IwtTdz97ktMzbu8zSrrvAr8rbw9fhs83dsMrarr7EuMXKvcrPtc7ds8PKxNTbr8vbrLzDzdziuMbLx9rjwtHXrbzDrr/IwdXessrZscjVwtfis8DFxtXasMfUxtnjzN3kqr7HrcPOqrrCrcrbrLrArMjar8jYr8fUr8naq8jaAAAAZmJJ4wAAAG10Uk5T////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////AC221EsAAACxSURBVHjaYshBAgxKiSrOwaZQTkIov6CQdpwWmMPDE+NhLRAQ5gvisEtK2elHOmlq+AA5HKqc7IpiNvauIQ45DCyeOhycfJaywrqiOQyBzDIsftJyChL+sTkMrAwMzCwuVspq4vJsDOmMrAzMelFG6obebAzZ2ems7ga80SIR4SBONiODF5eFsWOQG4STxRXPbWZiC+VkZHIzmaeBOalATjJTCpiTToCTNMoZ7ByAAAMAMXnTwpvpjk4AAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/images/wait.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhKwALAPEAADc8QP///5ianP///yH/C05FVFNDQVBFMi4wAwEAAAAh/h1CdWlsdCB3aXRoIEdJRiBNb3ZpZSBHZWFyIDQuMAAh/hVNYWRlIGJ5IEFqYXhMb2FkLmluZm8AIfkECQoAAAAsAAAAACsACwAAAjKEjgjLltnYg/PFChveVvPLheA2hlhZoWYnfd6avqcMZy1J14fKLvrEs/k+uKAgMkwVAAAh+QQJCgAAACwAAAAAKwALAAACPcSOCMsgD2FjsZqEx6x885hh3veMZJiYn8qhSkNKcCy4B2vNsa3pJA6yAWUUGm9Y8n2Oyk7T4posYlLHrwAAIfkECQoAAAAsAAAAACsACwAAAj2EjgjLMA9hY6maalvcb+IPChO3eeF5jKTUoKi6DqYLwutMYzaJ58nO6flSmpisNcwwjEfK6fKZLGJSqK4AACH5BAkKAAAALAAAAAArAAsAAAJAhI4Iy5bZ2JiUugcbfrH6uWVMqDSfRx5RKnQnxa6p+w6xNpu1nY/9suORZENd7eYrSnbIRRMQvGAizhAV+gIUAAA7AAAAAAAAAAAA]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnbGliL2pxdWVyeS5ob3ZlckludGVudC5qcycsJ2xpYi9qcXVlcnkuYmdpZnJhbWUubWluLmpzJywnanF1ZXJ5LmNsdWV0aXAubWluLmpzJyk7CiRpbmZvWydjc3MnXSA9ICdqcXVlcnkuY2x1ZXRpcC5jc3MnOwokaW5mb1snZGVwZW5kcyddID0gJ2pxdWVyeSc7CiRpbmZvWydqc19ub21pbmlmeSddID0gMTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.all.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCgooZnVuY3Rpb24oJCkgewoKICAkLmNsdWV0aXAgPSB7CiAgICB2ZXJzaW9uOiAnMS4yLjcnLAoKICAgIC8vIHRoZSBIVE1MIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdG9vbHRpcAogICAgdGVtcGxhdGU6IFsnPGRpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1vdXRlciI+JywKICAgICAgICAnPGgzIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+JywKICAgICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICc8L2Rpdj4nXS5qb2luKCcnKSwKCiAgICAvKiBjbHVlVGlwIHNldHVwCiAgICAgKiAgdGhlIHNldHVwIG9wdGlvbnMgYXJlIGFwcGxpZWQgZWFjaCB0aW1lIC5jbHVldGlwKCkgaXMgY2FsbGVkLAogICAgICogIEJVVCBvbmx5IGlmIDxkaXYgaWQ9ImNsdWV0aXAiPiBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZG9jdW1lbnQKICAgICovCiAgICBzZXR1cDogewogICAgICAvLyBtZXRob2QgdG8gYmUgdXNlZCBmb3IgaW5zZXJ0aW5nIHRoZSBjbHVlVGlwIGludG8gdGhlIERPTS4KICAgICAgLy8gUGVybWl0dGVkIHZhbHVlcyBhcmUgJ2FwcGVuZFRvJywgJ3ByZXBlbmRUbycsICdpbnNlcnRCZWZvcmUnLCBhbmQgJ2luc2VydEFmdGVyJwogICAgICBpbnNlcnRpb25UeXBlOiAnYXBwZW5kVG8nLAogICAgICAvLyBlbGVtZW50IGluIHRoZSBET00gdGhlIHBsdWdpbiB3aWxsIHJlZmVyZW5jZSB3aGVuIGluc2VydGluZyB0aGUgY2x1ZVRpcC4KICAgICAgaW5zZXJ0aW9uRWxlbWVudDogJ2JvZHknCiAgICB9LAoKICAgIC8qCiAgICAgKiBjbHVlVGlwIG9wdGlvbnMKICAgICAqCiAgICAgKiBlYWNoIG9uZSBjYW4gYmUgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IGNoYW5naW5nIGl0cyB2YWx1ZS4KICAgICAqIGZvciBleGFtcGxlOiAkLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7CiAgICAgKiAgICAgICAgIG9yOiAkLmZuLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgY2x1ZVRpcCB2ZXJzaW9ucwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIGZvciBhbGwgY2x1ZVRpcHMgdG8gMjAwLgogICAgICoKICAgICAqIGVhY2ggb25lIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG1hcCB0byB0aGUgY2x1ZXRpcCBtZXRob2QuCiAgICAgKiBmb3IgZXhhbXBsZTogJCgnYS5leGFtcGxlJykuY2x1ZXRpcCh7d2lkdGg6IDIwMH0pOwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIHRvIDIwMCBmb3IgY2x1ZVRpcHMgaW52b2tlZCBieSBhIGxpbmsgd2l0aCBjbGFzcyBvZiAiZXhhbXBsZSIKICAgICAqCiAgICAqLwogICAgZGVmYXVsdHM6IHsKICAgICAgbXVsdGlwbGU6ICAgICAgICAgZmFsc2UsICAgIC8vIEFsbG93IGEgbmV3IHRvb2x0aXAgdG8gYmUgY3JlYXRlZCBmb3IgZWFjaCAuY2x1ZXRpcCgpIGNhbGwKICAgICAgd2lkdGg6ICAgICAgICAgICAgMjc1LCAgICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgY2x1ZVRpcAogICAgICBoZWlnaHQ6ICAgICAgICAgICAnYXV0bycsICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgY2x1ZVRpcAogICAgICBjbHVlekluZGV4OiAgICAgICA5NywgICAgICAgLy8gU2V0cyB0aGUgei1pbmRleCBzdHlsZSBwcm9wZXJ0eSBvZiB0aGUgY2x1ZVRpcAogICAgICBwb3NpdGlvbkJ5OiAgICAgICAnYXV0bycsICAgLy8gU2V0cyB0aGUgdHlwZSBvZiBwb3NpdGlvbmluZzogJ2F1dG8nLCAnbW91c2UnLCdib3R0b21Ub3AnLCAndG9wQm90dG9tJywgZml4ZWQnCiAgICAgIHRvcE9mZnNldDogICAgICAgIDE1LCAgICAgICAvLyBOdW1iZXIgb2YgcHggdG8gb2Zmc2V0IGNsdWVUaXAgZnJvbSB0b3Agb2YgaW52b2tpbmcgZWxlbWVudAogICAgICBsZWZ0T2Zmc2V0OiAgICAgICAxNSwgICAgICAgLy8gTnVtYmVyIG9mIHB4IHRvIG9mZnNldCBjbHVlVGlwIGZyb20gbGVmdCBvZiBpbnZva2luZyBlbGVtZW50CiAgICAgIHNuYXBUb0VkZ2U6ICAgICAgIGZhbHNlLCAgICAvLyBGb3IgYm90dG9tVG9wIGFuZCB0b3BCb3R0b20sIHNuYXAgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGVsZW1lbnQuCiAgICAgIGxvY2FsOiAgICAgICAgICAgIGZhbHNlLCAgICAvLyBXaGV0aGVyIHRvIHVzZSBjb250ZW50IGZyb20gdGhlIHNhbWUgcGFnZSBmb3IgdGhlIGNsdWVUaXAncyBib2R5CiAgICAgIGxvY2FsUHJlZml4OiAgICAgIG51bGwsICAgICAvLyBzdHJpbmcgdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSB0aXAgYXR0cmlidXRlIGlmIGxvY2FsIGlzIHRydWUKICAgICAgbG9jYWxJZFN1ZmZpeDogICAgbnVsbCwgICAgIC8vIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byB0aGUgY2x1ZXRpcCBjb250ZW50IGVsZW1lbnQncyBpZCBpZiBsb2NhbCBpcyB0cnVlCiAgICAgIGhpZGVMb2NhbDogICAgICAgIHRydWUsICAgICAvLyBJZiBsb2NhbCBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGxvY2FsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHNob3duIGluIGNsdWVUaXAgc2hvdWxkIGJlIGhpZGRlbiBhdCBpdHMgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgYXR0cmlidXRlOiAgICAgICAgJ3JlbCcsICAgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyBib2R5IGNvbnRlbnQKICAgICAgdGl0bGVBdHRyaWJ1dGU6ICAgJ3RpdGxlJywgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyB0aXRsZQogICAgICBzcGxpdFRpdGxlOiAgICAgICAnJywgICAgICAgLy8gQSBjaGFyYWN0ZXIgdXNlZCB0byBzcGxpdCB0aGUgdGl0bGUgYXR0cmlidXRlIGludG8gdGhlIGNsdWVUaXAgdGl0bGUgYW5kIGRpdnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgY2x1ZVRpcCBib2R5LiBtb3JlIGluZm8gYmVsb3cgWzZdCiAgICAgIGVzY2FwZVRpdGxlOiAgICAgIGZhbHNlLCAgICAvLyB3aGV0aGVyIHRvIGh0bWwgZXNjYXBlIHRoZSB0aXRsZSBhdHRyaWJ1dGUKICAgICAgc2hvd1RpdGxlOiAgICAgICAgdHJ1ZSwgICAgIC8vIHNob3cgdGl0bGUgYmFyIG9mIHRoZSBjbHVlVGlwLCBldmVuIGlmIHRpdGxlIGF0dHJpYnV0ZSBub3Qgc2V0CiAgICAgIGNsdWV0aXBDbGFzczogICAgICdkZWZhdWx0JywvLyBjbGFzcyBhZGRlZCB0byBvdXRlcm1vc3QgY2x1ZVRpcCBkaXYgaW4gdGhlIGZvcm0gb2YgJ2NsdWV0aXAtJyArIGNsdWVUaXBDbGFzcy4KICAgICAgaG92ZXJDbGFzczogICAgICAgJycsICAgICAgIC8vIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGludm9raW5nIGVsZW1lbnQgb25tb3VzZW92ZXIgYW5kIHJlbW92ZWQgb25tb3VzZW91dAogICAgICB3YWl0SW1hZ2U6ICAgICAgICB0cnVlLCAgICAgLy8gd2hldGhlciB0byBzaG93IGEgImxvYWRpbmciIGltZywgd2hpY2ggaXMgc2V0IGluIGpxdWVyeS5jbHVldGlwLmNzcwogICAgICBjdXJzb3I6ICAgICAgICAgICAnaGVscCcsCiAgICAgIGFycm93czogICAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBkaXNwbGF5cyBhcnJvdyBvbiBhcHByb3ByaWF0ZSBzaWRlIG9mIGNsdWVUaXAKICAgICAgZHJvcFNoYWRvdzogICAgICAgdHJ1ZSwgICAgIC8vIHNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZHJvcC1zaGFkb3cgZWZmZWN0IG9uIHRoZSBjbHVlVGlwCiAgICAgIGRyb3BTaGFkb3dTdGVwczogIDYsICAgICAgICAvLyBhZGp1c3RzIHRoZSBzaXplIG9mIHRoZSBkcm9wIHNoYWRvdwogICAgICBzdGlja3k6ICAgICAgICAgICBmYWxzZSwgICAgLy8ga2VlcCB2aXNpYmxlIHVudGlsIG1hbnVhbGx5IGNsb3NlZAogICAgICBtb3VzZU91dENsb3NlOiAgICBmYWxzZSwgICAgLy8gY2xvc2Ugd2hlbiBjbHVlVGlwIGlzIG1vdXNlZCBvdXQ6IGZhbHNlLCAnY2x1ZXRpcCcsICdsaW5rJywgJ2JvdGgnCiAgICAgIGRlbGF5ZWRDbG9zZTogICAgIDUwLCAgICAgICAgLy8gY2xvc2UgY2x1ZVRpcCBvbiBhIHRpbWVkIGRlbGF5CiAgICAgIGFjdGl2YXRpb246ICAgICAgICdob3ZlcicsICAvLyBzZXQgdG8gJ2NsaWNrJyB0byBmb3JjZSB1c2VyIHRvIGNsaWNrIHRvIHNob3cgY2x1ZVRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvICdmb2N1cycgdG8gc2hvdyBvbiBmb2N1cyBvZiBhIGZvcm0gZWxlbWVudCBhbmQgaGlkZSBvbiBibHVyCiAgICAgIGNsaWNrVGhyb3VnaDogICAgIHRydWUsICAgIC8vIGlmIHRydWUsIGFuZCBhY3RpdmF0aW9uIGlzIG5vdCAnY2xpY2snLCB0aGVuIGNsaWNraW5nIG9uIGxpbmsgd2lsbCB0YWtlIHVzZXIgdG8gdGhlIGxpbmsncyBocmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBocmVmIGFuZCB0aXBBdHRyaWJ1dGUgYXJlIGVxdWFsCiAgICAgIHRyYWNraW5nOiAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBjbHVlVGlwIHdpbGwgdHJhY2sgbW91c2UgbW92ZW1lbnQgKGV4cGVyaW1lbnRhbCkKICAgICAgY2xvc2VQb3NpdGlvbjogICAgJ3RvcCcsICAgIC8vIGxvY2F0aW9uIG9mIGNsb3NlIHRleHQgZm9yIHN0aWNreSBjbHVldGlwczsgY2FuIGJlICd0b3AnLCAnYm90dG9tJywgJ3RpdGxlJyBvciAnbm9uZScKICAgICAgY2xvc2VUZXh0OiAgICAgICAgJ0Nsb3NlJywgIC8vIHRleHQgKG9yIEhUTUwpIHRvIHRvIGJlIGNsaWNrZWQgdG8gY2xvc2Ugc3RpY2t5IGNsdWVUaXBzCiAgICAgIHRydW5jYXRlOiAgICAgICAgIDAsICAgICAgICAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB0cnVuY2F0ZSBjbHVlVGlwJ3MgY29udGVudHMuIGlmIDAsIG5vIHRydW5jYXRpb24gb2NjdXJzCgogICAgICAvLyBlZmZlY3QgYW5kIHNwZWVkIGZvciBvcGVuaW5nIGNsdWVUaXBzCiAgICAgIGZ4OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46ICAgICAgICdzaG93JywgLy8gY2FuIGJlICdzaG93JyBvciAnc2xpZGVEb3duJyBvciAnZmFkZUluJwogICAgICAgICAgICAgICAgICAgICAgICBvcGVuU3BlZWQ6ICAnJwogICAgICB9LAoKICAgICAgLy8gc2V0dGluZ3MgZm9yIHdoZW4gaG92ZXJJbnRlbnQgcGx1Z2luIGlzIHVzZWQKICAgICAgaG92ZXJJbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICAzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbDogICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAgICAgIDAKICAgICAgfSwKCiAgICAgIC8vIHNob3J0LWNpcmN1aXQgZnVuY3Rpb24gdG8gcnVuIGp1c3QgYmVmb3JlIGNsdWVUaXAgaXMgc2hvd24uCiAgICAgIG9uQWN0aXZhdGU6ICAgICAgIGZ1bmN0aW9uKGUpIHtyZXR1cm4gdHJ1ZTt9LAogICAgICAvLyBmdW5jdGlvbiB0byBydW4ganVzdCBhZnRlciBjbHVlVGlwIGlzIHNob3duLgogICAgICBvblNob3c6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIGZ1bmN0aW9uIHRvIHJ1biBqdXN0IGFmdGVyIGNsdWVUaXAgaXMgaGlkZGVuLgogICAgICBvbkhpZGU6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIHdoZXRoZXIgdG8gY2FjaGUgcmVzdWx0cyBvZiBhamF4IHJlcXVlc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgaGl0cyB0byBzZXJ2ZXIKICAgICAgYWpheENhY2hlOiAgICAgICAgdHJ1ZSwKCiAgICAgIC8vIHByb2Nlc3MgZGF0YSByZXRyaWV2ZWQgdmlhIHhociBiZWZvcmUgaXQncyBkaXNwbGF5ZWQKICAgICAgYWpheFByb2Nlc3M6ICAgICAgZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLzwoc2NyaXB0fHN0eWxlfHRpdGxlKVtePF0rPFwvKHNjcmlwdHxzdHlsZXx0aXRsZSk+L2dtLCAnJykucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICB9LAoKICAgICAgLy8gY2FuIHBhc3MgaW4gc3RhbmRhcmQgJC5hamF4KCkgcGFyYW1ldGVycy4gQ2FsbGJhY2sgZnVuY3Rpb25zLCBzdWNoIGFzIGJlZm9yZVNlbmQsCiAgICAgIC8vIHdpbGwgYmUgcXVldWVkIGZpcnN0IHdpdGhpbiB0aGUgZGVmYXVsdCBjYWxsYmFja3MuCiAgICAgIC8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBlcnJvciwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0CiAgICAgIGFqYXhTZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcjogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIG92ZXJyaWRlIGRlZmF1bHQgZXJyb3IgY2FsbGJhY2sgKi8gfSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlU2VuZDogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIGNhbGxlZCBmaXJzdCB3aXRoaW4gZGVmYXVsdCBiZWZvcmVTZW5kIGNhbGxiYWNrICovIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnaHRtbCcKICAgICAgfSwKICAgICAgZGVidWc6IGZhbHNlCgogICAgfQogIH07CiAgdmFyICRjbHVldGlwV2FpdCwKICAgICAgc3RhbmRhcmRDbGFzc2VzID0gJ2NsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAnLAogICAgICBjYWNoZXMgPSB7fSwKICAgICAgY291bnRlciA9IDAsCiAgICAgIGltZ0NvdW50ID0gMDsKCiAgLy8gdXNlICQuZm4ucHJvcCgpIGlmIGF2YWlsYWJsZSAoalF1ZXJ5IDEuNispOyBvdGhlcndpc2UsICQuZm4uYXR0cigpCiAgJC5mbi5hdHRyUHJvcCA9ICQuZm4ucHJvcCB8fCAkLmZuLmF0dHI7CgogIC8vIC5jbHVldGlwKCkgbWV0aG9kCiAgJC5mbi5jbHVldGlwID0gZnVuY3Rpb24oanMsIG9wdGlvbnMpIHsKICAgIHZhciAkY2x1ZXRpcCwgJGNsdWV0aXBJbm5lciwgJGNsdWV0aXBPdXRlciwgJGNsdWV0aXBUaXRsZSwgJGNsdWV0aXBBcnJvd3MsICRkcm9wU2hhZG93OwogICAgaWYgKHR5cGVvZiBqcyA9PSAnb2JqZWN0JykgewogICAgICBvcHRpb25zID0ganM7CiAgICAgIGpzID0gbnVsbDsKICAgIH0KICAgIGlmIChqcyA9PSAnZGVzdHJveScpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoJ2NsdWV0aXAnKTsKICAgICAgaWYgKCBkYXRhICkgewogICAgICAgICQoZGF0YS5zZWxlY3RvcikucmVtb3ZlKCk7CiAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICd0aXRsZScpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcCcpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcE1vYycpOwogICAgICB9CiAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgnLmNsdWV0aXAnKTsKICAgICAgcmV0dXJuIHRoaXMudW5iaW5kKCcuY2x1ZXRpcCcpOwogICAgfQoKICAgIC8vIG1lcmdlIHBlci1jYWxsIG9wdGlvbnMgd2l0aCBkZWZhdWx0cwogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLmNsdWV0aXAuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pOwoKICAgIC8qKiA9Y3JlYXRlIGNsdWV0aXAgZGl2cyAqKi8KICAgIGNvdW50ZXIrKzsKICAgIHZhciBjbHVlekluZGV4LAogICAgICAgIGNsdWV0aXBJZCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0IHx8ICFvcHRpb25zLm11bHRpcGxlID8gJ2NsdWV0aXAnIDogJ2NsdWV0aXAtJyArIGNvdW50ZXIsCiAgICAgICAgY2x1ZXRpcFNlbGVjdG9yID0gJyMnICsgY2x1ZXRpcElkLAogICAgICAgIHByZWZpeCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0ID8gJyMnIDogJy4nLAogICAgICAgIGluc2VydGlvblR5cGUgPSAkLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSwKICAgICAgICBpbnNlcnRpb25FbGVtZW50ID0gJC5jbHVldGlwLnNldHVwLmluc2VydGlvbkVsZW1lbnQgfHwgJ2JvZHknOwoKICAgIGluc2VydGlvblR5cGUgPSAoL2FwcGVuZFRvfHByZXBlbmRUb3xpbnNlcnRCZWZvcmV8aW5zZXJ0QWZ0ZXIvKS50ZXN0KGluc2VydGlvblR5cGUpID8gaW5zZXJ0aW9uVHlwZSA6ICdhcHBlbmRUbyc7CiAgICAkY2x1ZXRpcCA9ICQoY2x1ZXRpcFNlbGVjdG9yKTsKICAgIGlmICghJGNsdWV0aXAubGVuZ3RoKSB7CgogICAgICAkY2x1ZXRpcCA9ICQoJC5jbHVldGlwLnRlbXBsYXRlKQogICAgICBbaW5zZXJ0aW9uVHlwZV0oaW5zZXJ0aW9uRWxlbWVudCkKICAgICAgLmF0dHIoJ2lkJywgY2x1ZXRpcElkKQogICAgICAuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgZGlzcGxheTogJ25vbmUnfSk7CgogICAgICBjbHVlekluZGV4ID0gK29wdGlvbnMuY2x1ZXpJbmRleDsKICAgICAgJGNsdWV0aXBPdXRlciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtb3V0ZXInKS5jc3Moe3Bvc2l0aW9uOiAncmVsYXRpdmUnLCB6SW5kZXg6IGNsdWV6SW5kZXh9KTsKICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKTsKICAgICAgJGNsdWV0aXBUaXRsZSA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtdGl0bGUnKTsKCiAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgJCh0aGlzKS5kYXRhKCdlbnRlcmVkJywgZXZlbnQudHlwZSA9PT0gJ21vdXNlZW50ZXInKTsKICAgICAgfSk7CiAgICB9CgogICAgJGNsdWV0aXBXYWl0ID0gJCgnI2NsdWV0aXAtd2FpdGltYWdlJyk7CiAgICBpZiAoISRjbHVldGlwV2FpdC5sZW5ndGggJiYgb3B0aW9ucy53YWl0SW1hZ2UpIHsKICAgICAgJGNsdWV0aXBXYWl0ID0gJCgnPGRpdj48L2Rpdj4nKS5hdHRyKCdpZCcsICdjbHVldGlwLXdhaXRpbWFnZScpLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZSd9KTsKICAgICAgJGNsdWV0aXBXYWl0Lmluc2VydEJlZm9yZSgkY2x1ZXRpcCkuaGlkZSgpOwogICAgfQoKCiAgICB2YXIgY2x1ZXRpcFBhZGRpbmcgPSAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nTGVmdCcpLCAxMCkgfHwgMCkgKyAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nUmlnaHQnKSwgMTApIHx8IDApOwoKCiAgICB0aGlzLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgdmFyIGxpbmsgPSB0aGlzLAogICAgICAgICAgJGxpbmsgPSAkKHRoaXMpLAogICAgICAgICAgLy8gc3VwcG9ydCBtZXRhZGF0YSBwbHVnaW4gKHYxLjAgYW5kIDIuMCkKICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0aW9ucywgJC5tZXRhZGF0YSA/ICRsaW5rLm1ldGFkYXRhKCkgOiAkLm1ldGEgPyAkbGluay5kYXRhKCkgOiAkbGluay5kYXRhKCdjbHVldGlwJykgfHwge30pLAogICAgICAgICAgLy8gc3RhcnQgb3V0IHdpdGggbm8gY29udGVudHMgKGZvciBhamF4IGFjdGl2YXRpb24pCiAgICAgICAgICBjbHVldGlwQ29udGVudHMgPSBmYWxzZSwKICAgICAgICAgIGlzQWN0aXZlID0gZmFsc2UsCiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsLAogICAgICAgICAgdGlwQXR0cmlidXRlID0gb3B0c1tvcHRzLmF0dHJpYnV0ZV0gfHwKICAgICAgICAgICAgKCBvcHRzLmF0dHJpYnV0ZSA9PSAnaHJlZicgPyAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSA6ICRsaW5rLmF0dHJQcm9wKG9wdHMuYXR0cmlidXRlKSB8fCAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSApLAogICAgICAgICAgY3RDbGFzcyA9IG9wdHMuY2x1ZXRpcENsYXNzOwoKICAgICAgY2x1ZXpJbmRleCA9ICtvcHRzLmNsdWV6SW5kZXg7CiAgICAgICRsaW5rLmRhdGEoJ2NsdWV0aXAnLCB7dGl0bGU6IGxpbmsudGl0bGUsIHpJbmRleDogY2x1ZXpJbmRleCwgc2VsZWN0b3I6IGNsdWV0aXBTZWxlY3Rvcn0pOwoKICAgICAgaWYgKG9wdHMuYXJyb3dzICYmICEkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1hcnJvd3MnKS5sZW5ndGgpIHsKICAgICAgICAkY2x1ZXRpcC5hcHBlbmQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIHVpLXN0YXRlLWRlZmF1bHQiPjwvZGl2PicpOwogICAgICB9CgogICAgICBpZiAoIXRpcEF0dHJpYnV0ZSAmJiAhb3B0cy5zcGxpdFRpdGxlICYmICFqcykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIGlmIGhpZGVMb2NhbCBpcyBzZXQgdG8gdHJ1ZSwgb24gRE9NIHJlYWR5IGhpZGUgdGhlIGxvY2FsIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgY2x1ZVRpcAogICAgICBpZiAob3B0cy5sb2NhbCAmJiBvcHRzLmxvY2FsUHJlZml4KSB7dGlwQXR0cmlidXRlID0gb3B0cy5sb2NhbFByZWZpeCArIHRpcEF0dHJpYnV0ZTt9CiAgICAgIGlmIChvcHRzLmxvY2FsICYmIG9wdHMuaGlkZUxvY2FsICYmIHRpcEF0dHJpYnV0ZSkgeyAkKHRpcEF0dHJpYnV0ZSArICc6Zmlyc3QnKS5oaWRlKCk7IH0KCiAgICAgIHZhciB0T2Zmc2V0ID0gcGFyc2VJbnQob3B0cy50b3BPZmZzZXQsIDEwKSwgbE9mZnNldCA9IHBhcnNlSW50KG9wdHMubGVmdE9mZnNldCwgMTApOwogICAgICAvLyB2ZXJ0aWNhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcEhlaWdodCwgd0hlaWdodCwKICAgICAgICAgIGRlZkhlaWdodCA9IGlzTmFOKHBhcnNlSW50KG9wdHMuaGVpZ2h0LCAxMCkpID8gJ2F1dG8nIDogKC9cRC9nKS50ZXN0KG9wdHMuaGVpZ2h0KSA/IG9wdHMuaGVpZ2h0IDogb3B0cy5oZWlnaHQgKyAncHgnOwogICAgICB2YXIgc1RvcCwgbGlua1RvcCwgbGlua0JvdHRvbSwgcG9zWSwgdGlwWSwgbW91c2VZLCBiYXNlbGluZTsKICAgICAgLy8gaG9yaXpvbnRhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcElubmVyV2lkdGggPSBwYXJzZUludChvcHRzLndpZHRoLCAxMCkgfHwgMjc1LAogICAgICAgICAgdGlwV2lkdGggPSB0aXBJbm5lcldpZHRoICsgY2x1ZXRpcFBhZGRpbmcgKyBvcHRzLmRyb3BTaGFkb3dTdGVwcywKICAgICAgICAgIGxpbmtXaWR0aCA9IHRoaXMub2Zmc2V0V2lkdGgsCiAgICAgICAgICBsaW5rTGVmdCwgcG9zWCwgdGlwWCwgbW91c2VYLCB3aW5XaWR0aDsKCiAgICAgIC8vIHBhcnNlIHRoZSB0aXRsZQogICAgICB2YXIgdGlwUGFydHM7CiAgICAgIHZhciB0aXBUaXRsZSA9IChvcHRzLmF0dHJpYnV0ZSAhPSAndGl0bGUnKSA/ICRsaW5rLmF0dHIob3B0cy50aXRsZUF0dHJpYnV0ZSkgfHwgJycgOiAnJzsKICAgICAgaWYgKG9wdHMuc3BsaXRUaXRsZSkgewogICAgICAgIHRpcFBhcnRzID0gdGlwVGl0bGUuc3BsaXQob3B0cy5zcGxpdFRpdGxlKTsKICAgICAgICB0aXBUaXRsZSA9IG9wdHMuc2hvd1RpdGxlIHx8IHRpcFBhcnRzWzBdID09PSAnJyA/IHRpcFBhcnRzLnNoaWZ0KCkgOiAnJzsKICAgICAgfQogICAgICBpZiAob3B0cy5lc2NhcGVUaXRsZSkgewogICAgICAgIHRpcFRpdGxlID0gdGlwVGl0bGUucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLz4vZywnJmd0OycpLnJlcGxhY2UoLzwvZywnJmx0OycpOwogICAgICB9CgogICAgICB2YXIgbG9jYWxDb250ZW50OwogICAgICBmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICAvLyBLZWVwIHRyYWNrIG9mIG1vdXNlIGVudGVyZWQgc3RhdGUgb24gbGluawogICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBkYXRhID0gJGxpbmsuZGF0YSgnY2x1ZXRpcCcpOwogICAgICAgIGRhdGEuZW50ZXJlZCA9IGV2ZW50LnR5cGUgPT09ICdlbnRlcmVkJzsKICAgICAgICAkbGluay5kYXRhKCdjbHVldGlwJywgZGF0YSk7CiAgICAgIH0pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEFDVElWQVRJT04KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vYWN0aXZhdGUgY2x1ZVRpcAogICAgdmFyIGFjdGl2YXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdmFyIHBZLCBhamF4TWVyZ2VkU2V0dGluZ3MsIGNhY2hlS2V5LAogICAgICAgICAgY29udGludWVPbiA9IG9wdHMub25BY3RpdmF0ZS5jYWxsKGxpbmssIGV2ZW50KTsKCiAgICAgIGlmIChjb250aW51ZU9uID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgaXNBY3RpdmUgPSB0cnVlOwoKICAgICAgLy8gYWN0aXZhdGUgZnVuY3Rpb24gbWF5IGdldCBjYWxsZWQgYWZ0ZXIgYW4gaW5pdGlhbGl6YXRpb24gb2YgYQogICAgICAvLyBkaWZmZXJlbnQgdGFyZ2V0IHNvIG5lZWQgdG8gcmUtZ2V0IHRoZSBDb3JyZWN0IENsdWV0aXAgb2JqZWN0IGhlcmUKICAgICAgJGNsdWV0aXAgPSAkKGNsdWV0aXBTZWxlY3RvcikuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJ30pOwogICAgICAkY2x1ZXRpcE91dGVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1vdXRlcicpOwogICAgICAkY2x1ZXRpcElubmVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1pbm5lcicpOwogICAgICAkY2x1ZXRpcFRpdGxlID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC10aXRsZScpOwogICAgICAkY2x1ZXRpcEFycm93cyA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtYXJyb3dzJyk7CiAgICAgICRjbHVldGlwLnJlbW92ZUNsYXNzKCkuY3NzKHt3aWR0aDogdGlwSW5uZXJXaWR0aH0pOwogICAgICBpZiAodGlwQXR0cmlidXRlID09ICRsaW5rLmF0dHIoJ2hyZWYnKSkgewogICAgICAgICRsaW5rLmNzcygnY3Vyc29yJywgb3B0cy5jdXJzb3IpOwogICAgICB9CiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5hZGRDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICAgIGxpbmtUb3AgPSBwb3NZID0gJGxpbmsub2Zmc2V0KCkudG9wOwogICAgICBsaW5rQm90dG9tID0gbGlua1RvcCArICRsaW5rLmlubmVySGVpZ2h0KCk7CiAgICAgIGxpbmtMZWZ0ID0gJGxpbmsub2Zmc2V0KCkubGVmdDsKCiAgICAgIC8vIEZJWDogKGJ1ZyA0NDEyKQogICAgICBsaW5rV2lkdGggPSAkbGluay5pbm5lcldpZHRoKCk7CiAgICAgIGlmICggZXZlbnQudHlwZSA9PSBmb2N1cyApIHsKICAgICAgICAvLyBpbiBmb2N1cyBldmVudCwgbm8gbW91c2UgcG9zaXRpb24gaXMgYXZhaWxhYmxlOyB0aGlzIGlzIG5lZWRlZCB3aXRoIGJvdHRvbVRvcDoKICAgICAgICBtb3VzZVggPSBsaW5rTGVmdCArICAoIGxpbmtXaWR0aCAvIDIgKSArIGxPZmZzZXQ7CiAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBwb3NYfSk7CiAgICAgICAgbW91c2VZID0gcG9zWSArIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW91c2VYID0gZXZlbnQucGFnZVg7CiAgICAgICAgbW91c2VZID0gZXZlbnQucGFnZVk7CiAgICAgIH0KICAgICAgLy9FTkQgT0YgRklYCgogICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2FyZWEnKSB7CiAgICAgICAgc1RvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOwogICAgICAgIHdpbldpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7CiAgICAgIH0KLy8gcG9zaXRpb24gY2x1ZVRpcCBob3Jpem9udGFsbHkKICAgICAgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAnZml4ZWQnKSB7CiAgICAgICAgcG9zWCA9IGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICAkY2x1ZXRpcC5jc3Moe2xlZnQ6IHBvc1h9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NYID0gKGxpbmtXaWR0aCA+IGxpbmtMZWZ0ICYmIGxpbmtMZWZ0ID4gdGlwV2lkdGgpIHx8CiAgICAgICAgICBsaW5rTGVmdCArIGxpbmtXaWR0aCArIHRpcFdpZHRoICsgbE9mZnNldCA+IHdpbldpZHRoID8KICAgICAgICAgIGxpbmtMZWZ0IC0gdGlwV2lkdGggLSBsT2Zmc2V0IDoKICAgICAgICAgIGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2FyZWEnIHx8IG9wdHMucG9zaXRpb25CeSA9PSAnbW91c2UnIHx8IGxpbmtXaWR0aCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsgLy8gcG9zaXRpb24gYnkgbW91c2UKICAgICAgICAgIGlmIChtb3VzZVggKyAyMCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsKICAgICAgICAgICAgJGNsdWV0aXAuYWRkQ2xhc3MoJ2NsdWV0aXAtJyArIGN0Q2xhc3MpOwogICAgICAgICAgICBwb3NYID0gKG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCkgPj0gMCA/IG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCAtIHBhcnNlSW50KCRjbHVldGlwLmNzcygnbWFyZ2luTGVmdCcpLDEwKSArIHBhcnNlSW50KCRjbHVldGlwSW5uZXIuY3NzKCdtYXJnaW5SaWdodCcpLDEwKSA6ICBtb3VzZVggLSAodGlwV2lkdGgvMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb3NYID0gbW91c2VYICsgbE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcFkgPSBwb3NYIDwgMCA/IGV2ZW50LnBhZ2VZICsgdE9mZnNldCA6IGV2ZW50LnBhZ2VZOwogICAgICAgIGlmIChwb3NYIDwgMCB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgIHx8IG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJykgewogICAgICAgICAgcG9zWCA9IChtb3VzZVggKyAodGlwV2lkdGgvMikgPiB3aW5XaWR0aCkgPyB3aW5XaWR0aC8yIC0gdGlwV2lkdGgvMiA6IE1hdGgubWF4KG1vdXNlWCAtICh0aXBXaWR0aC8yKSwwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICRjbHVldGlwQXJyb3dzLmNzcyh7ekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4KzF9KTsKICAgICAgJGNsdWV0aXAuY3NzKHsKICAgICAgICBsZWZ0OiBwb3NYLAogICAgICAgIHpJbmRleDogJGxpbmsuZGF0YSgnY2x1ZXRpcCcpLnpJbmRleAogICAgICB9KTsKICAgICAgd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGEgc3RyaW5nIGZyb20gY2x1ZXRpcCBtZXRob2QncyBmaXJzdCBhcmd1bWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIGlmIChqcykgewogICAgICAgIGlmICh0eXBlb2YganMgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAganMgPSBqcy5jYWxsKGxpbmspOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcElubmVyLmh0bWwoanMpOwogICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbG9hZCB0aGUgdGl0bGUgYXR0cmlidXRlIG9ubHkgKG9yIHVzZXItc2VsZWN0ZWQgYXR0cmlidXRlKS4KKiBjbHVlVGlwIHRpdGxlIGlzIHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBkZWxpbWl0ZXIKKiBzdWJzZXF1ZW50IGRlbGltaXRlcnMgcGxhY2UgY2x1ZVRpcCBib2R5IHRleHQgb24gc2VwYXJhdGUgbGluZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgZWxzZSBpZiAodGlwUGFydHMpIHsKICAgICAgICB2YXIgdHBsID0gdGlwUGFydHMubGVuZ3RoOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCh0cGwgPyB0aXBQYXJ0c1swXSA6ICcnKTsKICAgICAgICBpZiAodHBsID4gMSkgewogICAgICAgICAgZm9yICh2YXIgaT0xOyBpIDwgdHBsOyBpKyspewogICAgICAgICAgICAkY2x1ZXRpcElubmVyLmFwcGVuZCgnPGRpdiBjbGFzcz0ic3BsaXQtYm9keSI+JyArIHRpcFBhcnRzW2ldICsgJzwvZGl2PicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGxvYWQgZXh0ZXJuYWwgZmlsZSB2aWEgYWpheAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICBlbHNlIGlmICggIW9wdHMubG9jYWwgJiYgdGlwQXR0cmlidXRlLmluZGV4T2YoJyMnKSAhPT0gMCApIHsKICAgICAgICBpZiAoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QodGlwQXR0cmlidXRlKSkgewogICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKCc8aW1nIHNyYz0iJyArIHRpcEF0dHJpYnV0ZSArICciIGFsdD0iJyArIHRpcFRpdGxlICsgJyIgLz4nKTsKICAgICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG9wdGlvbkJlZm9yZVNlbmQgPSBvcHRzLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLAogICAgICAgICAgICAgIG9wdGlvbkVycm9yID0gb3B0cy5hamF4U2V0dGluZ3MuZXJyb3IsCiAgICAgICAgICAgICAgb3B0aW9uU3VjY2VzcyA9IG9wdHMuYWpheFNldHRpbmdzLnN1Y2Nlc3MsCiAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUgPSBvcHRzLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTsKCiAgICAgICAgICBjYWNoZUtleSA9IGdldENhY2hlS2V5KHRpcEF0dHJpYnV0ZSwgb3B0cy5hamF4U2V0dGluZ3MuZGF0YSk7CgogICAgICAgICAgdmFyIGFqYXhTZXR0aW5ncyA9IHsKICAgICAgICAgICAgY2FjaGU6IG9wdHMuYWpheENhY2hlLCAvLyBmb3JjZSByZXF1ZXN0ZWQgcGFnZSBub3QgdG8gYmUgY2FjaGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgdXJsOiB0aXBBdHRyaWJ1dGUsCiAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKHhociwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgICBpZiAob3B0aW9uQmVmb3JlU2VuZCkge29wdGlvbkJlZm9yZVNlbmQuY2FsbChsaW5rLCB4aHIsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyLCBzZXR0aW5ncyk7fQogICAgICAgICAgICAgICRjbHVldGlwT3V0ZXIuY2hpbGRyZW4oKS5lbXB0eSgpOwogICAgICAgICAgICAgIGlmIChvcHRzLndhaXRJbWFnZSkgewogICAgICAgICAgICAgICAgJGNsdWV0aXBXYWl0CiAgICAgICAgICAgICAgICAuY3NzKHt0b3A6IG1vdXNlWSsyMCwgbGVmdDogbW91c2VYKzIwLCB6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgtMX0pCiAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmICggb3B0aW9ucy5hamF4Q2FjaGUgJiYgIWNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgICAgICBjYWNoZXNbY2FjaGVLZXldID0ge3N0YXR1czogJ2Vycm9yJywgdGV4dFN0YXR1czogdGV4dFN0YXR1cywgeGhyOiB4aHJ9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgb3B0aW9uRXJyb3IuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgnPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7CiAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLmFqYXhDYWNoZSAmJiAhY2FjaGVzW2NhY2hlS2V5XSApIHsKICAgICAgICAgICAgICAgIGNhY2hlc1tjYWNoZUtleV0gPSB7c3RhdHVzOiAnc3VjY2VzcycsIGRhdGE6IGRhdGEsIHRleHRTdGF0dXM6IHRleHRTdGF0dXMsIHhocjogeGhyfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IG9wdHMuYWpheFByb2Nlc3MuY2FsbChsaW5rLCBkYXRhKTsKCiAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNoYW5naW5nIHRoZSB0aXRsZSBiYXNlZCBvbiBkYXRhIHJldHVybmVkIGJ5IHhocgogICAgICAgICAgICAgIGlmICggdHlwZW9mIGNsdWV0aXBDb250ZW50cyA9PSAnb2JqZWN0JyAmJiBjbHVldGlwQ29udGVudHMgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICB0aXBUaXRsZSA9IGNsdWV0aXBDb250ZW50cy50aXRsZTsKICAgICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IGNsdWV0aXBDb250ZW50cy5jb250ZW50OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uU3VjY2VzcykgewogICAgICAgICAgICAgICAgICBvcHRpb25TdWNjZXNzLmNhbGwobGluaywgZGF0YSwgdGV4dFN0YXR1cywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKGNsdWV0aXBDb250ZW50cyk7CgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmIChvcHRpb25Db21wbGV0ZSkgewogICAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGltZ3MgPSAkY2x1ZXRpcElubmVyWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKICAgICAgICAgICAgICBpbWdDb3VudCA9IGltZ3MubGVuZ3RoOwogICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbCA9IGltZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoaW1nc1tpXS5jb21wbGV0ZSkgewogICAgICAgICAgICAgICAgICBpbWdDb3VudC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaW1nQ291bnQgJiYgISQuYnJvd3Nlci5vcGVyYSkgewogICAgICAgICAgICAgICAgJChpbWdzKS5iaW5kKCdsb2FkLmN0IGVycm9yLmN0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGltZ0NvdW50LS07CiAgICAgICAgICAgICAgICAgIGlmIChpbWdDb3VudCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgJChpbWdzKS51bmJpbmQoJy5jdCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkgeyBjbHVldGlwU2hvdyhwWSk7IH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsgY2x1ZXRpcFNob3cocFkpOyB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwoKICAgICAgICAgIGFqYXhNZXJnZWRTZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLmFqYXhTZXR0aW5ncywgYWpheFNldHRpbmdzKTsKCiAgICAgICAgICBpZiAoIGNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgIGNhY2hlZEFqYXgoIGNhY2hlc1tjYWNoZUtleV0sIGFqYXhNZXJnZWRTZXR0aW5ncyApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJC5hamF4KGFqYXhNZXJnZWRTZXR0aW5ncyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2FtZSBwYWdlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgZWxzZSBpZiAob3B0cy5sb2NhbCkgewogICAgICAgIHZhciAkbG9jYWxDb250ZW50ID0gJCh0aXBBdHRyaWJ1dGUgKyAoL14jXFMrJC8udGVzdCh0aXBBdHRyaWJ1dGUpID8gJycgOiAnOmVxKCcgKyBpbmRleCArICcpJykpLmNsb25lKHRydWUpLnNob3coKTsKICAgICAgICBpZiAob3B0cy5sb2NhbElkU3VmZml4KSB7CiAgICAgICAgICAkbG9jYWxDb250ZW50LmF0dHIoJ2lkJywgJGxvY2FsQ29udGVudFswXS5pZCArIG9wdHMubG9jYWxJZFN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkbG9jYWxDb250ZW50KTsKICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KICAgIH07CgovLyBnZXQgZGltZW5zaW9ucyBhbmQgb3B0aW9ucyBmb3IgY2x1ZXRpcCBhbmQgcHJlcGFyZSBpdCB0byBiZSBzaG93bgogICAgdmFyIGNsdWV0aXBTaG93ID0gZnVuY3Rpb24oYnBZKSB7CiAgICAgIHZhciAkY2xvc2VMaW5rLCBkeW5hbWljQ2xhc3NlcywgaGVpZ2h0RGlmZiwKICAgICAgICAgIHRpdGxlSFRNTCA9IHRpcFRpdGxlIHx8IG9wdHMuc2hvd1RpdGxlICYmICcmbmJzcDsnLAogICAgICAgICAgYmdZID0gJycsIGRpcmVjdGlvbiA9ICcnLCBpbnN1ZmZpY2llbnRYID0gZmFsc2U7CiAgICAgIHZhciBzdGlja3lDbG9zZSA9IHsKICAgICAgICBib3R0b206IGZ1bmN0aW9uKCRjTGluaykgewogICAgICAgICAgJGNMaW5rLmFwcGVuZFRvKCRjbHVldGlwSW5uZXIpOwogICAgICAgIH0sCiAgICAgICAgdG9wOiBmdW5jdGlvbigkY0xpbmspIHsKICAgICAgICAgICRjTGluay5wcmVwZW5kVG8oJGNsdWV0aXBJbm5lcik7CiAgICAgICAgfSwKICAgICAgICB0aXRsZTogZnVuY3Rpb24oJGNMaW5rKSB7CiAgICAgICAgICAkY0xpbmsucHJlcGVuZFRvKCRjbHVldGlwVGl0bGUpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgICRjbHVldGlwLmFkZENsYXNzKCdjbHVldGlwLScgKyBjdENsYXNzKTsKICAgICAgaWYgKG9wdHMudHJ1bmNhdGUpIHsKICAgICAgICB2YXIgJHRydW5jbG9hZGVkID0gJGNsdWV0aXBJbm5lci50ZXh0KCkuc2xpY2UoMCxvcHRzLnRydW5jYXRlKSArICcuLi4nOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkdHJ1bmNsb2FkZWQpOwogICAgICB9CgogICAgICBpZiAodGl0bGVIVE1MKSB7CiAgICAgICAgJGNsdWV0aXBUaXRsZS5zaG93KCkuaHRtbCh0aXRsZUhUTUwpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwVGl0bGUuaGlkZSgpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zdGlja3kpIHsKICAgICAgICBpZiAoc3RpY2t5Q2xvc2Vbb3B0cy5jbG9zZVBvc2l0aW9uXSkgewogICAgICAgICAgJGNsb3NlTGluayA9ICQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtY2xvc2UiPjxhIGhyZWY9IiMiPicgKyBvcHRzLmNsb3NlVGV4dCArICc8L2E+PC9kaXY+Jyk7CiAgICAgICAgICBzdGlja3lDbG9zZVtvcHRzLmNsb3NlUG9zaXRpb25dKCAkY2xvc2VMaW5rICk7CiAgICAgICAgICAkY2xvc2VMaW5rLmJpbmQoJ2NsaWNrLmNsdWV0aXAnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2x1ZXRpcENsb3NlKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5tb3VzZU91dENsb3NlKSB7CiAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycpOwogICAgICAgICAgJGNsdWV0aXAudW5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnKTsKICAgICAgICAgIGlmIChvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnIHx8IG9wdHMubW91c2VPdXRDbG9zZSA9PSAnY2x1ZXRpcCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09PSB0cnVlKSB7IC8vIHRydWUgaW1wbGllcyAnY2x1ZXRpcCcgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAgICAgICAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycsIG1vdXNlT3V0Q2xvc2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnYm90aCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09ICdsaW5rJykgewogICAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnLCBtb3VzZU91dENsb3NlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCi8vIG5vdyB0aGF0IGNvbnRlbnQgaXMgbG9hZGVkLCBmaW5pc2ggdGhlIHBvc2l0aW9uaW5nCiAgICAgICRjbHVldGlwT3V0ZXIuY3NzKHt6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgsIG92ZXJmbG93OiBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gJ3Zpc2libGUnIDogJ2F1dG8nLCBoZWlnaHQ6IGRlZkhlaWdodH0pOwogICAgICB0aXBIZWlnaHQgPSBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gTWF0aC5tYXgoJGNsdWV0aXAub3V0ZXJIZWlnaHQoKSwkY2x1ZXRpcC5oZWlnaHQoKSkgOiBwYXJzZUludChkZWZIZWlnaHQsMTApOwogICAgICB0aXBZID0gcG9zWTsKICAgICAgYmFzZWxpbmUgPSBzVG9wICsgd0hlaWdodDsKICAgICAgaW5zdWZmaWNpZW50WCA9IChwb3NYIDwgbW91c2VYICYmIChNYXRoLm1heChwb3NYLCAwKSArIHRpcFdpZHRoID4gbW91c2VYKSk7CiAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2ZpeGVkJykgewogICAgICAgIHRpcFkgPSBwb3NZIC0gb3B0cy5kcm9wU2hhZG93U3RlcHMgKyB0T2Zmc2V0OwogICAgICB9IGVsc2UgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJyB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ3RvcEJvdHRvbScpIHsKICAgICAgICAgIGlmIChwb3NZICsgdGlwSGVpZ2h0ICsgdE9mZnNldCA8IGJhc2VsaW5lICYmIG1vdXNlWSAtIHNUb3AgPCB0aXBIZWlnaHQgKyB0T2Zmc2V0KSB7CiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdib3R0b20nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgICAgaWYgKHBvc1kgKyB0aXBIZWlnaHQgKyB0T2Zmc2V0ID4gYmFzZWxpbmUgJiYgbW91c2VZIC0gc1RvcCA+IHRpcEhlaWdodCArIHRPZmZzZXQpIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaXJlY3Rpb24gPSAnYm90dG9tJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdyBoYXZlIGEgZGlyZWN0aW9uLiBDb21wdXRlIHRpcFkKICAgICAgICBpZiAob3B0cy5zbmFwVG9FZGdlKSB7CiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09ICd0b3AnKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rVG9wIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rQm90dG9tICsgdE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAndG9wJykgewogICAgICAgICAgICB0aXBZID0gbW91c2VZIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBtb3VzZVkgKyB0T2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICggcG9zWSArIHRpcEhlaWdodCArIHRPZmZzZXQgPiBiYXNlbGluZSApIHsKICAgICAgICB0aXBZID0gKHRpcEhlaWdodCA+PSB3SGVpZ2h0KSA/IHNUb3AgOiBiYXNlbGluZSAtIHRpcEhlaWdodCAtIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSBpZiAoJGxpbmsuY3NzKCdkaXNwbGF5JykgPT0gJ2Jsb2NrJyB8fCBsaW5rLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnYXJlYScgfHwgb3B0cy5wb3NpdGlvbkJ5ID09ICJtb3VzZSIpIHsKICAgICAgICB0aXBZID0gYnBZIC0gdE9mZnNldDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aXBZID0gcG9zWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzOwogICAgICB9CiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICcnKSB7CiAgICAgICAgZGlyZWN0aW9uID0gcG9zWCA8IGxpbmtMZWZ0ID8gJ2xlZnQnIDogICdyaWdodCc7CiAgICAgIH0KICAgICAgLy8gYWRkIGNsYXNzZXMKICAgICAgZHluYW1pY0NsYXNzZXMgPSAnIGNsdWUtJyArIGRpcmVjdGlvbiArICctJyArIGN0Q2xhc3MgKyAnIGNsdWV0aXAtJyArIGN0Q2xhc3M7CiAgICAgIGlmIChjdENsYXNzID09ICdyb3VuZGVkJykgewogICAgICAgIGR5bmFtaWNDbGFzc2VzICs9ICcgdWktY29ybmVyLWFsbCc7CiAgICAgIH0KICAgICAgJGNsdWV0aXAuY3NzKHt0b3A6IHRpcFkgKyAncHgnfSkuYXR0clByb3AoeydjbGFzc05hbWUnOiBzdGFuZGFyZENsYXNzZXMgKyBkeW5hbWljQ2xhc3Nlc30pOwogICAgICAvLyBzZXQgdXAgYXJyb3cgcG9zaXRpb25pbmcgdG8gYWxpZ24gd2l0aCBlbGVtZW50CiAgICAgIGlmIChvcHRzLmFycm93cykgewogICAgICAgIGlmICggLyhsZWZ0fHJpZ2h0KS8udGVzdChkaXJlY3Rpb24pICkgewogICAgICAgICAgaGVpZ2h0RGlmZiA9ICRjbHVldGlwLmhlaWdodCgpIC0gJGNsdWV0aXBBcnJvd3MuaGVpZ2h0KCk7CiAgICAgICAgICBiZ1kgPSBwb3NYID49IDAgJiYgYnBZID4gMCA/IChwb3NZIC0gdGlwWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzKSA6IDA7CiAgICAgICAgICBiZ1kgPSBoZWlnaHREaWZmID4gYmdZID8gYmdZIDogaGVpZ2h0RGlmZjsKICAgICAgICAgIGJnWSArPSAncHgnOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcEFycm93cy5jc3Moe3RvcDogYmdZfSkuc2hvdygpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwQXJyb3dzLmhpZGUoKTsKICAgICAgfQoKLy8gKGZpcnN0IGhpZGUsIHRoZW4pICoqKlNIT1cgVEhFIENMVUVUSVAqKioKICAgICAgLy8gaGFuZGxlIGRyb3BzaGFkb3cgZGl2cyBmaXJzdAogICAgICAkZHJvcFNoYWRvdyA9IGNyZWF0ZURyb3BTaGFkb3dzKCRjbHVldGlwLCBvcHRzKTsKICAgICAgaWYgKCRkcm9wU2hhZG93ICYmICRkcm9wU2hhZG93Lmxlbmd0aCkgewogICAgICAgICRkcm9wU2hhZG93LmhpZGUoKS5jc3Moe2hlaWdodDogdGlwSGVpZ2h0LCB3aWR0aDogdGlwSW5uZXJXaWR0aCwgekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4LTF9KS5zaG93KCk7CiAgICAgIH0KCiAgICAgIGlmICghY2xvc2VPbkRlbGF5KSB7CiAgICAgICAgJGNsdWV0aXAuaGlkZSgpOwogICAgICB9CiAgICAgIGNsZWFyVGltZW91dChjbG9zZU9uRGVsYXkpOwogICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwoKICAgICAgLy8gc2hvdyB0aGUgY2x1ZXRpcAogICAgICAkY2x1ZXRpcFtvcHRzLmZ4Lm9wZW5dKG9wdHMuZngub3BlblNwZWVkIHx8IDApOwoKICAgICAgaWYgKCQuZm4uYmdpZnJhbWUpIHsgJGNsdWV0aXAuYmdpZnJhbWUoKTsgfQoKICAgICAgLy8gdHJpZ2dlciB0aGUgb3B0aW9uYWwgb25TaG93IGZ1bmN0aW9uCiAgICAgIG9wdHMub25TaG93LmNhbGwobGluaywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPUlOQUNUSVZBVElPTgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgdmFyIGluYWN0aXZhdGUgPSBmdW5jdGlvbihldmVudCkgewogICAgICBpc0FjdGl2ZSA9IGZhbHNlOwogICAgICAkY2x1ZXRpcFdhaXQuaGlkZSgpOwogICAgICBpZiAoIW9wdHMuc3RpY2t5IHx8ICgvY2xpY2t8dG9nZ2xlLykudGVzdChvcHRzLmFjdGl2YXRpb24pICkgewogICAgICAgIC8vIGRlbGF5ZWQgY2xvc2UgKG5vdCBmdWxseSB0ZXN0ZWQpCiAgICAgICAgaWYgKG9wdHMuZGVsYXllZENsb3NlID4gMCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KGNsb3NlT25EZWxheSk7CiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwogICAgICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChjbHVldGlwQ2xvc2UsIG9wdHMuZGVsYXllZENsb3NlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5yZW1vdmVDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICB9OwoKICAgIC8vIGNsb3NlIGNsdWV0aXAgYW5kIHJlc2V0IHNvbWUgdGhpbmdzCiAgICB2YXIgY2x1ZXRpcENsb3NlID0gZnVuY3Rpb24oZWwpIHsKICAgICAgdmFyICRjbG9zZXIgPSBlbCAmJiBlbC5kYXRhKCdjbHVldGlwJykgPyBlbCA6ICRsaW5rLAogICAgICAgICAgY3QgPSAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKSAmJiAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKS5zZWxlY3RvciwKICAgICAgICAgIGN0U2VsZWN0b3IgPSBjdCB8fCAnZGl2LmNsdWV0aXAnLAogICAgICAgICAgJGNsdWV0aXAgPSAkKGN0U2VsZWN0b3IpLAogICAgICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKSwKICAgICAgICAgICRjbHVldGlwQXJyb3dzID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1hcnJvd3MnKTsKCiAgICAgICRjbHVldGlwLmhpZGUoKS5yZW1vdmVDbGFzcygpOwogICAgICBvcHRzLm9uSGlkZS5jYWxsKCRjbG9zZXJbMF0sICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKCiAgICAgIGlmIChjdCkgewogICAgICAgICRjbG9zZXIucmVtb3ZlQ2xhc3MoJ2NsdWV0aXAtY2xpY2tlZCcpOwogICAgICAgICRjbG9zZXIuY3NzKCdjdXJzb3InLCcnKTsKICAgICAgfQogICAgICBpZiAoY3QgJiYgdGlwVGl0bGUpIHsKICAgICAgICAkY2xvc2VyLmF0dHJQcm9wKG9wdHMudGl0bGVBdHRyaWJ1dGUsIHRpcFRpdGxlKTsKICAgICAgfQoKICAgICAgaWYgKG9wdHMuYXJyb3dzKSB7CiAgICAgICAgJGNsdWV0aXBBcnJvd3MuY3NzKHt0b3A6ICcnfSk7CiAgICAgIH0KICAgIH07CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBiZSBjbG9zaW5nIGJ5IGNoZWNraW5nIHdoZXJlIHRoZSB1c2VyIGlzIGhvdmVyaW5nLgogICAgLy8gV2UgZG8gYSBzaG9ydCA1MG1zIGRlbGF5IGZvciB0d28gcmVhc29uczogdG8gcHJldmVudCBmbGlja2VyLCBhbmQgdG8gYWxsb3cgdGhlIHVzZXIgdGltZSB0byBob3ZlciBvbiBvdGhlciBlbGVtZW50CiAgICB2YXIgbW91c2VPdXRDbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZWwgPSB0aGlzOwogICAgICBjbGVhclRpbWVvdXQoY2xvc2VPbkRlbGF5KTsKICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGlua092ZXIgPSAkbGluay5kYXRhKCdjbHVldGlwJykuZW50ZXJlZCwKICAgICAgICAgICAgY2x1ZXRpcE92ZXIgPSAkY2x1ZXRpcC5kYXRhKCdlbnRlcmVkJyksCiAgICAgICAgICAgIGVudGVyZWQgPSBmYWxzZTsKCiAgICAgICAgaWYgKCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnICYmIChsaW5rT3ZlciB8fCBjbHVldGlwT3ZlcikgKSB7CiAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gdHJ1ZSBpbXBsaWVzICdjbHVldGlwJyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICBlbHNlIGlmICggKG9wdHMubW91c2VPdXRDbG9zZSA9PT0gdHJ1ZSB8fCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2NsdWV0aXAnKSAmJiBjbHVldGlwT3ZlcikgewogICAgICAgICAgZW50ZXJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnbGluaycgJiYgbGlua092ZXIpIHsKICAgICAgICAgIGVudGVyZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhZW50ZXJlZCApIHsKICAgICAgICAgIC8vIEFsbCBjaGVja3MgcGFzcywgY2xvc2UgdGhlIGNsdWV0aXAKICAgICAgICAgIGNsdWV0aXBDbG9zZS5jYWxsKGVsKTsKICAgICAgICB9CgogICAgICB9LCBvcHRzLmRlbGF5ZWRDbG9zZSk7CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLnVuYmluZCgnaGlkZUNsdWV0aXAuY2x1ZXRpcCcpLmJpbmQoJ2hpZGVDbHVldGlwLmNsdWV0aXAnLCBmdW5jdGlvbihlKSB7CiAgICAgIGNsdWV0aXBDbG9zZSggJChlLnRhcmdldCkgKTsKICAgIH0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1CSU5EIEVWRU5UUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8vIGFjdGl2YXRlIGJ5IGNsaWNrCiAgICAgIGlmICggKC9jbGlja3x0b2dnbGUvKS50ZXN0KG9wdHMuYWN0aXZhdGlvbikgKSB7CiAgICAgICAgJGxpbmsuYmluZCgnY2xpY2suY2x1ZXRpcCcsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICBpZiAoJGNsdWV0aXAuaXMoJzpoaWRkZW4nKSB8fCAhJGxpbmsuaXMoJy5jbHVldGlwLWNsaWNrZWQnKSkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICQoJy5jbHVldGlwLWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnY2x1ZXRpcC1jbGlja2VkJyk7CiAgICAgICAgICAgICRsaW5rLmFkZENsYXNzKCdjbHVldGlwLWNsaWNrZWQnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluYWN0aXZhdGUoZXZlbnQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogIC8vIGFjdGl2YXRlIGJ5IGZvY3VzOyBpbmFjdGl2YXRlIGJ5IGJsdXIKICAgICAgfSBlbHNlIGlmIChvcHRzLmFjdGl2YXRpb24gPT0gJ2ZvY3VzJykgewogICAgICAgICRsaW5rLmJpbmQoJ2ZvY3VzLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgfSk7CiAgICAgICAgJGxpbmsuYmluZCgnYmx1ci5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICB9KTsKICAvLyBhY3RpdmF0ZSBieSBob3ZlcgogICAgICB9IGVsc2UgewoKICAgICAgICAvLyBjbGlja2luZyBpcyByZXR1cm5lZCBmYWxzZSBpZiBjbGlja1Rocm91Z2ggb3B0aW9uIGlzIHNldCB0byBmYWxzZQogICAgICAgICRsaW5rW29wdHMuY2xpY2tUaHJvdWdoID8gJ3VuYmluZCcgOiAnYmluZCddKCdjbGljay5jbHVldGlwJywgcmV0dXJuRmFsc2UpOwoKICAgICAgICAvL3NldCB1cCBtb3VzZSB0cmFja2luZwogICAgICAgIHZhciBtb3VzZVRyYWNrcyA9IGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgaWYgKG9wdHMudHJhY2tpbmcpIHsKICAgICAgICAgICAgdmFyIHRyYWNrWCA9IHBvc1ggLSBldnQucGFnZVg7CiAgICAgICAgICAgIHZhciB0cmFja1kgPSB0aXBZID8gdGlwWSAtIGV2dC5wYWdlWSA6IHBvc1kgLSBldnQucGFnZVk7CiAgICAgICAgICAgICRsaW5rLmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBldnQucGFnZVggKyB0cmFja1gsIHRvcDogZXZ0LnBhZ2VZICsgdHJhY2tZIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBpZiAoJC5mbi5ob3ZlckludGVudCAmJiBvcHRzLmhvdmVySW50ZW50KSB7CiAgICAgICAgICAkbGluay5ob3ZlckludGVudCh7CiAgICAgICAgICAgIHNlbnNpdGl2aXR5OiBvcHRzLmhvdmVySW50ZW50LnNlbnNpdGl2aXR5LAogICAgICAgICAgICBpbnRlcnZhbDogb3B0cy5ob3ZlckludGVudC5pbnRlcnZhbCwKICAgICAgICAgICAgb3ZlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICAgbW91c2VUcmFja3MoZXZlbnQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBvcHRzLmhvdmVySW50ZW50LnRpbWVvdXQsCiAgICAgICAgICAgIG91dDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgIG1vdXNlVHJhY2tzKGV2ZW50KTsKICAgICAgICAgIH0pCiAgICAgICAgICAuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgaW5hY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICRsaW5rLnVuYmluZCgnbW91c2Vtb3ZlLmNsdWV0aXAnKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJGxpbmsuYmluZCgnbW91c2VvdmVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgfSkuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIHRyaWdnZXIgYSBjYWNoZWQgQWpheCByZXNwb25zZQogICAgICBmdW5jdGlvbiBjYWNoZWRBamF4KGluZm8sIHNldHRpbmdzKSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGluZm8uc3RhdHVzOwogICAgICAgIHNldHRpbmdzLmJlZm9yZVNlbmQoaW5mby54aHIsIHNldHRpbmdzKTsKICAgICAgICBpZiAoIHN0YXR1cyA9PSAnZXJyb3InICkgewogICAgICAgICAgc2V0dGluZ3Nbc3RhdHVzXShpbmZvLnhociwgaW5mby50ZXh0U3RhdHVzKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnc3VjY2VzcycpIHsKICAgICAgICAgIHNldHRpbmdzW3N0YXR1c10oaW5mby5kYXRhLCBpbmZvLnRleHRTdGF0dXMsIGluZm8ueGhyKTsKICAgICAgICB9CiAgICAgICAgc2V0dGluZ3MuY29tcGxldGUoaW5mby54aHIsIHNldHRpbmdzLnRleHRTdGF0dXMpOwogICAgICB9CgogICAgfSk7IC8vIGVuZCB0aGlzLmVhY2gKCiAgICAvKiogPXByaXZhdGUgZnVuY3Rpb25zCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvL2VtcHR5IGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBkb05vdGhpbmcoKSB7fQoKICAgIC8vIGNyZWF0ZSBhIHN0cmluZyB0byBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIGFqYXggY2FjaGVzCiAgICBmdW5jdGlvbiBnZXRDYWNoZUtleSh1cmwsIGRhdGEpIHsKICAgICAgdmFyIGNhY2hlS2V5ID0gdXJsIHx8ICcnOwogICAgICBkYXRhID0gZGF0YSB8fCAnJzsKCiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgewogICAgICAgICQuZWFjaChkYXRhLCBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgICAgY2FjaGVLZXkgKz0gJy0nICsga2V5ICsgJy0nICsgdmFsOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CiAgICAgICAgY2FjaGVLZXkgKz0gZGF0YTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNhY2hlS2V5OwogICAgfQoKICAgIC8qKiA9Y3JlYXRlIGRyb3BzaGFkb3cgZGl2cyAqKi8KCiAgICBmdW5jdGlvbiBjcmVhdGVEcm9wU2hhZG93cygkY2x1ZXRpcCwgb3B0aW9ucywgbmV3RHJvcFNoYWRvdykgewogICAgICB2YXIgZHNTdHlsZSA9ICcnLAogICAgICAgICAgZHJvcFNoYWRvd1N0ZXBzID0gKG9wdGlvbnMuZHJvcFNoYWRvdyAmJiBvcHRpb25zLmRyb3BTaGFkb3dTdGVwcykgPyArb3B0aW9ucy5kcm9wU2hhZG93U3RlcHMgOiAwOwoKICAgICAgaWYgKCQuc3VwcG9ydC5ib3hTaGFkb3cpIHsKICAgICAgICBpZiAoIGRyb3BTaGFkb3dTdGVwcyApIHsKICAgICAgICAgIGRzU3R5bGUgPSAnMXB4IDFweCAnICsgZHJvcFNoYWRvd1N0ZXBzICsgJ3B4IHJnYmEoMCwwLDAsMC41KSc7CiAgICAgICAgfQogICAgICAgIHZhciBkc09mZnNldHMgPSBkcm9wU2hhZG93U3RlcHMgPT09IDAgPyAnMCAwICcgOiAnMXB4IDFweCAnOwogICAgICAgICRjbHVldGlwLmNzcygkLnN1cHBvcnQuYm94U2hhZG93LCBkc1N0eWxlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIG9sZERyb3BTaGFkb3cgPSAkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1kcm9wLXNoYWRvdycpOwogICAgICBpZiAoZHJvcFNoYWRvd1N0ZXBzID09IG9sZERyb3BTaGFkb3cubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG9sZERyb3BTaGFkb3c7CiAgICAgIH0KICAgICAgb2xkRHJvcFNoYWRvdy5yZW1vdmUoKTsKICAgICAgdmFyIGRyb3BTaGFkb3dzID0gW107CiAgICAgIGZvciAodmFyIGk9MDsgaSA8IGRyb3BTaGFkb3dTdGVwczspIHsKICAgICAgICBkcm9wU2hhZG93c1tpKytdID0gJzxkaXYgc3R5bGU9InRvcDonICsgaSArICdweDtsZWZ0OicgKyBpICsgJ3B4OyI+PC9kaXY+JzsKICAgICAgfQoKICAgICAgbmV3RHJvcFNoYWRvdyA9ICQoZHJvcFNoYWRvd3Muam9pbignJykpCiAgICAgIC5jc3MoewogICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMwMDAnLAogICAgICAgIHpJbmRleDogY2x1ZXpJbmRleCAtMSwKICAgICAgICBvcGFjaXR5OiAwLjEKICAgICAgfSkKICAgICAgLmFkZENsYXNzKCdjbHVldGlwLWRyb3Atc2hhZG93JykKICAgICAgLnByZXBlbmRUbygkY2x1ZXRpcCk7CiAgICAgIHJldHVybiBuZXdEcm9wU2hhZG93OwoKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAoZnVuY3Rpb24oKSB7CiAgICAkLnN1cHBvcnQgPSAkLnN1cHBvcnQgfHwge307CiAgICAvLyBjaGVjayBzdXBwb3J0IGZvciBDU1MzIHByb3BlcnRpZXMgKGN1cnJlbnRseSBvbmx5IGJveFNoYWRvdykKICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKICAgICAgICBkaXZTdHlsZSA9IGRpdi5zdHlsZSwKICAgICAgICBzdHlsZVByb3BzID0gWydib3hTaGFkb3cnXSwKICAgICAgICBwcmVmaXhlcyA9IFsnbW96JywgJ01veicsICd3ZWJraXQnLCAnbyddOwoKICAgIGZvciAodmFyIGk9MCwgc2wgPSBzdHlsZVByb3BzLmxlbmd0aDsgaSA8IHNsOyBpKyspIHsKICAgICAgdmFyIHByb3AgPSBzdHlsZVByb3BzW2ldLAogICAgICAgICAgdVByb3AgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKTsKCiAgICAgIGlmICggdHlwZW9mIGRpdlN0eWxlWyBwcm9wIF0gIT09ICd1bmRlZmluZWQnICkgewogICAgICAgICQuc3VwcG9ydFsgcHJvcCBdID0gcHJvcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBqPTAsIHBsID0gcHJlZml4ZXMubGVuZ3RoOyBqIDwgcGw7IGorKykgewoKICAgICAgICAgIGlmICh0eXBlb2YgZGl2U3R5bGVbIHByZWZpeGVzW2pdICsgdVByb3AgXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJC5zdXBwb3J0WyBwcm9wIF0gPSBwcmVmaXhlc1tqXSArIHVQcm9wOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGRpdiA9IG51bGw7CiAgfSkoKTsKCiAgJC5mbi5jbHVldGlwLmRlZmF1bHRzID0gJC5jbHVldGlwLmRlZmF1bHRzOwoKfSkoalF1ZXJ5KTsKKGZ1bmN0aW9uKCQpIHsKICAvLyBCYWNrLWNvbXBhdCBmaWxlIGZvciBjbHVlVGlwIDEuMgogIC8vIFRoaXMgbW9kaWZpZXMgdGhlICQuZm4uY2x1ZXRpcCBvYmplY3QgdG8gbWFrZSB0aGUgcGx1Z2luIHdvcmsgdGhlIHdheSBpdCBkaWQgYmVmb3JlIGNsdWVUaXAgdmVyc2lvbiAxLjIKICAkLmV4dGVuZCh0cnVlLCAkLmZuLmNsdWV0aXAsIHsKICAgIGJhY2tDb21wYXQ6IHRydWUsCiAgICB0ZW1wbGF0ZTogWyc8ZGl2IGlkPSJjbHVldGlwIj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1vdXRlciIgY2xhc3M9ImNsdWV0aXAtb3V0ZXIiPicsCiAgICAgICAgJzxoMyBpZD0iY2x1ZXRpcC10aXRsZSIgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz4nLAogICAgICAgICc8ZGl2IGlkPSJjbHVldGlwLWlubmVyIiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICAgJzxkaXYgaWQ9ImNsdWV0aXAtYXJyb3dzIiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MiPjwvZGl2PicsCiAgICAnPC9kaXY+J10uam9pbignJykKICB9KTsKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.all.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCihmdW5jdGlvbihjKXtjLmNsdWV0aXA9e3ZlcnNpb246IjEuMi43Iix0ZW1wbGF0ZTonPGRpdj48ZGl2IGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJjbHVldGlwLWlubmVyIHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAtY29udGVudCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+PC9kaXY+JyxzZXR1cDp7aW5zZXJ0aW9uVHlwZToiYXBwZW5kVG8iLGluc2VydGlvbkVsZW1lbnQ6ImJvZHkifSxkZWZhdWx0czp7bXVsdGlwbGU6ZmFsc2Usd2lkdGg6Mjc1LGhlaWdodDoiYXV0byIsY2x1ZXpJbmRleDo5Nyxwb3NpdGlvbkJ5OiJhdXRvIix0b3BPZmZzZXQ6MTUsbGVmdE9mZnNldDoxNSxzbmFwVG9FZGdlOmZhbHNlLGxvY2FsOmZhbHNlLGxvY2FsUHJlZml4Om51bGwsbG9jYWxJZFN1ZmZpeDpudWxsLGhpZGVMb2NhbDp0cnVlLAphdHRyaWJ1dGU6InJlbCIsdGl0bGVBdHRyaWJ1dGU6InRpdGxlIixzcGxpdFRpdGxlOiIiLGVzY2FwZVRpdGxlOmZhbHNlLHNob3dUaXRsZTp0cnVlLGNsdWV0aXBDbGFzczoiZGVmYXVsdCIsaG92ZXJDbGFzczoiIix3YWl0SW1hZ2U6dHJ1ZSxjdXJzb3I6ImhlbHAiLGFycm93czpmYWxzZSxkcm9wU2hhZG93OnRydWUsZHJvcFNoYWRvd1N0ZXBzOjYsc3RpY2t5OmZhbHNlLG1vdXNlT3V0Q2xvc2U6ZmFsc2UsZGVsYXllZENsb3NlOjUwLGFjdGl2YXRpb246ImhvdmVyIixjbGlja1Rocm91Z2g6dHJ1ZSx0cmFja2luZzpmYWxzZSxjbG9zZVBvc2l0aW9uOiJ0b3AiLGNsb3NlVGV4dDoiQ2xvc2UiLHRydW5jYXRlOjAsZng6e29wZW46InNob3ciLG9wZW5TcGVlZDoiIn0saG92ZXJJbnRlbnQ6e3NlbnNpdGl2aXR5OjMsaW50ZXJ2YWw6NTAsdGltZW91dDowfSxvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRydWV9LG9uU2hvdzpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSwKYWpheENhY2hlOnRydWUsYWpheFByb2Nlc3M6ZnVuY3Rpb24obSl7cmV0dXJuIG09bS5yZXBsYWNlKC88KHNjcmlwdHxzdHlsZXx0aXRsZSlbXjxdKzxcLyhzY3JpcHR8c3R5bGV8dGl0bGUpPi9nbSwiIikucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csIiIpfSxhamF4U2V0dGluZ3M6e2RhdGFUeXBlOiJodG1sIn0sZGVidWc6ZmFsc2V9fTt2YXIgRSxQPXt9LG1hPTAsVD0wO2MuZm4uYXR0clByb3A9Yy5mbi5wcm9wfHxjLmZuLmF0dHI7Yy5mbi5jbHVldGlwPWZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gVSh6LGspe3ZhciBsPXp8fCIiO2s9a3x8IiI7aWYodHlwZW9mIGs9PSJvYmplY3QiKWMuZWFjaChrLGZ1bmN0aW9uKGosZCl7bCs9Ii0iK2orIi0iK2R9KTtlbHNlIGlmKHR5cGVvZiBrPT0ic3RyaW5nIilsKz1rO3JldHVybiBsfWZ1bmN0aW9uIFYoeixrLGwpe2w9IiI7az1rLmRyb3BTaGFkb3cmJmsuZHJvcFNoYWRvd1N0ZXBzPytrLmRyb3BTaGFkb3dTdGVwczowO2lmKGMuc3VwcG9ydC5ib3hTaGFkb3cpe2lmKGspbD0KIjFweCAxcHggIitrKyJweCByZ2JhKDAsMCwwLDAuNSkiO3ouY3NzKGMuc3VwcG9ydC5ib3hTaGFkb3csbCk7cmV0dXJuIGZhbHNlfWw9ei5maW5kKCIuY2x1ZXRpcC1kcm9wLXNoYWRvdyIpO2lmKGs9PWwubGVuZ3RoKXJldHVybiBsO2wucmVtb3ZlKCk7bD1bXTtmb3IodmFyIGo9MDtqPGs7KWxbaisrXT0nPGRpdiBzdHlsZT0idG9wOicraisicHg7bGVmdDoiK2orJ3B4OyI+PC9kaXY+JztyZXR1cm4gbD1jKGwuam9pbigiIikpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixiYWNrZ3JvdW5kQ29sb3I6IiMwMDAiLHpJbmRleDpXLTEsb3BhY2l0eTowLjF9KS5hZGRDbGFzcygiY2x1ZXRpcC1kcm9wLXNoYWRvdyIpLnByZXBlbmRUbyh6KX12YXIgZSxoLEksdyxKLGdhO2lmKHR5cGVvZiBtPT0ib2JqZWN0Iil7cT1tO209bnVsbH1pZihtPT0iZGVzdHJveSIpe3ZhciBYPXRoaXMuZGF0YSgiY2x1ZXRpcCIpO2lmKFgpe2MoWC5zZWxlY3RvcikucmVtb3ZlKCk7Yy5yZW1vdmVEYXRhKHRoaXMsCiJ0aXRsZSIpO2MucmVtb3ZlRGF0YSh0aGlzLCJjbHVldGlwIik7Yy5yZW1vdmVEYXRhKHRoaXMsImNsdWV0aXBNb2MiKX1jKGRvY3VtZW50KS51bmJpbmQoIi5jbHVldGlwIik7cmV0dXJuIHRoaXMudW5iaW5kKCIuY2x1ZXRpcCIpfXE9Yy5leHRlbmQodHJ1ZSx7fSxjLmNsdWV0aXAuZGVmYXVsdHMscXx8e30pO21hKys7dmFyIFc7WD1jLmNsdWV0aXAuYmFja0NvbXBhdHx8IXEubXVsdGlwbGU/ImNsdWV0aXAiOiJjbHVldGlwLSIrbWE7dmFyIGhhPSIjIitYLEE9Yy5jbHVldGlwLmJhY2tDb21wYXQ/IiMiOiIuIixhYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSxyYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uRWxlbWVudHx8ImJvZHkiO2FhPS9hcHBlbmRUb3xwcmVwZW5kVG98aW5zZXJ0QmVmb3JlfGluc2VydEFmdGVyLy50ZXN0KGFhKT9hYToiYXBwZW5kVG8iO2U9YyhoYSk7aWYoIWUubGVuZ3RoKXtlPWMoYy5jbHVldGlwLnRlbXBsYXRlKVthYV0ocmEpLmF0dHIoImlkIiwKWCkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUifSk7Vz0rcS5jbHVlekluZGV4O0k9ZS5maW5kKEErImNsdWV0aXAtb3V0ZXIiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsekluZGV4Old9KTtoPWUuZmluZChBKyJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO2UuYmluZCgibW91c2VlbnRlciBtb3VzZWxlYXZlIixmdW5jdGlvbih6KXtjKHRoaXMpLmRhdGEoImVudGVyZWQiLHoudHlwZT09PSJtb3VzZWVudGVyIil9KX1FPWMoIiNjbHVldGlwLXdhaXRpbWFnZSIpO2lmKCFFLmxlbmd0aCYmcS53YWl0SW1hZ2Upe0U9YygiPGRpdj48L2Rpdj4iKS5hdHRyKCJpZCIsImNsdWV0aXAtd2FpdGltYWdlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7RS5pbnNlcnRCZWZvcmUoZSkuaGlkZSgpfXZhciBzYT0ocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSsocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdSaWdodCIpLAoxMCl8fDApO3RoaXMuZWFjaChmdW5jdGlvbih6KXtmdW5jdGlvbiBrKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGwoYixnKXt2YXIgZj1iLnN0YXR1cztnLmJlZm9yZVNlbmQoYi54aHIsZyk7aWYoZj09ImVycm9yIilnW2ZdKGIueGhyLGIudGV4dFN0YXR1cyk7ZWxzZSBmPT0ic3VjY2VzcyImJmdbZl0oYi5kYXRhLGIudGV4dFN0YXR1cyxiLnhocik7Zy5jb21wbGV0ZShiLnhocixnLnRleHRTdGF0dXMpfXZhciBqPXRoaXMsZD1jKHRoaXMpLGE9Yy5leHRlbmQodHJ1ZSx7fSxxLGMubWV0YWRhdGE/ZC5tZXRhZGF0YSgpOmMubWV0YT9kLmRhdGEoKTpkLmRhdGEoImNsdWV0aXAiKXx8e30pLEs9ZmFsc2UsUT1mYWxzZSxGPW51bGwscD1hW2EuYXR0cmlidXRlXXx8KGEuYXR0cmlidXRlPT0iaHJlZiI/ZC5hdHRyKGEuYXR0cmlidXRlKTpkLmF0dHJQcm9wKGEuYXR0cmlidXRlKXx8ZC5hdHRyKGEuYXR0cmlidXRlKSksWT1hLmNsdWV0aXBDbGFzcztXPSthLmNsdWV6SW5kZXg7ZC5kYXRhKCJjbHVldGlwIiwKe3RpdGxlOmoudGl0bGUsekluZGV4Olcsc2VsZWN0b3I6aGF9KTthLmFycm93cyYmIWUuZmluZCgiLmNsdWV0aXAtYXJyb3dzIikubGVuZ3RoJiZlLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MgdWktc3RhdGUtZGVmYXVsdCI+PC9kaXY+Jyk7aWYoIXAmJiFhLnNwbGl0VGl0bGUmJiFtKXJldHVybiB0cnVlO2lmKGEubG9jYWwmJmEubG9jYWxQcmVmaXgpcD1hLmxvY2FsUHJlZml4K3A7YS5sb2NhbCYmYS5oaWRlTG9jYWwmJnAmJmMocCsiOmZpcnN0IikuaGlkZSgpO3ZhciBvPXBhcnNlSW50KGEudG9wT2Zmc2V0LDEwKSxHPXBhcnNlSW50KGEubGVmdE9mZnNldCwxMCksdCxpYSxiYT1pc05hTihwYXJzZUludChhLmhlaWdodCwxMCkpPyJhdXRvIjovXEQvZy50ZXN0KGEuaGVpZ2h0KT9hLmhlaWdodDphLmhlaWdodCsicHgiLFosamEsbmEseCx1LEwsJCxrYT1wYXJzZUludChhLndpZHRoLDEwKXx8Mjc1LHI9a2Erc2ErYS5kcm9wU2hhZG93U3RlcHMsTT10aGlzLm9mZnNldFdpZHRoLApCLG4scyxSLE4sQz1hLmF0dHJpYnV0ZSE9InRpdGxlIj9kLmF0dHIoYS50aXRsZUF0dHJpYnV0ZSl8fCIiOiIiO2lmKGEuc3BsaXRUaXRsZSl7Tj1DLnNwbGl0KGEuc3BsaXRUaXRsZSk7Qz1hLnNob3dUaXRsZXx8TlswXT09PSIiP04uc2hpZnQoKToiIn1pZihhLmVzY2FwZVRpdGxlKUM9Qy5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvPC9nLCImbHQ7Iik7ZC5iaW5kKCJtb3VzZWVudGVyIG1vdXNlbGVhdmUiLGZ1bmN0aW9uKGIpe3ZhciBnPWQuZGF0YSgiY2x1ZXRpcCIpO2cuZW50ZXJlZD1iLnR5cGU9PT0iZW50ZXJlZCI7ZC5kYXRhKCJjbHVldGlwIixnKX0pO3ZhciBkYT1mdW5jdGlvbihiKXt2YXIgZyxmO2lmKGEub25BY3RpdmF0ZS5jYWxsKGosYik9PT1mYWxzZSlyZXR1cm4gZmFsc2U7UT10cnVlO2U9YyhoYSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7ST1lLmZpbmQoQSsiY2x1ZXRpcC1vdXRlciIpO2g9ZS5maW5kKEErCiJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO0o9ZS5maW5kKEErImNsdWV0aXAtYXJyb3dzIik7ZS5yZW1vdmVDbGFzcygpLmNzcyh7d2lkdGg6a2F9KTtwPT1kLmF0dHIoImhyZWYiKSYmZC5jc3MoImN1cnNvciIsYS5jdXJzb3IpO2EuaG92ZXJDbGFzcyYmZC5hZGRDbGFzcyhhLmhvdmVyQ2xhc3MpO2phPXg9ZC5vZmZzZXQoKS50b3A7bmE9amErZC5pbm5lckhlaWdodCgpO0I9ZC5vZmZzZXQoKS5sZWZ0O009ZC5pbm5lcldpZHRoKCk7aWYoYi50eXBlPT1mb2N1cyl7cz1CK00vMitHO2UuY3NzKHtsZWZ0Om59KTtMPXgrb31lbHNle3M9Yi5wYWdlWDtMPWIucGFnZVl9aWYoai50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJhcmVhIil7Wj1jKGRvY3VtZW50KS5zY3JvbGxUb3AoKTtSPWMod2luZG93KS53aWR0aCgpfWlmKGEucG9zaXRpb25CeT09ImZpeGVkIil7bj1NK0IrRztlLmNzcyh7bGVmdDpufSl9ZWxzZXtuPU0+QiYmQj5yfHxCK00rcitHPlI/Qi0Kci1HOk0rQitHO2lmKGoudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iYXJlYSJ8fGEucG9zaXRpb25CeT09Im1vdXNlInx8TStyPlIpaWYocysyMCtyPlIpe2UuYWRkQ2xhc3MoImNsdWV0aXAtIitZKTtuPXMtci1HPj0wP3Mtci1HLXBhcnNlSW50KGUuY3NzKCJtYXJnaW5MZWZ0IiksMTApK3BhcnNlSW50KGguY3NzKCJtYXJnaW5SaWdodCIpLDEwKTpzLXIvMn1lbHNlIG49cytHO2c9bjwwP2IucGFnZVkrbzpiLnBhZ2VZO2lmKG48MHx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8YS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tIiluPXMrci8yPlI/Ui8yLXIvMjpNYXRoLm1heChzLXIvMiwwKX1KLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCsxfSk7ZS5jc3Moe2xlZnQ6bix6SW5kZXg6ZC5kYXRhKCJjbHVldGlwIikuekluZGV4fSk7aWE9Yyh3aW5kb3cpLmhlaWdodCgpO2lmKG0pe2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKW09bS5jYWxsKGopO2guaHRtbChtKTtTKGcpfWVsc2UgaWYoTil7Yj0KTi5sZW5ndGg7aC5odG1sKGI/TlswXToiIik7aWYoYj4xKWZvcih2YXIgaT0xO2k8YjtpKyspaC5hcHBlbmQoJzxkaXYgY2xhc3M9InNwbGl0LWJvZHkiPicrTltpXSsiPC9kaXY+Iik7UyhnKX1lbHNlIGlmKCFhLmxvY2FsJiZwLmluZGV4T2YoIiMiKSE9PTApaWYoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QocCkpe2guaHRtbCgnPGltZyBzcmM9IicrcCsnIiBhbHQ9IicrQysnIiAvPicpO1MoZyl9ZWxzZXt2YXIgdj1hLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLGNhPWEuYWpheFNldHRpbmdzLmVycm9yLEg9YS5hamF4U2V0dGluZ3Muc3VjY2VzcyxvYT1hLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTtmPVUocCxhLmFqYXhTZXR0aW5ncy5kYXRhKTtiPWMuZXh0ZW5kKHRydWUse30sYS5hamF4U2V0dGluZ3Mse2NhY2hlOmEuYWpheENhY2hlLHVybDpwLGJlZm9yZVNlbmQ6ZnVuY3Rpb24oeSxEKXt2JiZ2LmNhbGwoaix5LGUsaCxEKTtJLmNoaWxkcmVuKCkuZW1wdHkoKTsKYS53YWl0SW1hZ2UmJkUuY3NzKHt0b3A6TCsyMCxsZWZ0OnMrMjAsekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleC0xfSkuc2hvdygpfSxlcnJvcjpmdW5jdGlvbih5LEQpe2lmKHEuYWpheENhY2hlJiYhUFtmXSlQW2ZdPXtzdGF0dXM6ImVycm9yIix0ZXh0U3RhdHVzOkQseGhyOnl9O2lmKFEpY2E/Y2EuY2FsbChqLHksRCxlLGgpOmguaHRtbCgiPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPiIpfSxzdWNjZXNzOmZ1bmN0aW9uKHksRCxPKXtpZihxLmFqYXhDYWNoZSYmIVBbZl0pUFtmXT17c3RhdHVzOiJzdWNjZXNzIixkYXRhOnksdGV4dFN0YXR1czpELHhocjpPfTtLPWEuYWpheFByb2Nlc3MuY2FsbChqLHkpO2lmKHR5cGVvZiBLPT0ib2JqZWN0IiYmSyE9PW51bGwpe0M9Sy50aXRsZTtLPUsuY29udGVudH1pZihRKXtIJiZILmNhbGwoaix5LEQsZSxoKTtoLmh0bWwoSyl9fSxjb21wbGV0ZTpmdW5jdGlvbih5LEQpe29hJiZvYS5jYWxsKGosCnksRCxlLGgpO3ZhciBPPWhbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpO1Q9Ty5sZW5ndGg7Zm9yKHZhciBsYT0wLHRhPU8ubGVuZ3RoO2xhPHRhO2xhKyspT1tsYV0uY29tcGxldGUmJlQtLTtpZihUJiYhYy5icm93c2VyLm9wZXJhKWMoTykuYmluZCgibG9hZC5jdCBlcnJvci5jdCIsZnVuY3Rpb24oKXtULS07aWYoVD09PTApe0UuaGlkZSgpO2MoTykudW5iaW5kKCIuY3QiKTtRJiZTKGcpfX0pO2Vsc2V7RS5oaWRlKCk7USYmUyhnKX19fSk7UFtmXT9sKFBbZl0sYik6Yy5hamF4KGIpfWVsc2UgaWYoYS5sb2NhbCl7Yj1jKHArKC9eI1xTKyQvLnRlc3QocCk/IiI6IjplcSgiK3orIikiKSkuY2xvbmUodHJ1ZSkuc2hvdygpO2EubG9jYWxJZFN1ZmZpeCYmYi5hdHRyKCJpZCIsYlswXS5pZCthLmxvY2FsSWRTdWZmaXgpO2guaHRtbChiKTtTKGcpfX0sUz1mdW5jdGlvbihiKXt2YXIgZyxmO2c9Q3x8YS5zaG93VGl0bGUmJiImbmJzcDsiO3ZhciBpPSIiO2Y9IiI7dmFyIHY9ZmFsc2U7CnY9e2JvdHRvbTpmdW5jdGlvbihIKXtILmFwcGVuZFRvKGgpfSx0b3A6ZnVuY3Rpb24oSCl7SC5wcmVwZW5kVG8oaCl9LHRpdGxlOmZ1bmN0aW9uKEgpe0gucHJlcGVuZFRvKHcpfX07ZS5hZGRDbGFzcygiY2x1ZXRpcC0iK1kpO2lmKGEudHJ1bmNhdGUpe3ZhciBjYT1oLnRleHQoKS5zbGljZSgwLGEudHJ1bmNhdGUpKyIuLi4iO2guaHRtbChjYSl9Zz93LnNob3coKS5odG1sKGcpOncuaGlkZSgpO2lmKGEuc3RpY2t5KXtpZih2W2EuY2xvc2VQb3NpdGlvbl0pe2c9YygnPGRpdiBjbGFzcz0iY2x1ZXRpcC1jbG9zZSI+PGEgaHJlZj0iIyI+JythLmNsb3NlVGV4dCsiPC9hPjwvZGl2PiIpO3ZbYS5jbG9zZVBvc2l0aW9uXShnKTtnLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZWEoKTtyZXR1cm4gZmFsc2V9KX1pZihhLm1vdXNlT3V0Q2xvc2Upe2QudW5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXBNb2MiKTtlLnVuYmluZCgibW91c2VsZWF2ZS5jbHVldGlwTW9jIik7aWYoYS5tb3VzZU91dENsb3NlPT0KImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJjbHVldGlwInx8YS5tb3VzZU91dENsb3NlPT09dHJ1ZSllLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpO2lmKGEubW91c2VPdXRDbG9zZT09ImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJsaW5rIilkLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpfX1JLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCxvdmVyZmxvdzpiYT09ImF1dG8iPyJ2aXNpYmxlIjoiYXV0byIsaGVpZ2h0OmJhfSk7dD1iYT09ImF1dG8iP01hdGgubWF4KGUub3V0ZXJIZWlnaHQoKSxlLmhlaWdodCgpKTpwYXJzZUludChiYSwxMCk7dT14OyQ9WitpYTt2PW48cyYmTWF0aC5tYXgobiwwKStyPnM7aWYoYS5wb3NpdGlvbkJ5PT0iZml4ZWQiKXU9eC1hLmRyb3BTaGFkb3dTdGVwcytvO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tInx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dil7aWYoYS5wb3NpdGlvbkJ5PT0KInRvcEJvdHRvbSIpZj14K3QrbzwkJiZMLVo8dCtvPyJib3R0b20iOiJ0b3AiO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dilmPXgrdCtvPiQmJkwtWj50K28/InRvcCI6ImJvdHRvbSI7aWYoYS5zbmFwVG9FZGdlKWlmKGY9PSJ0b3AiKXU9amEtdC1vO2Vsc2V7aWYoZj09ImJvdHRvbSIpdT1uYStvfWVsc2UgaWYoZj09InRvcCIpdT1MLXQtbztlbHNlIGlmKGY9PSJib3R0b20iKXU9TCtvfWVsc2UgdT14K3Qrbz4kP3Q+PWlhP1o6JC10LW86ZC5jc3MoImRpc3BsYXkiKT09ImJsb2NrInx8ai50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJhcmVhInx8YS5wb3NpdGlvbkJ5PT0ibW91c2UiP2Itbzp4LWEuZHJvcFNoYWRvd1N0ZXBzO2lmKGY9PT0iIilmPW48Qj8ibGVmdCI6InJpZ2h0IjtnPSIgY2x1ZS0iK2YrIi0iK1krIiBjbHVldGlwLSIrWTtpZihZPT0icm91bmRlZCIpZys9IiB1aS1jb3JuZXItYWxsIjtlLmNzcyh7dG9wOnUrInB4In0pLmF0dHJQcm9wKHtjbGFzc05hbWU6ImNsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAiKwpnfSk7aWYoYS5hcnJvd3Mpe2lmKC8obGVmdHxyaWdodCkvLnRlc3QoZikpe2Y9ZS5oZWlnaHQoKS1KLmhlaWdodCgpO2k9bj49MCYmYj4wP3gtdS1hLmRyb3BTaGFkb3dTdGVwczowO2k9Zj5pP2k6ZjtpKz0icHgifUouY3NzKHt0b3A6aX0pLnNob3coKX1lbHNlIEouaGlkZSgpOyhnYT1WKGUsYSkpJiZnYS5sZW5ndGgmJmdhLmhpZGUoKS5jc3Moe2hlaWdodDp0LHdpZHRoOmthLHpJbmRleDpkLmRhdGEoImNsdWV0aXAiKS56SW5kZXgtMX0pLnNob3coKTtGfHxlLmhpZGUoKTtjbGVhclRpbWVvdXQoRik7Rj1udWxsO2VbYS5meC5vcGVuXShhLmZ4Lm9wZW5TcGVlZHx8MCk7Yy5mbi5iZ2lmcmFtZSYmZS5iZ2lmcmFtZSgpO2Eub25TaG93LmNhbGwoaixlLGgpfSxmYT1mdW5jdGlvbigpe1E9ZmFsc2U7RS5oaWRlKCk7aWYoIWEuc3RpY2t5fHwvY2xpY2t8dG9nZ2xlLy50ZXN0KGEuYWN0aXZhdGlvbikpaWYoYS5kZWxheWVkQ2xvc2U+MCl7Y2xlYXJUaW1lb3V0KEYpO0Y9bnVsbDtGPXNldFRpbWVvdXQoZWEsCmEuZGVsYXllZENsb3NlKX1hLmhvdmVyQ2xhc3MmJmQucmVtb3ZlQ2xhc3MoYS5ob3ZlckNsYXNzKX0sZWE9ZnVuY3Rpb24oYil7Yj1iJiZiLmRhdGEoImNsdWV0aXAiKT9iOmQ7dmFyIGc9Yi5kYXRhKCJjbHVldGlwIikmJmIuZGF0YSgiY2x1ZXRpcCIpLnNlbGVjdG9yLGY9YyhnfHwiZGl2LmNsdWV0aXAiKSxpPWYuZmluZChBKyJjbHVldGlwLWlubmVyIiksdj1mLmZpbmQoQSsiY2x1ZXRpcC1hcnJvd3MiKTtmLmhpZGUoKS5yZW1vdmVDbGFzcygpO2Eub25IaWRlLmNhbGwoYlswXSxmLGkpO2lmKGcpe2IucmVtb3ZlQ2xhc3MoImNsdWV0aXAtY2xpY2tlZCIpO2IuY3NzKCJjdXJzb3IiLCIiKX1nJiZDJiZiLmF0dHJQcm9wKGEudGl0bGVBdHRyaWJ1dGUsQyk7YS5hcnJvd3MmJnYuY3NzKHt0b3A6IiJ9KX0scGE9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2NsZWFyVGltZW91dChGKTtGPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZz1kLmRhdGEoImNsdWV0aXAiKS5lbnRlcmVkLGY9ZS5kYXRhKCJlbnRlcmVkIiksCmk9ZmFsc2U7aWYoYS5tb3VzZU91dENsb3NlPT0iYm90aCImJihnfHxmKSlpPXRydWU7ZWxzZSBpZigoYS5tb3VzZU91dENsb3NlPT09dHJ1ZXx8YS5tb3VzZU91dENsb3NlPT0iY2x1ZXRpcCIpJiZmKWk9dHJ1ZTtlbHNlIGlmKGEubW91c2VPdXRDbG9zZT09ImxpbmsiJiZnKWk9dHJ1ZTtpfHxlYS5jYWxsKGIpfSxhLmRlbGF5ZWRDbG9zZSl9O2MoZG9jdW1lbnQpLnVuYmluZCgiaGlkZUNsdWV0aXAuY2x1ZXRpcCIpLmJpbmQoImhpZGVDbHVldGlwLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2VhKGMoYi50YXJnZXQpKX0pO2lmKC9jbGlja3x0b2dnbGUvLnRlc3QoYS5hY3RpdmF0aW9uKSlkLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2lmKGUuaXMoIjpoaWRkZW4iKXx8IWQuaXMoIi5jbHVldGlwLWNsaWNrZWQiKSl7ZGEoYik7YygiLmNsdWV0aXAtY2xpY2tlZCIpLnJlbW92ZUNsYXNzKCJjbHVldGlwLWNsaWNrZWQiKTtkLmFkZENsYXNzKCJjbHVldGlwLWNsaWNrZWQiKX1lbHNlIGZhKGIpOwpyZXR1cm4gZmFsc2V9KTtlbHNlIGlmKGEuYWN0aXZhdGlvbj09ImZvY3VzIil7ZC5iaW5kKCJmb2N1cy5jbHVldGlwIixmdW5jdGlvbihiKXtkLmF0dHJQcm9wKCJ0aXRsZSIsIiIpO2RhKGIpfSk7ZC5iaW5kKCJibHVyLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2QuYXR0clByb3AoInRpdGxlIixkLmRhdGEoImNsdWV0aXAiKS50aXRsZSk7ZmEoYil9KX1lbHNle2RbYS5jbGlja1Rocm91Z2g/InVuYmluZCI6ImJpbmQiXSgiY2xpY2suY2x1ZXRpcCIsayk7dmFyIHFhPWZ1bmN0aW9uKGIpe2lmKGEudHJhY2tpbmcpe3ZhciBnPW4tYi5wYWdlWCxmPXU/dS1iLnBhZ2VZOngtYi5wYWdlWTtkLmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIixmdW5jdGlvbihpKXtlLmNzcyh7bGVmdDppLnBhZ2VYK2csdG9wOmkucGFnZVkrZn0pfSl9fTtjLmZuLmhvdmVySW50ZW50JiZhLmhvdmVySW50ZW50P2QuaG92ZXJJbnRlbnQoe3NlbnNpdGl2aXR5OmEuaG92ZXJJbnRlbnQuc2Vuc2l0aXZpdHksaW50ZXJ2YWw6YS5ob3ZlckludGVudC5pbnRlcnZhbCwKb3ZlcjpmdW5jdGlvbihiKXtkYShiKTtxYShiKX0sdGltZW91dDphLmhvdmVySW50ZW50LnRpbWVvdXQsb3V0OmZ1bmN0aW9uKGIpe2ZhKGIpO2QudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIpfX0pOmQuYmluZCgibW91c2VlbnRlci5jbHVldGlwIixmdW5jdGlvbihiKXtkYShiKTtxYShiKX0pLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcCIsZnVuY3Rpb24oYil7ZmEoYik7ZC51bmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIil9KTtkLmJpbmQoIm1vdXNlb3Zlci5jbHVldGlwIixmdW5jdGlvbigpe2QuYXR0clByb3AoInRpdGxlIiwiIil9KS5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZC5hdHRyUHJvcCgidGl0bGUiLGQuZGF0YSgiY2x1ZXRpcCIpLnRpdGxlKX0pfX0pO3JldHVybiB0aGlzfTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9Yy5zdXBwb3J0fHx7fTtmb3IodmFyIG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscT1bImJveFNoYWRvdyJdLApVPVsibW96IiwiTW96Iiwid2Via2l0IiwibyJdLFY9MCxlPXEubGVuZ3RoO1Y8ZTtWKyspe3ZhciBoPXFbVl0sST1oLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2guc2xpY2UoMSk7aWYodHlwZW9mIG1baF0hPT0idW5kZWZpbmVkIiljLnN1cHBvcnRbaF09aDtlbHNlIGZvcih2YXIgdz0wLEo9VS5sZW5ndGg7dzxKO3crKylpZih0eXBlb2YgbVtVW3ddK0ldIT09InVuZGVmaW5lZCIpe2Muc3VwcG9ydFtoXT1VW3ddK0k7YnJlYWt9fX0pKCk7Yy5mbi5jbHVldGlwLmRlZmF1bHRzPWMuY2x1ZXRpcC5kZWZhdWx0c30pKGpRdWVyeSk7KGZ1bmN0aW9uKGMpe2MuZXh0ZW5kKHRydWUsYy5mbi5jbHVldGlwLHtiYWNrQ29tcGF0OnRydWUsdGVtcGxhdGU6JzxkaXYgaWQ9ImNsdWV0aXAiPjxkaXYgaWQ9ImNsdWV0aXAtb3V0ZXIiIGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgaWQ9ImNsdWV0aXAtdGl0bGUiIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+PGRpdiBpZD0iY2x1ZXRpcC1pbm5lciIgY2xhc3M9ImNsdWV0aXAtaW5uZXIgdWktd2lkZ2V0LWNvbnRlbnQgdWktY2x1ZXRpcC1jb250ZW50Ij48L2Rpdj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWV4dHJhIj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWFycm93cyIgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIj48L2Rpdj48L2Rpdj4nfSl9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogZ2xvYmFsICovCmRpdi51aS1jbHVldGlwIHsKICBmb250LXNpemU6IDFlbTsKfQoudWktY2x1ZXRpcC1oZWFkZXIsCi51aS1jbHVldGlwLWNvbnRlbnQgewogIHBhZGRpbmc6IDEycHg7Cn0KLnVpLWNsdWV0aXAtaGVhZGVyIHsKICBmb250LXNpemU6IDFlbTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLmNsdWV0aXAtdGl0bGUgLmNsdWV0aXAtY2xvc2UgewogIGZsb2F0OiByaWdodDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLmNsdWV0aXAtY2xvc2UgaW1nIHsKICBib3JkZXI6IDA7Cn0KCiNjbHVldGlwLXdhaXRpbWFnZSB7CiAgd2lkdGg6IDQzcHg7CiAgaGVpZ2h0OiAxMXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3dhaXQuZ2lmKTsKfQouY2x1ZXRpcC1hcnJvd3MgewogIGRpc3BsYXk6IG5vbmU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICBsZWZ0OiAtMTFweDsKICB3aWR0aDogMTFweDsKICBoZWlnaHQ6IDIycHg7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7CiAgYm9yZGVyLXdpZHRoOiAwOwp9Ci5jbHVldGlwLWV4dHJhIHsKICBkaXNwbGF5OiBub25lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdkZWZhdWx0JwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLmNsdWV0aXAtZGVmYXVsdCwKLmNsdWV0aXAtZGVmYXVsdCAuY2x1ZXRpcC1vdXRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzg3ODc2YTsKfQoKCi8qCi5jbHVldGlwLWRlZmF1bHQgI2NsdWV0aXAtb3V0ZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW46IDA7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IGgzI2NsdWV0aXAtdGl0bGUgewogIG1hcmdpbjogMCAwIDVweDsKICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgZm9udC1zaXplOiAxLjFlbTsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGJhY2tncm91bmQtY29sb3I6ICM4Nzg3NmE7CiAgY29sb3I6ICNmZmY7Cn0KLmNsdWV0aXAtZGVmYXVsdCAjY2x1ZXRpcC10aXRsZSBhIHsKICBjb2xvcjogI2Q5ZDljMjsKICBmb250LXNpemU6IDAuOTVlbTsKfQouY2x1ZXRpcC1kZWZhdWx0ICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiAxMHB4Owp9Ci5jbHVldGlwLWRlZmF1bHQgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggNXB4OwogIGNvbG9yOiAjOTAwOwp9CiovCi8qIGRlZmF1bHQgYXJyb3dzICovCmRpdi5jbHVldGlwLWRlZmF1bHQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dsZWZ0LmdpZik7Cn0KZGl2LmNsdWUtbGVmdC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4OwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93dXAuZ2lmKTsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBtYXJnaW4tbGVmdDogLTExcHg7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdqdGlwJwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwouY2x1ZXRpcC1qdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5jbHVldGlwLWp0aXAgLmNsdWV0aXAtb3V0ZXIgewogIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi5jbHVldGlwLWp0aXAgLmNsdWV0aXAtaW5uZXIgewogIHBhZGRpbmc6IDVweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KLmNsdWV0aXAtanRpcCBkaXYuY2x1ZXRpcC1jbG9zZSB7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgbWFyZ2luOiAwIDVweCAwOwogIGNvbG9yOiAjOTAwOwp9CgouY2x1ZXRpcC1qdGlwIC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2NjYzsKICBwYWRkaW5nOiA2cHg7Ci8qICBtYXJnaW4tYm90dG9tOiAxZW07Ki8KfQoKLyoganRpcCBhcnJvd3MgKi8KZGl2LmNsdWV0aXAtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJvcmRlci13aWR0aDogMDsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBub25lOwp9CmRpdi5jbHVlLXJpZ2h0LWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93bGVmdC5naWYpOwp9CmRpdi5jbHVlLWxlZnQtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3dkb3duLmdpZik7CiAgdG9wOiAxMDAlOwogIGxlZnQ6IDUwJTsKICB3aWR0aDogMjJweDsKICBoZWlnaHQ6IDExcHg7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4Owp9CmRpdi5jbHVlLWJvdHRvbS1qdGlwIC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9hcnJvd3VwLmdpZik7CiAgdG9wOiAtMTFweDsKICBsZWZ0OiA1MCU7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4OwogIG1hcmdpbi1sZWZ0OiAtMTFweDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICA9Y2x1ZXRpcENsYXNzOiAncm91bmRlZCcKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLmNsdWV0aXAtcm91bmRlZCB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA2cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQoKLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC1vdXRlciB7CiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA2cHg7CiAgLW1vei1ib3JkZXItcmFkaXVzOiA2cHg7CiAgYm9yZGVyLXJhZGl1czogNnB4OwogIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi5jbHVldGlwLXJvdW5kZWQgIC5jbHVldGlwLWFycm93cyB7CiAgYm9yZGVyLWNvbG9yOiAjY2NjOwp9CgovKiBuZWVkIHRvIGJlIG1vcmUgc3BlY2lmaWMgaGVyZSB0byBvdmVycmlkZSBUaGVtZVJvbGxlciBkZWZhdWx0cyAqLwpkaXYuY2x1ZXRpcC1yb3VuZGVkICAuY2x1ZXRpcC1hcnJvd3MgewogIGZvbnQtc2l6ZTogMDsKICBsaW5lLWhlaWdodDogMCU7CiAgd2lkdGg6IDA7CiAgaGVpZ2h0OiAwOwogIGJvcmRlci1zdHlsZTogc29saWQ7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1yb3VuZGVkIC5jbHVldGlwLWFycm93cyB7CiAgYm9yZGVyLXdpZHRoOiAxMXB4IDExcHggMTFweCAwOwogIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKfQpkaXYuY2x1ZS1sZWZ0LXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICBsZWZ0OiAxMDAlOwogIG1hcmdpbi1yaWdodDogLTExcHg7CiAgYm9yZGVyLXdpZHRoOiAxMXB4IDAgMTFweCAxMXB4OwogIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7Cgp9CmRpdi5jbHVlLXRvcC1yb3VuZGVkIC5jbHVldGlwLWFycm93cyB7CiAgdG9wOiAxMDAlOwogIGxlZnQ6IDUwJTsKICBib3JkZXItd2lkdGg6IDExcHggMTFweCAwIDExcHg7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KLmNsdWUtYm90dG9tLXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBib3JkZXItd2lkdGg6IDAgMTFweCAxMXB4IDExcHg7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQ7Cgp9Ci8qIHN0dXBpZCBJRTYgSGFzTGF5b3V0IGhhY2sgKi8KLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC10aXRsZSwKLmNsdWV0aXAtcm91bmRlZCAuY2x1ZXRpcC1pbm5lciB7CiAgem9vbTogMTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCgooZnVuY3Rpb24oJCkgewoKICAkLmNsdWV0aXAgPSB7CiAgICB2ZXJzaW9uOiAnMS4yLjcnLAoKICAgIC8vIHRoZSBIVE1MIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0aGUgdG9vbHRpcAogICAgdGVtcGxhdGU6IFsnPGRpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1vdXRlciI+JywKICAgICAgICAnPGgzIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+JywKICAgICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICc8L2Rpdj4nXS5qb2luKCcnKSwKCiAgICAvKiBjbHVlVGlwIHNldHVwCiAgICAgKiAgdGhlIHNldHVwIG9wdGlvbnMgYXJlIGFwcGxpZWQgZWFjaCB0aW1lIC5jbHVldGlwKCkgaXMgY2FsbGVkLAogICAgICogIEJVVCBvbmx5IGlmIDxkaXYgaWQ9ImNsdWV0aXAiPiBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZG9jdW1lbnQKICAgICovCiAgICBzZXR1cDogewogICAgICAvLyBtZXRob2QgdG8gYmUgdXNlZCBmb3IgaW5zZXJ0aW5nIHRoZSBjbHVlVGlwIGludG8gdGhlIERPTS4KICAgICAgLy8gUGVybWl0dGVkIHZhbHVlcyBhcmUgJ2FwcGVuZFRvJywgJ3ByZXBlbmRUbycsICdpbnNlcnRCZWZvcmUnLCBhbmQgJ2luc2VydEFmdGVyJwogICAgICBpbnNlcnRpb25UeXBlOiAnYXBwZW5kVG8nLAogICAgICAvLyBlbGVtZW50IGluIHRoZSBET00gdGhlIHBsdWdpbiB3aWxsIHJlZmVyZW5jZSB3aGVuIGluc2VydGluZyB0aGUgY2x1ZVRpcC4KICAgICAgaW5zZXJ0aW9uRWxlbWVudDogJ2JvZHknCiAgICB9LAoKICAgIC8qCiAgICAgKiBjbHVlVGlwIG9wdGlvbnMKICAgICAqCiAgICAgKiBlYWNoIG9uZSBjYW4gYmUgZXhwbGljaXRseSBvdmVycmlkZGVuIGJ5IGNoYW5naW5nIGl0cyB2YWx1ZS4KICAgICAqIGZvciBleGFtcGxlOiAkLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7CiAgICAgKiAgICAgICAgIG9yOiAkLmZuLmNsdWV0aXAuZGVmYXVsdHMud2lkdGggPSAyMDA7IC8vIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgY2x1ZVRpcCB2ZXJzaW9ucwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIGZvciBhbGwgY2x1ZVRpcHMgdG8gMjAwLgogICAgICoKICAgICAqIGVhY2ggb25lIGNhbiBhbHNvIGJlIG92ZXJyaWRkZW4gYnkgcGFzc2luZyBhbiBvcHRpb25zIG1hcCB0byB0aGUgY2x1ZXRpcCBtZXRob2QuCiAgICAgKiBmb3IgZXhhbXBsZTogJCgnYS5leGFtcGxlJykuY2x1ZXRpcCh7d2lkdGg6IDIwMH0pOwogICAgICogd291bGQgY2hhbmdlIHRoZSBkZWZhdWx0IHdpZHRoIHRvIDIwMCBmb3IgY2x1ZVRpcHMgaW52b2tlZCBieSBhIGxpbmsgd2l0aCBjbGFzcyBvZiAiZXhhbXBsZSIKICAgICAqCiAgICAqLwogICAgZGVmYXVsdHM6IHsKICAgICAgbXVsdGlwbGU6ICAgICAgICAgZmFsc2UsICAgIC8vIEFsbG93IGEgbmV3IHRvb2x0aXAgdG8gYmUgY3JlYXRlZCBmb3IgZWFjaCAuY2x1ZXRpcCgpIGNhbGwKICAgICAgd2lkdGg6ICAgICAgICAgICAgMjc1LCAgICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgY2x1ZVRpcAogICAgICBoZWlnaHQ6ICAgICAgICAgICAnYXV0bycsICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgY2x1ZVRpcAogICAgICBjbHVlekluZGV4OiAgICAgICA5NywgICAgICAgLy8gU2V0cyB0aGUgei1pbmRleCBzdHlsZSBwcm9wZXJ0eSBvZiB0aGUgY2x1ZVRpcAogICAgICBwb3NpdGlvbkJ5OiAgICAgICAnYXV0bycsICAgLy8gU2V0cyB0aGUgdHlwZSBvZiBwb3NpdGlvbmluZzogJ2F1dG8nLCAnbW91c2UnLCdib3R0b21Ub3AnLCAndG9wQm90dG9tJywgZml4ZWQnCiAgICAgIHRvcE9mZnNldDogICAgICAgIDE1LCAgICAgICAvLyBOdW1iZXIgb2YgcHggdG8gb2Zmc2V0IGNsdWVUaXAgZnJvbSB0b3Agb2YgaW52b2tpbmcgZWxlbWVudAogICAgICBsZWZ0T2Zmc2V0OiAgICAgICAxNSwgICAgICAgLy8gTnVtYmVyIG9mIHB4IHRvIG9mZnNldCBjbHVlVGlwIGZyb20gbGVmdCBvZiBpbnZva2luZyBlbGVtZW50CiAgICAgIHNuYXBUb0VkZ2U6ICAgICAgIGZhbHNlLCAgICAvLyBGb3IgYm90dG9tVG9wIGFuZCB0b3BCb3R0b20sIHNuYXAgdG8gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIGVsZW1lbnQuCiAgICAgIGxvY2FsOiAgICAgICAgICAgIGZhbHNlLCAgICAvLyBXaGV0aGVyIHRvIHVzZSBjb250ZW50IGZyb20gdGhlIHNhbWUgcGFnZSBmb3IgdGhlIGNsdWVUaXAncyBib2R5CiAgICAgIGxvY2FsUHJlZml4OiAgICAgIG51bGwsICAgICAvLyBzdHJpbmcgdG8gYmUgcHJlcGVuZGVkIHRvIHRoZSB0aXAgYXR0cmlidXRlIGlmIGxvY2FsIGlzIHRydWUKICAgICAgbG9jYWxJZFN1ZmZpeDogICAgbnVsbCwgICAgIC8vIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byB0aGUgY2x1ZXRpcCBjb250ZW50IGVsZW1lbnQncyBpZCBpZiBsb2NhbCBpcyB0cnVlCiAgICAgIGhpZGVMb2NhbDogICAgICAgIHRydWUsICAgICAvLyBJZiBsb2NhbCBvcHRpb24gaXMgc2V0IHRvIHRydWUsIHRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGxvY2FsIGNvbnRlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHNob3duIGluIGNsdWVUaXAgc2hvdWxkIGJlIGhpZGRlbiBhdCBpdHMgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgYXR0cmlidXRlOiAgICAgICAgJ3JlbCcsICAgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyBib2R5IGNvbnRlbnQKICAgICAgdGl0bGVBdHRyaWJ1dGU6ICAgJ3RpdGxlJywgIC8vIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgZmV0Y2hpbmcgdGhlIGNsdWVUaXAncyB0aXRsZQogICAgICBzcGxpdFRpdGxlOiAgICAgICAnJywgICAgICAgLy8gQSBjaGFyYWN0ZXIgdXNlZCB0byBzcGxpdCB0aGUgdGl0bGUgYXR0cmlidXRlIGludG8gdGhlIGNsdWVUaXAgdGl0bGUgYW5kIGRpdnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgY2x1ZVRpcCBib2R5LiBtb3JlIGluZm8gYmVsb3cgWzZdCiAgICAgIGVzY2FwZVRpdGxlOiAgICAgIGZhbHNlLCAgICAvLyB3aGV0aGVyIHRvIGh0bWwgZXNjYXBlIHRoZSB0aXRsZSBhdHRyaWJ1dGUKICAgICAgc2hvd1RpdGxlOiAgICAgICAgdHJ1ZSwgICAgIC8vIHNob3cgdGl0bGUgYmFyIG9mIHRoZSBjbHVlVGlwLCBldmVuIGlmIHRpdGxlIGF0dHJpYnV0ZSBub3Qgc2V0CiAgICAgIGNsdWV0aXBDbGFzczogICAgICdkZWZhdWx0JywvLyBjbGFzcyBhZGRlZCB0byBvdXRlcm1vc3QgY2x1ZVRpcCBkaXYgaW4gdGhlIGZvcm0gb2YgJ2NsdWV0aXAtJyArIGNsdWVUaXBDbGFzcy4KICAgICAgaG92ZXJDbGFzczogICAgICAgJycsICAgICAgIC8vIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGludm9raW5nIGVsZW1lbnQgb25tb3VzZW92ZXIgYW5kIHJlbW92ZWQgb25tb3VzZW91dAogICAgICB3YWl0SW1hZ2U6ICAgICAgICB0cnVlLCAgICAgLy8gd2hldGhlciB0byBzaG93IGEgImxvYWRpbmciIGltZywgd2hpY2ggaXMgc2V0IGluIGpxdWVyeS5jbHVldGlwLmNzcwogICAgICBjdXJzb3I6ICAgICAgICAgICAnaGVscCcsCiAgICAgIGFycm93czogICAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBkaXNwbGF5cyBhcnJvdyBvbiBhcHByb3ByaWF0ZSBzaWRlIG9mIGNsdWVUaXAKICAgICAgZHJvcFNoYWRvdzogICAgICAgdHJ1ZSwgICAgIC8vIHNldCB0byBmYWxzZSBpZiB5b3UgZG9uJ3Qgd2FudCB0aGUgZHJvcC1zaGFkb3cgZWZmZWN0IG9uIHRoZSBjbHVlVGlwCiAgICAgIGRyb3BTaGFkb3dTdGVwczogIDYsICAgICAgICAvLyBhZGp1c3RzIHRoZSBzaXplIG9mIHRoZSBkcm9wIHNoYWRvdwogICAgICBzdGlja3k6ICAgICAgICAgICBmYWxzZSwgICAgLy8ga2VlcCB2aXNpYmxlIHVudGlsIG1hbnVhbGx5IGNsb3NlZAogICAgICBtb3VzZU91dENsb3NlOiAgICBmYWxzZSwgICAgLy8gY2xvc2Ugd2hlbiBjbHVlVGlwIGlzIG1vdXNlZCBvdXQ6IGZhbHNlLCAnY2x1ZXRpcCcsICdsaW5rJywgJ2JvdGgnCiAgICAgIGRlbGF5ZWRDbG9zZTogICAgIDUwLCAgICAgICAgLy8gY2xvc2UgY2x1ZVRpcCBvbiBhIHRpbWVkIGRlbGF5CiAgICAgIGFjdGl2YXRpb246ICAgICAgICdob3ZlcicsICAvLyBzZXQgdG8gJ2NsaWNrJyB0byBmb3JjZSB1c2VyIHRvIGNsaWNrIHRvIHNob3cgY2x1ZVRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRvICdmb2N1cycgdG8gc2hvdyBvbiBmb2N1cyBvZiBhIGZvcm0gZWxlbWVudCBhbmQgaGlkZSBvbiBibHVyCiAgICAgIGNsaWNrVGhyb3VnaDogICAgIHRydWUsICAgIC8vIGlmIHRydWUsIGFuZCBhY3RpdmF0aW9uIGlzIG5vdCAnY2xpY2snLCB0aGVuIGNsaWNraW5nIG9uIGxpbmsgd2lsbCB0YWtlIHVzZXIgdG8gdGhlIGxpbmsncyBocmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBocmVmIGFuZCB0aXBBdHRyaWJ1dGUgYXJlIGVxdWFsCiAgICAgIHRyYWNraW5nOiAgICAgICAgIGZhbHNlLCAgICAvLyBpZiB0cnVlLCBjbHVlVGlwIHdpbGwgdHJhY2sgbW91c2UgbW92ZW1lbnQgKGV4cGVyaW1lbnRhbCkKICAgICAgY2xvc2VQb3NpdGlvbjogICAgJ3RvcCcsICAgIC8vIGxvY2F0aW9uIG9mIGNsb3NlIHRleHQgZm9yIHN0aWNreSBjbHVldGlwczsgY2FuIGJlICd0b3AnLCAnYm90dG9tJywgJ3RpdGxlJyBvciAnbm9uZScKICAgICAgY2xvc2VUZXh0OiAgICAgICAgJ0Nsb3NlJywgIC8vIHRleHQgKG9yIEhUTUwpIHRvIHRvIGJlIGNsaWNrZWQgdG8gY2xvc2Ugc3RpY2t5IGNsdWVUaXBzCiAgICAgIHRydW5jYXRlOiAgICAgICAgIDAsICAgICAgICAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB0cnVuY2F0ZSBjbHVlVGlwJ3MgY29udGVudHMuIGlmIDAsIG5vIHRydW5jYXRpb24gb2NjdXJzCgogICAgICAvLyBlZmZlY3QgYW5kIHNwZWVkIGZvciBvcGVuaW5nIGNsdWVUaXBzCiAgICAgIGZ4OiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW46ICAgICAgICdzaG93JywgLy8gY2FuIGJlICdzaG93JyBvciAnc2xpZGVEb3duJyBvciAnZmFkZUluJwogICAgICAgICAgICAgICAgICAgICAgICBvcGVuU3BlZWQ6ICAnJwogICAgICB9LAoKICAgICAgLy8gc2V0dGluZ3MgZm9yIHdoZW4gaG92ZXJJbnRlbnQgcGx1Z2luIGlzIHVzZWQKICAgICAgaG92ZXJJbnRlbnQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2l0aXZpdHk6ICAzLAogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbDogICAgIDUwLAogICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0OiAgICAgIDAKICAgICAgfSwKCiAgICAgIC8vIHNob3J0LWNpcmN1aXQgZnVuY3Rpb24gdG8gcnVuIGp1c3QgYmVmb3JlIGNsdWVUaXAgaXMgc2hvd24uCiAgICAgIG9uQWN0aXZhdGU6ICAgICAgIGZ1bmN0aW9uKGUpIHtyZXR1cm4gdHJ1ZTt9LAogICAgICAvLyBmdW5jdGlvbiB0byBydW4ganVzdCBhZnRlciBjbHVlVGlwIGlzIHNob3duLgogICAgICBvblNob3c6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIGZ1bmN0aW9uIHRvIHJ1biBqdXN0IGFmdGVyIGNsdWVUaXAgaXMgaGlkZGVuLgogICAgICBvbkhpZGU6ICAgICAgICAgICBmdW5jdGlvbihjdCwgY2kpe30sCiAgICAgIC8vIHdoZXRoZXIgdG8gY2FjaGUgcmVzdWx0cyBvZiBhamF4IHJlcXVlc3QgdG8gYXZvaWQgdW5uZWNlc3NhcnkgaGl0cyB0byBzZXJ2ZXIKICAgICAgYWpheENhY2hlOiAgICAgICAgdHJ1ZSwKCiAgICAgIC8vIHByb2Nlc3MgZGF0YSByZXRyaWV2ZWQgdmlhIHhociBiZWZvcmUgaXQncyBkaXNwbGF5ZWQKICAgICAgYWpheFByb2Nlc3M6ICAgICAgZnVuY3Rpb24oZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoLzwoc2NyaXB0fHN0eWxlfHRpdGxlKVtePF0rPFwvKHNjcmlwdHxzdHlsZXx0aXRsZSk+L2dtLCAnJykucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICB9LAoKICAgICAgLy8gY2FuIHBhc3MgaW4gc3RhbmRhcmQgJC5hamF4KCkgcGFyYW1ldGVycy4gQ2FsbGJhY2sgZnVuY3Rpb25zLCBzdWNoIGFzIGJlZm9yZVNlbmQsCiAgICAgIC8vIHdpbGwgYmUgcXVldWVkIGZpcnN0IHdpdGhpbiB0aGUgZGVmYXVsdCBjYWxsYmFja3MuCiAgICAgIC8vIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBlcnJvciwgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0CiAgICAgIGFqYXhTZXR0aW5nczogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBlcnJvcjogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIG92ZXJyaWRlIGRlZmF1bHQgZXJyb3IgY2FsbGJhY2sgKi8gfSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlU2VuZDogZnVuY3Rpb24oY3QsIGNpKSB7IC8qIGNhbGxlZCBmaXJzdCB3aXRoaW4gZGVmYXVsdCBiZWZvcmVTZW5kIGNhbGxiYWNrICovIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnaHRtbCcKICAgICAgfSwKICAgICAgZGVidWc6IGZhbHNlCgogICAgfQogIH07CiAgdmFyICRjbHVldGlwV2FpdCwKICAgICAgc3RhbmRhcmRDbGFzc2VzID0gJ2NsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAnLAogICAgICBjYWNoZXMgPSB7fSwKICAgICAgY291bnRlciA9IDAsCiAgICAgIGltZ0NvdW50ID0gMDsKCiAgLy8gdXNlICQuZm4ucHJvcCgpIGlmIGF2YWlsYWJsZSAoalF1ZXJ5IDEuNispOyBvdGhlcndpc2UsICQuZm4uYXR0cigpCiAgJC5mbi5hdHRyUHJvcCA9ICQuZm4ucHJvcCB8fCAkLmZuLmF0dHI7CgogIC8vIC5jbHVldGlwKCkgbWV0aG9kCiAgJC5mbi5jbHVldGlwID0gZnVuY3Rpb24oanMsIG9wdGlvbnMpIHsKICAgIHZhciAkY2x1ZXRpcCwgJGNsdWV0aXBJbm5lciwgJGNsdWV0aXBPdXRlciwgJGNsdWV0aXBUaXRsZSwgJGNsdWV0aXBBcnJvd3MsICRkcm9wU2hhZG93OwogICAgaWYgKHR5cGVvZiBqcyA9PSAnb2JqZWN0JykgewogICAgICBvcHRpb25zID0ganM7CiAgICAgIGpzID0gbnVsbDsKICAgIH0KICAgIGlmIChqcyA9PSAnZGVzdHJveScpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLmRhdGEoJ2NsdWV0aXAnKTsKICAgICAgaWYgKCBkYXRhICkgewogICAgICAgICQoZGF0YS5zZWxlY3RvcikucmVtb3ZlKCk7CiAgICAgICAgJC5yZW1vdmVEYXRhKHRoaXMsICd0aXRsZScpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcCcpOwogICAgICAgICQucmVtb3ZlRGF0YSh0aGlzLCAnY2x1ZXRpcE1vYycpOwogICAgICB9CiAgICAgICQoZG9jdW1lbnQpLnVuYmluZCgnLmNsdWV0aXAnKTsKICAgICAgcmV0dXJuIHRoaXMudW5iaW5kKCcuY2x1ZXRpcCcpOwogICAgfQoKICAgIC8vIG1lcmdlIHBlci1jYWxsIG9wdGlvbnMgd2l0aCBkZWZhdWx0cwogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHt9LCAkLmNsdWV0aXAuZGVmYXVsdHMsIG9wdGlvbnMgfHwge30pOwoKICAgIC8qKiA9Y3JlYXRlIGNsdWV0aXAgZGl2cyAqKi8KICAgIGNvdW50ZXIrKzsKICAgIHZhciBjbHVlekluZGV4LAogICAgICAgIGNsdWV0aXBJZCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0IHx8ICFvcHRpb25zLm11bHRpcGxlID8gJ2NsdWV0aXAnIDogJ2NsdWV0aXAtJyArIGNvdW50ZXIsCiAgICAgICAgY2x1ZXRpcFNlbGVjdG9yID0gJyMnICsgY2x1ZXRpcElkLAogICAgICAgIHByZWZpeCA9ICQuY2x1ZXRpcC5iYWNrQ29tcGF0ID8gJyMnIDogJy4nLAogICAgICAgIGluc2VydGlvblR5cGUgPSAkLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSwKICAgICAgICBpbnNlcnRpb25FbGVtZW50ID0gJC5jbHVldGlwLnNldHVwLmluc2VydGlvbkVsZW1lbnQgfHwgJ2JvZHknOwoKICAgIGluc2VydGlvblR5cGUgPSAoL2FwcGVuZFRvfHByZXBlbmRUb3xpbnNlcnRCZWZvcmV8aW5zZXJ0QWZ0ZXIvKS50ZXN0KGluc2VydGlvblR5cGUpID8gaW5zZXJ0aW9uVHlwZSA6ICdhcHBlbmRUbyc7CiAgICAkY2x1ZXRpcCA9ICQoY2x1ZXRpcFNlbGVjdG9yKTsKICAgIGlmICghJGNsdWV0aXAubGVuZ3RoKSB7CgogICAgICAkY2x1ZXRpcCA9ICQoJC5jbHVldGlwLnRlbXBsYXRlKQogICAgICBbaW5zZXJ0aW9uVHlwZV0oaW5zZXJ0aW9uRWxlbWVudCkKICAgICAgLmF0dHIoJ2lkJywgY2x1ZXRpcElkKQogICAgICAuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJywgZGlzcGxheTogJ25vbmUnfSk7CgogICAgICBjbHVlekluZGV4ID0gK29wdGlvbnMuY2x1ZXpJbmRleDsKICAgICAgJGNsdWV0aXBPdXRlciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtb3V0ZXInKS5jc3Moe3Bvc2l0aW9uOiAncmVsYXRpdmUnLCB6SW5kZXg6IGNsdWV6SW5kZXh9KTsKICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKTsKICAgICAgJGNsdWV0aXBUaXRsZSA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtdGl0bGUnKTsKCiAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlZW50ZXIgbW91c2VsZWF2ZScsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgJCh0aGlzKS5kYXRhKCdlbnRlcmVkJywgZXZlbnQudHlwZSA9PT0gJ21vdXNlZW50ZXInKTsKICAgICAgfSk7CiAgICB9CgogICAgJGNsdWV0aXBXYWl0ID0gJCgnI2NsdWV0aXAtd2FpdGltYWdlJyk7CiAgICBpZiAoISRjbHVldGlwV2FpdC5sZW5ndGggJiYgb3B0aW9ucy53YWl0SW1hZ2UpIHsKICAgICAgJGNsdWV0aXBXYWl0ID0gJCgnPGRpdj48L2Rpdj4nKS5hdHRyKCdpZCcsICdjbHVldGlwLXdhaXRpbWFnZScpLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZSd9KTsKICAgICAgJGNsdWV0aXBXYWl0Lmluc2VydEJlZm9yZSgkY2x1ZXRpcCkuaGlkZSgpOwogICAgfQoKCiAgICB2YXIgY2x1ZXRpcFBhZGRpbmcgPSAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nTGVmdCcpLCAxMCkgfHwgMCkgKyAocGFyc2VJbnQoJGNsdWV0aXAuY3NzKCdwYWRkaW5nUmlnaHQnKSwgMTApIHx8IDApOwoKCiAgICB0aGlzLmVhY2goZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgdmFyIGxpbmsgPSB0aGlzLAogICAgICAgICAgJGxpbmsgPSAkKHRoaXMpLAogICAgICAgICAgLy8gc3VwcG9ydCBtZXRhZGF0YSBwbHVnaW4gKHYxLjAgYW5kIDIuMCkKICAgICAgICAgIG9wdHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgb3B0aW9ucywgJC5tZXRhZGF0YSA/ICRsaW5rLm1ldGFkYXRhKCkgOiAkLm1ldGEgPyAkbGluay5kYXRhKCkgOiAkbGluay5kYXRhKCdjbHVldGlwJykgfHwge30pLAogICAgICAgICAgLy8gc3RhcnQgb3V0IHdpdGggbm8gY29udGVudHMgKGZvciBhamF4IGFjdGl2YXRpb24pCiAgICAgICAgICBjbHVldGlwQ29udGVudHMgPSBmYWxzZSwKICAgICAgICAgIGlzQWN0aXZlID0gZmFsc2UsCiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsLAogICAgICAgICAgdGlwQXR0cmlidXRlID0gb3B0c1tvcHRzLmF0dHJpYnV0ZV0gfHwKICAgICAgICAgICAgKCBvcHRzLmF0dHJpYnV0ZSA9PSAnaHJlZicgPyAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSA6ICRsaW5rLmF0dHJQcm9wKG9wdHMuYXR0cmlidXRlKSB8fCAkbGluay5hdHRyKG9wdHMuYXR0cmlidXRlKSApLAogICAgICAgICAgY3RDbGFzcyA9IG9wdHMuY2x1ZXRpcENsYXNzOwoKICAgICAgY2x1ZXpJbmRleCA9ICtvcHRzLmNsdWV6SW5kZXg7CiAgICAgICRsaW5rLmRhdGEoJ2NsdWV0aXAnLCB7dGl0bGU6IGxpbmsudGl0bGUsIHpJbmRleDogY2x1ZXpJbmRleCwgc2VsZWN0b3I6IGNsdWV0aXBTZWxlY3Rvcn0pOwoKICAgICAgaWYgKG9wdHMuYXJyb3dzICYmICEkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1hcnJvd3MnKS5sZW5ndGgpIHsKICAgICAgICAkY2x1ZXRpcC5hcHBlbmQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIHVpLXN0YXRlLWRlZmF1bHQiPjwvZGl2PicpOwogICAgICB9CgogICAgICBpZiAoIXRpcEF0dHJpYnV0ZSAmJiAhb3B0cy5zcGxpdFRpdGxlICYmICFqcykgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIGlmIGhpZGVMb2NhbCBpcyBzZXQgdG8gdHJ1ZSwgb24gRE9NIHJlYWR5IGhpZGUgdGhlIGxvY2FsIGNvbnRlbnQgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgY2x1ZVRpcAogICAgICBpZiAob3B0cy5sb2NhbCAmJiBvcHRzLmxvY2FsUHJlZml4KSB7dGlwQXR0cmlidXRlID0gb3B0cy5sb2NhbFByZWZpeCArIHRpcEF0dHJpYnV0ZTt9CiAgICAgIGlmIChvcHRzLmxvY2FsICYmIG9wdHMuaGlkZUxvY2FsICYmIHRpcEF0dHJpYnV0ZSkgeyAkKHRpcEF0dHJpYnV0ZSArICc6Zmlyc3QnKS5oaWRlKCk7IH0KCiAgICAgIHZhciB0T2Zmc2V0ID0gcGFyc2VJbnQob3B0cy50b3BPZmZzZXQsIDEwKSwgbE9mZnNldCA9IHBhcnNlSW50KG9wdHMubGVmdE9mZnNldCwgMTApOwogICAgICAvLyB2ZXJ0aWNhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcEhlaWdodCwgd0hlaWdodCwKICAgICAgICAgIGRlZkhlaWdodCA9IGlzTmFOKHBhcnNlSW50KG9wdHMuaGVpZ2h0LCAxMCkpID8gJ2F1dG8nIDogKC9cRC9nKS50ZXN0KG9wdHMuaGVpZ2h0KSA/IG9wdHMuaGVpZ2h0IDogb3B0cy5oZWlnaHQgKyAncHgnOwogICAgICB2YXIgc1RvcCwgbGlua1RvcCwgbGlua0JvdHRvbSwgcG9zWSwgdGlwWSwgbW91c2VZLCBiYXNlbGluZTsKICAgICAgLy8gaG9yaXpvbnRhbCBtZWFzdXJlbWVudCB2YXJpYWJsZXMKICAgICAgdmFyIHRpcElubmVyV2lkdGggPSBwYXJzZUludChvcHRzLndpZHRoLCAxMCkgfHwgMjc1LAogICAgICAgICAgdGlwV2lkdGggPSB0aXBJbm5lcldpZHRoICsgY2x1ZXRpcFBhZGRpbmcgKyBvcHRzLmRyb3BTaGFkb3dTdGVwcywKICAgICAgICAgIGxpbmtXaWR0aCA9IHRoaXMub2Zmc2V0V2lkdGgsCiAgICAgICAgICBsaW5rTGVmdCwgcG9zWCwgdGlwWCwgbW91c2VYLCB3aW5XaWR0aDsKCiAgICAgIC8vIHBhcnNlIHRoZSB0aXRsZQogICAgICB2YXIgdGlwUGFydHM7CiAgICAgIHZhciB0aXBUaXRsZSA9IChvcHRzLmF0dHJpYnV0ZSAhPSAndGl0bGUnKSA/ICRsaW5rLmF0dHIob3B0cy50aXRsZUF0dHJpYnV0ZSkgfHwgJycgOiAnJzsKICAgICAgaWYgKG9wdHMuc3BsaXRUaXRsZSkgewogICAgICAgIHRpcFBhcnRzID0gdGlwVGl0bGUuc3BsaXQob3B0cy5zcGxpdFRpdGxlKTsKICAgICAgICB0aXBUaXRsZSA9IG9wdHMuc2hvd1RpdGxlIHx8IHRpcFBhcnRzWzBdID09PSAnJyA/IHRpcFBhcnRzLnNoaWZ0KCkgOiAnJzsKICAgICAgfQogICAgICBpZiAob3B0cy5lc2NhcGVUaXRsZSkgewogICAgICAgIHRpcFRpdGxlID0gdGlwVGl0bGUucmVwbGFjZSgvJi9nLCcmYW1wOycpLnJlcGxhY2UoLz4vZywnJmd0OycpLnJlcGxhY2UoLzwvZywnJmx0OycpOwogICAgICB9CgogICAgICB2YXIgbG9jYWxDb250ZW50OwogICAgICBmdW5jdGlvbiByZXR1cm5GYWxzZSgpIHsgcmV0dXJuIGZhbHNlOyB9CgogICAgICAvLyBLZWVwIHRyYWNrIG9mIG1vdXNlIGVudGVyZWQgc3RhdGUgb24gbGluawogICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyIG1vdXNlbGVhdmUnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBkYXRhID0gJGxpbmsuZGF0YSgnY2x1ZXRpcCcpOwogICAgICAgIGRhdGEuZW50ZXJlZCA9IGV2ZW50LnR5cGUgPT09ICdlbnRlcmVkJzsKICAgICAgICAkbGluay5kYXRhKCdjbHVldGlwJywgZGF0YSk7CiAgICAgIH0pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIEFDVElWQVRJT04KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8vYWN0aXZhdGUgY2x1ZVRpcAogICAgdmFyIGFjdGl2YXRlID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgdmFyIHBZLCBhamF4TWVyZ2VkU2V0dGluZ3MsIGNhY2hlS2V5LAogICAgICAgICAgY29udGludWVPbiA9IG9wdHMub25BY3RpdmF0ZS5jYWxsKGxpbmssIGV2ZW50KTsKCiAgICAgIGlmIChjb250aW51ZU9uID09PSBmYWxzZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgaXNBY3RpdmUgPSB0cnVlOwoKICAgICAgLy8gYWN0aXZhdGUgZnVuY3Rpb24gbWF5IGdldCBjYWxsZWQgYWZ0ZXIgYW4gaW5pdGlhbGl6YXRpb24gb2YgYQogICAgICAvLyBkaWZmZXJlbnQgdGFyZ2V0IHNvIG5lZWQgdG8gcmUtZ2V0IHRoZSBDb3JyZWN0IENsdWV0aXAgb2JqZWN0IGhlcmUKICAgICAgJGNsdWV0aXAgPSAkKGNsdWV0aXBTZWxlY3RvcikuY3NzKHtwb3NpdGlvbjogJ2Fic29sdXRlJ30pOwogICAgICAkY2x1ZXRpcE91dGVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1vdXRlcicpOwogICAgICAkY2x1ZXRpcElubmVyID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1pbm5lcicpOwogICAgICAkY2x1ZXRpcFRpdGxlID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC10aXRsZScpOwogICAgICAkY2x1ZXRpcEFycm93cyA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtYXJyb3dzJyk7CiAgICAgICRjbHVldGlwLnJlbW92ZUNsYXNzKCkuY3NzKHt3aWR0aDogdGlwSW5uZXJXaWR0aH0pOwogICAgICBpZiAodGlwQXR0cmlidXRlID09ICRsaW5rLmF0dHIoJ2hyZWYnKSkgewogICAgICAgICRsaW5rLmNzcygnY3Vyc29yJywgb3B0cy5jdXJzb3IpOwogICAgICB9CiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5hZGRDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICAgIGxpbmtUb3AgPSBwb3NZID0gJGxpbmsub2Zmc2V0KCkudG9wOwogICAgICBsaW5rQm90dG9tID0gbGlua1RvcCArICRsaW5rLmlubmVySGVpZ2h0KCk7CiAgICAgIGxpbmtMZWZ0ID0gJGxpbmsub2Zmc2V0KCkubGVmdDsKCiAgICAgIC8vIEZJWDogKGJ1ZyA0NDEyKQogICAgICBsaW5rV2lkdGggPSAkbGluay5pbm5lcldpZHRoKCk7CiAgICAgIGlmICggZXZlbnQudHlwZSA9PSBmb2N1cyApIHsKICAgICAgICAvLyBpbiBmb2N1cyBldmVudCwgbm8gbW91c2UgcG9zaXRpb24gaXMgYXZhaWxhYmxlOyB0aGlzIGlzIG5lZWRlZCB3aXRoIGJvdHRvbVRvcDoKICAgICAgICBtb3VzZVggPSBsaW5rTGVmdCArICAoIGxpbmtXaWR0aCAvIDIgKSArIGxPZmZzZXQ7CiAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBwb3NYfSk7CiAgICAgICAgbW91c2VZID0gcG9zWSArIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW91c2VYID0gZXZlbnQucGFnZVg7CiAgICAgICAgbW91c2VZID0gZXZlbnQucGFnZVk7CiAgICAgIH0KICAgICAgLy9FTkQgT0YgRklYCgogICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgIT0gJ2FyZWEnKSB7CiAgICAgICAgc1RvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpOwogICAgICAgIHdpbldpZHRoID0gJCh3aW5kb3cpLndpZHRoKCk7CiAgICAgIH0KLy8gcG9zaXRpb24gY2x1ZVRpcCBob3Jpem9udGFsbHkKICAgICAgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAnZml4ZWQnKSB7CiAgICAgICAgcG9zWCA9IGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICAkY2x1ZXRpcC5jc3Moe2xlZnQ6IHBvc1h9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3NYID0gKGxpbmtXaWR0aCA+IGxpbmtMZWZ0ICYmIGxpbmtMZWZ0ID4gdGlwV2lkdGgpIHx8CiAgICAgICAgICBsaW5rTGVmdCArIGxpbmtXaWR0aCArIHRpcFdpZHRoICsgbE9mZnNldCA+IHdpbldpZHRoID8KICAgICAgICAgIGxpbmtMZWZ0IC0gdGlwV2lkdGggLSBsT2Zmc2V0IDoKICAgICAgICAgIGxpbmtXaWR0aCArIGxpbmtMZWZ0ICsgbE9mZnNldDsKICAgICAgICBpZiAobGluay50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2FyZWEnIHx8IG9wdHMucG9zaXRpb25CeSA9PSAnbW91c2UnIHx8IGxpbmtXaWR0aCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsgLy8gcG9zaXRpb24gYnkgbW91c2UKICAgICAgICAgIGlmIChtb3VzZVggKyAyMCArIHRpcFdpZHRoID4gd2luV2lkdGgpIHsKICAgICAgICAgICAgJGNsdWV0aXAuYWRkQ2xhc3MoJ2NsdWV0aXAtJyArIGN0Q2xhc3MpOwogICAgICAgICAgICBwb3NYID0gKG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCkgPj0gMCA/IG1vdXNlWCAtIHRpcFdpZHRoIC0gbE9mZnNldCAtIHBhcnNlSW50KCRjbHVldGlwLmNzcygnbWFyZ2luTGVmdCcpLDEwKSArIHBhcnNlSW50KCRjbHVldGlwSW5uZXIuY3NzKCdtYXJnaW5SaWdodCcpLDEwKSA6ICBtb3VzZVggLSAodGlwV2lkdGgvMik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwb3NYID0gbW91c2VYICsgbE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcFkgPSBwb3NYIDwgMCA/IGV2ZW50LnBhZ2VZICsgdE9mZnNldCA6IGV2ZW50LnBhZ2VZOwogICAgICAgIGlmIChwb3NYIDwgMCB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgIHx8IG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJykgewogICAgICAgICAgcG9zWCA9IChtb3VzZVggKyAodGlwV2lkdGgvMikgPiB3aW5XaWR0aCkgPyB3aW5XaWR0aC8yIC0gdGlwV2lkdGgvMiA6IE1hdGgubWF4KG1vdXNlWCAtICh0aXBXaWR0aC8yKSwwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICRjbHVldGlwQXJyb3dzLmNzcyh7ekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4KzF9KTsKICAgICAgJGNsdWV0aXAuY3NzKHsKICAgICAgICBsZWZ0OiBwb3NYLAogICAgICAgIHpJbmRleDogJGxpbmsuZGF0YSgnY2x1ZXRpcCcpLnpJbmRleAogICAgICB9KTsKICAgICAgd0hlaWdodCA9ICQod2luZG93KS5oZWlnaHQoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGEgc3RyaW5nIGZyb20gY2x1ZXRpcCBtZXRob2QncyBmaXJzdCBhcmd1bWVudAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIGlmIChqcykgewogICAgICAgIGlmICh0eXBlb2YganMgPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAganMgPSBqcy5jYWxsKGxpbmspOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcElubmVyLmh0bWwoanMpOwogICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogbG9hZCB0aGUgdGl0bGUgYXR0cmlidXRlIG9ubHkgKG9yIHVzZXItc2VsZWN0ZWQgYXR0cmlidXRlKS4KKiBjbHVlVGlwIHRpdGxlIGlzIHRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBkZWxpbWl0ZXIKKiBzdWJzZXF1ZW50IGRlbGltaXRlcnMgcGxhY2UgY2x1ZVRpcCBib2R5IHRleHQgb24gc2VwYXJhdGUgbGluZXMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgZWxzZSBpZiAodGlwUGFydHMpIHsKICAgICAgICB2YXIgdHBsID0gdGlwUGFydHMubGVuZ3RoOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCh0cGwgPyB0aXBQYXJ0c1swXSA6ICcnKTsKICAgICAgICBpZiAodHBsID4gMSkgewogICAgICAgICAgZm9yICh2YXIgaT0xOyBpIDwgdHBsOyBpKyspewogICAgICAgICAgICAkY2x1ZXRpcElubmVyLmFwcGVuZCgnPGRpdiBjbGFzcz0ic3BsaXQtYm9keSI+JyArIHRpcFBhcnRzW2ldICsgJzwvZGl2PicpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIGxvYWQgZXh0ZXJuYWwgZmlsZSB2aWEgYWpheAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICBlbHNlIGlmICggIW9wdHMubG9jYWwgJiYgdGlwQXR0cmlidXRlLmluZGV4T2YoJyMnKSAhPT0gMCApIHsKICAgICAgICBpZiAoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QodGlwQXR0cmlidXRlKSkgewogICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKCc8aW1nIHNyYz0iJyArIHRpcEF0dHJpYnV0ZSArICciIGFsdD0iJyArIHRpcFRpdGxlICsgJyIgLz4nKTsKICAgICAgICAgIGNsdWV0aXBTaG93KHBZKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG9wdGlvbkJlZm9yZVNlbmQgPSBvcHRzLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLAogICAgICAgICAgICAgIG9wdGlvbkVycm9yID0gb3B0cy5hamF4U2V0dGluZ3MuZXJyb3IsCiAgICAgICAgICAgICAgb3B0aW9uU3VjY2VzcyA9IG9wdHMuYWpheFNldHRpbmdzLnN1Y2Nlc3MsCiAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUgPSBvcHRzLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTsKCiAgICAgICAgICBjYWNoZUtleSA9IGdldENhY2hlS2V5KHRpcEF0dHJpYnV0ZSwgb3B0cy5hamF4U2V0dGluZ3MuZGF0YSk7CgogICAgICAgICAgdmFyIGFqYXhTZXR0aW5ncyA9IHsKICAgICAgICAgICAgY2FjaGU6IG9wdHMuYWpheENhY2hlLCAvLyBmb3JjZSByZXF1ZXN0ZWQgcGFnZSBub3QgdG8gYmUgY2FjaGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgdXJsOiB0aXBBdHRyaWJ1dGUsCiAgICAgICAgICAgIGJlZm9yZVNlbmQ6IGZ1bmN0aW9uKHhociwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgICBpZiAob3B0aW9uQmVmb3JlU2VuZCkge29wdGlvbkJlZm9yZVNlbmQuY2FsbChsaW5rLCB4aHIsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyLCBzZXR0aW5ncyk7fQogICAgICAgICAgICAgICRjbHVldGlwT3V0ZXIuY2hpbGRyZW4oKS5lbXB0eSgpOwogICAgICAgICAgICAgIGlmIChvcHRzLndhaXRJbWFnZSkgewogICAgICAgICAgICAgICAgJGNsdWV0aXBXYWl0CiAgICAgICAgICAgICAgICAuY3NzKHt0b3A6IG1vdXNlWSsyMCwgbGVmdDogbW91c2VYKzIwLCB6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgtMX0pCiAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmICggb3B0aW9ucy5hamF4Q2FjaGUgJiYgIWNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgICAgICBjYWNoZXNbY2FjaGVLZXldID0ge3N0YXR1czogJ2Vycm9yJywgdGV4dFN0YXR1czogdGV4dFN0YXR1cywgeGhyOiB4aHJ9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgb3B0aW9uRXJyb3IuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgnPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7CiAgICAgICAgICAgICAgaWYgKCBvcHRpb25zLmFqYXhDYWNoZSAmJiAhY2FjaGVzW2NhY2hlS2V5XSApIHsKICAgICAgICAgICAgICAgIGNhY2hlc1tjYWNoZUtleV0gPSB7c3RhdHVzOiAnc3VjY2VzcycsIGRhdGE6IGRhdGEsIHRleHRTdGF0dXM6IHRleHRTdGF0dXMsIHhocjogeGhyfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IG9wdHMuYWpheFByb2Nlc3MuY2FsbChsaW5rLCBkYXRhKTsKCiAgICAgICAgICAgICAgLy8gYWxsb3cgZm9yIGNoYW5naW5nIHRoZSB0aXRsZSBiYXNlZCBvbiBkYXRhIHJldHVybmVkIGJ5IHhocgogICAgICAgICAgICAgIGlmICggdHlwZW9mIGNsdWV0aXBDb250ZW50cyA9PSAnb2JqZWN0JyAmJiBjbHVldGlwQ29udGVudHMgIT09IG51bGwgKSB7CiAgICAgICAgICAgICAgICB0aXBUaXRsZSA9IGNsdWV0aXBDb250ZW50cy50aXRsZTsKICAgICAgICAgICAgICAgIGNsdWV0aXBDb250ZW50cyA9IGNsdWV0aXBDb250ZW50cy5jb250ZW50OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKGlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9uU3VjY2VzcykgewogICAgICAgICAgICAgICAgICBvcHRpb25TdWNjZXNzLmNhbGwobGluaywgZGF0YSwgdGV4dFN0YXR1cywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGNsdWV0aXBJbm5lci5odG1sKGNsdWV0aXBDb250ZW50cyk7CgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY29tcGxldGU6IGZ1bmN0aW9uKHhociwgdGV4dFN0YXR1cykgewogICAgICAgICAgICAgIGlmIChvcHRpb25Db21wbGV0ZSkgewogICAgICAgICAgICAgICAgb3B0aW9uQ29tcGxldGUuY2FsbChsaW5rLCB4aHIsIHRleHRTdGF0dXMsICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGltZ3MgPSAkY2x1ZXRpcElubmVyWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKTsKICAgICAgICAgICAgICBpbWdDb3VudCA9IGltZ3MubGVuZ3RoOwogICAgICAgICAgICAgIGZvciAodmFyIGk9MCwgbCA9IGltZ3MubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoaW1nc1tpXS5jb21wbGV0ZSkgewogICAgICAgICAgICAgICAgICBpbWdDb3VudC0tOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoaW1nQ291bnQgJiYgISQuYnJvd3Nlci5vcGVyYSkgewogICAgICAgICAgICAgICAgJChpbWdzKS5iaW5kKCdsb2FkLmN0IGVycm9yLmN0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgIGltZ0NvdW50LS07CiAgICAgICAgICAgICAgICAgIGlmIChpbWdDb3VudCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgJChpbWdzKS51bmJpbmQoJy5jdCcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0FjdGl2ZSkgeyBjbHVldGlwU2hvdyhwWSk7IH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjbHVldGlwV2FpdC5oaWRlKCk7CiAgICAgICAgICAgICAgICBpZiAoaXNBY3RpdmUpIHsgY2x1ZXRpcFNob3cocFkpOyB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9OwoKICAgICAgICAgIGFqYXhNZXJnZWRTZXR0aW5ncyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBvcHRzLmFqYXhTZXR0aW5ncywgYWpheFNldHRpbmdzKTsKCiAgICAgICAgICBpZiAoIGNhY2hlc1tjYWNoZUtleV0gKSB7CiAgICAgICAgICAgIGNhY2hlZEFqYXgoIGNhY2hlc1tjYWNoZUtleV0sIGFqYXhNZXJnZWRTZXR0aW5ncyApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJC5hamF4KGFqYXhNZXJnZWRTZXR0aW5ncyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBsb2FkIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2FtZSBwYWdlCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgZWxzZSBpZiAob3B0cy5sb2NhbCkgewogICAgICAgIHZhciAkbG9jYWxDb250ZW50ID0gJCh0aXBBdHRyaWJ1dGUgKyAoL14jXFMrJC8udGVzdCh0aXBBdHRyaWJ1dGUpID8gJycgOiAnOmVxKCcgKyBpbmRleCArICcpJykpLmNsb25lKHRydWUpLnNob3coKTsKICAgICAgICBpZiAob3B0cy5sb2NhbElkU3VmZml4KSB7CiAgICAgICAgICAkbG9jYWxDb250ZW50LmF0dHIoJ2lkJywgJGxvY2FsQ29udGVudFswXS5pZCArIG9wdHMubG9jYWxJZFN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkbG9jYWxDb250ZW50KTsKICAgICAgICBjbHVldGlwU2hvdyhwWSk7CiAgICAgIH0KICAgIH07CgovLyBnZXQgZGltZW5zaW9ucyBhbmQgb3B0aW9ucyBmb3IgY2x1ZXRpcCBhbmQgcHJlcGFyZSBpdCB0byBiZSBzaG93bgogICAgdmFyIGNsdWV0aXBTaG93ID0gZnVuY3Rpb24oYnBZKSB7CiAgICAgIHZhciAkY2xvc2VMaW5rLCBkeW5hbWljQ2xhc3NlcywgaGVpZ2h0RGlmZiwKICAgICAgICAgIHRpdGxlSFRNTCA9IHRpcFRpdGxlIHx8IG9wdHMuc2hvd1RpdGxlICYmICcmbmJzcDsnLAogICAgICAgICAgYmdZID0gJycsIGRpcmVjdGlvbiA9ICcnLCBpbnN1ZmZpY2llbnRYID0gZmFsc2U7CiAgICAgIHZhciBzdGlja3lDbG9zZSA9IHsKICAgICAgICBib3R0b206IGZ1bmN0aW9uKCRjTGluaykgewogICAgICAgICAgJGNMaW5rLmFwcGVuZFRvKCRjbHVldGlwSW5uZXIpOwogICAgICAgIH0sCiAgICAgICAgdG9wOiBmdW5jdGlvbigkY0xpbmspIHsKICAgICAgICAgICRjTGluay5wcmVwZW5kVG8oJGNsdWV0aXBJbm5lcik7CiAgICAgICAgfSwKICAgICAgICB0aXRsZTogZnVuY3Rpb24oJGNMaW5rKSB7CiAgICAgICAgICAkY0xpbmsucHJlcGVuZFRvKCRjbHVldGlwVGl0bGUpOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgICRjbHVldGlwLmFkZENsYXNzKCdjbHVldGlwLScgKyBjdENsYXNzKTsKICAgICAgaWYgKG9wdHMudHJ1bmNhdGUpIHsKICAgICAgICB2YXIgJHRydW5jbG9hZGVkID0gJGNsdWV0aXBJbm5lci50ZXh0KCkuc2xpY2UoMCxvcHRzLnRydW5jYXRlKSArICcuLi4nOwogICAgICAgICRjbHVldGlwSW5uZXIuaHRtbCgkdHJ1bmNsb2FkZWQpOwogICAgICB9CgogICAgICBpZiAodGl0bGVIVE1MKSB7CiAgICAgICAgJGNsdWV0aXBUaXRsZS5zaG93KCkuaHRtbCh0aXRsZUhUTUwpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwVGl0bGUuaGlkZSgpOwogICAgICB9CgogICAgICBpZiAob3B0cy5zdGlja3kpIHsKICAgICAgICBpZiAoc3RpY2t5Q2xvc2Vbb3B0cy5jbG9zZVBvc2l0aW9uXSkgewogICAgICAgICAgJGNsb3NlTGluayA9ICQoJzxkaXYgY2xhc3M9ImNsdWV0aXAtY2xvc2UiPjxhIGhyZWY9IiMiPicgKyBvcHRzLmNsb3NlVGV4dCArICc8L2E+PC9kaXY+Jyk7CiAgICAgICAgICBzdGlja3lDbG9zZVtvcHRzLmNsb3NlUG9zaXRpb25dKCAkY2xvc2VMaW5rICk7CiAgICAgICAgICAkY2xvc2VMaW5rLmJpbmQoJ2NsaWNrLmNsdWV0aXAnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2x1ZXRpcENsb3NlKCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAob3B0cy5tb3VzZU91dENsb3NlKSB7CiAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycpOwogICAgICAgICAgJGNsdWV0aXAudW5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnKTsKICAgICAgICAgIGlmIChvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnIHx8IG9wdHMubW91c2VPdXRDbG9zZSA9PSAnY2x1ZXRpcCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09PSB0cnVlKSB7IC8vIHRydWUgaW1wbGllcyAnY2x1ZXRpcCcgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5CiAgICAgICAgICAgICRjbHVldGlwLmJpbmQoJ21vdXNlbGVhdmUuY2x1ZXRpcE1vYycsIG1vdXNlT3V0Q2xvc2UpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnYm90aCcgfHwgb3B0cy5tb3VzZU91dENsb3NlID09ICdsaW5rJykgewogICAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWxlYXZlLmNsdWV0aXBNb2MnLCBtb3VzZU91dENsb3NlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCi8vIG5vdyB0aGF0IGNvbnRlbnQgaXMgbG9hZGVkLCBmaW5pc2ggdGhlIHBvc2l0aW9uaW5nCiAgICAgICRjbHVldGlwT3V0ZXIuY3NzKHt6SW5kZXg6ICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS56SW5kZXgsIG92ZXJmbG93OiBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gJ3Zpc2libGUnIDogJ2F1dG8nLCBoZWlnaHQ6IGRlZkhlaWdodH0pOwogICAgICB0aXBIZWlnaHQgPSBkZWZIZWlnaHQgPT0gJ2F1dG8nID8gTWF0aC5tYXgoJGNsdWV0aXAub3V0ZXJIZWlnaHQoKSwkY2x1ZXRpcC5oZWlnaHQoKSkgOiBwYXJzZUludChkZWZIZWlnaHQsMTApOwogICAgICB0aXBZID0gcG9zWTsKICAgICAgYmFzZWxpbmUgPSBzVG9wICsgd0hlaWdodDsKICAgICAgaW5zdWZmaWNpZW50WCA9IChwb3NYIDwgbW91c2VYICYmIChNYXRoLm1heChwb3NYLCAwKSArIHRpcFdpZHRoID4gbW91c2VYKSk7CiAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2ZpeGVkJykgewogICAgICAgIHRpcFkgPSBwb3NZIC0gb3B0cy5kcm9wU2hhZG93U3RlcHMgKyB0T2Zmc2V0OwogICAgICB9IGVsc2UgaWYgKG9wdHMucG9zaXRpb25CeSA9PSAndG9wQm90dG9tJyB8fCBvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ3RvcEJvdHRvbScpIHsKICAgICAgICAgIGlmIChwb3NZICsgdGlwSGVpZ2h0ICsgdE9mZnNldCA8IGJhc2VsaW5lICYmIG1vdXNlWSAtIHNUb3AgPCB0aXBIZWlnaHQgKyB0T2Zmc2V0KSB7CiAgICAgICAgICAgIGRpcmVjdGlvbiA9ICdib3R0b20nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChvcHRzLnBvc2l0aW9uQnkgPT0gJ2JvdHRvbVRvcCcgfHwgaW5zdWZmaWNpZW50WCkgewogICAgICAgICAgaWYgKHBvc1kgKyB0aXBIZWlnaHQgKyB0T2Zmc2V0ID4gYmFzZWxpbmUgJiYgbW91c2VZIC0gc1RvcCA+IHRpcEhlaWdodCArIHRPZmZzZXQpIHsKICAgICAgICAgICAgZGlyZWN0aW9uID0gJ3RvcCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkaXJlY3Rpb24gPSAnYm90dG9tJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdyBoYXZlIGEgZGlyZWN0aW9uLiBDb21wdXRlIHRpcFkKICAgICAgICBpZiAob3B0cy5zbmFwVG9FZGdlKSB7CiAgICAgICAgICBpZiAoZGlyZWN0aW9uID09ICd0b3AnKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rVG9wIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBsaW5rQm90dG9tICsgdE9mZnNldDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpcmVjdGlvbiA9PSAndG9wJykgewogICAgICAgICAgICB0aXBZID0gbW91c2VZIC0gdGlwSGVpZ2h0IC0gdE9mZnNldDsKICAgICAgICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09ICdib3R0b20nKSB7CiAgICAgICAgICAgIHRpcFkgPSBtb3VzZVkgKyB0T2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICggcG9zWSArIHRpcEhlaWdodCArIHRPZmZzZXQgPiBiYXNlbGluZSApIHsKICAgICAgICB0aXBZID0gKHRpcEhlaWdodCA+PSB3SGVpZ2h0KSA/IHNUb3AgOiBiYXNlbGluZSAtIHRpcEhlaWdodCAtIHRPZmZzZXQ7CiAgICAgIH0gZWxzZSBpZiAoJGxpbmsuY3NzKCdkaXNwbGF5JykgPT0gJ2Jsb2NrJyB8fCBsaW5rLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PSAnYXJlYScgfHwgb3B0cy5wb3NpdGlvbkJ5ID09ICJtb3VzZSIpIHsKICAgICAgICB0aXBZID0gYnBZIC0gdE9mZnNldDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aXBZID0gcG9zWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzOwogICAgICB9CiAgICAgIGlmIChkaXJlY3Rpb24gPT09ICcnKSB7CiAgICAgICAgZGlyZWN0aW9uID0gcG9zWCA8IGxpbmtMZWZ0ID8gJ2xlZnQnIDogICdyaWdodCc7CiAgICAgIH0KICAgICAgLy8gYWRkIGNsYXNzZXMKICAgICAgZHluYW1pY0NsYXNzZXMgPSAnIGNsdWUtJyArIGRpcmVjdGlvbiArICctJyArIGN0Q2xhc3MgKyAnIGNsdWV0aXAtJyArIGN0Q2xhc3M7CiAgICAgIGlmIChjdENsYXNzID09ICdyb3VuZGVkJykgewogICAgICAgIGR5bmFtaWNDbGFzc2VzICs9ICcgdWktY29ybmVyLWFsbCc7CiAgICAgIH0KICAgICAgJGNsdWV0aXAuY3NzKHt0b3A6IHRpcFkgKyAncHgnfSkuYXR0clByb3AoeydjbGFzc05hbWUnOiBzdGFuZGFyZENsYXNzZXMgKyBkeW5hbWljQ2xhc3Nlc30pOwogICAgICAvLyBzZXQgdXAgYXJyb3cgcG9zaXRpb25pbmcgdG8gYWxpZ24gd2l0aCBlbGVtZW50CiAgICAgIGlmIChvcHRzLmFycm93cykgewogICAgICAgIGlmICggLyhsZWZ0fHJpZ2h0KS8udGVzdChkaXJlY3Rpb24pICkgewogICAgICAgICAgaGVpZ2h0RGlmZiA9ICRjbHVldGlwLmhlaWdodCgpIC0gJGNsdWV0aXBBcnJvd3MuaGVpZ2h0KCk7CiAgICAgICAgICBiZ1kgPSBwb3NYID49IDAgJiYgYnBZID4gMCA/IChwb3NZIC0gdGlwWSAtIG9wdHMuZHJvcFNoYWRvd1N0ZXBzKSA6IDA7CiAgICAgICAgICBiZ1kgPSBoZWlnaHREaWZmID4gYmdZID8gYmdZIDogaGVpZ2h0RGlmZjsKICAgICAgICAgIGJnWSArPSAncHgnOwogICAgICAgIH0KICAgICAgICAkY2x1ZXRpcEFycm93cy5jc3Moe3RvcDogYmdZfSkuc2hvdygpOwogICAgICB9IGVsc2UgewogICAgICAgICRjbHVldGlwQXJyb3dzLmhpZGUoKTsKICAgICAgfQoKLy8gKGZpcnN0IGhpZGUsIHRoZW4pICoqKlNIT1cgVEhFIENMVUVUSVAqKioKICAgICAgLy8gaGFuZGxlIGRyb3BzaGFkb3cgZGl2cyBmaXJzdAogICAgICAkZHJvcFNoYWRvdyA9IGNyZWF0ZURyb3BTaGFkb3dzKCRjbHVldGlwLCBvcHRzKTsKICAgICAgaWYgKCRkcm9wU2hhZG93ICYmICRkcm9wU2hhZG93Lmxlbmd0aCkgewogICAgICAgICRkcm9wU2hhZG93LmhpZGUoKS5jc3Moe2hlaWdodDogdGlwSGVpZ2h0LCB3aWR0aDogdGlwSW5uZXJXaWR0aCwgekluZGV4OiAkbGluay5kYXRhKCdjbHVldGlwJykuekluZGV4LTF9KS5zaG93KCk7CiAgICAgIH0KCiAgICAgIGlmICghY2xvc2VPbkRlbGF5KSB7CiAgICAgICAgJGNsdWV0aXAuaGlkZSgpOwogICAgICB9CiAgICAgIGNsZWFyVGltZW91dChjbG9zZU9uRGVsYXkpOwogICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwoKICAgICAgLy8gc2hvdyB0aGUgY2x1ZXRpcAogICAgICAkY2x1ZXRpcFtvcHRzLmZ4Lm9wZW5dKG9wdHMuZngub3BlblNwZWVkIHx8IDApOwoKICAgICAgaWYgKCQuZm4uYmdpZnJhbWUpIHsgJGNsdWV0aXAuYmdpZnJhbWUoKTsgfQoKICAgICAgLy8gdHJpZ2dlciB0aGUgb3B0aW9uYWwgb25TaG93IGZ1bmN0aW9uCiAgICAgIG9wdHMub25TaG93LmNhbGwobGluaywgJGNsdWV0aXAsICRjbHVldGlwSW5uZXIpOwogICAgfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPUlOQUNUSVZBVElPTgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogICAgdmFyIGluYWN0aXZhdGUgPSBmdW5jdGlvbihldmVudCkgewogICAgICBpc0FjdGl2ZSA9IGZhbHNlOwogICAgICAkY2x1ZXRpcFdhaXQuaGlkZSgpOwogICAgICBpZiAoIW9wdHMuc3RpY2t5IHx8ICgvY2xpY2t8dG9nZ2xlLykudGVzdChvcHRzLmFjdGl2YXRpb24pICkgewogICAgICAgIC8vIGRlbGF5ZWQgY2xvc2UgKG5vdCBmdWxseSB0ZXN0ZWQpCiAgICAgICAgaWYgKG9wdHMuZGVsYXllZENsb3NlID4gMCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KGNsb3NlT25EZWxheSk7CiAgICAgICAgICBjbG9zZU9uRGVsYXkgPSBudWxsOwogICAgICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChjbHVldGlwQ2xvc2UsIG9wdHMuZGVsYXllZENsb3NlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChvcHRzLmhvdmVyQ2xhc3MpIHsKICAgICAgICAkbGluay5yZW1vdmVDbGFzcyhvcHRzLmhvdmVyQ2xhc3MpOwogICAgICB9CiAgICB9OwoKICAgIC8vIGNsb3NlIGNsdWV0aXAgYW5kIHJlc2V0IHNvbWUgdGhpbmdzCiAgICB2YXIgY2x1ZXRpcENsb3NlID0gZnVuY3Rpb24oZWwpIHsKICAgICAgdmFyICRjbG9zZXIgPSBlbCAmJiBlbC5kYXRhKCdjbHVldGlwJykgPyBlbCA6ICRsaW5rLAogICAgICAgICAgY3QgPSAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKSAmJiAkY2xvc2VyLmRhdGEoJ2NsdWV0aXAnKS5zZWxlY3RvciwKICAgICAgICAgIGN0U2VsZWN0b3IgPSBjdCB8fCAnZGl2LmNsdWV0aXAnLAogICAgICAgICAgJGNsdWV0aXAgPSAkKGN0U2VsZWN0b3IpLAogICAgICAgICAgJGNsdWV0aXBJbm5lciA9ICRjbHVldGlwLmZpbmQocHJlZml4ICsgJ2NsdWV0aXAtaW5uZXInKSwKICAgICAgICAgICRjbHVldGlwQXJyb3dzID0gJGNsdWV0aXAuZmluZChwcmVmaXggKyAnY2x1ZXRpcC1hcnJvd3MnKTsKCiAgICAgICRjbHVldGlwLmhpZGUoKS5yZW1vdmVDbGFzcygpOwogICAgICBvcHRzLm9uSGlkZS5jYWxsKCRjbG9zZXJbMF0sICRjbHVldGlwLCAkY2x1ZXRpcElubmVyKTsKCiAgICAgIGlmIChjdCkgewogICAgICAgICRjbG9zZXIucmVtb3ZlQ2xhc3MoJ2NsdWV0aXAtY2xpY2tlZCcpOwogICAgICAgICRjbG9zZXIuY3NzKCdjdXJzb3InLCcnKTsKICAgICAgfQogICAgICBpZiAoY3QgJiYgdGlwVGl0bGUpIHsKICAgICAgICAkY2xvc2VyLmF0dHJQcm9wKG9wdHMudGl0bGVBdHRyaWJ1dGUsIHRpcFRpdGxlKTsKICAgICAgfQoKICAgICAgaWYgKG9wdHMuYXJyb3dzKSB7CiAgICAgICAgJGNsdWV0aXBBcnJvd3MuY3NzKHt0b3A6ICcnfSk7CiAgICAgIH0KICAgIH07CgogICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCBiZSBjbG9zaW5nIGJ5IGNoZWNraW5nIHdoZXJlIHRoZSB1c2VyIGlzIGhvdmVyaW5nLgogICAgLy8gV2UgZG8gYSBzaG9ydCA1MG1zIGRlbGF5IGZvciB0d28gcmVhc29uczogdG8gcHJldmVudCBmbGlja2VyLCBhbmQgdG8gYWxsb3cgdGhlIHVzZXIgdGltZSB0byBob3ZlciBvbiBvdGhlciBlbGVtZW50CiAgICB2YXIgbW91c2VPdXRDbG9zZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgZWwgPSB0aGlzOwogICAgICBjbGVhclRpbWVvdXQoY2xvc2VPbkRlbGF5KTsKICAgICAgY2xvc2VPbkRlbGF5ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbGlua092ZXIgPSAkbGluay5kYXRhKCdjbHVldGlwJykuZW50ZXJlZCwKICAgICAgICAgICAgY2x1ZXRpcE92ZXIgPSAkY2x1ZXRpcC5kYXRhKCdlbnRlcmVkJyksCiAgICAgICAgICAgIGVudGVyZWQgPSBmYWxzZTsKCiAgICAgICAgaWYgKCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2JvdGgnICYmIChsaW5rT3ZlciB8fCBjbHVldGlwT3ZlcikgKSB7CiAgICAgICAgICBlbnRlcmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gdHJ1ZSBpbXBsaWVzICdjbHVldGlwJyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICBlbHNlIGlmICggKG9wdHMubW91c2VPdXRDbG9zZSA9PT0gdHJ1ZSB8fCBvcHRzLm1vdXNlT3V0Q2xvc2UgPT0gJ2NsdWV0aXAnKSAmJiBjbHVldGlwT3ZlcikgewogICAgICAgICAgZW50ZXJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG9wdHMubW91c2VPdXRDbG9zZSA9PSAnbGluaycgJiYgbGlua092ZXIpIHsKICAgICAgICAgIGVudGVyZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAhZW50ZXJlZCApIHsKICAgICAgICAgIC8vIEFsbCBjaGVja3MgcGFzcywgY2xvc2UgdGhlIGNsdWV0aXAKICAgICAgICAgIGNsdWV0aXBDbG9zZS5jYWxsKGVsKTsKICAgICAgICB9CgogICAgICB9LCBvcHRzLmRlbGF5ZWRDbG9zZSk7CiAgICB9OwoKICAgICQoZG9jdW1lbnQpLnVuYmluZCgnaGlkZUNsdWV0aXAuY2x1ZXRpcCcpLmJpbmQoJ2hpZGVDbHVldGlwLmNsdWV0aXAnLCBmdW5jdGlvbihlKSB7CiAgICAgIGNsdWV0aXBDbG9zZSggJChlLnRhcmdldCkgKTsKICAgIH0pOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1CSU5EIEVWRU5UUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogIC8vIGFjdGl2YXRlIGJ5IGNsaWNrCiAgICAgIGlmICggKC9jbGlja3x0b2dnbGUvKS50ZXN0KG9wdHMuYWN0aXZhdGlvbikgKSB7CiAgICAgICAgJGxpbmsuYmluZCgnY2xpY2suY2x1ZXRpcCcsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICBpZiAoJGNsdWV0aXAuaXMoJzpoaWRkZW4nKSB8fCAhJGxpbmsuaXMoJy5jbHVldGlwLWNsaWNrZWQnKSkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICQoJy5jbHVldGlwLWNsaWNrZWQnKS5yZW1vdmVDbGFzcygnY2x1ZXRpcC1jbGlja2VkJyk7CiAgICAgICAgICAgICRsaW5rLmFkZENsYXNzKCdjbHVldGlwLWNsaWNrZWQnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGluYWN0aXZhdGUoZXZlbnQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwogIC8vIGFjdGl2YXRlIGJ5IGZvY3VzOyBpbmFjdGl2YXRlIGJ5IGJsdXIKICAgICAgfSBlbHNlIGlmIChvcHRzLmFjdGl2YXRpb24gPT0gJ2ZvY3VzJykgewogICAgICAgICRsaW5rLmJpbmQoJ2ZvY3VzLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgfSk7CiAgICAgICAgJGxpbmsuYmluZCgnYmx1ci5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICB9KTsKICAvLyBhY3RpdmF0ZSBieSBob3ZlcgogICAgICB9IGVsc2UgewoKICAgICAgICAvLyBjbGlja2luZyBpcyByZXR1cm5lZCBmYWxzZSBpZiBjbGlja1Rocm91Z2ggb3B0aW9uIGlzIHNldCB0byBmYWxzZQogICAgICAgICRsaW5rW29wdHMuY2xpY2tUaHJvdWdoID8gJ3VuYmluZCcgOiAnYmluZCddKCdjbGljay5jbHVldGlwJywgcmV0dXJuRmFsc2UpOwoKICAgICAgICAvL3NldCB1cCBtb3VzZSB0cmFja2luZwogICAgICAgIHZhciBtb3VzZVRyYWNrcyA9IGZ1bmN0aW9uKGV2dCkgewogICAgICAgICAgaWYgKG9wdHMudHJhY2tpbmcpIHsKICAgICAgICAgICAgdmFyIHRyYWNrWCA9IHBvc1ggLSBldnQucGFnZVg7CiAgICAgICAgICAgIHZhciB0cmFja1kgPSB0aXBZID8gdGlwWSAtIGV2dC5wYWdlWSA6IHBvc1kgLSBldnQucGFnZVk7CiAgICAgICAgICAgICRsaW5rLmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZ0KSB7CiAgICAgICAgICAgICAgJGNsdWV0aXAuY3NzKHtsZWZ0OiBldnQucGFnZVggKyB0cmFja1gsIHRvcDogZXZ0LnBhZ2VZICsgdHJhY2tZIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBpZiAoJC5mbi5ob3ZlckludGVudCAmJiBvcHRzLmhvdmVySW50ZW50KSB7CiAgICAgICAgICAkbGluay5ob3ZlckludGVudCh7CiAgICAgICAgICAgIHNlbnNpdGl2aXR5OiBvcHRzLmhvdmVySW50ZW50LnNlbnNpdGl2aXR5LAogICAgICAgICAgICBpbnRlcnZhbDogb3B0cy5ob3ZlckludGVudC5pbnRlcnZhbCwKICAgICAgICAgICAgb3ZlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICAgbW91c2VUcmFja3MoZXZlbnQpOwogICAgICAgICAgICB9LAogICAgICAgICAgICB0aW1lb3V0OiBvcHRzLmhvdmVySW50ZW50LnRpbWVvdXQsCiAgICAgICAgICAgIG91dDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICBpbmFjdGl2YXRlKGV2ZW50KTsKICAgICAgICAgICAgICAkbGluay51bmJpbmQoJ21vdXNlbW92ZS5jbHVldGlwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkbGluay5iaW5kKCdtb3VzZWVudGVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgICBhY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgIG1vdXNlVHJhY2tzKGV2ZW50KTsKICAgICAgICAgIH0pCiAgICAgICAgICAuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgaW5hY3RpdmF0ZShldmVudCk7CiAgICAgICAgICAgICRsaW5rLnVuYmluZCgnbW91c2Vtb3ZlLmNsdWV0aXAnKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgJGxpbmsuYmluZCgnbW91c2VvdmVyLmNsdWV0aXAnLCBmdW5jdGlvbihldmVudCkgewogICAgICAgICAgJGxpbmsuYXR0clByb3AoJ3RpdGxlJywnJyk7CiAgICAgICAgfSkuYmluZCgnbW91c2VsZWF2ZS5jbHVldGlwJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICRsaW5rLmF0dHJQcm9wKCd0aXRsZScsICRsaW5rLmRhdGEoJ2NsdWV0aXAnKS50aXRsZSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIHRyaWdnZXIgYSBjYWNoZWQgQWpheCByZXNwb25zZQogICAgICBmdW5jdGlvbiBjYWNoZWRBamF4KGluZm8sIHNldHRpbmdzKSB7CiAgICAgICAgdmFyIHN0YXR1cyA9IGluZm8uc3RhdHVzOwogICAgICAgIHNldHRpbmdzLmJlZm9yZVNlbmQoaW5mby54aHIsIHNldHRpbmdzKTsKICAgICAgICBpZiAoIHN0YXR1cyA9PSAnZXJyb3InICkgewogICAgICAgICAgc2V0dGluZ3Nbc3RhdHVzXShpbmZvLnhociwgaW5mby50ZXh0U3RhdHVzKTsKICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSAnc3VjY2VzcycpIHsKICAgICAgICAgIHNldHRpbmdzW3N0YXR1c10oaW5mby5kYXRhLCBpbmZvLnRleHRTdGF0dXMsIGluZm8ueGhyKTsKICAgICAgICB9CiAgICAgICAgc2V0dGluZ3MuY29tcGxldGUoaW5mby54aHIsIHNldHRpbmdzLnRleHRTdGF0dXMpOwogICAgICB9CgogICAgfSk7IC8vIGVuZCB0aGlzLmVhY2gKCiAgICAvKiogPXByaXZhdGUgZnVuY3Rpb25zCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAvL2VtcHR5IGZ1bmN0aW9uCiAgICBmdW5jdGlvbiBkb05vdGhpbmcoKSB7fQoKICAgIC8vIGNyZWF0ZSBhIHN0cmluZyB0byBiZSB1c2VkIGFzIGFuIGlkZW50aWZpZXIgZm9yIGFqYXggY2FjaGVzCiAgICBmdW5jdGlvbiBnZXRDYWNoZUtleSh1cmwsIGRhdGEpIHsKICAgICAgdmFyIGNhY2hlS2V5ID0gdXJsIHx8ICcnOwogICAgICBkYXRhID0gZGF0YSB8fCAnJzsKCiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PSAnb2JqZWN0JykgewogICAgICAgICQuZWFjaChkYXRhLCBmdW5jdGlvbihrZXksIHZhbCkgewogICAgICAgICAgY2FjaGVLZXkgKz0gJy0nICsga2V5ICsgJy0nICsgdmFsOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhID09ICdzdHJpbmcnKSB7CiAgICAgICAgY2FjaGVLZXkgKz0gZGF0YTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNhY2hlS2V5OwogICAgfQoKICAgIC8qKiA9Y3JlYXRlIGRyb3BzaGFkb3cgZGl2cyAqKi8KCiAgICBmdW5jdGlvbiBjcmVhdGVEcm9wU2hhZG93cygkY2x1ZXRpcCwgb3B0aW9ucywgbmV3RHJvcFNoYWRvdykgewogICAgICB2YXIgZHNTdHlsZSA9ICcnLAogICAgICAgICAgZHJvcFNoYWRvd1N0ZXBzID0gKG9wdGlvbnMuZHJvcFNoYWRvdyAmJiBvcHRpb25zLmRyb3BTaGFkb3dTdGVwcykgPyArb3B0aW9ucy5kcm9wU2hhZG93U3RlcHMgOiAwOwoKICAgICAgaWYgKCQuc3VwcG9ydC5ib3hTaGFkb3cpIHsKICAgICAgICBpZiAoIGRyb3BTaGFkb3dTdGVwcyApIHsKICAgICAgICAgIGRzU3R5bGUgPSAnMXB4IDFweCAnICsgZHJvcFNoYWRvd1N0ZXBzICsgJ3B4IHJnYmEoMCwwLDAsMC41KSc7CiAgICAgICAgfQogICAgICAgIHZhciBkc09mZnNldHMgPSBkcm9wU2hhZG93U3RlcHMgPT09IDAgPyAnMCAwICcgOiAnMXB4IDFweCAnOwogICAgICAgICRjbHVldGlwLmNzcygkLnN1cHBvcnQuYm94U2hhZG93LCBkc1N0eWxlKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIG9sZERyb3BTaGFkb3cgPSAkY2x1ZXRpcC5maW5kKCcuY2x1ZXRpcC1kcm9wLXNoYWRvdycpOwogICAgICBpZiAoZHJvcFNoYWRvd1N0ZXBzID09IG9sZERyb3BTaGFkb3cubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIG9sZERyb3BTaGFkb3c7CiAgICAgIH0KICAgICAgb2xkRHJvcFNoYWRvdy5yZW1vdmUoKTsKICAgICAgdmFyIGRyb3BTaGFkb3dzID0gW107CiAgICAgIGZvciAodmFyIGk9MDsgaSA8IGRyb3BTaGFkb3dTdGVwczspIHsKICAgICAgICBkcm9wU2hhZG93c1tpKytdID0gJzxkaXYgc3R5bGU9InRvcDonICsgaSArICdweDtsZWZ0OicgKyBpICsgJ3B4OyI+PC9kaXY+JzsKICAgICAgfQoKICAgICAgbmV3RHJvcFNoYWRvdyA9ICQoZHJvcFNoYWRvd3Muam9pbignJykpCiAgICAgIC5jc3MoewogICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgIGJhY2tncm91bmRDb2xvcjogJyMwMDAnLAogICAgICAgIHpJbmRleDogY2x1ZXpJbmRleCAtMSwKICAgICAgICBvcGFjaXR5OiAwLjEKICAgICAgfSkKICAgICAgLmFkZENsYXNzKCdjbHVldGlwLWRyb3Atc2hhZG93JykKICAgICAgLnByZXBlbmRUbygkY2x1ZXRpcCk7CiAgICAgIHJldHVybiBuZXdEcm9wU2hhZG93OwoKICAgIH0KCiAgICByZXR1cm4gdGhpczsKICB9OwoKICAoZnVuY3Rpb24oKSB7CiAgICAkLnN1cHBvcnQgPSAkLnN1cHBvcnQgfHwge307CiAgICAvLyBjaGVjayBzdXBwb3J0IGZvciBDU1MzIHByb3BlcnRpZXMgKGN1cnJlbnRseSBvbmx5IGJveFNoYWRvdykKICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSwKICAgICAgICBkaXZTdHlsZSA9IGRpdi5zdHlsZSwKICAgICAgICBzdHlsZVByb3BzID0gWydib3hTaGFkb3cnXSwKICAgICAgICBwcmVmaXhlcyA9IFsnbW96JywgJ01veicsICd3ZWJraXQnLCAnbyddOwoKICAgIGZvciAodmFyIGk9MCwgc2wgPSBzdHlsZVByb3BzLmxlbmd0aDsgaSA8IHNsOyBpKyspIHsKICAgICAgdmFyIHByb3AgPSBzdHlsZVByb3BzW2ldLAogICAgICAgICAgdVByb3AgPSBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zbGljZSgxKTsKCiAgICAgIGlmICggdHlwZW9mIGRpdlN0eWxlWyBwcm9wIF0gIT09ICd1bmRlZmluZWQnICkgewogICAgICAgICQuc3VwcG9ydFsgcHJvcCBdID0gcHJvcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBqPTAsIHBsID0gcHJlZml4ZXMubGVuZ3RoOyBqIDwgcGw7IGorKykgewoKICAgICAgICAgIGlmICh0eXBlb2YgZGl2U3R5bGVbIHByZWZpeGVzW2pdICsgdVByb3AgXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgJC5zdXBwb3J0WyBwcm9wIF0gPSBwcmVmaXhlc1tqXSArIHVQcm9wOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGRpdiA9IG51bGw7CiAgfSkoKTsKCiAgJC5mbi5jbHVldGlwLmRlZmF1bHRzID0gJC5jbHVldGlwLmRlZmF1bHRzOwoKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.cluetip.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBjbHVlVGlwIHBsdWdpbiB2MS4yLjcKICoKICogRGF0ZTogU2F0IE9jdCAxMyAxNzoxNzo0NyAyMDEyIEVEVAogKiBSZXF1aXJlczogalF1ZXJ5IHYxLjMrCiAqCiAqIENvcHlyaWdodCAyMDEyLCBLYXJsIFN3ZWRiZXJnCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAogKiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWwKICoKICoKICogRXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9wbHVnaW5zLmxlYXJuaW5nanF1ZXJ5LmNvbS9jbHVldGlwL2RlbW8vCiAqCiovCihmdW5jdGlvbihjKXtjLmNsdWV0aXA9e3ZlcnNpb246IjEuMi43Iix0ZW1wbGF0ZTonPGRpdj48ZGl2IGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz48ZGl2IGNsYXNzPSJjbHVldGlwLWlubmVyIHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAtY29udGVudCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+PC9kaXY+JyxzZXR1cDp7aW5zZXJ0aW9uVHlwZToiYXBwZW5kVG8iLGluc2VydGlvbkVsZW1lbnQ6ImJvZHkifSxkZWZhdWx0czp7bXVsdGlwbGU6ZmFsc2Usd2lkdGg6Mjc1LGhlaWdodDoiYXV0byIsY2x1ZXpJbmRleDo5Nyxwb3NpdGlvbkJ5OiJhdXRvIix0b3BPZmZzZXQ6MTUsbGVmdE9mZnNldDoxNSxzbmFwVG9FZGdlOmZhbHNlLGxvY2FsOmZhbHNlLGxvY2FsUHJlZml4Om51bGwsbG9jYWxJZFN1ZmZpeDpudWxsLGhpZGVMb2NhbDp0cnVlLAphdHRyaWJ1dGU6InJlbCIsdGl0bGVBdHRyaWJ1dGU6InRpdGxlIixzcGxpdFRpdGxlOiIiLGVzY2FwZVRpdGxlOmZhbHNlLHNob3dUaXRsZTp0cnVlLGNsdWV0aXBDbGFzczoiZGVmYXVsdCIsaG92ZXJDbGFzczoiIix3YWl0SW1hZ2U6dHJ1ZSxjdXJzb3I6ImhlbHAiLGFycm93czpmYWxzZSxkcm9wU2hhZG93OnRydWUsZHJvcFNoYWRvd1N0ZXBzOjYsc3RpY2t5OmZhbHNlLG1vdXNlT3V0Q2xvc2U6ZmFsc2UsZGVsYXllZENsb3NlOjUwLGFjdGl2YXRpb246ImhvdmVyIixjbGlja1Rocm91Z2g6dHJ1ZSx0cmFja2luZzpmYWxzZSxjbG9zZVBvc2l0aW9uOiJ0b3AiLGNsb3NlVGV4dDoiQ2xvc2UiLHRydW5jYXRlOjAsZng6e29wZW46InNob3ciLG9wZW5TcGVlZDoiIn0saG92ZXJJbnRlbnQ6e3NlbnNpdGl2aXR5OjMsaW50ZXJ2YWw6NTAsdGltZW91dDowfSxvbkFjdGl2YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRydWV9LG9uU2hvdzpmdW5jdGlvbigpe30sb25IaWRlOmZ1bmN0aW9uKCl7fSwKYWpheENhY2hlOnRydWUsYWpheFByb2Nlc3M6ZnVuY3Rpb24obSl7cmV0dXJuIG09bS5yZXBsYWNlKC88KHNjcmlwdHxzdHlsZXx0aXRsZSlbXjxdKzxcLyhzY3JpcHR8c3R5bGV8dGl0bGUpPi9nbSwiIikucmVwbGFjZSgvPChsaW5rfG1ldGEpW14+XSs+L2csIiIpfSxhamF4U2V0dGluZ3M6e2RhdGFUeXBlOiJodG1sIn0sZGVidWc6ZmFsc2V9fTt2YXIgRSxQPXt9LG1hPTAsVD0wO2MuZm4uYXR0clByb3A9Yy5mbi5wcm9wfHxjLmZuLmF0dHI7Yy5mbi5jbHVldGlwPWZ1bmN0aW9uKG0scSl7ZnVuY3Rpb24gVSh6LGspe3ZhciBsPXp8fCIiO2s9a3x8IiI7aWYodHlwZW9mIGs9PSJvYmplY3QiKWMuZWFjaChrLGZ1bmN0aW9uKGosZCl7bCs9Ii0iK2orIi0iK2R9KTtlbHNlIGlmKHR5cGVvZiBrPT0ic3RyaW5nIilsKz1rO3JldHVybiBsfWZ1bmN0aW9uIFYoeixrLGwpe2w9IiI7az1rLmRyb3BTaGFkb3cmJmsuZHJvcFNoYWRvd1N0ZXBzPytrLmRyb3BTaGFkb3dTdGVwczowO2lmKGMuc3VwcG9ydC5ib3hTaGFkb3cpe2lmKGspbD0KIjFweCAxcHggIitrKyJweCByZ2JhKDAsMCwwLDAuNSkiO3ouY3NzKGMuc3VwcG9ydC5ib3hTaGFkb3csbCk7cmV0dXJuIGZhbHNlfWw9ei5maW5kKCIuY2x1ZXRpcC1kcm9wLXNoYWRvdyIpO2lmKGs9PWwubGVuZ3RoKXJldHVybiBsO2wucmVtb3ZlKCk7bD1bXTtmb3IodmFyIGo9MDtqPGs7KWxbaisrXT0nPGRpdiBzdHlsZT0idG9wOicraisicHg7bGVmdDoiK2orJ3B4OyI+PC9kaXY+JztyZXR1cm4gbD1jKGwuam9pbigiIikpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIixiYWNrZ3JvdW5kQ29sb3I6IiMwMDAiLHpJbmRleDpXLTEsb3BhY2l0eTowLjF9KS5hZGRDbGFzcygiY2x1ZXRpcC1kcm9wLXNoYWRvdyIpLnByZXBlbmRUbyh6KX12YXIgZSxoLEksdyxKLGdhO2lmKHR5cGVvZiBtPT0ib2JqZWN0Iil7cT1tO209bnVsbH1pZihtPT0iZGVzdHJveSIpe3ZhciBYPXRoaXMuZGF0YSgiY2x1ZXRpcCIpO2lmKFgpe2MoWC5zZWxlY3RvcikucmVtb3ZlKCk7Yy5yZW1vdmVEYXRhKHRoaXMsCiJ0aXRsZSIpO2MucmVtb3ZlRGF0YSh0aGlzLCJjbHVldGlwIik7Yy5yZW1vdmVEYXRhKHRoaXMsImNsdWV0aXBNb2MiKX1jKGRvY3VtZW50KS51bmJpbmQoIi5jbHVldGlwIik7cmV0dXJuIHRoaXMudW5iaW5kKCIuY2x1ZXRpcCIpfXE9Yy5leHRlbmQodHJ1ZSx7fSxjLmNsdWV0aXAuZGVmYXVsdHMscXx8e30pO21hKys7dmFyIFc7WD1jLmNsdWV0aXAuYmFja0NvbXBhdHx8IXEubXVsdGlwbGU/ImNsdWV0aXAiOiJjbHVldGlwLSIrbWE7dmFyIGhhPSIjIitYLEE9Yy5jbHVldGlwLmJhY2tDb21wYXQ/IiMiOiIuIixhYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uVHlwZSxyYT1jLmNsdWV0aXAuc2V0dXAuaW5zZXJ0aW9uRWxlbWVudHx8ImJvZHkiO2FhPS9hcHBlbmRUb3xwcmVwZW5kVG98aW5zZXJ0QmVmb3JlfGluc2VydEFmdGVyLy50ZXN0KGFhKT9hYToiYXBwZW5kVG8iO2U9YyhoYSk7aWYoIWUubGVuZ3RoKXtlPWMoYy5jbHVldGlwLnRlbXBsYXRlKVthYV0ocmEpLmF0dHIoImlkIiwKWCkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUifSk7Vz0rcS5jbHVlekluZGV4O0k9ZS5maW5kKEErImNsdWV0aXAtb3V0ZXIiKS5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsekluZGV4Old9KTtoPWUuZmluZChBKyJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO2UuYmluZCgibW91c2VlbnRlciBtb3VzZWxlYXZlIixmdW5jdGlvbih6KXtjKHRoaXMpLmRhdGEoImVudGVyZWQiLHoudHlwZT09PSJtb3VzZWVudGVyIil9KX1FPWMoIiNjbHVldGlwLXdhaXRpbWFnZSIpO2lmKCFFLmxlbmd0aCYmcS53YWl0SW1hZ2Upe0U9YygiPGRpdj48L2Rpdj4iKS5hdHRyKCJpZCIsImNsdWV0aXAtd2FpdGltYWdlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7RS5pbnNlcnRCZWZvcmUoZSkuaGlkZSgpfXZhciBzYT0ocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKSsocGFyc2VJbnQoZS5jc3MoInBhZGRpbmdSaWdodCIpLAoxMCl8fDApO3RoaXMuZWFjaChmdW5jdGlvbih6KXtmdW5jdGlvbiBrKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIGwoYixnKXt2YXIgZj1iLnN0YXR1cztnLmJlZm9yZVNlbmQoYi54aHIsZyk7aWYoZj09ImVycm9yIilnW2ZdKGIueGhyLGIudGV4dFN0YXR1cyk7ZWxzZSBmPT0ic3VjY2VzcyImJmdbZl0oYi5kYXRhLGIudGV4dFN0YXR1cyxiLnhocik7Zy5jb21wbGV0ZShiLnhocixnLnRleHRTdGF0dXMpfXZhciBqPXRoaXMsZD1jKHRoaXMpLGE9Yy5leHRlbmQodHJ1ZSx7fSxxLGMubWV0YWRhdGE/ZC5tZXRhZGF0YSgpOmMubWV0YT9kLmRhdGEoKTpkLmRhdGEoImNsdWV0aXAiKXx8e30pLEs9ZmFsc2UsUT1mYWxzZSxGPW51bGwscD1hW2EuYXR0cmlidXRlXXx8KGEuYXR0cmlidXRlPT0iaHJlZiI/ZC5hdHRyKGEuYXR0cmlidXRlKTpkLmF0dHJQcm9wKGEuYXR0cmlidXRlKXx8ZC5hdHRyKGEuYXR0cmlidXRlKSksWT1hLmNsdWV0aXBDbGFzcztXPSthLmNsdWV6SW5kZXg7ZC5kYXRhKCJjbHVldGlwIiwKe3RpdGxlOmoudGl0bGUsekluZGV4Olcsc2VsZWN0b3I6aGF9KTthLmFycm93cyYmIWUuZmluZCgiLmNsdWV0aXAtYXJyb3dzIikubGVuZ3RoJiZlLmFwcGVuZCgnPGRpdiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MgdWktc3RhdGUtZGVmYXVsdCI+PC9kaXY+Jyk7aWYoIXAmJiFhLnNwbGl0VGl0bGUmJiFtKXJldHVybiB0cnVlO2lmKGEubG9jYWwmJmEubG9jYWxQcmVmaXgpcD1hLmxvY2FsUHJlZml4K3A7YS5sb2NhbCYmYS5oaWRlTG9jYWwmJnAmJmMocCsiOmZpcnN0IikuaGlkZSgpO3ZhciBvPXBhcnNlSW50KGEudG9wT2Zmc2V0LDEwKSxHPXBhcnNlSW50KGEubGVmdE9mZnNldCwxMCksdCxpYSxiYT1pc05hTihwYXJzZUludChhLmhlaWdodCwxMCkpPyJhdXRvIjovXEQvZy50ZXN0KGEuaGVpZ2h0KT9hLmhlaWdodDphLmhlaWdodCsicHgiLFosamEsbmEseCx1LEwsJCxrYT1wYXJzZUludChhLndpZHRoLDEwKXx8Mjc1LHI9a2Erc2ErYS5kcm9wU2hhZG93U3RlcHMsTT10aGlzLm9mZnNldFdpZHRoLApCLG4scyxSLE4sQz1hLmF0dHJpYnV0ZSE9InRpdGxlIj9kLmF0dHIoYS50aXRsZUF0dHJpYnV0ZSl8fCIiOiIiO2lmKGEuc3BsaXRUaXRsZSl7Tj1DLnNwbGl0KGEuc3BsaXRUaXRsZSk7Qz1hLnNob3dUaXRsZXx8TlswXT09PSIiP04uc2hpZnQoKToiIn1pZihhLmVzY2FwZVRpdGxlKUM9Qy5yZXBsYWNlKC8mL2csIiZhbXA7IikucmVwbGFjZSgvPi9nLCImZ3Q7IikucmVwbGFjZSgvPC9nLCImbHQ7Iik7ZC5iaW5kKCJtb3VzZWVudGVyIG1vdXNlbGVhdmUiLGZ1bmN0aW9uKGIpe3ZhciBnPWQuZGF0YSgiY2x1ZXRpcCIpO2cuZW50ZXJlZD1iLnR5cGU9PT0iZW50ZXJlZCI7ZC5kYXRhKCJjbHVldGlwIixnKX0pO3ZhciBkYT1mdW5jdGlvbihiKXt2YXIgZyxmO2lmKGEub25BY3RpdmF0ZS5jYWxsKGosYik9PT1mYWxzZSlyZXR1cm4gZmFsc2U7UT10cnVlO2U9YyhoYSkuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSk7ST1lLmZpbmQoQSsiY2x1ZXRpcC1vdXRlciIpO2g9ZS5maW5kKEErCiJjbHVldGlwLWlubmVyIik7dz1lLmZpbmQoQSsiY2x1ZXRpcC10aXRsZSIpO0o9ZS5maW5kKEErImNsdWV0aXAtYXJyb3dzIik7ZS5yZW1vdmVDbGFzcygpLmNzcyh7d2lkdGg6a2F9KTtwPT1kLmF0dHIoImhyZWYiKSYmZC5jc3MoImN1cnNvciIsYS5jdXJzb3IpO2EuaG92ZXJDbGFzcyYmZC5hZGRDbGFzcyhhLmhvdmVyQ2xhc3MpO2phPXg9ZC5vZmZzZXQoKS50b3A7bmE9amErZC5pbm5lckhlaWdodCgpO0I9ZC5vZmZzZXQoKS5sZWZ0O009ZC5pbm5lcldpZHRoKCk7aWYoYi50eXBlPT1mb2N1cyl7cz1CK00vMitHO2UuY3NzKHtsZWZ0Om59KTtMPXgrb31lbHNle3M9Yi5wYWdlWDtMPWIucGFnZVl9aWYoai50YWdOYW1lLnRvTG93ZXJDYXNlKCkhPSJhcmVhIil7Wj1jKGRvY3VtZW50KS5zY3JvbGxUb3AoKTtSPWMod2luZG93KS53aWR0aCgpfWlmKGEucG9zaXRpb25CeT09ImZpeGVkIil7bj1NK0IrRztlLmNzcyh7bGVmdDpufSl9ZWxzZXtuPU0+QiYmQj5yfHxCK00rcitHPlI/Qi0Kci1HOk0rQitHO2lmKGoudGFnTmFtZS50b0xvd2VyQ2FzZSgpPT0iYXJlYSJ8fGEucG9zaXRpb25CeT09Im1vdXNlInx8TStyPlIpaWYocysyMCtyPlIpe2UuYWRkQ2xhc3MoImNsdWV0aXAtIitZKTtuPXMtci1HPj0wP3Mtci1HLXBhcnNlSW50KGUuY3NzKCJtYXJnaW5MZWZ0IiksMTApK3BhcnNlSW50KGguY3NzKCJtYXJnaW5SaWdodCIpLDEwKTpzLXIvMn1lbHNlIG49cytHO2c9bjwwP2IucGFnZVkrbzpiLnBhZ2VZO2lmKG48MHx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8YS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tIiluPXMrci8yPlI/Ui8yLXIvMjpNYXRoLm1heChzLXIvMiwwKX1KLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCsxfSk7ZS5jc3Moe2xlZnQ6bix6SW5kZXg6ZC5kYXRhKCJjbHVldGlwIikuekluZGV4fSk7aWE9Yyh3aW5kb3cpLmhlaWdodCgpO2lmKG0pe2lmKHR5cGVvZiBtPT0iZnVuY3Rpb24iKW09bS5jYWxsKGopO2guaHRtbChtKTtTKGcpfWVsc2UgaWYoTil7Yj0KTi5sZW5ndGg7aC5odG1sKGI/TlswXToiIik7aWYoYj4xKWZvcih2YXIgaT0xO2k8YjtpKyspaC5hcHBlbmQoJzxkaXYgY2xhc3M9InNwbGl0LWJvZHkiPicrTltpXSsiPC9kaXY+Iik7UyhnKX1lbHNlIGlmKCFhLmxvY2FsJiZwLmluZGV4T2YoIiMiKSE9PTApaWYoL1wuKGpwZT9nfHRpZmY/fGdpZnxwbmcpKD86XD8uKik/JC9pLnRlc3QocCkpe2guaHRtbCgnPGltZyBzcmM9IicrcCsnIiBhbHQ9IicrQysnIiAvPicpO1MoZyl9ZWxzZXt2YXIgdj1hLmFqYXhTZXR0aW5ncy5iZWZvcmVTZW5kLGNhPWEuYWpheFNldHRpbmdzLmVycm9yLEg9YS5hamF4U2V0dGluZ3Muc3VjY2VzcyxvYT1hLmFqYXhTZXR0aW5ncy5jb21wbGV0ZTtmPVUocCxhLmFqYXhTZXR0aW5ncy5kYXRhKTtiPWMuZXh0ZW5kKHRydWUse30sYS5hamF4U2V0dGluZ3Mse2NhY2hlOmEuYWpheENhY2hlLHVybDpwLGJlZm9yZVNlbmQ6ZnVuY3Rpb24oeSxEKXt2JiZ2LmNhbGwoaix5LGUsaCxEKTtJLmNoaWxkcmVuKCkuZW1wdHkoKTsKYS53YWl0SW1hZ2UmJkUuY3NzKHt0b3A6TCsyMCxsZWZ0OnMrMjAsekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleC0xfSkuc2hvdygpfSxlcnJvcjpmdW5jdGlvbih5LEQpe2lmKHEuYWpheENhY2hlJiYhUFtmXSlQW2ZdPXtzdGF0dXM6ImVycm9yIix0ZXh0U3RhdHVzOkQseGhyOnl9O2lmKFEpY2E/Y2EuY2FsbChqLHksRCxlLGgpOmguaHRtbCgiPGk+c29ycnksIHRoZSBjb250ZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkPC9pPiIpfSxzdWNjZXNzOmZ1bmN0aW9uKHksRCxPKXtpZihxLmFqYXhDYWNoZSYmIVBbZl0pUFtmXT17c3RhdHVzOiJzdWNjZXNzIixkYXRhOnksdGV4dFN0YXR1czpELHhocjpPfTtLPWEuYWpheFByb2Nlc3MuY2FsbChqLHkpO2lmKHR5cGVvZiBLPT0ib2JqZWN0IiYmSyE9PW51bGwpe0M9Sy50aXRsZTtLPUsuY29udGVudH1pZihRKXtIJiZILmNhbGwoaix5LEQsZSxoKTtoLmh0bWwoSyl9fSxjb21wbGV0ZTpmdW5jdGlvbih5LEQpe29hJiZvYS5jYWxsKGosCnksRCxlLGgpO3ZhciBPPWhbMF0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImltZyIpO1Q9Ty5sZW5ndGg7Zm9yKHZhciBsYT0wLHRhPU8ubGVuZ3RoO2xhPHRhO2xhKyspT1tsYV0uY29tcGxldGUmJlQtLTtpZihUJiYhYy5icm93c2VyLm9wZXJhKWMoTykuYmluZCgibG9hZC5jdCBlcnJvci5jdCIsZnVuY3Rpb24oKXtULS07aWYoVD09PTApe0UuaGlkZSgpO2MoTykudW5iaW5kKCIuY3QiKTtRJiZTKGcpfX0pO2Vsc2V7RS5oaWRlKCk7USYmUyhnKX19fSk7UFtmXT9sKFBbZl0sYik6Yy5hamF4KGIpfWVsc2UgaWYoYS5sb2NhbCl7Yj1jKHArKC9eI1xTKyQvLnRlc3QocCk/IiI6IjplcSgiK3orIikiKSkuY2xvbmUodHJ1ZSkuc2hvdygpO2EubG9jYWxJZFN1ZmZpeCYmYi5hdHRyKCJpZCIsYlswXS5pZCthLmxvY2FsSWRTdWZmaXgpO2guaHRtbChiKTtTKGcpfX0sUz1mdW5jdGlvbihiKXt2YXIgZyxmO2c9Q3x8YS5zaG93VGl0bGUmJiImbmJzcDsiO3ZhciBpPSIiO2Y9IiI7dmFyIHY9ZmFsc2U7CnY9e2JvdHRvbTpmdW5jdGlvbihIKXtILmFwcGVuZFRvKGgpfSx0b3A6ZnVuY3Rpb24oSCl7SC5wcmVwZW5kVG8oaCl9LHRpdGxlOmZ1bmN0aW9uKEgpe0gucHJlcGVuZFRvKHcpfX07ZS5hZGRDbGFzcygiY2x1ZXRpcC0iK1kpO2lmKGEudHJ1bmNhdGUpe3ZhciBjYT1oLnRleHQoKS5zbGljZSgwLGEudHJ1bmNhdGUpKyIuLi4iO2guaHRtbChjYSl9Zz93LnNob3coKS5odG1sKGcpOncuaGlkZSgpO2lmKGEuc3RpY2t5KXtpZih2W2EuY2xvc2VQb3NpdGlvbl0pe2c9YygnPGRpdiBjbGFzcz0iY2x1ZXRpcC1jbG9zZSI+PGEgaHJlZj0iIyI+JythLmNsb3NlVGV4dCsiPC9hPjwvZGl2PiIpO3ZbYS5jbG9zZVBvc2l0aW9uXShnKTtnLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZWEoKTtyZXR1cm4gZmFsc2V9KX1pZihhLm1vdXNlT3V0Q2xvc2Upe2QudW5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXBNb2MiKTtlLnVuYmluZCgibW91c2VsZWF2ZS5jbHVldGlwTW9jIik7aWYoYS5tb3VzZU91dENsb3NlPT0KImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJjbHVldGlwInx8YS5tb3VzZU91dENsb3NlPT09dHJ1ZSllLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpO2lmKGEubW91c2VPdXRDbG9zZT09ImJvdGgifHxhLm1vdXNlT3V0Q2xvc2U9PSJsaW5rIilkLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcE1vYyIscGEpfX1JLmNzcyh7ekluZGV4OmQuZGF0YSgiY2x1ZXRpcCIpLnpJbmRleCxvdmVyZmxvdzpiYT09ImF1dG8iPyJ2aXNpYmxlIjoiYXV0byIsaGVpZ2h0OmJhfSk7dD1iYT09ImF1dG8iP01hdGgubWF4KGUub3V0ZXJIZWlnaHQoKSxlLmhlaWdodCgpKTpwYXJzZUludChiYSwxMCk7dT14OyQ9WitpYTt2PW48cyYmTWF0aC5tYXgobiwwKStyPnM7aWYoYS5wb3NpdGlvbkJ5PT0iZml4ZWQiKXU9eC1hLmRyb3BTaGFkb3dTdGVwcytvO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0idG9wQm90dG9tInx8YS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dil7aWYoYS5wb3NpdGlvbkJ5PT0KInRvcEJvdHRvbSIpZj14K3QrbzwkJiZMLVo8dCtvPyJib3R0b20iOiJ0b3AiO2Vsc2UgaWYoYS5wb3NpdGlvbkJ5PT0iYm90dG9tVG9wInx8dilmPXgrdCtvPiQmJkwtWj50K28/InRvcCI6ImJvdHRvbSI7aWYoYS5zbmFwVG9FZGdlKWlmKGY9PSJ0b3AiKXU9amEtdC1vO2Vsc2V7aWYoZj09ImJvdHRvbSIpdT1uYStvfWVsc2UgaWYoZj09InRvcCIpdT1MLXQtbztlbHNlIGlmKGY9PSJib3R0b20iKXU9TCtvfWVsc2UgdT14K3Qrbz4kP3Q+PWlhP1o6JC10LW86ZC5jc3MoImRpc3BsYXkiKT09ImJsb2NrInx8ai50YWdOYW1lLnRvTG93ZXJDYXNlKCk9PSJhcmVhInx8YS5wb3NpdGlvbkJ5PT0ibW91c2UiP2Itbzp4LWEuZHJvcFNoYWRvd1N0ZXBzO2lmKGY9PT0iIilmPW48Qj8ibGVmdCI6InJpZ2h0IjtnPSIgY2x1ZS0iK2YrIi0iK1krIiBjbHVldGlwLSIrWTtpZihZPT0icm91bmRlZCIpZys9IiB1aS1jb3JuZXItYWxsIjtlLmNzcyh7dG9wOnUrInB4In0pLmF0dHJQcm9wKHtjbGFzc05hbWU6ImNsdWV0aXAgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNsdWV0aXAiKwpnfSk7aWYoYS5hcnJvd3Mpe2lmKC8obGVmdHxyaWdodCkvLnRlc3QoZikpe2Y9ZS5oZWlnaHQoKS1KLmhlaWdodCgpO2k9bj49MCYmYj4wP3gtdS1hLmRyb3BTaGFkb3dTdGVwczowO2k9Zj5pP2k6ZjtpKz0icHgifUouY3NzKHt0b3A6aX0pLnNob3coKX1lbHNlIEouaGlkZSgpOyhnYT1WKGUsYSkpJiZnYS5sZW5ndGgmJmdhLmhpZGUoKS5jc3Moe2hlaWdodDp0LHdpZHRoOmthLHpJbmRleDpkLmRhdGEoImNsdWV0aXAiKS56SW5kZXgtMX0pLnNob3coKTtGfHxlLmhpZGUoKTtjbGVhclRpbWVvdXQoRik7Rj1udWxsO2VbYS5meC5vcGVuXShhLmZ4Lm9wZW5TcGVlZHx8MCk7Yy5mbi5iZ2lmcmFtZSYmZS5iZ2lmcmFtZSgpO2Eub25TaG93LmNhbGwoaixlLGgpfSxmYT1mdW5jdGlvbigpe1E9ZmFsc2U7RS5oaWRlKCk7aWYoIWEuc3RpY2t5fHwvY2xpY2t8dG9nZ2xlLy50ZXN0KGEuYWN0aXZhdGlvbikpaWYoYS5kZWxheWVkQ2xvc2U+MCl7Y2xlYXJUaW1lb3V0KEYpO0Y9bnVsbDtGPXNldFRpbWVvdXQoZWEsCmEuZGVsYXllZENsb3NlKX1hLmhvdmVyQ2xhc3MmJmQucmVtb3ZlQ2xhc3MoYS5ob3ZlckNsYXNzKX0sZWE9ZnVuY3Rpb24oYil7Yj1iJiZiLmRhdGEoImNsdWV0aXAiKT9iOmQ7dmFyIGc9Yi5kYXRhKCJjbHVldGlwIikmJmIuZGF0YSgiY2x1ZXRpcCIpLnNlbGVjdG9yLGY9YyhnfHwiZGl2LmNsdWV0aXAiKSxpPWYuZmluZChBKyJjbHVldGlwLWlubmVyIiksdj1mLmZpbmQoQSsiY2x1ZXRpcC1hcnJvd3MiKTtmLmhpZGUoKS5yZW1vdmVDbGFzcygpO2Eub25IaWRlLmNhbGwoYlswXSxmLGkpO2lmKGcpe2IucmVtb3ZlQ2xhc3MoImNsdWV0aXAtY2xpY2tlZCIpO2IuY3NzKCJjdXJzb3IiLCIiKX1nJiZDJiZiLmF0dHJQcm9wKGEudGl0bGVBdHRyaWJ1dGUsQyk7YS5hcnJvd3MmJnYuY3NzKHt0b3A6IiJ9KX0scGE9ZnVuY3Rpb24oKXt2YXIgYj10aGlzO2NsZWFyVGltZW91dChGKTtGPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgZz1kLmRhdGEoImNsdWV0aXAiKS5lbnRlcmVkLGY9ZS5kYXRhKCJlbnRlcmVkIiksCmk9ZmFsc2U7aWYoYS5tb3VzZU91dENsb3NlPT0iYm90aCImJihnfHxmKSlpPXRydWU7ZWxzZSBpZigoYS5tb3VzZU91dENsb3NlPT09dHJ1ZXx8YS5tb3VzZU91dENsb3NlPT0iY2x1ZXRpcCIpJiZmKWk9dHJ1ZTtlbHNlIGlmKGEubW91c2VPdXRDbG9zZT09ImxpbmsiJiZnKWk9dHJ1ZTtpfHxlYS5jYWxsKGIpfSxhLmRlbGF5ZWRDbG9zZSl9O2MoZG9jdW1lbnQpLnVuYmluZCgiaGlkZUNsdWV0aXAuY2x1ZXRpcCIpLmJpbmQoImhpZGVDbHVldGlwLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2VhKGMoYi50YXJnZXQpKX0pO2lmKC9jbGlja3x0b2dnbGUvLnRlc3QoYS5hY3RpdmF0aW9uKSlkLmJpbmQoImNsaWNrLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2lmKGUuaXMoIjpoaWRkZW4iKXx8IWQuaXMoIi5jbHVldGlwLWNsaWNrZWQiKSl7ZGEoYik7YygiLmNsdWV0aXAtY2xpY2tlZCIpLnJlbW92ZUNsYXNzKCJjbHVldGlwLWNsaWNrZWQiKTtkLmFkZENsYXNzKCJjbHVldGlwLWNsaWNrZWQiKX1lbHNlIGZhKGIpOwpyZXR1cm4gZmFsc2V9KTtlbHNlIGlmKGEuYWN0aXZhdGlvbj09ImZvY3VzIil7ZC5iaW5kKCJmb2N1cy5jbHVldGlwIixmdW5jdGlvbihiKXtkLmF0dHJQcm9wKCJ0aXRsZSIsIiIpO2RhKGIpfSk7ZC5iaW5kKCJibHVyLmNsdWV0aXAiLGZ1bmN0aW9uKGIpe2QuYXR0clByb3AoInRpdGxlIixkLmRhdGEoImNsdWV0aXAiKS50aXRsZSk7ZmEoYil9KX1lbHNle2RbYS5jbGlja1Rocm91Z2g/InVuYmluZCI6ImJpbmQiXSgiY2xpY2suY2x1ZXRpcCIsayk7dmFyIHFhPWZ1bmN0aW9uKGIpe2lmKGEudHJhY2tpbmcpe3ZhciBnPW4tYi5wYWdlWCxmPXU/dS1iLnBhZ2VZOngtYi5wYWdlWTtkLmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIixmdW5jdGlvbihpKXtlLmNzcyh7bGVmdDppLnBhZ2VYK2csdG9wOmkucGFnZVkrZn0pfSl9fTtjLmZuLmhvdmVySW50ZW50JiZhLmhvdmVySW50ZW50P2QuaG92ZXJJbnRlbnQoe3NlbnNpdGl2aXR5OmEuaG92ZXJJbnRlbnQuc2Vuc2l0aXZpdHksaW50ZXJ2YWw6YS5ob3ZlckludGVudC5pbnRlcnZhbCwKb3ZlcjpmdW5jdGlvbihiKXtkYShiKTtxYShiKX0sdGltZW91dDphLmhvdmVySW50ZW50LnRpbWVvdXQsb3V0OmZ1bmN0aW9uKGIpe2ZhKGIpO2QudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIpfX0pOmQuYmluZCgibW91c2VlbnRlci5jbHVldGlwIixmdW5jdGlvbihiKXtkYShiKTtxYShiKX0pLmJpbmQoIm1vdXNlbGVhdmUuY2x1ZXRpcCIsZnVuY3Rpb24oYil7ZmEoYik7ZC51bmJpbmQoIm1vdXNlbW92ZS5jbHVldGlwIil9KTtkLmJpbmQoIm1vdXNlb3Zlci5jbHVldGlwIixmdW5jdGlvbigpe2QuYXR0clByb3AoInRpdGxlIiwiIil9KS5iaW5kKCJtb3VzZWxlYXZlLmNsdWV0aXAiLGZ1bmN0aW9uKCl7ZC5hdHRyUHJvcCgidGl0bGUiLGQuZGF0YSgiY2x1ZXRpcCIpLnRpdGxlKX0pfX0pO3JldHVybiB0aGlzfTsoZnVuY3Rpb24oKXtjLnN1cHBvcnQ9Yy5zdXBwb3J0fHx7fTtmb3IodmFyIG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUscT1bImJveFNoYWRvdyJdLApVPVsibW96IiwiTW96Iiwid2Via2l0IiwibyJdLFY9MCxlPXEubGVuZ3RoO1Y8ZTtWKyspe3ZhciBoPXFbVl0sST1oLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2guc2xpY2UoMSk7aWYodHlwZW9mIG1baF0hPT0idW5kZWZpbmVkIiljLnN1cHBvcnRbaF09aDtlbHNlIGZvcih2YXIgdz0wLEo9VS5sZW5ndGg7dzxKO3crKylpZih0eXBlb2YgbVtVW3ddK0ldIT09InVuZGVmaW5lZCIpe2Muc3VwcG9ydFtoXT1VW3ddK0k7YnJlYWt9fX0pKCk7Yy5mbi5jbHVldGlwLmRlZmF1bHRzPWMuY2x1ZXRpcC5kZWZhdWx0c30pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqID1iYWNrLWNvbXBhdCBjc3MgZmlsZQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVXNlIHRoaXMgaW5zdGVhZCBvZiBqcXVlcnkuY2x1ZXRpcC5jc3MgaWYgYWxzbyB1c2luZyB0aGUKYmFjay1jb21wYXQganMgZmlsZSAtLSBqcXVlcnkuY29tcGF0LmNsdWV0aXAuanMKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogZ2xvYmFsICovCmRpdi51aS1jbHVldGlwIHsKICBmb250LXNpemU6IDFlbTsKfQoudWktY2x1ZXRpcC1oZWFkZXIsCi51aS1jbHVldGlwLWNvbnRlbnQgewogIHBhZGRpbmc6IDEycHg7Cn0KLnVpLWNsdWV0aXAtaGVhZGVyIHsKICBmb250LXNpemU6IDFlbTsKICBtYXJnaW46IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKI2NsdWV0aXAtdGl0bGUgI2NsdWV0aXAtY2xvc2UgewogIGZsb2F0OiByaWdodDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KI2NsdWV0aXAtY2xvc2UgaW1nIHsKICBib3JkZXI6IDA7Cn0KCiNjbHVldGlwLXdhaXRpbWFnZSB7CiAgd2lkdGg6IDQzcHg7CiAgaGVpZ2h0OiAxMXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL3dhaXQuZ2lmKTsKfQouY2x1ZXRpcC1hcnJvd3MgewogIGRpc3BsYXk6IG5vbmU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHRvcDogMDsKICBsZWZ0OiAtMTFweDsKICB3aWR0aDogMTFweDsKICBoZWlnaHQ6IDIycHg7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7CiAgYm9yZGVyLXdpZHRoOiAwOwp9CiNjbHVldGlwLWV4dHJhIHsKICBkaXNwbGF5OiBub25lOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdkZWZhdWx0JwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLmNsdWV0aXAtZGVmYXVsdCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IC51aS1jbHVldGlwLWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzg3ODc2YTsKfQoKCi8qCi5jbHVldGlwLWRlZmF1bHQgI2NsdWV0aXAtb3V0ZXIgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBtYXJnaW46IDA7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDljMjsKfQouY2x1ZXRpcC1kZWZhdWx0IGgzI2NsdWV0aXAtdGl0bGUgewogIG1hcmdpbjogMCAwIDVweDsKICBwYWRkaW5nOiA4cHggMTBweCA0cHg7CiAgZm9udC1zaXplOiAxLjFlbTsKICBmb250LXdlaWdodDogbm9ybWFsOwogIGJhY2tncm91bmQtY29sb3I6ICM4Nzg3NmE7CiAgY29sb3I6ICNmZmY7Cn0KLmNsdWV0aXAtZGVmYXVsdCAjY2x1ZXRpcC10aXRsZSBhIHsKICBjb2xvcjogI2Q5ZDljMjsKICBmb250LXNpemU6IDAuOTVlbTsKfQouY2x1ZXRpcC1kZWZhdWx0ICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiAxMHB4Owp9Ci5jbHVldGlwLWRlZmF1bHQgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggNXB4OwogIGNvbG9yOiAjOTAwOwp9CiovCi8qIGRlZmF1bHQgYXJyb3dzICovCmRpdi5jbHVldGlwLWRlZmF1bHQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dsZWZ0LmdpZik7Cn0KZGl2LmNsdWUtbGVmdC1kZWZhdWx0IC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9kYXJyb3dyaWdodC5naWYpOwogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKfQpkaXYuY2x1ZS10b3AtZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgbWFyZ2luLWxlZnQ6IC0xMXB4OwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tZGVmYXVsdCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvZGFycm93dXAuZ2lmKTsKICB0b3A6IC0xMXB4OwogIGxlZnQ6IDUwJTsKICBtYXJnaW4tbGVmdDogLTExcHg7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgID1jbHVldGlwQ2xhc3M6ICdqdGlwJwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwouY2x1ZXRpcC1qdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwp9Ci5jbHVldGlwLWp0aXAgI2NsdWV0aXAtb3V0ZXIgewogIGJvcmRlcjogMnB4IHNvbGlkICNjY2M7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouY2x1ZXRpcC1qdGlwICNjbHVldGlwLWlubmVyIHsKICBwYWRkaW5nOiA1cHg7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwp9Ci5jbHVldGlwLWp0aXAgZGl2I2NsdWV0aXAtY2xvc2UgewogIHRleHQtYWxpZ246IHJpZ2h0OwogIG1hcmdpbjogMCA1cHggMDsKICBjb2xvcjogIzkwMDsKfQoKLmNsdWV0aXAtanRpcCAudWktY2x1ZXRpcC1oZWFkZXIgewogIGJhY2tncm91bmQtY29sb3I6ICNjY2M7CiAgcGFkZGluZzogNnB4OwovKiAgbWFyZ2luLWJvdHRvbTogMWVtOyovCn0KCi8qIGp0aXAgYXJyb3dzICovCmRpdi5jbHVldGlwLWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDA7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQgbm9uZTsKfQpkaXYuY2x1ZS1yaWdodC1qdGlwIC5jbHVldGlwLWFycm93cyB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGltYWdlcy9hcnJvd2xlZnQuZ2lmKTsKfQpkaXYuY2x1ZS1sZWZ0LWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93cmlnaHQuZ2lmKTsKICBsZWZ0OiAxMDAlOwogIG1hcmdpbi1yaWdodDogLTExcHg7Cn0KZGl2LmNsdWUtdG9wLWp0aXAgLmNsdWV0aXAtYXJyb3dzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoaW1hZ2VzL2Fycm93ZG93bi5naWYpOwogIHRvcDogMTAwJTsKICBsZWZ0OiA1MCU7CiAgd2lkdGg6IDIycHg7CiAgaGVpZ2h0OiAxMXB4OwogIG1hcmdpbi1sZWZ0OiAtMTFweDsKfQpkaXYuY2x1ZS1ib3R0b20tanRpcCAuY2x1ZXRpcC1hcnJvd3MgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChpbWFnZXMvYXJyb3d1cC5naWYpOwogIHRvcDogLTExcHg7CiAgbGVmdDogNTAlOwogIHdpZHRoOiAyMnB4OwogIGhlaWdodDogMTFweDsKICBtYXJnaW4tbGVmdDogLTExcHg7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgPWNsdWV0aXBDbGFzczogJ3JvdW5kZWQnCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi5jbHVldGlwLXJvdW5kZWQgewogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNnB4OwogIC1tb3otYm9yZGVyLXJhZGl1czogNnB4OwogIGJvcmRlci1yYWRpdXM6IDZweDsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0KLmNsdWV0aXAtcm91bmRlZCAgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItY29sb3I6ICNjY2M7Cn0KCi8qIG5lZWQgdG8gYmUgbW9yZSBzcGVjaWZpYyBoZXJlIHRvIG92ZXJyaWRlIFRoZW1lUm9sbGVyIGRlZmF1bHRzICovCmRpdi5jbHVldGlwLXJvdW5kZWQgIC5jbHVldGlwLWFycm93cyB7CiAgZm9udC1zaXplOiAwOwogIGxpbmUtaGVpZ2h0OiAwJTsKICB3aWR0aDogMDsKICBoZWlnaHQ6IDA7CiAgYm9yZGVyLXN0eWxlOiBzb2xpZDsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCBub25lOwp9CmRpdi5jbHVlLXJpZ2h0LXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICBib3JkZXItd2lkdGg6IDExcHggMTFweCAxMXB4IDA7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50Owp9CmRpdi5jbHVlLWxlZnQtcm91bmRlZCAuY2x1ZXRpcC1hcnJvd3MgewogIGxlZnQ6IDEwMCU7CiAgbWFyZ2luLXJpZ2h0OiAtMTFweDsKICBib3JkZXItd2lkdGg6IDExcHggMCAxMXB4IDExcHg7CiAgYm9yZGVyLXRvcC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudDsKCn0KZGl2LmNsdWUtdG9wLXJvdW5kZWQgLmNsdWV0aXAtYXJyb3dzIHsKICB0b3A6IDEwMCU7CiAgbGVmdDogNTAlOwogIGJvcmRlci13aWR0aDogMTFweCAxMXB4IDAgMTFweDsKICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKfQouY2x1ZS1ib3R0b20tcm91bmRlZCAuY2x1ZXRpcC1hcnJvd3MgewogIHRvcDogLTExcHg7CiAgbGVmdDogNTAlOwogIGJvcmRlci13aWR0aDogMCAxMXB4IDExcHggMTFweDsKICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudDsKCn0KLyogc3R1cGlkIElFNiBIYXNMYXlvdXQgaGFjayAqLwouY2x1ZXRpcC1yb3VuZGVkICNjbHVldGlwLXRpdGxlLAouY2x1ZXRpcC1yb3VuZGVkICNjbHVldGlwLWlubmVyIHsKICB6b29tOiAxOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpIHsKICAvLyBCYWNrLWNvbXBhdCBmaWxlIGZvciBjbHVlVGlwIDEuMgogIC8vIFRoaXMgbW9kaWZpZXMgdGhlICQuZm4uY2x1ZXRpcCBvYmplY3QgdG8gbWFrZSB0aGUgcGx1Z2luIHdvcmsgdGhlIHdheSBpdCBkaWQgYmVmb3JlIGNsdWVUaXAgdmVyc2lvbiAxLjIKICAkLmV4dGVuZCh0cnVlLCAkLmZuLmNsdWV0aXAsIHsKICAgIGJhY2tDb21wYXQ6IHRydWUsCiAgICB0ZW1wbGF0ZTogWyc8ZGl2IGlkPSJjbHVldGlwIj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1vdXRlciIgY2xhc3M9ImNsdWV0aXAtb3V0ZXIiPicsCiAgICAgICAgJzxoMyBpZD0iY2x1ZXRpcC10aXRsZSIgY2xhc3M9ImNsdWV0aXAtdGl0bGUgdWktd2lkZ2V0LWhlYWRlciB1aS1jbHVldGlwLWhlYWRlciI+PC9oMz4nLAogICAgICAgICc8ZGl2IGlkPSJjbHVldGlwLWlubmVyIiBjbGFzcz0iY2x1ZXRpcC1pbm5lciB1aS13aWRnZXQtY29udGVudCB1aS1jbHVldGlwLWNvbnRlbnQiPjwvZGl2PicsCiAgICAgICc8L2Rpdj4nLAogICAgICAnPGRpdiBpZD0iY2x1ZXRpcC1leHRyYSI+PC9kaXY+JywKICAgICAgJzxkaXYgaWQ9ImNsdWV0aXAtYXJyb3dzIiBjbGFzcz0iY2x1ZXRpcC1hcnJvd3MiPjwvZGl2PicsCiAgICAnPC9kaXY+J10uam9pbignJykKICB9KTsKfSkoalF1ZXJ5KTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/jquery.compat.cluetip.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKGEpe2EuZXh0ZW5kKHRydWUsYS5mbi5jbHVldGlwLHtiYWNrQ29tcGF0OnRydWUsdGVtcGxhdGU6JzxkaXYgaWQ9ImNsdWV0aXAiPjxkaXYgaWQ9ImNsdWV0aXAtb3V0ZXIiIGNsYXNzPSJjbHVldGlwLW91dGVyIj48aDMgaWQ9ImNsdWV0aXAtdGl0bGUiIGNsYXNzPSJjbHVldGlwLXRpdGxlIHVpLXdpZGdldC1oZWFkZXIgdWktY2x1ZXRpcC1oZWFkZXIiPjwvaDM+PGRpdiBpZD0iY2x1ZXRpcC1pbm5lciIgY2xhc3M9ImNsdWV0aXAtaW5uZXIgdWktd2lkZ2V0LWNvbnRlbnQgdWktY2x1ZXRpcC1jb250ZW50Ij48L2Rpdj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWV4dHJhIj48L2Rpdj48ZGl2IGlkPSJjbHVldGlwLWFycm93cyIgY2xhc3M9ImNsdWV0aXAtYXJyb3dzIj48L2Rpdj48L2Rpdj4nfSl9KShqUXVlcnkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery-1.3.2.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuMy4zcHJlCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgKGMpIDIwMDkgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlcy4KICogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9MaWNlbnNlCiAqCiAqIERhdGU6IDIwMDktMDYtMDQgMTM6MzY6MjMgLTA0MDAgKFRodSwgMDQgSnVuIDIwMDkpCiAqIFJldmlzaW9uOiA2MzcyCiAqLwooZnVuY3Rpb24od2luZG93LCB1bmRlZmluZWQpewoKLy8gRGVmaW5lIGEgbG9jYWwgY29weSBvZiBqUXVlcnkKdmFyIGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCcKCQlyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/CgkJCXJvb3RqUXVlcnkgOgoJCQluZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7Cgl9LAoKCS8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJX2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksCgoJLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGUKCV8kID0gd2luZG93LiQsCgoJLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpCglyb290alF1ZXJ5LAoKCS8vIEEgc2ltcGxlIHdheSB0byBjaGVjayBmb3IgSFRNTCBzdHJpbmdzIG9yIElEIHN0cmluZ3MKCS8vIChib3RoIG9mIHdoaWNoIHdlIG9wdGltaXplIGZvcikKCXF1aWNrRXhwciA9IC9eW148XSooPCgufFxzKSs+KVtePl0qJHxeIyhbXHctXSspJC8sCgoJLy8gSXMgaXQgYSBzaW1wbGUgc2VsZWN0b3IKCWlzU2ltcGxlID0gL14uW146I1xbXC4sXSokLywKCgkvLyBLZWVwIGEgVXNlckFnZW50IHN0cmluZyBmb3IgdXNlIHdpdGggalF1ZXJ5LmJyb3dzZXIKCXVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSwKCgkvLyBTYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3JlIHRvU3RyaW5nIG1ldGhvZAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwoKLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7CgpqUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0gewoJaW5pdDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBtYXRjaCwgZWxlbSwgcmV0OwoKCQkvLyBIYW5kbGUgJCgiIiksICQobnVsbCksIG9yICQodW5kZWZpbmVkKQoJCWlmICggIXNlbGVjdG9yICkgewoJCQl0aGlzLmxlbmd0aCA9IDA7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gSGFuZGxlICQoRE9NRWxlbWVudCkKCQlpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkgewoJCQl0aGlzWzBdID0gc2VsZWN0b3I7CgkJCXRoaXMubGVuZ3RoID0gMTsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3I7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJLy8gSGFuZGxlIEhUTUwgc3RyaW5ncwoJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApIHsKCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0aCBIVE1MIHN0cmluZyBvciBhbiBJRD8KCQkJbWF0Y2ggPSBxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTsKCgkJCS8vIFZlcmlmeSBhIG1hdGNoLCBhbmQgdGhhdCBubyBjb250ZXh0IHdhcyBzcGVjaWZpZWQgZm9yICNpZAoJCQlpZiAoIG1hdGNoICYmIChtYXRjaFsxXSB8fCAhY29udGV4dCkgKSB7CgoJCQkJLy8gSEFORExFOiAkKGh0bWwpIC0+ICQoYXJyYXkpCgkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCXNlbGVjdG9yID0galF1ZXJ5LmNsZWFuKCBbIG1hdGNoWzFdIF0sIGNvbnRleHQgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQl9IGVsc2UgewoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKCgkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQlpZiAoIGVsZW0gJiYgZWxlbS5pZCAhPT0gbWF0Y2hbM10gKSB7CgkJCQkJCXJldHVybiByb290alF1ZXJ5LmZpbmQoIHNlbGVjdG9yICk7CgkJCQkJfQoKCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJcmV0ID0galF1ZXJ5KCBlbGVtIHx8IG51bGwgKTsKCQkJCQlyZXQuY29udGV4dCA9IGRvY3VtZW50OwoJCQkJCXJldC5zZWxlY3RvciA9IHNlbGVjdG9yOwoJCQkJCXJldHVybiByZXQ7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOwoKCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCgkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIGpRdWVyeSggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7CgkJCX0KCgkJLy8gSEFORExFOiAkKGZ1bmN0aW9uKQoJCS8vIFNob3J0Y3V0IGZvciBkb2N1bWVudCByZWFkeQoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkgewoJCQlyZXR1cm4gcm9vdGpRdWVyeS5yZWFkeSggc2VsZWN0b3IgKTsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB0aGF0IG9sZCBzZWxlY3RvciBzdGF0ZSBpcyBwYXNzZWQgYWxvbmcKCQlpZiAoIHNlbGVjdG9yLnNlbGVjdG9yICYmIHNlbGVjdG9yLmNvbnRleHQgKSB7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvci5zZWxlY3RvcjsKCQkJdGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDsKCQl9CgoJCXJldHVybiB0aGlzLnNldEFycmF5KGpRdWVyeS5pc0FycmF5KCBzZWxlY3RvciApID8KCQkJc2VsZWN0b3IgOgoJCQlqUXVlcnkubWFrZUFycmF5KHNlbGVjdG9yKSk7Cgl9LAoKCS8vIFN0YXJ0IHdpdGggYW4gZW1wdHkgc2VsZWN0b3IKCXNlbGVjdG9yOiAiIiwKCgkvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkCglqcXVlcnk6ICIxLjMuM3ByZSIsCgoJLy8gVGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQKCXNpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmxlbmd0aDsKCX0sCgoJLy8gR2V0IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgoJLy8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXkKCWdldDogZnVuY3Rpb24oIG51bSApIHsKCQlyZXR1cm4gbnVtID09IG51bGwgPwoKCQkJLy8gUmV0dXJuIGEgJ2NsZWFuJyBhcnJheQoJCQlBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcyApIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJdGhpc1sgbnVtIF07Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IGpRdWVyeSggZWxlbXMgfHwgbnVsbCApOwoKCQkvLyBBZGQgdGhlIG9sZCBvYmplY3Qgb250byB0aGUgc3RhY2sgKGFzIGEgcmVmZXJlbmNlKQoJCXJldC5wcmV2T2JqZWN0ID0gdGhpczsKCgkJcmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7CgoJCWlmICggbmFtZSA9PT0gImZpbmQiICkgewoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgKHRoaXMuc2VsZWN0b3IgPyAiICIgOiAiIikgKyBzZWxlY3RvcjsKCQl9IGVsc2UgaWYgKCBuYW1lICkgewoJCQlyZXQuc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yICsgIi4iICsgbmFtZSArICIoIiArIHNlbGVjdG9yICsgIikiOwoJCX0KCgkJLy8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCgkvLyBGb3JjZSB0aGUgY3VycmVudCBtYXRjaGVkIHNldCBvZiBlbGVtZW50cyB0byBiZWNvbWUKCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lpbmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQoJLy8gWW91IHNob3VsZCB1c2UgcHVzaFN0YWNrKCkgaW4gb3JkZXIgdG8gZG8gdGhpcywgYnV0IG1haW50YWluIHRoZSBzdGFjawoJc2V0QXJyYXk6IGZ1bmN0aW9uKCBlbGVtcyApIHsKCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAoJCS8vIGlzIGEgc3VwZXItZmFzdCB3YXkgdG8gcG9wdWxhdGUgYW4gb2JqZWN0IHdpdGggYXJyYXktbGlrZSBwcm9wZXJ0aWVzCgkJdGhpcy5sZW5ndGggPSAwOwoJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJLy8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4KCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFyZ3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCgkvLyBvbmx5IHVzZWQgaW50ZXJuYWxseS4pCgllYWNoOiBmdW5jdGlvbiggY2FsbGJhY2ssIGFyZ3MgKSB7CgkJcmV0dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCQlpZiAoICFlbGVtIHx8IHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KCB0aGlzWzBdLAoJCQkJLy8gSWYgaXQgcmVjZWl2ZXMgYSBzdHJpbmcsIHRoZSBzZWxlY3RvciBpcyB1c2VkCgkJCQkvLyBJZiBpdCByZWNlaXZlcyBub3RoaW5nLCB0aGUgc2libGluZ3MgYXJlIHVzZWQKCQkJCWVsZW0gPyBqUXVlcnkoIGVsZW0gKSA6IHRoaXMucGFyZW50KCkuY2hpbGRyZW4oKSApOwoJCX0KCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcyApLmxlbmd0aCA+IDA7Cgl9LAoKCS8vIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KCS8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLgoJcHVzaDogW10ucHVzaCwKCXNvcnQ6IFtdLnNvcnQsCglzcGxpY2U6IFtdLnNwbGljZQp9OwoKLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgpqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47CgpqUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkgewoJLy8gY29weSByZWZlcmVuY2UgdG8gdGFyZ2V0IG9iamVjdAoJdmFyIHRhcmdldCA9IGFyZ3VtZW50c1swXSB8fCB7fSwgaSA9IDEsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsIGRlZXAgPSBmYWxzZSwgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5OwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcwoJCQkJaWYgKCBkZWVwICYmIGNvcHkgJiYgdHlwZW9mIGNvcHkgPT09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVUeXBlICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwKCQkJCQkJLy8gTmV2ZXIgbW92ZSBvcmlnaW5hbCBvYmplY3RzLCBjbG9uZSB0aGVtCgkJCQkJCXNyYyB8fCAoIGNvcHkubGVuZ3RoICE9IG51bGwgPyBbIF0gOiB7IH0gKSwgY29weSApOwoKCQkJCS8vIERvbid0IGJyaW5nIGluIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCX0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHsKCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3QKCXJldHVybiB0YXJnZXQ7Cn07CgpqUXVlcnkuZXh0ZW5kKHsKCW5vQ29uZmxpY3Q6IGZ1bmN0aW9uKCBkZWVwICkgewoJCXdpbmRvdy4kID0gXyQ7CgoJCWlmICggZGVlcCApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIHRvU3RyaW5nLmNhbGwob2JqKSA9PT0gIltvYmplY3QgRnVuY3Rpb25dIjsKCX0sCgoJaXNBcnJheTogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSAiW29iamVjdCBBcnJheV0iOwoJfSwKCgkvLyBjaGVjayBpZiBhbiBlbGVtZW50IGlzIGluIGEgKG9yIGlzIGFuKSBYTUwgZG9jdW1lbnQKCWlzWE1MRG9jOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJCSEhZWxlbS5vd25lckRvY3VtZW50ICYmIGVsZW0ub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09ICJIVE1MIjsKCX0sCgoJLy8gRXZhbHVsYXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CglnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKCQlpZiAoIGRhdGEgJiYgL1xTLy50ZXN0KGRhdGEpICkgewoJCQkvLyBJbnNwaXJlZCBieSBjb2RlIGJ5IEFuZHJlYSBHaWFtbWFyY2hpCgkJCS8vIGh0dHA6Ly93ZWJyZWZsZWN0aW9uLmJsb2dzcG90LmNvbS8yMDA3LzA4L2dsb2JhbC1zY29wZS1ldmFsdWF0aW9uLWFuZC1kb20uaHRtbAoJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAoJCQkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CgoJCQlzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwoJCQlpZiAoIGpRdWVyeS5zdXBwb3J0LnNjcmlwdEV2YWwgKSB7CgkJCQlzY3JpcHQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCBkYXRhICkgKTsKCQkJfSBlbHNlIHsKCQkJCXNjcmlwdC50ZXh0ID0gZGF0YTsKCQkJfQoKCQkJLy8gVXNlIGluc2VydEJlZm9yZSBpbnN0ZWFkIG9mIGFwcGVuZENoaWxkICB0byBjaXJjdW12ZW50IGFuIElFNiBidWcuCgkJCS8vIFRoaXMgYXJpc2VzIHdoZW4gYSBiYXNlIG5vZGUgaXMgdXNlZCAoIzI3MDkpLgoJCQloZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBoZWFkLmZpcnN0Q2hpbGQgKTsKCQkJaGVhZC5yZW1vdmVDaGlsZCggc2NyaXB0ICk7CgkJfQoJfSwKCglub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9uKCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsKCgkJaWYgKCBhcmdzICkgewoJCQlpZiAoIGxlbmd0aCA9PT0gdW5kZWZpbmVkICkgewoJCQkJZm9yICggbmFtZSBpbiBvYmplY3QgKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBuYW1lIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgaSA8IGxlbmd0aDsgKSB7CgkJCQkJaWYgKCBjYWxsYmFjay5hcHBseSggb2JqZWN0WyBpKysgXSwgYXJncyApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCS8vIEEgc3BlY2lhbCwgZmFzdCwgY2FzZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBvZiBlYWNoCgkJfSBlbHNlIHsKCQkJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgewoJCQkJCWlmICggY2FsbGJhY2suY2FsbCggb2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgdmFsdWUgPSBvYmplY3RbMF07CgkJCQkJaSA8IGxlbmd0aCAmJiBjYWxsYmFjay5jYWxsKCB2YWx1ZSwgaSwgdmFsdWUgKSAhPT0gZmFsc2U7IHZhbHVlID0gb2JqZWN0WysraV0gKSB7fQoJCQl9CgkJfQoKCQlyZXR1cm4gb2JqZWN0OwoJfSwKCgl0cmltOiBmdW5jdGlvbiggdGV4dCApIHsKCQlyZXR1cm4gKHRleHQgfHwgIiIpLnJlcGxhY2UoIC9eXHMrfFxzKyQvZywgIiIgKTsKCX0sCgoJbWFrZUFycmF5OiBmdW5jdGlvbiggYXJyYXkgKSB7CgkJdmFyIHJldCA9IFtdLCBpOwoKCQlpZiAoIGFycmF5ICE9IG51bGwgKSB7CgkJCWkgPSBhcnJheS5sZW5ndGg7CgoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJaWYgKCBpID09IG51bGwgfHwgdHlwZW9mIGFycmF5ID09PSAic3RyaW5nIiB8fCBqUXVlcnkuaXNGdW5jdGlvbihhcnJheSkgfHwgYXJyYXkuc2V0SW50ZXJ2YWwgKSB7CgkJCQlyZXRbMF0gPSBhcnJheTsKCQkJfSBlbHNlIHsKCQkJCXdoaWxlICggaSApIHsKCQkJCQlyZXRbLS1pXSA9IGFycmF5W2ldOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CgkJZm9yICggdmFyIGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJaWYgKCBhcnJheVsgaSBdID09PSBlbGVtICkgewoJCQkJcmV0dXJuIGk7CgkJCX0KCQl9CgoJCXJldHVybiAtMTsKCX0sCgoJbWVyZ2U6IGZ1bmN0aW9uKCBmaXJzdCwgc2Vjb25kICkgewoJCS8vIFdlIGhhdmUgdG8gbG9vcCB0aGlzIHdheSBiZWNhdXNlIElFICYgT3BlcmEgb3ZlcndyaXRlIHRoZSBsZW5ndGgKCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCgkJdmFyIGkgPSAwLCBlbGVtLCBwb3MgPSBmaXJzdC5sZW5ndGg7CgoJCS8vIEFsc28sIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvcnJlY3QgZWxlbWVudHMgYXJlIGJlaW5nIHJldHVybmVkCgkJLy8gKElFIHJldHVybnMgY29tbWVudCBub2RlcyBpbiBhICcqJyBxdWVyeSkKCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5nZXRBbGwgKSB7CgkJCXdoaWxlICggKGVsZW0gPSBzZWNvbmRbIGkrKyBdKSAhPSBudWxsICkgewoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlICE9PSA4ICkgewoJCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIChlbGVtID0gc2Vjb25kWyBpKysgXSkgIT0gbnVsbCApIHsKCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZpcnN0OwoJfSwKCgl1bmlxdWU6IGZ1bmN0aW9uKCBhcnJheSApIHsKCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fSwgaWQ7CgoJCXRyeSB7CgkJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlpZCA9IGpRdWVyeS5kYXRhKCBhcnJheVsgaSBdICk7CgoJCQkJaWYgKCAhZG9uZVsgaWQgXSApIHsKCQkJCQlkb25lWyBpZCBdID0gdHJ1ZTsKCQkJCQlyZXQucHVzaCggYXJyYXlbIGkgXSApOwoJCQkJfQoJCQl9CgkJfSBjYXRjaCggZSApIHsKCQkJcmV0ID0gYXJyYXk7CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zCgkJLy8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb24KCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQlpZiAoICFpbnYgIT09ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApICkgewoJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrICkgewoJCXZhciByZXQgPSBbXSwgdmFsdWU7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCB0cmFuc2xhdGluZyBlYWNoIG9mIHRoZSBpdGVtcyB0byB0aGVpcgoJCS8vIG5ldyB2YWx1ZSAob3IgdmFsdWVzKS4KCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7CgoJCQlpZiAoIHZhbHVlICE9IG51bGwgKSB7CgkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBVc2Ugb2YgalF1ZXJ5LmJyb3dzZXIgaXMgZGVwcmVjYXRlZC4KCS8vIEl0J3MgaW5jbHVkZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZCBwbHVnaW5zLAoJLy8gYWx0aG91Z2ggdGhleSBzaG91bGQgd29yayB0byBtaWdyYXRlIGF3YXkuCglicm93c2VyOiB7CgkJdmVyc2lvbjogKHVzZXJBZ2VudC5tYXRjaCggLy4rKD86cnZ8aXR8cmF8aWUpW1wvOiBdKFtcZC5dKykvICkgfHwgWzAsJzAnXSlbMV0sCgkJc2FmYXJpOiAvd2Via2l0Ly50ZXN0KCB1c2VyQWdlbnQgKSwKCQlvcGVyYTogL29wZXJhLy50ZXN0KCB1c2VyQWdlbnQgKSwKCQltc2llOiAvbXNpZS8udGVzdCggdXNlckFnZW50ICkgJiYgIS9vcGVyYS8udGVzdCggdXNlckFnZW50ICksCgkJbW96aWxsYTogL21vemlsbGEvLnRlc3QoIHVzZXJBZ2VudCApICYmICEvKGNvbXBhdGlibGV8d2Via2l0KS8udGVzdCggdXNlckFnZW50ICkKCX0KfSk7CgovLyBBbGwgalF1ZXJ5IG9iamVjdHMgc2hvdWxkIHBvaW50IGJhY2sgdG8gdGhlc2UKcm9vdGpRdWVyeSA9IGpRdWVyeShkb2N1bWVudCk7CgpmdW5jdGlvbiBldmFsU2NyaXB0KCBpLCBlbGVtICkgewoJaWYgKCBlbGVtLnNyYyApIHsKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogZWxlbS5zcmMsCgkJCWFzeW5jOiBmYWxzZSwKCQkJZGF0YVR5cGU6ICJzY3JpcHQiCgkJfSk7Cgl9IGVsc2UgewoJCWpRdWVyeS5nbG9iYWxFdmFsKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApOwoJfQoKCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJfQp9CgpmdW5jdGlvbiBub3coKSB7CglyZXR1cm4gKG5ldyBEYXRlKS5nZXRUaW1lKCk7Cn0KdmFyIGV4cGFuZG8gPSAialF1ZXJ5IiArIG5vdygpLCB1dWlkID0gMCwgd2luZG93RGF0YSA9IHt9OwoKalF1ZXJ5LmV4dGVuZCh7CgljYWNoZToge30sCgoJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7CgkJZWxlbSA9IGVsZW0gPT0gd2luZG93ID8KCQkJd2luZG93RGF0YSA6CgkJCWVsZW07CgoJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKCgkJLy8gQ29tcHV0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQKCQlpZiAoICFpZCApCgkJCWlkID0gZWxlbVsgZXhwYW5kbyBdID0gKyt1dWlkOwoKCQkvLyBPbmx5IGdlbmVyYXRlIHRoZSBkYXRhIGNhY2hlIGlmIHdlJ3JlCgkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0CgkJaWYgKCBuYW1lICYmICFqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQlqUXVlcnkuY2FjaGVbIGlkIF0gPSB7fTsKCgkJLy8gUHJldmVudCBvdmVycmlkaW5nIHRoZSBuYW1lZCBjYWNoZSB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApCgkJCWpRdWVyeS5jYWNoZVsgaWQgXVsgbmFtZSBdID0gZGF0YTsKCgkJLy8gUmV0dXJuIHRoZSBuYW1lZCBjYWNoZSBkYXRhLCBvciB0aGUgSUQgZm9yIHRoZSBlbGVtZW50CgkJcmV0dXJuIG5hbWUgPwoJCQlqUXVlcnkuY2FjaGVbIGlkIF1bIG5hbWUgXSA6CgkJCWlkOwoJfSwKCglyZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPwoJCQl3aW5kb3dEYXRhIDoKCQkJZWxlbTsKCgkJdmFyIGlkID0gZWxlbVsgZXhwYW5kbyBdOwoKCQkvLyBJZiB3ZSB3YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJaWYgKCBuYW1lICkgewoJCQlpZiAoIGpRdWVyeS5jYWNoZVsgaWQgXSApIHsKCQkJCS8vIFJlbW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCgkJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdWyBuYW1lIF07CgoJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJlbW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCgkJCQluYW1lID0gIiI7CgoJCQkJZm9yICggbmFtZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQoJCQkJCWJyZWFrOwoKCQkJCWlmICggIW5hbWUgKQoJCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtICk7CgkJCX0KCgkJLy8gT3RoZXJ3aXNlLCB3ZSB3YW50IHRvIHJlbW92ZSBhbGwgb2YgdGhlIGVsZW1lbnQncyBkYXRhCgkJfSBlbHNlIHsKCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbwoJCQl0cnkgewoJCQkJZGVsZXRlIGVsZW1bIGV4cGFuZG8gXTsKCQkJfSBjYXRjaChlKXsKCQkJCS8vIElFIGhhcyB0cm91YmxlIGRpcmVjdGx5IHJlbW92aW5nIHRoZSBleHBhbmRvCgkJCQkvLyBidXQgaXQncyBvayB3aXRoIHVzaW5nIHJlbW92ZUF0dHJpYnV0ZQoJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApCgkJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGV4cGFuZG8gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGVseSByZW1vdmUgdGhlIGRhdGEgY2FjaGUKCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsgaWQgXTsKCQl9Cgl9LAoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApewoKCQkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgInF1ZXVlIjsKCgkJCXZhciBxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUgKTsKCgkJCWlmICggIXEgfHwgalF1ZXJ5LmlzQXJyYXkoZGF0YSkgKQoJCQkJcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlLCBqUXVlcnkubWFrZUFycmF5KGRhdGEpICk7CgkJCWVsc2UgaWYoIGRhdGEgKQoJCQkJcS5wdXNoKCBkYXRhICk7CgoJCX0KCQlyZXR1cm4gcTsKCX0sCgoJZGVxdWV1ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGUgKXsKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoKCQlpZiggIXR5cGUgfHwgdHlwZSA9PT0gImZ4IiApCgkJCWZuID0gcXVldWVbMF07CgoJCWlmKCBmbiAhPT0gdW5kZWZpbmVkICkKCQkJZm4uY2FsbChlbGVtKTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7CgkJdmFyIHBhcnRzID0ga2V5LnNwbGl0KCIuIik7CgkJcGFydHNbMV0gPSBwYXJ0c1sxXSA/ICIuIiArIHBhcnRzWzFdIDogIiI7CgoJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJdmFyIGRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIHRoaXMubGVuZ3RoICkKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoJCX0gZWxzZQoJCQlyZXR1cm4gdGhpcy50cmlnZ2VyKCJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF0sIHZhbHVlXSkuZWFjaChmdW5jdGlvbigpewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKCQkJfSk7Cgl9LAoKCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKCQl9KTsKCX0sCglxdWV1ZTogZnVuY3Rpb24odHlwZSwgZGF0YSl7CgkJaWYgKCB0eXBlb2YgdHlwZSAhPT0gInN0cmluZyIgKSB7CgkJCWRhdGEgPSB0eXBlOwoJCQl0eXBlID0gImZ4IjsKCQl9CgoJCWlmICggZGF0YSA9PT0gdW5kZWZpbmVkICkKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCXZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApOwoKCQkJIGlmKCB0eXBlID09ICJmeCIgJiYgcXVldWUubGVuZ3RoID09IDEgKQoJCQkJcXVldWVbMF0uY2FsbCh0aGlzKTsKCQl9KTsKCX0sCglkZXF1ZXVlOiBmdW5jdGlvbih0eXBlKXsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9Cn0pOy8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSAtIHYxLjAKICogIENvcHlyaWdodCAyMDA5LCBUaGUgRG9qbyBGb3VuZGF0aW9uCiAqICBSZWxlYXNlZCB1bmRlciB0aGUgTUlULCBCU0QsIGFuZCBHUEwgTGljZW5zZXMuCiAqICBNb3JlIGluZm9ybWF0aW9uOiBodHRwOi8vc2l6emxlanMuY29tLwogKi8KKGZ1bmN0aW9uKCl7Cgp2YXIgY2h1bmtlciA9IC8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXltcXSciXSspK1xdfFxcLnxbXiA+K34sKFxbXFxdKykrfFs+K35dKShccyosXHMqKT8vZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2U7Cgp2YXIgU2l6emxlID0gZnVuY3Rpb24oc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQpIHsKCXJlc3VsdHMgPSByZXN1bHRzIHx8IFtdOwoJdmFyIG9yaWdDb250ZXh0ID0gY29udGV4dCA9IGNvbnRleHQgfHwgZG9jdW1lbnQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBwYXJ0cyA9IFtdLCBtLCBzZXQsIGNoZWNrU2V0LCBjaGVjaywgbW9kZSwgZXh0cmEsIHBydW5lID0gdHJ1ZSwgY29udGV4dFhNTCA9IGlzWE1MKGNvbnRleHQpOwoJCgkvLyBSZXNldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNodW5rZXIgcmVnZXhwIChzdGFydCBmcm9tIGhlYWQpCgljaHVua2VyLmxhc3RJbmRleCA9IDA7CgkKCXdoaWxlICggKG0gPSBjaHVua2VyLmV4ZWMoc2VsZWN0b3IpKSAhPT0gbnVsbCApIHsKCQlwYXJ0cy5wdXNoKCBtWzFdICk7CgkJCgkJaWYgKCBtWzJdICkgewoJCQlleHRyYSA9IFJlZ0V4cC5yaWdodENvbnRleHQ7CgkJCWJyZWFrOwoJCX0KCX0KCglpZiAoIHBhcnRzLmxlbmd0aCA+IDEgJiYgb3JpZ1BPUy5leGVjKCBzZWxlY3RvciApICkgewoJCWlmICggcGFydHMubGVuZ3RoID09PSAyICYmIEV4cHIucmVsYXRpdmVbIHBhcnRzWzBdIF0gKSB7CgkJCXNldCA9IHBvc1Byb2Nlc3MoIHBhcnRzWzBdICsgcGFydHNbMV0sIGNvbnRleHQgKTsKCQl9IGVsc2UgewoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KCQkJCVsgY29udGV4dCBdIDoKCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOwoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkKCQkJCQlzZWxlY3RvciArPSBwYXJ0cy5zaGlmdCgpOwoKCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKCQkJfQoJCX0KCX0gZWxzZSB7CgkJLy8gVGFrZSBhIHNob3J0Y3V0IGFuZCBzZXQgdGhlIGNvbnRleHQgaWYgdGhlIHJvb3Qgc2VsZWN0b3IgaXMgYW4gSUQKCQkvLyAoYnV0IG5vdCBpZiBpdCdsbCBiZSBmYXN0ZXIgaWYgdGhlIGlubmVyIHNlbGVjdG9yIGlzIGFuIElEKQoJCWlmICggIXNlZWQgJiYgcGFydHMubGVuZ3RoID4gMSAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICYmICFjb250ZXh0WE1MICYmCgkJCQlFeHByLm1hdGNoLklELnRlc3QocGFydHNbMF0pICYmICFFeHByLm1hdGNoLklELnRlc3QocGFydHNbcGFydHMubGVuZ3RoIC0gMV0pICkgewoJCQl2YXIgcmV0ID0gU2l6emxlLmZpbmQoIHBhcnRzLnNoaWZ0KCksIGNvbnRleHQsIGNvbnRleHRYTUwgKTsKCQkJY29udGV4dCA9IHJldC5leHByID8gU2l6emxlLmZpbHRlciggcmV0LmV4cHIsIHJldC5zZXQgKVswXSA6IHJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXZhciByZXQgPSBzZWVkID8KCQkJCXsgZXhwcjogcGFydHMucG9wKCksIHNldDogbWFrZUFycmF5KHNlZWQpIH0gOgoJCQkJU2l6emxlLmZpbmQoIHBhcnRzLnBvcCgpLCBwYXJ0cy5sZW5ndGggPT09IDEgJiYgKHBhcnRzWzBdID09PSAifiIgfHwgcGFydHNbMF0gPT09ICIrIikgJiYgY29udGV4dC5wYXJlbnROb2RlID8gY29udGV4dC5wYXJlbnROb2RlIDogY29udGV4dCwgY29udGV4dFhNTCApOwoJCQlzZXQgPSByZXQuZXhwciA/IFNpenpsZS5maWx0ZXIoIHJldC5leHByLCByZXQuc2V0ICkgOiByZXQuc2V0OwoKCQkJaWYgKCBwYXJ0cy5sZW5ndGggPiAwICkgewoJCQkJY2hlY2tTZXQgPSBtYWtlQXJyYXkoc2V0KTsKCQkJfSBlbHNlIHsKCQkJCXBydW5lID0gZmFsc2U7CgkJCX0KCgkJCXdoaWxlICggcGFydHMubGVuZ3RoICkgewoJCQkJdmFyIGN1ciA9IHBhcnRzLnBvcCgpLCBwb3AgPSBjdXI7CgoJCQkJaWYgKCAhRXhwci5yZWxhdGl2ZVsgY3VyIF0gKSB7CgkJCQkJY3VyID0gIiI7CgkJCQl9IGVsc2UgewoJCQkJCXBvcCA9IHBhcnRzLnBvcCgpOwoJCQkJfQoKCQkJCWlmICggcG9wID09IG51bGwgKSB7CgkJCQkJcG9wID0gY29udGV4dDsKCQkJCX0KCgkJCQlFeHByLnJlbGF0aXZlWyBjdXIgXSggY2hlY2tTZXQsIHBvcCwgY29udGV4dFhNTCApOwoJCQl9CgkJfSBlbHNlIHsKCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOwoJCX0KCX0KCglpZiAoICFjaGVja1NldCApIHsKCQljaGVja1NldCA9IHNldDsKCX0KCglpZiAoICFjaGVja1NldCApIHsKCQl0aHJvdyAiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIiArIChjdXIgfHwgc2VsZWN0b3IpOwoJfQoKCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CgkJaWYgKCAhcHJ1bmUgKSB7CgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKCQl9IGVsc2UgaWYgKCBjb250ZXh0ICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDEgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgY29udGFpbnMoY29udGV4dCwgY2hlY2tTZXRbaV0pKSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwOyBjaGVja1NldFtpXSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGNoZWNrU2V0W2ldICYmIGNoZWNrU2V0W2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCXJlc3VsdHMucHVzaCggc2V0W2ldICk7CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCW1ha2VBcnJheSggY2hlY2tTZXQsIHJlc3VsdHMgKTsKCX0KCglpZiAoIGV4dHJhICkgewoJCVNpenpsZSggZXh0cmEsIG9yaWdDb250ZXh0LCByZXN1bHRzLCBzZWVkICk7CgkJU2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTsKCX0KCglyZXR1cm4gcmVzdWx0czsKfTsKClNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24ocmVzdWx0cyl7CglpZiAoIHNvcnRPcmRlciApIHsKCQloYXNEdXBsaWNhdGUgPSBmYWxzZTsKCQlyZXN1bHRzLnNvcnQoc29ydE9yZGVyKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbaS0xXSApIHsKCQkJCQlyZXN1bHRzLnNwbGljZShpLS0sIDEpOwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbihleHByLCBzZXQpewoJcmV0dXJuIFNpenpsZShleHByLCBudWxsLCBudWxsLCBzZXQpOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbihleHByLCBjb250ZXh0LCBpc1hNTCl7Cgl2YXIgc2V0LCBtYXRjaDsKCglpZiAoICFleHByICkgewoJCXJldHVybiBbXTsKCX0KCglmb3IgKCB2YXIgaSA9IDAsIGwgPSBFeHByLm9yZGVyLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgdHlwZSA9IEV4cHIub3JkZXJbaV0sIG1hdGNoOwoJCQoJCWlmICggKG1hdGNoID0gRXhwci5tYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gUmVnRXhwLmxlZnRDb250ZXh0OwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSgvXFwvZywgIiIpOwoJCQkJc2V0ID0gRXhwci5maW5kWyB0eXBlIF0oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApOwoJCQkJaWYgKCBzZXQgIT0gbnVsbCApIHsKCQkJCQlleHByID0gZXhwci5yZXBsYWNlKCBFeHByLm1hdGNoWyB0eXBlIF0sICIiICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJaWYgKCAhc2V0ICkgewoJCXNldCA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTsKCX0KCglyZXR1cm4ge3NldDogc2V0LCBleHByOiBleHByfTsKfTsKClNpenpsZS5maWx0ZXIgPSBmdW5jdGlvbihleHByLCBzZXQsIGlucGxhY2UsIG5vdCl7Cgl2YXIgb2xkID0gZXhwciwgcmVzdWx0ID0gW10sIGN1ckxvb3AgPSBzZXQsIG1hdGNoLCBhbnlGb3VuZCwKCQlpc1hNTEZpbHRlciA9IHNldCAmJiBzZXRbMF0gJiYgaXNYTUwoc2V0WzBdKTsKCgl3aGlsZSAoIGV4cHIgJiYgc2V0Lmxlbmd0aCApIHsKCQlmb3IgKCB2YXIgdHlwZSBpbiBFeHByLmZpbHRlciApIHsKCQkJaWYgKCAobWF0Y2ggPSBFeHByLm1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSAhPSBudWxsICkgewoJCQkJdmFyIGZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sIGZvdW5kLCBpdGVtOwoJCQkJYW55Rm91bmQgPSBmYWxzZTsKCgkJCQlpZiAoIGN1ckxvb3AgPT0gcmVzdWx0ICkgewoJCQkJCXJlc3VsdCA9IFtdOwoJCQkJfQoKCQkJCWlmICggRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSApIHsKCQkJCQltYXRjaCA9IEV4cHIucHJlRmlsdGVyWyB0eXBlIF0oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUxGaWx0ZXIgKTsKCgkJCQkJaWYgKCAhbWF0Y2ggKSB7CgkJCQkJCWFueUZvdW5kID0gZm91bmQgPSB0cnVlOwoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJCQlpZiAoIGl0ZW0gKSB7CgkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKCgkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKCQkJCQkJCQlpZiAoIHBhc3MgKSB7CgkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQljdXJMb29wW2ldID0gZmFsc2U7CgkJCQkJCQkJfQoJCQkJCQkJfSBlbHNlIGlmICggcGFzcyApIHsKCQkJCQkJCQlyZXN1bHQucHVzaCggaXRlbSApOwoJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCX0KCQkJCX0KCgkJCQlpZiAoIGZvdW5kICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcCA9IHJlc3VsdDsKCQkJCQl9CgoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCgkJCQkJaWYgKCAhYW55Rm91bmQgKSB7CgkJCQkJCXJldHVybiBbXTsKCQkJCQl9CgoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBJbXByb3BlciBleHByZXNzaW9uCgkJaWYgKCBleHByID09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBleHByOwoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCW9sZCA9IGV4cHI7Cgl9CgoJcmV0dXJuIGN1ckxvb3A7Cn07Cgp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CglvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCgltYXRjaDogewoJCUlEOiAvIygoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sCgkJQ0xBU1M6IC9cLigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKS8sCgkJTkFNRTogL1xbbmFtZT1bJyJdKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVsnIl0qXF0vLAoJCUFUVFI6IC9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKVxzKig/OihcUz89KVxzKihbJyJdKikoLio/KVwzfClccypcXS8sCgkJVEFHOiAvXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpfLV18XFwuKSspLywKCQlDSElMRDogLzoob25seXxudGh8bGFzdHxmaXJzdCktY2hpbGQoPzpcKChldmVufG9kZHxbXGRuKy1dKilcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W14tXXwkKS8sCgkJUFNFVURPOiAvOigoPzpbXHdcdTAwYzAtXHVGRkZGXy1dfFxcLikrKSg/OlwoKFsnIl0qKSgoPzpcKFteXCldK1wpfFteXDJcKFwpXSopKylcMlwpKT8vCgl9LAoJYXR0ck1hcDogewoJCSJjbGFzcyI6ICJjbGFzc05hbWUiLAoJCSJmb3IiOiAiaHRtbEZvciIKCX0sCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwoJCX0KCX0sCglyZWxhdGl2ZTogewoJCSIrIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKCQkJCWlzVGFnID0gaXNQYXJ0U3RyICYmICEvXFcvLnRlc3QocGFydCksCgkJCQlpc1BhcnRTdHJOb3RUYWcgPSBpc1BhcnRTdHIgJiYgIWlzVGFnOwoKCQkJaWYgKCBpc1RhZyAmJiAhaXNYTUwgKSB7CgkJCQlwYXJ0ID0gcGFydC50b1VwcGVyQ2FzZSgpOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgewoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CgoJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZSA9PT0gcGFydCA/CgkJCQkJCWVsZW0gfHwgZmFsc2UgOgoJCQkJCQllbGVtID09PSBwYXJ0OwoJCQkJfQoJCQl9CgoJCQlpZiAoIGlzUGFydFN0ck5vdFRhZyApIHsKCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCX0KCQl9LAoJCSI+IjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIGlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIjsKCgkJCWlmICggaXNQYXJ0U3RyICYmICEvXFcvLnRlc3QocGFydCkgKSB7CgkJCQlwYXJ0ID0gaXNYTUwgPyBwYXJ0IDogcGFydC50b1VwcGVyQ2FzZSgpOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUgPT09IHBhcnQgPyBwYXJlbnQgOiBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKCQkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggaXNQYXJ0U3RyICkgewoJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoJCSIiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggIXBhcnQubWF0Y2goL1xXLykgKSB7CgkJCQl2YXIgbm9kZUNoZWNrID0gcGFydCA9IGlzWE1MID8gcGFydCA6IHBhcnQudG9VcHBlckNhc2UoKTsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwpOwoJCX0sCgkJIn4iOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCwgaXNYTUwpewoJCQl2YXIgZG9uZU5hbWUgPSBkb25lKyssIGNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFwYXJ0Lm1hdGNoKC9cVy8pICkgewoJCQkJdmFyIG5vZGVDaGVjayA9IHBhcnQgPSBpc1hNTCA/IHBhcnQgOiBwYXJ0LnRvVXBwZXJDYXNlKCk7CgkJCQljaGVja0ZuID0gZGlyTm9kZUNoZWNrOwoJCQl9CgoJCQljaGVja0ZuKCJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwpOwoJCX0KCX0sCglmaW5kOiB7CgkJSUQ6IGZ1bmN0aW9uKG1hdGNoLCBjb250ZXh0LCBpc1hNTCl7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09ICJ1bmRlZmluZWQiICYmICFpc1hNTCApIHsKCQkJCXZhciBtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZChtYXRjaFsxXSk7CgkJCQlyZXR1cm4gbSA/IFttXSA6IFtdOwoJCQl9CgkJfSwKCQlOQU1FOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCwgaXNYTUwpewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lICE9PSAidW5kZWZpbmVkIiApIHsKCQkJCXZhciByZXQgPSBbXSwgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUobWF0Y2hbMV0pOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHJlc3VsdHMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggcmVzdWx0c1tpXS5nZXRBdHRyaWJ1dGUoIm5hbWUiKSA9PT0gbWF0Y2hbMV0gKSB7CgkJCQkJCXJldC5wdXNoKCByZXN1bHRzW2ldICk7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiByZXQubGVuZ3RoID09PSAwID8gbnVsbCA6IHJldDsKCQkJfQoJCX0sCgkJVEFHOiBmdW5jdGlvbihtYXRjaCwgY29udGV4dCl7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKG1hdGNoWzFdKTsKCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCwgaXNYTUwpewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoL1xcL2csICIiKSArICIgIjsKCgkJCWlmICggaXNYTUwgKSB7CgkJCQlyZXR1cm4gbWF0Y2g7CgkJCX0KCgkJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBjdXJMb29wW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJaWYgKCBub3QgXiAoZWxlbS5jbGFzc05hbWUgJiYgKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApCgkJCQkJCQlyZXN1bHQucHVzaCggZWxlbSApOwoJCQkJCX0gZWxzZSBpZiAoIGlucGxhY2UgKSB7CgkJCQkJCWN1ckxvb3BbaV0gPSBmYWxzZTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCQl9LAoJCUlEOiBmdW5jdGlvbihtYXRjaCl7CgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKC9cXC9nLCAiIik7CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wKXsKCQkJZm9yICggdmFyIGkgPSAwOyBjdXJMb29wW2ldID09PSBmYWxzZTsgaSsrICl7fQoJCQlyZXR1cm4gY3VyTG9vcFtpXSAmJiBpc1hNTChjdXJMb29wW2ldKSA/IG1hdGNoWzFdIDogbWF0Y2hbMV0udG9VcHBlckNhc2UoKTsKCQl9LAoJCUNISUxEOiBmdW5jdGlvbihtYXRjaCl7CgkJCWlmICggbWF0Y2hbMV0gPT0gIm50aCIgKSB7CgkJCQkvLyBwYXJzZSBlcXVhdGlvbnMgbGlrZSAnZXZlbicsICdvZGQnLCAnNScsICcybicsICczbisyJywgJzRuLTEnLCAnLW4rNicKCQkJCXZhciB0ZXN0ID0gLygtPykoXGQqKW4oKD86XCt8LSk/XGQqKS8uZXhlYygKCQkJCQltYXRjaFsyXSA9PSAiZXZlbiIgJiYgIjJuIiB8fCBtYXRjaFsyXSA9PSAib2RkIiAmJiAiMm4rMSIgfHwKCQkJCQkhL1xELy50ZXN0KCBtYXRjaFsyXSApICYmICIwbisiICsgbWF0Y2hbMl0gfHwgbWF0Y2hbMl0pOwoKCQkJCS8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVycyAoZmlyc3QpbisobGFzdCkgaW5jbHVkaW5nIGlmIHRoZXkgYXJlIG5lZ2F0aXZlCgkJCQltYXRjaFsyXSA9ICh0ZXN0WzFdICsgKHRlc3RbMl0gfHwgMSkpIC0gMDsKCQkJCW1hdGNoWzNdID0gdGVzdFszXSAtIDA7CgkJCX0KCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCgkJCW1hdGNoWzBdID0gZG9uZSsrOwoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgkJQVRUUjogZnVuY3Rpb24obWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTCl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0ucmVwbGFjZSgvXFwvZywgIiIpOwoJCQkKCQkJaWYgKCAhaXNYTUwgJiYgRXhwci5hdHRyTWFwW25hbWVdICkgewoJCQkJbWF0Y2hbMV0gPSBFeHByLmF0dHJNYXBbbmFtZV07CgkJCX0KCgkJCWlmICggbWF0Y2hbMl0gPT09ICJ+PSIgKSB7CgkJCQltYXRjaFs0XSA9ICIgIiArIG1hdGNoWzRdICsgIiAiOwoJCQl9CgoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlQU0VVRE86IGZ1bmN0aW9uKG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCl7CgkJCWlmICggbWF0Y2hbMV0gPT09ICJub3QiICkgewoJCQkJLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIGEgY29tcGxleCBleHByZXNzaW9uLCBvciBhIHNpbXBsZSBvbmUKCQkJCWlmICggbWF0Y2hbM10ubWF0Y2goY2h1bmtlcikubGVuZ3RoID4gMSB8fCAvXlx3Ly50ZXN0KG1hdGNoWzNdKSApIHsKCQkJCQltYXRjaFszXSA9IFNpenpsZShtYXRjaFszXSwgbnVsbCwgbnVsbCwgY3VyTG9vcCk7CgkJCQl9IGVsc2UgewoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQlyZXN1bHQucHVzaC5hcHBseSggcmVzdWx0LCByZXQgKTsKCQkJCQl9CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCQlQT1M6IGZ1bmN0aW9uKG1hdGNoKXsKCQkJbWF0Y2gudW5zaGlmdCggdHJ1ZSApOwoJCQlyZXR1cm4gbWF0Y2g7CgkJfQoJfSwKCWZpbHRlcnM6IHsKCQllbmFibGVkOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICYmIGVsZW0udHlwZSAhPT0gImhpZGRlbiI7CgkJfSwKCQlkaXNhYmxlZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSB0cnVlOwoJCX0sCgkJY2hlY2tlZDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CgkJfSwKCQlzZWxlY3RlZDogZnVuY3Rpb24oZWxlbSl7CgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQoJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCQkJcmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7CgkJfSwKCQlwYXJlbnQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCQllbXB0eTogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAhZWxlbS5maXJzdENoaWxkOwoJCX0sCgkJaGFzOiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CgkJCXJldHVybiAhIVNpenpsZSggbWF0Y2hbM10sIGVsZW0gKS5sZW5ndGg7CgkJfSwKCQloZWFkZXI6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gL2hcZC9pLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoJCXRleHQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInRleHQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlyYWRpbzogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicmFkaW8iID09PSBlbGVtLnR5cGU7CgkJfSwKCQljaGVja2JveDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7CgkJfSwKCQlmaWxlOiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJmaWxlIiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gInBhc3N3b3JkIiA9PT0gZWxlbS50eXBlOwoJCX0sCgkJc3VibWl0OiBmdW5jdGlvbihlbGVtKXsKCQkJcmV0dXJuICJzdWJtaXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlpbWFnZTogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlyZXNldDogZnVuY3Rpb24oZWxlbSl7CgkJCXJldHVybiAicmVzZXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCQlidXR0b246IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gImJ1dHRvbiIgPT09IGVsZW0udHlwZSB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICJCVVRUT04iOwoJCX0sCgkJaW5wdXQ6IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGVsZW0ubm9kZU5hbWUpOwoJCX0KCX0sCglzZXRGaWx0ZXJzOiB7CgkJZmlyc3Q6IGZ1bmN0aW9uKGVsZW0sIGkpewoJCQlyZXR1cm4gaSA9PT0gMDsKCQl9LAoJCWxhc3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoLCBhcnJheSl7CgkJCXJldHVybiBpID09PSBhcnJheS5sZW5ndGggLSAxOwoJCX0sCgkJZXZlbjogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoJCW9kZDogZnVuY3Rpb24oZWxlbSwgaSl7CgkJCXJldHVybiBpICUgMiA9PT0gMTsKCQl9LAoJCWx0OiBmdW5jdGlvbihlbGVtLCBpLCBtYXRjaCl7CgkJCXJldHVybiBpIDwgbWF0Y2hbM10gLSAwOwoJCX0sCgkJZ3Q6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCQludGg6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOwoJCX0sCgkJZXE6IGZ1bmN0aW9uKGVsZW0sIGksIG1hdGNoKXsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PSBpOwoJCX0KCX0sCglmaWx0ZXI6IHsKCQlQU0VVRE86IGZ1bmN0aW9uKGVsZW0sIG1hdGNoLCBpLCBhcnJheSl7CgkJCXZhciBuYW1lID0gbWF0Y2hbMV0sIGZpbHRlciA9IEV4cHIuZmlsdGVyc1sgbmFtZSBdOwoKCQkJaWYgKCBmaWx0ZXIgKSB7CgkJCQlyZXR1cm4gZmlsdGVyKCBlbGVtLCBpLCBtYXRjaCwgYXJyYXkgKTsKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKCQkJCXJldHVybiAoZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCAiIikuaW5kZXhPZihtYXRjaFszXSkgPj0gMDsKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gIm5vdCIgKSB7CgkJCQl2YXIgbm90ID0gbWF0Y2hbM107CgoJCQkJZm9yICggaSA9IDAsIGwgPSBub3QubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggbm90W2ldID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfSwKCQlDSElMRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgdHlwZSA9IG1hdGNoWzFdLCBub2RlID0gZWxlbTsKCQkJc3dpdGNoICh0eXBlKSB7CgkJCQljYXNlICdvbmx5JzoKCQkJCWNhc2UgJ2ZpcnN0JzoKCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5wcmV2aW91c1NpYmxpbmcpICkgIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQlpZiAoIHR5cGUgPT0gJ2ZpcnN0JykgcmV0dXJuIHRydWU7CgkJCQkJbm9kZSA9IGVsZW07CgkJCQljYXNlICdsYXN0JzoKCQkJCQl3aGlsZSAoIChub2RlID0gbm9kZS5uZXh0U2libGluZykgKSAgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSByZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCXJldHVybiB0cnVlOwoJCQkJY2FzZSAnbnRoJzoKCQkJCQl2YXIgZmlyc3QgPSBtYXRjaFsyXSwgbGFzdCA9IG1hdGNoWzNdOwoKCQkJCQlpZiAoIGZpcnN0ID09IDEgJiYgbGFzdCA9PSAwICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQoJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CgkJCQkJCXZhciBjb3VudCA9IDA7CgkJCQkJCWZvciAoIG5vZGUgPSBwYXJlbnQuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcgKSB7CgkJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCQkJbm9kZS5ub2RlSW5kZXggPSArK2NvdW50OwoJCQkJCQkJfQoJCQkJCQl9IAoJCQkJCQlwYXJlbnQuc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRpZmYgPSBlbGVtLm5vZGVJbmRleCAtIGxhc3Q7CgkJCQkJaWYgKCBmaXJzdCA9PSAwICkgewoJCQkJCQlyZXR1cm4gZGlmZiA9PSAwOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7CgkJCQkJfQoJCQl9CgkJfSwKCQlJRDogZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtLmdldEF0dHJpYnV0ZSgiaWQiKSA9PT0gbWF0Y2g7CgkJfSwKCQlUQUc6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUgPT09IG1hdGNoOwoJCX0sCgkJQ0xBU1M6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJcmV0dXJuICgiICIgKyAoZWxlbS5jbGFzc05hbWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpICsgIiAiKQoJCQkJLmluZGV4T2YoIG1hdGNoICkgPiAtMTsKCQl9LAoJCUFUVFI6IGZ1bmN0aW9uKGVsZW0sIG1hdGNoKXsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIl49IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA9PT0gMCA6CgkJCQl0eXBlID09PSAiJD0iID8KCQkJCXZhbHVlLnN1YnN0cih2YWx1ZS5sZW5ndGggLSBjaGVjay5sZW5ndGgpID09PSBjaGVjayA6CgkJCQl0eXBlID09PSAifD0iID8KCQkJCXZhbHVlID09PSBjaGVjayB8fCB2YWx1ZS5zdWJzdHIoMCwgY2hlY2subGVuZ3RoICsgMSkgPT09IGNoZWNrICsgIi0iIDoKCQkJCWZhbHNlOwoJCX0sCgkJUE9TOiBmdW5jdGlvbihlbGVtLCBtYXRjaCwgaSwgYXJyYXkpewoJCQl2YXIgbmFtZSA9IG1hdGNoWzJdLCBmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKCgkJCWlmICggZmlsdGVyICkgewoJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CgkJCX0KCQl9Cgl9Cn07Cgp2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TOwoKZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAvKD8hW15cW10qXF0pKD8hW15cKF0qXCkpLy5zb3VyY2UgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKGFycmF5LCByZXN1bHRzKSB7CglhcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcnJheSApOwoKCWlmICggcmVzdWx0cyApIHsKCQlyZXN1bHRzLnB1c2guYXBwbHkoIHJlc3VsdHMsIGFycmF5ICk7CgkJcmV0dXJuIHJlc3VsdHM7Cgl9CgkKCXJldHVybiBhcnJheTsKfTsKCi8vIFBlcmZvcm0gYSBzaW1wbGUgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBicm93c2VyIGlzIGNhcGFibGUgb2YKLy8gY29udmVydGluZyBhIE5vZGVMaXN0IHRvIGFuIGFycmF5IHVzaW5nIGJ1aWx0aW4gbWV0aG9kcy4KdHJ5IHsKCUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2RlcyApOwoKLy8gUHJvdmlkZSBhIGZhbGxiYWNrIG1ldGhvZCBpZiBpdCBkb2VzIG5vdCB3b3JrCn0gY2F0Y2goZSl7CgltYWtlQXJyYXkgPSBmdW5jdGlvbihhcnJheSwgcmVzdWx0cykgewoJCXZhciByZXQgPSByZXN1bHRzIHx8IFtdOwoKCQlpZiAoIHRvU3RyaW5nLmNhbGwoYXJyYXkpID09PSAiW29iamVjdCBBcnJheV0iICkgewoJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggcmV0LCBhcnJheSApOwoJCX0gZWxzZSB7CgkJCWlmICggdHlwZW9mIGFycmF5Lmxlbmd0aCA9PT0gIm51bWJlciIgKSB7CgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCB2YXIgaSA9IDA7IGFycmF5W2ldOyBpKysgKSB7CgkJCQkJcmV0LnB1c2goIGFycmF5W2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9Owp9Cgp2YXIgc29ydE9yZGVyOwoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgcmV0ID0gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDQgPyAtMSA6IGEgPT09IGIgPyAwIDogMTsKCQlpZiAoIHJldCA9PT0gMCApIHsKCQkJaGFzRHVwbGljYXRlID0gdHJ1ZTsKCQl9CgkJcmV0dXJuIHJldDsKCX07Cn0gZWxzZSBpZiAoICJzb3VyY2VJbmRleCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJdmFyIHJldCA9IGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4OwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfSBlbHNlIGlmICggZG9jdW1lbnQuY3JlYXRlUmFuZ2UgKSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQl2YXIgYVJhbmdlID0gYS5vd25lckRvY3VtZW50LmNyZWF0ZVJhbmdlKCksIGJSYW5nZSA9IGIub3duZXJEb2N1bWVudC5jcmVhdGVSYW5nZSgpOwoJCWFSYW5nZS5zZWxlY3ROb2RlKGEpOwoJCWFSYW5nZS5jb2xsYXBzZSh0cnVlKTsKCQliUmFuZ2Uuc2VsZWN0Tm9kZShiKTsKCQliUmFuZ2UuY29sbGFwc2UodHJ1ZSk7CgkJdmFyIHJldCA9IGFSYW5nZS5jb21wYXJlQm91bmRhcnlQb2ludHMoUmFuZ2UuU1RBUlRfVE9fRU5ELCBiUmFuZ2UpOwoJCWlmICggcmV0ID09PSAwICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCX0KCQlyZXR1cm4gcmV0OwoJfTsKfQoKLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBicm93c2VyIHJldHVybnMgZWxlbWVudHMgYnkgbmFtZSB3aGVuCi8vIHF1ZXJ5aW5nIGJ5IGdldEVsZW1lbnRCeUlkIChhbmQgcHJvdmlkZSBhIHdvcmthcm91bmQpCihmdW5jdGlvbigpewoJLy8gV2UncmUgZ29pbmcgdG8gaW5qZWN0IGEgZmFrZSBpbnB1dCBlbGVtZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZQoJdmFyIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwKCQlpZCA9ICJzY3JpcHQiICsgKG5ldyBEYXRlKS5nZXRUaW1lKCk7Cglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKCgkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKCXZhciByb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoJcm9vdC5pbnNlcnRCZWZvcmUoIGZvcm0sIHJvb3QuZmlyc3RDaGlsZCApOwoKCS8vIFRoZSB3b3JrYXJvdW5kIGhhcyB0byBkbyBhZGRpdGlvbmFsIGNoZWNrcyBhZnRlciBhIGdldEVsZW1lbnRCeUlkCgkvLyBXaGljaCBzbG93cyB0aGluZ3MgZG93biBmb3Igb3RoZXIgYnJvd3NlcnMgKGhlbmNlIHRoZSBicmFuY2hpbmcpCglpZiAoICEhZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICkgKSB7CgkJRXhwci5maW5kLklEID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKXsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCXJldHVybiBtID8gbS5pZCA9PT0gbWF0Y2hbMV0gfHwgdHlwZW9mIG0uZ2V0QXR0cmlidXRlTm9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpLm5vZGVWYWx1ZSA9PT0gbWF0Y2hbMV0gPyBbbV0gOiB1bmRlZmluZWQgOiBbXTsKCQkJfQoJCX07CgoJCUV4cHIuZmlsdGVyLklEID0gZnVuY3Rpb24oZWxlbSwgbWF0Y2gpewoJCQl2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09ICJ1bmRlZmluZWQiICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgbm9kZSAmJiBub2RlLm5vZGVWYWx1ZSA9PT0gbWF0Y2g7CgkJfTsKCX0KCglyb290LnJlbW92ZUNoaWxkKCBmb3JtICk7Cglyb290ID0gZm9ybSA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFCn0pKCk7CgooZnVuY3Rpb24oKXsKCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIG9ubHkgZWxlbWVudHMKCS8vIHdoZW4gZG9pbmcgZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKQoKCS8vIENyZWF0ZSBhIGZha2UgZWxlbWVudAoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSApOwoKCS8vIE1ha2Ugc3VyZSBubyBjb21tZW50cyBhcmUgZm91bmQKCWlmICggZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RoID4gMCApIHsKCQlFeHByLmZpbmQuVEFHID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQpewoJCQl2YXIgcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUobWF0Y2hbMV0pOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CgkJCQl2YXIgdG1wID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXN1bHRzID0gdG1wOwoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcwoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCWlmICggZGl2LmZpcnN0Q2hpbGQgJiYgdHlwZW9mIGRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSAhPT0gInVuZGVmaW5lZCIgJiYKCQkJZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgIT09ICIjIiApIHsKCQlFeHByLmF0dHJIYW5kbGUuaHJlZiA9IGZ1bmN0aW9uKGVsZW0pewoJCQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoImhyZWYiLCAyKTsKCQl9OwoJfQoKCWRpdiA9IG51bGw7IC8vIHJlbGVhc2UgbWVtb3J5IGluIElFCn0pKCk7CgppZiAoIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwgKSAoZnVuY3Rpb24oKXsKCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJLy8gU2FmYXJpIGNhbid0IGhhbmRsZSB1cHBlcmNhc2Ugb3IgdW5pY29kZSBjaGFyYWN0ZXJzIHdoZW4KCS8vIGluIHF1aXJrcyBtb2RlLgoJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJcmV0dXJuOwoJfQoJCglTaXp6bGUgPSBmdW5jdGlvbihxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpewoJCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCQkvLyBPbmx5IHVzZSBxdWVyeVNlbGVjdG9yQWxsIG9uIG5vbi1YTUwgZG9jdW1lbnRzCgkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQlpZiAoICFzZWVkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgIWlzWE1MKGNvbnRleHQpICkgewoJCQl0cnkgewoJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSwgZXh0cmEgKTsKCQkJfSBjYXRjaChlKXt9CgkJfQoJCQoJCXJldHVybiBvbGRTaXp6bGUocXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkKTsKCX07CgoJZm9yICggdmFyIHByb3AgaW4gb2xkU2l6emxlICkgewoJCVNpenpsZVsgcHJvcCBdID0gb2xkU2l6emxlWyBwcm9wIF07Cgl9CgoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCmlmICggZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIChmdW5jdGlvbigpewoJdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CgoJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDAgKQoJCXJldHVybjsKCgkvLyBTYWZhcmkgY2FjaGVzIGNsYXNzIGF0dHJpYnV0ZXMsIGRvZXNuJ3QgY2F0Y2ggY2hhbmdlcyAoaW4gMy4yKQoJZGl2Lmxhc3RDaGlsZC5jbGFzc05hbWUgPSAiZSI7CgoJaWYgKCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMSApCgkJcmV0dXJuOwoKCUV4cHIub3JkZXIuc3BsaWNlKDEsIDAsICJDTEFTUyIpOwoJRXhwci5maW5kLkNMQVNTID0gZnVuY3Rpb24obWF0Y2gsIGNvbnRleHQsIGlzWE1MKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJZGl2ID0gbnVsbDsgLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKfSkoKTsKCmZ1bmN0aW9uIGRpck5vZGVDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCXZhciBzaWJEaXIgPSBkaXIgPT0gInByZXZpb3VzU2libGluZyIgJiYgIWlzWE1MOwoJZm9yICggdmFyIGkgPSAwLCBsID0gY2hlY2tTZXQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBlbGVtID0gY2hlY2tTZXRbaV07CgkJaWYgKCBlbGVtICkgewoJCQlpZiAoIHNpYkRpciAmJiBlbGVtLm5vZGVUeXBlID09PSAxICl7CgkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQllbGVtLnNpenNldCA9IGk7CgkJCX0KCQkJZWxlbSA9IGVsZW1bZGlyXTsKCQkJdmFyIG1hdGNoID0gZmFsc2U7CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZSA9PT0gY3VyICkgewoJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQlicmVhazsKCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKZnVuY3Rpb24gZGlyQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cgl2YXIgc2liRGlyID0gZGlyID09ICJwcmV2aW91c1NpYmxpbmciICYmICFpc1hNTDsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoJCWlmICggZWxlbSApIHsKCQkJaWYgKCBzaWJEaXIgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWVsZW0uc2l6Y2FjaGUgPSBkb25lTmFtZTsKCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJfQoJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgkJCQkJaWYgKCB0eXBlb2YgY3VyICE9PSAic3RyaW5nIiApIHsKCQkJCQkJaWYgKCBlbGVtID09PSBjdXIgKSB7CgkJCQkJCQltYXRjaCA9IHRydWU7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKCBTaXp6bGUuZmlsdGVyKCBjdXIsIFtlbGVtXSApLmxlbmd0aCA+IDAgKSB7CgkJCQkJCW1hdGNoID0gZWxlbTsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9Cgp2YXIgY29udGFpbnMgPSBkb2N1bWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiA/ICBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpICYgMTY7Cn0gOiBmdW5jdGlvbihhLCBiKXsKCXJldHVybiBhICE9PSBiICYmIChhLmNvbnRhaW5zID8gYS5jb250YWlucyhiKSA6IHRydWUpOwp9OwoKdmFyIGlzWE1MID0gZnVuY3Rpb24oZWxlbSl7CglyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gOSAmJiBlbGVtLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiIHx8CgkJISFlbGVtLm93bmVyRG9jdW1lbnQgJiYgZWxlbS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gIkhUTUwiOwp9OwoKdmFyIHBvc1Byb2Nlc3MgPSBmdW5jdGlvbihzZWxlY3RvciwgY29udGV4dCl7Cgl2YXIgdG1wU2V0ID0gW10sIGxhdGVyID0gIiIsIG1hdGNoLAoJCXJvb3QgPSBjb250ZXh0Lm5vZGVUeXBlID8gW2NvbnRleHRdIDogY29udGV4dDsKCgkvLyBQb3NpdGlvbiBzZWxlY3RvcnMgbXVzdCBiZSBkb25lIGFmdGVyIHRoZSBmaWx0ZXIKCS8vIEFuZCBzbyBtdXN0IDpub3QocG9zaXRpb25hbCkgc28gd2UgbW92ZSBhbGwgUFNFVURPcyB0byB0aGUgZW5kCgl3aGlsZSAoIChtYXRjaCA9IEV4cHIubWF0Y2guUFNFVURPLmV4ZWMoIHNlbGVjdG9yICkpICkgewoJCWxhdGVyICs9IG1hdGNoWzBdOwoJCXNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSggRXhwci5tYXRjaC5QU0VVRE8sICIiICk7Cgl9CgoJc2VsZWN0b3IgPSBFeHByLnJlbGF0aXZlW3NlbGVjdG9yXSA/IHNlbGVjdG9yICsgIioiIDogc2VsZWN0b3I7CgoJZm9yICggdmFyIGkgPSAwLCBsID0gcm9vdC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJU2l6emxlKCBzZWxlY3Rvciwgcm9vdFtpXSwgdG1wU2V0ICk7Cgl9CgoJcmV0dXJuIFNpenpsZS5maWx0ZXIoIGxhdGVyLCB0bXBTZXQgKTsKfTsKCi8vIEVYUE9TRQpqUXVlcnkuZmluZCA9IFNpenpsZTsKalF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzOwpqUXVlcnkuZXhwclsiOiJdID0galF1ZXJ5LmV4cHIuZmlsdGVyczsKClNpenpsZS5zZWxlY3RvcnMuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbihlbGVtKXsKCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsIGhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoJcmV0dXJuICggd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwICkgPwoJCXRydWUgOgoJCSggd2lkdGggIT09IDAgJiYgaGVpZ2h0ICE9PSAwICkgPwoJCQlmYWxzZSA6CgkJCSEhKCBqUXVlcnkuY3VyQ1NTKGVsZW0sICJkaXNwbGF5IikgPT09ICJub25lIiApOwp9OwoKU2l6emxlLnNlbGVjdG9ycy5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbihlbGVtKXsKCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsIGhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoJcmV0dXJuICggd2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwICkgPwoJCWZhbHNlIDoKCQkoIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwICkgPwoJCQl0cnVlIDoKCQkJISEoIGpRdWVyeS5jdXJDU1MoZWxlbSwgImRpc3BsYXkiKSAhPT0gIm5vbmUiICk7Cn07CgpTaXp6bGUuc2VsZWN0b3JzLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbihlbGVtKXsKCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbihmbil7CgkJcmV0dXJuIGVsZW0gPT09IGZuLmVsZW07Cgl9KS5sZW5ndGg7Cn07CgpqUXVlcnkuZmlsdGVyID0galF1ZXJ5Lm11bHRpRmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CglpZiAoIG5vdCApIHsKCQlleHByID0gIjpub3QoIiArIGV4cHIgKyAiKSI7Cgl9CgoJcmV0dXJuIFNpenpsZS5tYXRjaGVzKGV4cHIsIGVsZW1zKTsKfTsKCmpRdWVyeS5kaXIgPSBmdW5jdGlvbiggZWxlbSwgZGlyICl7Cgl2YXIgbWF0Y2hlZCA9IFtdLCBjdXIgPSBlbGVtW2Rpcl07Cgl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CgkJaWYgKCBjdXIubm9kZVR5cGUgPT0gMSApCgkJCW1hdGNoZWQucHVzaCggY3VyICk7CgkJY3VyID0gY3VyW2Rpcl07Cgl9CglyZXR1cm4gbWF0Y2hlZDsKfTsKCmpRdWVyeS5udGggPSBmdW5jdGlvbihjdXIsIHJlc3VsdCwgZGlyLCBlbGVtKXsKCXJlc3VsdCA9IHJlc3VsdCB8fCAxOwoJdmFyIG51bSA9IDA7CgoJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkKCQlpZiAoIGN1ci5ub2RlVHlwZSA9PSAxICYmICsrbnVtID09IHJlc3VsdCApCgkJCWJyZWFrOwoKCXJldHVybiBjdXI7Cn07CgpqUXVlcnkuc2libGluZyA9IGZ1bmN0aW9uKG4sIGVsZW0pewoJdmFyIHIgPSBbXTsKCglmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkgewoJCWlmICggbi5ub2RlVHlwZSA9PSAxICYmIG4gIT0gZWxlbSApCgkJCXIucHVzaCggbiApOwoJfQoKCXJldHVybiByOwp9OwoKcmV0dXJuOwoKd2luZG93LlNpenpsZSA9IFNpenpsZTsKCn0pKCk7CmpRdWVyeS5mbi5leHRlbmQoewoJZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKSwgbGVuZ3RoID0gMDsKCgkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCWxlbmd0aCA9IHJldC5sZW5ndGg7CgkJCWpRdWVyeS5maW5kKCBzZWxlY3RvciwgdGhpc1tpXSwgcmV0ICk7CgoJCQlpZiAoIGkgPiAwICkgewoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdHMgYXJlIHVuaXF1ZQoJCQkJZm9yICggdmFyIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggdmFyIHIgPSAwOyByIDwgbGVuZ3RoOyByKysgKSB7CgkJCQkJCWlmICggcmV0W3JdID09PSByZXRbbl0gKSB7CgkJCQkJCQlyZXQuc3BsaWNlKG4tLSwgMSk7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKAoJCQlqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSAmJgoJCQlqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJCXJldHVybiBzZWxlY3Rvci5jYWxsKCBlbGVtLCBpICk7CgkJCX0pIHx8CgoJCQlqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCBqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKCQkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxOwoJCQl9KSApLCAiZmlsdGVyIiwgc2VsZWN0b3IgKTsKCX0sCgoJY2xvc2VzdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciBwb3MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MudGVzdCggc2VsZWN0b3IgKSA/IGpRdWVyeShzZWxlY3RvcikgOiBudWxsLAoJCQljbG9zZXIgPSAwOwoKCQlyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJdmFyIGN1ciA9IHRoaXM7CgkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5KGN1cikuaXMoc2VsZWN0b3IpICkgewoJCQkJCWpRdWVyeS5kYXRhKGN1ciwgImNsb3Nlc3QiLCBjbG9zZXIpOwoJCQkJCXJldHVybiBjdXI7CgkJCQl9CgkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJCWNsb3NlcisrOwoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCWlmICggdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIiApCgkJCS8vIHRlc3Qgc3BlY2lhbCBjYXNlIHdoZXJlIGp1c3Qgb25lIHNlbGVjdG9yIGlzIHBhc3NlZCBpbgoJCQlpZiAoIGlzU2ltcGxlLnRlc3QoIHNlbGVjdG9yICkgKQoJCQkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzLCB0cnVlICksICJub3QiLCBzZWxlY3RvciApOwoJCQllbHNlCgkJCQlzZWxlY3RvciA9IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHRoaXMgKTsKCgkJdmFyIGlzQXJyYXlMaWtlID0gc2VsZWN0b3IubGVuZ3RoICYmIHNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aCAtIDFdICE9PSB1bmRlZmluZWQgJiYgIXNlbGVjdG9yLm5vZGVUeXBlOwoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGlzQXJyYXlMaWtlID8galF1ZXJ5LmluQXJyYXkoIHRoaXMsIHNlbGVjdG9yICkgPCAwIDogdGhpcyAhPSBzZWxlY3RvcjsKCQl9KTsKCX0sCgoJYWRkOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCBqUXVlcnkubWVyZ2UoCgkJCXRoaXMuZ2V0KCksCgkJCXR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvciApIDoKCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICkKCQkpKSk7Cgl9LAoKCWVxOiBmdW5jdGlvbiggaSApIHsKCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgK2kgKyAxICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICksCgkJCSJzbGljZSIsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpICk7Cgl9LAoKCW1hcDogZnVuY3Rpb24oIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBpKXsKCQkJcmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQl9KSk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9LAoKCWVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCBqUXVlcnkobnVsbCk7Cgl9Cn0pOwoKalF1ZXJ5LmVhY2goewoJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30sCglwYXJlbnRzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwYXJlbnROb2RlIik7fSwKCW5leHQ6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwibmV4dFNpYmxpbmciKTt9LAoJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAoJbmV4dEFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwibmV4dFNpYmxpbmciKTt9LAoJcHJldkFsbDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicHJldmlvdXNTaWJsaW5nIik7fSwKCXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKCWNoaWxkcmVuOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5maXJzdENoaWxkKTt9LAoJY29udGVudHM6IGZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubm9kZU5hbWUoZWxlbSwiaWZyYW1lIik/ZWxlbS5jb250ZW50RG9jdW1lbnR8fGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudDpqUXVlcnkubWFrZUFycmF5KGVsZW0uY2hpbGROb2Rlcyk7fQp9LCBmdW5jdGlvbihuYW1lLCBmbil7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgcmV0ID0galF1ZXJ5Lm1hcCggdGhpcywgZm4gKTsKCgkJaWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT0gInN0cmluZyIgKQoJCQlyZXQgPSBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCByZXQgKSwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pO2pRdWVyeS5mbi5leHRlbmQoewoJYXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXZhciBvcHRpb25zID0gbmFtZSwgaXNGdW5jdGlvbiA9IGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApOwoKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApIHsKCQkJLy8gQXJlIHdlIHNldHRpbmcgdGhlIGF0dHJpYnV0ZT8KCQkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHRoaXMubGVuZ3RoID8KCQkJCQlqUXVlcnkuYXR0ciggdGhpc1swXSwgbmFtZSApIDoKCQkJCQludWxsOwoKCQkJLy8gQ29udmVydCBuYW1lLCB2YWx1ZSBwYXJhbXMgdG8gb3B0aW9ucyBoYXNoIGZvcm1hdAoJCQl9IGVsc2UgewoJCQkJb3B0aW9ucyA9IHt9OwoJCQkJb3B0aW9uc1sgbmFtZSBdID0gdmFsdWU7CgkJCX0KCQl9CgoJCS8vIEZvciBlYWNoIGVsZW1lbnQuLi4KCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJdmFyIGVsZW0gPSB0aGlzW2ldOwoKCQkJLy8gU2V0IGFsbCB0aGUgYXR0cmlidXRlcwoJCQlmb3IgKCB2YXIgcHJvcCBpbiBvcHRpb25zICkgewoJCQkJdmFsdWUgPSBvcHRpb25zW3Byb3BdOwoKCQkJCWlmICggaXNGdW5jdGlvbiApIHsKCQkJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIGVsZW0sIGkgKTsKCQkJCX0KCgkJCQlqUXVlcnkuYXR0ciggZWxlbSwgcHJvcCwgdmFsdWUgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgdGhpcy5pcyggIi4iICsgc2VsZWN0b3IgKTsKCX0sCgoJdmFsOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQl2YXIgZWxlbSA9IHRoaXNbMF07CgoJCQlpZiAoIGVsZW0gKSB7CgkJCQlpZiggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAnb3B0aW9uJyApICkKCQkJCQlyZXR1cm4gKGVsZW0uYXR0cmlidXRlcy52YWx1ZSB8fCB7fSkuc3BlY2lmaWVkID8gZWxlbS52YWx1ZSA6IGVsZW0udGV4dDsKCgkJCQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBzZWxlY3QgYm94ZXMgc3BlY2lhbAoJCQkJaWYgKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJzZWxlY3QiICkgKSB7CgkJCQkJdmFyIGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LAoJCQkJCQl2YWx1ZXMgPSBbXSwKCQkJCQkJb3B0aW9ucyA9IGVsZW0ub3B0aW9ucywKCQkJCQkJb25lID0gZWxlbS50eXBlID09ICJzZWxlY3Qtb25lIjsKCgkJCQkJLy8gTm90aGluZyB3YXMgc2VsZWN0ZWQKCQkJCQlpZiAoIGluZGV4IDwgMCApCgkJCQkJCXJldHVybiBudWxsOwoKCQkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQkJZm9yICggdmFyIGkgPSBvbmUgPyBpbmRleCA6IDAsIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBpKysgKSB7CgkJCQkJCXZhciBvcHRpb24gPSBvcHRpb25zWyBpIF07CgoJCQkJCQlpZiAoIG9wdGlvbi5zZWxlY3RlZCApIHsKCQkJCQkJCS8vIEdldCB0aGUgc3BlY2lmYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQkJdmFsdWUgPSBqUXVlcnkob3B0aW9uKS52YWwoKTsKCgkJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQkJaWYgKCBvbmUgKQoJCQkJCQkJCXJldHVybiB2YWx1ZTsKCgkJCQkJCQkvLyBNdWx0aS1TZWxlY3RzIHJldHVybiBhbiBhcnJheQoJCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiB2YWx1ZXM7CgkJCQl9CgoJCQkJLy8gRXZlcnl0aGluZyBlbHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCgkJCQlyZXR1cm4gKGVsZW0udmFsdWUgfHwgIiIpLnJlcGxhY2UoL1xyL2csICIiKTsKCgkJCX0KCgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgKQoJCQl2YWx1ZSArPSAnJzsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpewoJCQlpZiAoIHRoaXMubm9kZVR5cGUgIT0gMSApCgkJCQlyZXR1cm47CgoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KHZhbHVlKSAmJiAvcmFkaW98Y2hlY2tib3gvLnRlc3QoIHRoaXMudHlwZSApICkKCQkJCXRoaXMuY2hlY2tlZCA9IChqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLCB2YWx1ZSkgPj0gMCB8fAoJCQkJCWpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSwgdmFsdWUpID49IDApOwoKCQkJZWxzZSBpZiAoIGpRdWVyeS5ub2RlTmFtZSggdGhpcywgInNlbGVjdCIgKSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbHVlKTsKCgkJCQlqUXVlcnkoICJvcHRpb24iLCB0aGlzICkuZWFjaChmdW5jdGlvbigpewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSAoalF1ZXJ5LmluQXJyYXkoIHRoaXMudmFsdWUsIHZhbHVlcyApID49IDAgfHwKCQkJCQkJalF1ZXJ5LmluQXJyYXkoIHRoaXMudGV4dCwgdmFsdWVzICkgPj0gMCk7CgkJCQl9KTsKCgkJCQlpZiAoICF2YWx1ZXMubGVuZ3RoICkKCQkJCQl0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKCgkJCX0gZWxzZQoJCQkJdGhpcy52YWx1ZSA9IHZhbHVlOwoJCX0pOwoJfQp9KTsKCmpRdWVyeS5lYWNoKHsKCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgewoJCWpRdWVyeS5hdHRyKCB0aGlzLCBuYW1lLCAiIiApOwoJCWlmICh0aGlzLm5vZGVUeXBlID09IDEpCgkJCXRoaXMucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7Cgl9LAoKCWFkZENsYXNzOiBmdW5jdGlvbiggY2xhc3NOYW1lcyApIHsKCQlqUXVlcnkuY2xhc3NOYW1lLmFkZCggdGhpcywgY2xhc3NOYW1lcyApOwoJfSwKCglyZW1vdmVDbGFzczogZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CgkJalF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUoIHRoaXMsIGNsYXNzTmFtZXMgKTsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzLCBzdGF0ZSApIHsKCQl2YXIgdHlwZSA9IHR5cGVvZiBjbGFzc05hbWVzOwoJCWlmICggdHlwZSA9PT0gInN0cmluZyIgKSB7CgkJCS8vIHRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzCgkJCXZhciBpc0Jvb2wgPSB0eXBlb2Ygc3RhdGUgPT09ICJib29sZWFuIiwgY2xhc3NOYW1lLCBpID0gMCwKCQkJCWNsYXNzTmFtZXMgPSBjbGFzc05hbWVzLnNwbGl0KCAvXHMrLyApOwoJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CgkJCQkvLyBjaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwZXJhdGVkIGxpc3QKCQkJCXN0YXRlID0gaXNCb29sID8gc3RhdGUgOiAhalF1ZXJ5LmNsYXNzTmFtZS5oYXMoIHRoaXMsIGNsYXNzTmFtZSApOwoJCQkJalF1ZXJ5LmNsYXNzTmFtZVsgc3RhdGUgPyAiYWRkIiA6ICJyZW1vdmUiIF0oIHRoaXMsIGNsYXNzTmFtZSApOwoJCQl9CgkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgewoJCQlpZiAoIHRoaXMuY2xhc3NOYW1lICkgewoJCQkJLy8gc3RvcmUgY2xhc3NOYW1lIGlmIHNldAoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsICJfX2NsYXNzTmFtZV9fIiwgdGhpcy5jbGFzc05hbWUgKTsKCQkJfQoJCQkvLyB0b2dnbGUgd2hvbGUgY2xhc3NOYW1lCgkJCXRoaXMuY2xhc3NOYW1lID0gdGhpcy5jbGFzc05hbWUgfHwgY2xhc3NOYW1lcyA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIgKSB8fCAiIjsKCQl9Cgl9Cn0sIGZ1bmN0aW9uKG5hbWUsIGZuKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gdGhpcy5lYWNoKCBmbiwgYXJndW1lbnRzICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoJY2xhc3NOYW1lOiB7CgkJLy8gaW50ZXJuYWwgb25seSwgdXNlIGFkZENsYXNzKCJjbGFzcyIpCgkJYWRkOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKCQkJalF1ZXJ5LmVhY2goKGNsYXNzTmFtZXMgfHwgIiIpLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaSwgY2xhc3NOYW1lKXsKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PSAxICYmICFqUXVlcnkuY2xhc3NOYW1lLmhhcyggZWxlbS5jbGFzc05hbWUsIGNsYXNzTmFtZSApICkKCQkJCQllbGVtLmNsYXNzTmFtZSArPSAoZWxlbS5jbGFzc05hbWUgPyAiICIgOiAiIikgKyBjbGFzc05hbWU7CgkJCX0pOwoJCX0sCgoJCS8vIGludGVybmFsIG9ubHksIHVzZSByZW1vdmVDbGFzcygiY2xhc3MiKQoJCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZXMgKSB7CgkJCWlmIChlbGVtLm5vZGVUeXBlID09IDEpCgkJCQllbGVtLmNsYXNzTmFtZSA9IGNsYXNzTmFtZXMgIT09IHVuZGVmaW5lZCA/CgkJCQkJalF1ZXJ5LmdyZXAoZWxlbS5jbGFzc05hbWUuc3BsaXQoL1xzKy8pLCBmdW5jdGlvbihjbGFzc05hbWUpewoJCQkJCQlyZXR1cm4gIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBjbGFzc05hbWVzLCBjbGFzc05hbWUgKTsKCQkJCQl9KS5qb2luKCIgIikgOgoJCQkJCSIiOwoJCX0sCgoJCS8vIGludGVybmFsIG9ubHksIHVzZSBoYXNDbGFzcygiY2xhc3MiKQoJCWhhczogZnVuY3Rpb24oIGVsZW0sIGNsYXNzTmFtZSApIHsKCQkJcmV0dXJuIGVsZW0gJiYgalF1ZXJ5LmluQXJyYXkoIGNsYXNzTmFtZSwgKGVsZW0uY2xhc3NOYW1lIHx8IGVsZW0pLnRvU3RyaW5nKCkuc3BsaXQoL1xzKy8pICkgPiAtMTsKCQl9Cgl9LAoKCWF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQkvLyBkb24ndCBzZXQgYXR0cmlidXRlcyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT0gMyB8fCBlbGVtLm5vZGVUeXBlID09IDgpCgkJCXJldHVybiB1bmRlZmluZWQ7CgoJCXZhciBub3R4bWwgPSAhZWxlbS50YWdOYW1lIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSwKCQkJLy8gV2hldGhlciB3ZSBhcmUgc2V0dGluZyAob3IgZ2V0dGluZykKCQkJc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKCgkJLy8gVHJ5IHRvIG5vcm1hbGl6ZS9maXggdGhlIG5hbWUKCQluYW1lID0gbm90eG1sICYmIGpRdWVyeS5wcm9wc1sgbmFtZSBdIHx8IG5hbWU7CgoJCS8vIE9ubHkgZG8gYWxsIHRoZSBmb2xsb3dpbmcgaWYgdGhpcyBpcyBhIG5vZGUgKGZhc3RlciBmb3Igc3R5bGUpCgkJaWYgKCBlbGVtLnRhZ05hbWUgKSB7CgoJCQkvLyBUaGVzZSBhdHRyaWJ1dGVzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKCQkJdmFyIHNwZWNpYWwgPSAvaHJlZnxzcmN8c3R5bGUvLnRlc3QoIG5hbWUgKTsKCgkJCS8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVmYXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhIGhpZGRlbiBvcHRpb24KCQkJLy8gQWNjZXNzaW5nIHRoZSBwYXJlbnQncyBzZWxlY3RlZEluZGV4IHByb3BlcnR5IGZpeGVzIGl0CgkJCWlmICggbmFtZSA9PSAic2VsZWN0ZWQiICYmIGVsZW0ucGFyZW50Tm9kZSApCgkJCQllbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKCgkJCS8vIElmIGFwcGxpY2FibGUsIGFjY2VzcyB0aGUgYXR0cmlidXRlIHZpYSB0aGUgRE9NIDAgd2F5CgkJCWlmICggbmFtZSBpbiBlbGVtICYmIG5vdHhtbCAmJiAhc3BlY2lhbCApIHsKCQkJCWlmICggc2V0ICl7CgkJCQkJLy8gV2UgY2FuJ3QgYWxsb3cgdGhlIHR5cGUgcHJvcGVydHkgdG8gYmUgY2hhbmdlZCAoc2luY2UgaXQgY2F1c2VzIHByb2JsZW1zIGluIElFKQoJCQkJCWlmICggbmFtZSA9PSAidHlwZSIgJiYgZWxlbS5ub2RlTmFtZS5tYXRjaCgvKGJ1dHRvbnxpbnB1dCkvaSkgJiYgZWxlbS5wYXJlbnROb2RlICkKCQkJCQkJdGhyb3cgInR5cGUgcHJvcGVydHkgY2FuJ3QgYmUgY2hhbmdlZCI7CgoJCQkJCWVsZW1bIG5hbWUgXSA9IHZhbHVlOwoJCQkJfQoKCQkJCS8vIGJyb3dzZXJzIGluZGV4IGVsZW1lbnRzIGJ5IGlkL25hbWUgb24gZm9ybXMsIGdpdmUgcHJpb3JpdHkgdG8gYXR0cmlidXRlcy4KCQkJCWlmKCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJmb3JtIiApICYmIGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSApCgkJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApLm5vZGVWYWx1ZTsKCgkJCQkvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0CgkJCQkvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0LwoJCQkJaWYgKCBuYW1lID09ICJ0YWJJbmRleCIgKSB7CgkJCQkJdmFyIGF0dHJpYnV0ZU5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoICJ0YWJJbmRleCIgKTsKCQkJCQlyZXR1cm4gYXR0cmlidXRlTm9kZSAmJiBhdHRyaWJ1dGVOb2RlLnNwZWNpZmllZAoJCQkJCQk/IGF0dHJpYnV0ZU5vZGUudmFsdWUKCQkJCQkJOiBlbGVtLm5vZGVOYW1lLm1hdGNoKC8oYnV0dG9ufGlucHV0fG9iamVjdHxzZWxlY3R8dGV4dGFyZWEpL2kpCgkJCQkJCQk/IDAKCQkJCQkJCTogZWxlbS5ub2RlTmFtZS5tYXRjaCgvXihhfGFyZWEpJC9pKSAmJiBlbGVtLmhyZWYKCQkJCQkJCQk/IDAKCQkJCQkJCQk6IHVuZGVmaW5lZDsKCQkJCX0KCgkJCQlyZXR1cm4gZWxlbVsgbmFtZSBdOwoJCQl9CgoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5zdHlsZSAmJiBub3R4bWwgJiYgbmFtZSA9PSAic3R5bGUiICkgewoJCQkJaWYgKCBzZXQgKQoJCQkJCWVsZW0uc3R5bGUuY3NzVGV4dCA9ICIiICsgdmFsdWU7CgoJCQkJcmV0dXJuIGVsZW0uc3R5bGUuY3NzVGV4dDsKCQkJfQoKCQkJaWYgKCBzZXQgKQoJCQkJLy8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcgKGFsbCBicm93c2VycyBkbyB0aGlzIGJ1dCBJRSkgc2VlICMxMDcwCgkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgIiIgKyB2YWx1ZSApOwoKCQkJdmFyIGF0dHIgPSAhalF1ZXJ5LnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWQgJiYgbm90eG1sICYmIHNwZWNpYWwKCQkJCQkvLyBTb21lIGF0dHJpYnV0ZXMgcmVxdWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQoJCQkJCT8gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIDIgKQoJCQkJCTogZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTsKCgkJCS8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkCgkJCXJldHVybiBhdHRyID09PSBudWxsID8gdW5kZWZpbmVkIDogYXR0cjsKCQl9CgoJCS8vIGVsZW0gaXMgYWN0dWFsbHkgZWxlbS5zdHlsZSAuLi4gc2V0IHRoZSBzdHlsZQoJCS8vIFVzaW5nIGF0dHIgZm9yIHNwZWNpZmljIHN0eWxlIGluZm9ybWF0aW9uIGlzIG5vdyBkZXByZWNhdGVkLiBVc2Ugc3R5bGUgaW5zZWFkLgoJCXJldHVybiBqUXVlcnkuc3R5bGUoZWxlbSwgbmFtZSwgdmFsdWUpOwoJfQp9KTtqUXVlcnkuZm4uZXh0ZW5kKHsKCXRleHQ6IGZ1bmN0aW9uKCB0ZXh0ICkgewoJCWlmICggdHlwZW9mIHRleHQgIT09ICJvYmplY3QiICYmIHRleHQgIT0gbnVsbCApCgkJCXJldHVybiB0aGlzLmVtcHR5KCkuYXBwZW5kKCAodGhpc1swXSAmJiB0aGlzWzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKCB0ZXh0ICkgKTsKCgkJdmFyIHJldCA9ICIiOwoKCQlqUXVlcnkuZWFjaCggdGV4dCB8fCB0aGlzLCBmdW5jdGlvbigpewoJCQlqUXVlcnkuZWFjaCggdGhpcy5jaGlsZE5vZGVzLCBmdW5jdGlvbigpewoJCQkJaWYgKCB0aGlzLm5vZGVUeXBlICE9IDggKQoJCQkJCXJldCArPSB0aGlzLm5vZGVUeXBlICE9IDEgPwoJCQkJCQl0aGlzLm5vZGVWYWx1ZSA6CgkJCQkJCWpRdWVyeS5mbi50ZXh0KCBbIHRoaXMgXSApOwoJCQl9KTsKCQl9KTsKCgkJcmV0dXJuIHJldDsKCX0sCgoJd3JhcEFsbDogZnVuY3Rpb24oIGh0bWwgKSB7CgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuY2xvbmUoKTsKCgkJCWlmICggdGhpc1swXS5wYXJlbnROb2RlICkKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgoJCQl3cmFwLm1hcChmdW5jdGlvbigpewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICkKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQodGhpcyk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJd3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeSggdGhpcyApLmNvbnRlbnRzKCkud3JhcEFsbCggaHRtbCApOwoJCX0pOwoJfSwKCgl3cmFwOiBmdW5jdGlvbiggaHRtbCApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKCQl9KTsKCX0sCgoJYXBwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0pewoJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCX0pOwoJfSwKCglwcmVwZW5kOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIGZ1bmN0aW9uKGVsZW0pewoJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQoJCQkJdGhpcy5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMuZmlyc3RDaGlsZCApOwoJCX0pOwoJfSwKCgliZWZvcmU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKGVsZW0pewoJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzICk7CgkJfSk7Cgl9LAoKCWFmdGVyOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmdW5jdGlvbihlbGVtKXsKCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApOwoJCX0pOwoJfSwKCgljbG9uZTogZnVuY3Rpb24oIGV2ZW50cyApIHsKCQkvLyBEbyB0aGUgY2xvbmUKCQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKXsKCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ICYmICFqUXVlcnkuaXNYTUxEb2ModGhpcykgKSB7CgkJCQkvLyBJRSBjb3BpZXMgZXZlbnRzIGJvdW5kIHZpYSBhdHRhY2hFdmVudCB3aGVuCgkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlCgkJCQkvLyBjbG9uZSB3aWxsIGFsc28gcmVtb3ZlIHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ25hbAoJCQkJLy8gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2UgaW5uZXJIVE1MLgoJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KCQkJCS8vIGF0dHJpYnV0ZXMgaW4gSUUgdGhhdCBhcmUgYWN0dWFsbHkgb25seSBzdG9yZWQKCQkJCS8vIGFzIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgY29waWVkIChzdWNoIGFzIHRoZQoJCQkJLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0KS4KCQkJCXZhciBodG1sID0gdGhpcy5vdXRlckhUTUwsIG93bmVyRG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQ7CgkJCQlpZiAoICFodG1sICkgewoJCQkJCXZhciBkaXYgPSBvd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoJCQkJCWRpdi5hcHBlbmRDaGlsZCggdGhpcy5jbG9uZU5vZGUodHJ1ZSkgKTsKCQkJCQlodG1sID0gZGl2LmlubmVySFRNTDsKCQkJCX0KCgkJCQlyZXR1cm4galF1ZXJ5LmNsZWFuKFtodG1sLnJlcGxhY2UoLyBqUXVlcnlcZCs9Iig/OlxkK3xudWxsKSIvZywgIiIpLnJlcGxhY2UoL15ccyovLCAiIildLCBvd25lckRvY3VtZW50KVswXTsKCQkJfSBlbHNlCgkJCQlyZXR1cm4gdGhpcy5jbG9uZU5vZGUodHJ1ZSk7CgkJfSk7CgoJCS8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmUKCQlpZiAoIGV2ZW50cyA9PT0gdHJ1ZSApIHsKCQkJdmFyIG9yaWcgPSB0aGlzLmZpbmQoIioiKS5hbmRTZWxmKCksIGkgPSAwOwoKCQkJcmV0LmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbigpewoJCQkJaWYgKCB0aGlzLm5vZGVOYW1lICE9PSBvcmlnW2ldLm5vZGVOYW1lICkKCQkJCQlyZXR1cm47CgoJCQkJdmFyIGV2ZW50cyA9IGpRdWVyeS5kYXRhKCBvcmlnW2ldLCAiZXZlbnRzIiApOwoKCQkJCWZvciAoIHZhciB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQlmb3IgKCB2YXIgaGFuZGxlciBpbiBldmVudHNbIHR5cGUgXSApIHsKCQkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXS5kYXRhICk7CgkJCQkJfQoJCQkJfQoKCQkJCWkrKzsKCQkJfSk7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXQKCQlyZXR1cm4gcmV0OwoJfSwKCglodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgPwoJCQkodGhpc1swXSA/CgkJCQl0aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKC8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csICIiKSA6CgkJCQludWxsKSA6CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7Cgl9LAoKCXJlcGxhY2VXaXRoOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHRoaXMuYWZ0ZXIoIHZhbHVlICkucmVtb3ZlKCk7Cgl9LAoKCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIGNhbGxiYWNrICkgewoJCWlmICggdGhpc1swXSApIHsKCQkJdmFyIGZyYWdtZW50ID0gKHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCB0aGlzWzBdKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksCgkJCQlzY3JpcHRzID0galF1ZXJ5LmNsZWFuKCBhcmdzLCAodGhpc1swXS5vd25lckRvY3VtZW50IHx8IHRoaXNbMF0pLCBmcmFnbWVudCApLAoJCQkJZmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkOwoKCQkJaWYgKCBmaXJzdCApCgkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApCgkJCQkJY2FsbGJhY2suY2FsbCggcm9vdCh0aGlzW2ldLCBmaXJzdCksIHRoaXMubGVuZ3RoID4gMSB8fCBpID4gMCA/CgkJCQkJCQlmcmFnbWVudC5jbG9uZU5vZGUodHJ1ZSkgOiBmcmFnbWVudCApOwoKCQkJaWYgKCBzY3JpcHRzICkKCQkJCWpRdWVyeS5lYWNoKCBzY3JpcHRzLCBldmFsU2NyaXB0ICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCgkJZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgewoJCQlyZXR1cm4gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJ0YWJsZSIpICYmIGpRdWVyeS5ub2RlTmFtZShjdXIsICJ0ciIpID8KCQkJCShlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8CgkJCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgoJCQkJZWxlbTsKCQl9Cgl9Cn0pOwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKG5hbWUsIG9yaWdpbmFsKXsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwgaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApOwoKCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbnNlcnQubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQl2YXIgZWxlbXMgPSAoaSA+IDAgPyB0aGlzLmNsb25lKHRydWUpIDogdGhpcykuZ2V0KCk7CgkJCWpRdWVyeS5mblsgb3JpZ2luYWwgXS5hcHBseSggalF1ZXJ5KGluc2VydFtpXSksIGVsZW1zICk7CgkJCXJldCA9IHJldC5jb25jYXQoIGVsZW1zICk7CgkJfQoKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgc2VsZWN0b3IgKTsKCX07Cn0pOwoKalF1ZXJ5LmVhY2goewoJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJaWYgKCAhc2VsZWN0b3IgfHwgalF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgWyB0aGlzIF0gKS5sZW5ndGggKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWNsZWFuRGF0YSggalF1ZXJ5KCIqIiwgdGhpcykuYWRkKHRoaXMpICk7CgkJCX0KCgkJCWlmICggdGhpcy5wYXJlbnROb2RlICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0aGlzICk7CgkJCX0KCQl9Cgl9LAoKCWVtcHR5OiBmdW5jdGlvbigpIHsKCQkvLyBSZW1vdmUgZWxlbWVudCBub2RlcyBhbmQgcHJldmVudCBtZW1vcnkgbGVha3MKCQlpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgKSB7CgkJCWNsZWFuRGF0YSggalF1ZXJ5KCIqIiwgdGhpcykgKTsKCQl9CgoJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCgkJd2hpbGUgKCB0aGlzLmZpcnN0Q2hpbGQgKSB7CgkJCXRoaXMucmVtb3ZlQ2hpbGQoIHRoaXMuZmlyc3RDaGlsZCApOwoJCX0KCX0KfSwgZnVuY3Rpb24obmFtZSwgZm4pewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigpewoJCXJldHVybiB0aGlzLmVhY2goIGZuLCBhcmd1bWVudHMgKTsKCX07Cn0pOwoKalF1ZXJ5LmV4dGVuZCh7CgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCApIHsKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKQoJCQljb250ZXh0ID0gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHRbMF0gJiYgY29udGV4dFswXS5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50OwoKCQkvLyBJZiBhIHNpbmdsZSBzdHJpbmcgaXMgcGFzc2VkIGluIGFuZCBpdCdzIGEgc2luZ2xlIHRhZwoJCS8vIGp1c3QgZG8gYSBjcmVhdGVFbGVtZW50IGFuZCBza2lwIHRoZSByZXN0CgkJaWYgKCAhZnJhZ21lbnQgJiYgZWxlbXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBlbGVtc1swXSA9PT0gInN0cmluZyIgKSB7CgkJCXZhciBtYXRjaCA9IC9ePChcdyspXHMqXC8/PiQvLmV4ZWMoZWxlbXNbMF0pOwoJCQlpZiAoIG1hdGNoICkKCQkJCXJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggbWF0Y2hbMV0gKSBdOwoJCX0KCgkJdmFyIHJldCA9IFtdLCBzY3JpcHRzID0gW10sIGRpdiA9IGNvbnRleHQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKXsKCQkJaWYgKCB0eXBlb2YgZWxlbSA9PT0gIm51bWJlciIgKQoJCQkJZWxlbSArPSAnJzsKCgkJCWlmICggIWVsZW0gKQoJCQkJcmV0dXJuOwoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCS8vIEZpeCAiWEhUTUwiLXN0eWxlIHRhZ3MgaW4gYWxsIGJyb3dzZXJzCgkJCQllbGVtID0gZWxlbS5yZXBsYWNlKC8oPChcdyspW14+XSo/KVwvPi9nLCBmdW5jdGlvbihhbGwsIGZyb250LCB0YWcpewoJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPwoJCQkJCQlhbGwgOgoJCQkJCQlmcm9udCArICI+PC8iICsgdGFnICsgIj4iOwoJCQkJfSk7CgoJCQkJLy8gVHJpbSB3aGl0ZXNwYWNlLCBvdGhlcndpc2UgaW5kZXhPZiB3b24ndCB3b3JrIGFzIGV4cGVjdGVkCgkJCQl2YXIgdGFncyA9IGVsZW0ucmVwbGFjZSgvXlxzKy8sICIiKS5zdWJzdHJpbmcoMCwgMTApLnRvTG93ZXJDYXNlKCk7CgoJCQkJdmFyIHdyYXAgPQoJCQkJCS8vIG9wdGlvbiBvciBvcHRncm91cAoJCQkJCSF0YWdzLmluZGV4T2YoIjxvcHQiKSAmJgoJCQkJCVsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjxsZWciKSAmJgoJCQkJCVsgMSwgIjxmaWVsZHNldD4iLCAiPC9maWVsZHNldD4iIF0gfHwKCgkJCQkJdGFncy5tYXRjaCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykgJiYKCQkJCQlbIDEsICI8dGFibGU+IiwgIjwvdGFibGU+IiBdIHx8CgoJCQkJCSF0YWdzLmluZGV4T2YoIjx0ciIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSB8fAoKCQkJCSAJLy8gPHRoZWFkPiBtYXRjaGVkIGFib3ZlCgkJCQkJKCF0YWdzLmluZGV4T2YoIjx0ZCIpIHx8ICF0YWdzLmluZGV4T2YoIjx0aCIpKSAmJgoJCQkJCVsgMywgIjx0YWJsZT48dGJvZHk+PHRyPiIsICI8L3RyPjwvdGJvZHk+PC90YWJsZT4iIF0gfHwKCgkJCQkJIXRhZ3MuaW5kZXhPZigiPGNvbCIpICYmCgkJCQkJWyAyLCAiPHRhYmxlPjx0Ym9keT48L3Rib2R5Pjxjb2xncm91cD4iLCAiPC9jb2xncm91cD48L3RhYmxlPiIgXSB8fAoKCQkJCQkvLyBJRSBjYW4ndCBzZXJpYWxpemUgPGxpbms+IGFuZCA8c2NyaXB0PiB0YWdzIG5vcm1hbGx5CgkJCQkJIWpRdWVyeS5zdXBwb3J0Lmh0bWxTZXJpYWxpemUgJiYKCQkJCQlbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF0gfHwKCgkJCQkJWyAwLCAiIiwgIiIgXTsKCgkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQlkaXYuaW5uZXJIVE1MID0gd3JhcFsxXSArIGVsZW0gKyB3cmFwWzJdOwoKCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCgkJCQl3aGlsZSAoIHdyYXBbMF0tLSApCgkJCQkJZGl2ID0gZGl2Lmxhc3RDaGlsZDsKCgkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQudGJvZHkgKSB7CgoJCQkJCS8vIFN0cmluZyB3YXMgYSA8dGFibGU+LCAqbWF5KiBoYXZlIHNwdXJpb3VzIDx0Ym9keT4KCQkJCQl2YXIgaGFzQm9keSA9IC88dGJvZHkvaS50ZXN0KGVsZW0pLAoJCQkJCQl0Ym9keSA9ICF0YWdzLmluZGV4T2YoIjx0YWJsZSIpICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CgkJCQkJCXdyYXBbMV0gPT0gIjx0YWJsZT4iICYmICFoYXNCb2R5ID8KCQkJCQkJCWRpdi5jaGlsZE5vZGVzIDoKCQkJCQkJCVtdOwoKCQkJCQlmb3IgKCB2YXIgaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApCgkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKQoJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgoJCQkJCX0KCgkJCQkvLyBJRSBjb21wbGV0ZWx5IGtpbGxzIGxlYWRpbmcgd2hpdGVzcGFjZSB3aGVuIGlubmVySFRNTCBpcyB1c2VkCgkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiAvXlxzLy50ZXN0KCBlbGVtICkgKQoJCQkJCWRpdi5pbnNlcnRCZWZvcmUoIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0ubWF0Y2goL15ccyovKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoKCQkJCWVsZW0gPSBqUXVlcnkubWFrZUFycmF5KCBkaXYuY2hpbGROb2RlcyApOwoJCQl9CgoJCQlpZiAoIGVsZW0ubm9kZVR5cGUgKQoJCQkJcmV0LnB1c2goIGVsZW0gKTsKCQkJZWxzZQoJCQkJcmV0ID0galF1ZXJ5Lm1lcmdlKCByZXQsIGVsZW0gKTsKCgkJfSk7CgoJCWlmICggZnJhZ21lbnQgKSB7CgkJCWZvciAoIHZhciBpID0gMDsgcmV0W2ldOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggcmV0W2ldLCAic2NyaXB0IiApICYmICghcmV0W2ldLnR5cGUgfHwgcmV0W2ldLnR5cGUudG9Mb3dlckNhc2UoKSA9PT0gInRleHQvamF2YXNjcmlwdCIpICkgewoJCQkJCXNjcmlwdHMucHVzaCggcmV0W2ldLnBhcmVudE5vZGUgPyByZXRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggcmV0W2ldICkgOiByZXRbaV0gKTsKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKQoJCQkJCQlyZXQuc3BsaWNlLmFwcGx5KCByZXQsIFtpICsgMSwgMF0uY29uY2F0KGpRdWVyeS5tYWtlQXJyYXkocmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSkpICk7CgkJCQkJZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIHJldFtpXSApOwoJCQkJfQoJCQl9CgoJCQlyZXR1cm4gc2NyaXB0czsKCQl9CgoJCXJldHVybiByZXQ7Cgl9Cn0pOwoKZnVuY3Rpb24gY2xlYW5EYXRhKCBlbGVtcyApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGVsZW1zLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgaWQgPSBlbGVtc1tpXVtleHBhbmRvXTsKCQlpZiAoIGlkICkgewoJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBdOwoJCX0KCX0KfQovKgogKiBBIG51bWJlciBvZiBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgZm9yIG1hbmFnaW5nIGV2ZW50cy4KICogTWFueSBvZiB0aGUgaWRlYXMgYmVoaW5kIHRoaXMgY29kZSBvcmlnaW5hdGVkIGZyb20KICogRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5LgogKi8KalF1ZXJ5LmV2ZW50ID0gewoKCS8vIEJpbmQgYW4gZXZlbnQgdG8gYW4gZWxlbWVudAoJLy8gT3JpZ2luYWwgYnkgRGVhbiBFZHdhcmRzCglhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSApIHsKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRm9yIHdoYXRldmVyIHJlYXNvbiwgSUUgaGFzIHRyb3VibGUgcGFzc2luZyB0aGUgd2luZG93IG9iamVjdAoJCS8vIGFyb3VuZCwgY2F1c2luZyBpdCB0byBiZSBjbG9uZWQgaW4gdGhlIHByb2Nlc3MKCQlpZiAoIGVsZW0uc2V0SW50ZXJ2YWwgJiYgKCBlbGVtICE9PSB3aW5kb3cgJiYgIWVsZW0uZnJhbWVFbGVtZW50ICkgKSB7CgkJCWVsZW0gPSB3aW5kb3c7CgkJfQoKCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgaGFzIGEgdW5pcXVlIElECgkJaWYgKCAhaGFuZGxlci5ndWlkICkgewoJCQloYW5kbGVyLmd1aWQgPSB0aGlzLmd1aWQrKzsKCQl9CgoJCS8vIGlmIGRhdGEgaXMgcGFzc2VkLCBiaW5kIHRvIGhhbmRsZXIKCQlpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHsKCQkJLy8gQ3JlYXRlIHRlbXBvcmFyeSBmdW5jdGlvbiBwb2ludGVyIHRvIG9yaWdpbmFsIGhhbmRsZXIKCQkJdmFyIGZuID0gaGFuZGxlcjsKCgkJCS8vIENyZWF0ZSB1bmlxdWUgaGFuZGxlciBmdW5jdGlvbiwgd3JhcHBlZCBhcm91bmQgb3JpZ2luYWwgaGFuZGxlcgoJCQloYW5kbGVyID0gdGhpcy5wcm94eSggZm4gKTsKCgkJCS8vIFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhhbmRsZXIKCQkJaGFuZGxlci5kYXRhID0gZGF0YTsKCQl9CgoJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUKCQl2YXIgZXZlbnRzID0galF1ZXJ5LmRhdGEoIGVsZW0sICJldmVudHMiICkgfHwgalF1ZXJ5LmRhdGEoIGVsZW0sICJldmVudHMiLCB7fSApLAoJCQloYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKSB8fCBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIsIGZ1bmN0aW9uKCkgewoJCQkJLy8gSGFuZGxlIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSB0cmlnZ2VyIGFuZCB3aGVuCgkJCQkvLyBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAoJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmICFqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID8KCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBhcmd1bWVudHMuY2FsbGVlLmVsZW0sIGFyZ3VtZW50cyApIDoKCQkJCQl1bmRlZmluZWQ7CgkJCX0pOwoJCS8vIEFkZCBlbGVtIGFzIGEgcHJvcGVydHkgb2YgdGhlIGhhbmRsZSBmdW5jdGlvbgoJCS8vIFRoaXMgaXMgdG8gcHJldmVudCBhIG1lbW9yeSBsZWFrIHdpdGggbm9uLW5hdGl2ZQoJCS8vIGV2ZW50IGluIElFLgoJCWhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCAvXHMrLyApOwoJCXZhciB0eXBlLCBpPTA7CgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCWhhbmRsZXIudHlwZSA9IG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJLy8gR2V0IHRoZSBjdXJyZW50IGxpc3Qgb2YgZnVuY3Rpb25zIGJvdW5kIHRvIHRoaXMgZXZlbnQKCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0sCgkJCQlzcGVjaWFsID0gdGhpcy5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQlpZiAoIHNwZWNpYWwuYWRkICkgewoJCQkJdmFyIG1vZGlmaWVkSGFuZGxlciA9IHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZXIsIGRhdGEsIG5hbWVzcGFjZXMgKTsKCQkJCWlmICggbW9kaWZpZWRIYW5kbGVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBtb2RpZmllZEhhbmRsZXIgKSApIHsKCQkJCQltb2RpZmllZEhhbmRsZXIuZ3VpZCA9IG1vZGlmaWVkSGFuZGxlci5ndWlkIHx8IGhhbmRsZXIuZ3VpZDsKCQkJCQloYW5kbGVyID0gbW9kaWZpZWRIYW5kbGVyOwoJCQkJfQoJCQl9CgoJCQkvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlCgkJCWlmICggIWhhbmRsZXJzICkgewoJCQkJaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IHt9OwoKCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZlbnQgaGFuZGxlcgoJCQkJLy8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lci9hdHRhY2hFdmVudCBpZiB0aGUgc3BlY2lhbAoJCQkJLy8gZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZQoJCQkJaWYgKCAhc3BlY2lhbC5zZXR1cCB8fCBzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMgKSA9PT0gZmFsc2UgKSB7CgkJCQkJLy8gQmluZCB0aGUgZ2xvYmFsIGV2ZW50IGhhbmRsZXIgdG8gdGhlIGVsZW1lbnQKCQkJCQlpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHsKCQkJCQkJZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUsIGZhbHNlICk7CgkJCQkJfSBlbHNlIGlmICggZWxlbS5hdHRhY2hFdmVudCApIHsKCQkJCQkJZWxlbS5hdHRhY2hFdmVudCggIm9uIiArIHR5cGUsIGhhbmRsZSApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gQWRkIHRoZSBmdW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAoJCQloYW5kbGVyc1sgaGFuZGxlci5ndWlkIF0gPSBoYW5kbGVyOwoKCQkJLy8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBiZWVuIHVzZWQsIGZvciBnbG9iYWwgdHJpZ2dlcmluZwoJCQl0aGlzLmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTsKCQl9CgoJCS8vIE51bGxpZnkgZWxlbSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQoJCWVsZW0gPSBudWxsOwoJfSwKCglndWlkOiAxLAoJZ2xvYmFsOiB7fSwKCgkvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyICkgewoJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YSggZWxlbSwgImV2ZW50cyIgKSwgcmV0LCB0eXBlOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CgkJCWlmICggdHlwZXMgPT09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT09ICIuIikgKSB7CgkJCQlmb3IgKCB0eXBlIGluIGV2ZW50cyApIHsKCQkJCQl0aGlzLnJlbW92ZSggZWxlbSwgdHlwZSArICh0eXBlcyB8fCAiIikgKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCgkJCQlpZiAoIHR5cGVzLnR5cGUgKSB7CgkJCQkJaGFuZGxlciA9IHR5cGVzLmhhbmRsZXI7CgkJCQkJdHlwZXMgPSB0eXBlcy50eXBlOwoJCQkJfQoKCQkJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwZXJhdGVkIGJ5IGEgc3BhY2UKCQkJCS8vIGpRdWVyeSguLi4pLnVuYmluZCgibW91c2VvdmVyIG1vdXNlb3V0IiwgZm4pOwoJCQkJdHlwZXMgPSB0eXBlcy5zcGxpdCgvXHMrLyk7CgkJCQl2YXIgaSA9IDA7CgkJCQl3aGlsZSAoICh0eXBlID0gdHlwZXNbIGkrKyBdKSApIHsKCQkJCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCgkJCQkJdmFyIG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCIuIik7CgkJCQkJdHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKCQkJCQl2YXIgYWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoLAoJCQkJCQluYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIiksCgkJCQkJCXNwZWNpYWwgPSB0aGlzLnNwZWNpYWxbIHR5cGUgXSB8fCB7fTsKCgkJCQkJaWYgKCBldmVudHNbIHR5cGUgXSApIHsKCQkJCQkJLy8gcmVtb3ZlIHRoZSBnaXZlbiBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZQoJCQkJCQlpZiAoIGhhbmRsZXIgKSB7CgkJCQkJCQlkZWxldGUgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIuZ3VpZCBdOwoKCQkJCQkJLy8gcmVtb3ZlIGFsbCBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIHR5cGUKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCWZvciAoIHZhciBoYW5kbGUgaW4gZXZlbnRzWyB0eXBlIF0gKSB7CgkJCQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFsIG9mIG5hbWVzcGFjZWQgZXZlbnRzCgkJCQkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGV2ZW50c1sgdHlwZSBdWyBoYW5kbGUgXS50eXBlICkgKSB7CgkJCQkJCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXVsgaGFuZGxlIF07CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQlpZiAoIHNwZWNpYWwucmVtb3ZlICkgewoJCQkJCQkJc3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgbmFtZXNwYWNlcyApOwoJCQkJCQl9CgoJCQkJCQkvLyByZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3QKCQkJCQkJZm9yICggcmV0IGluIGV2ZW50c1sgdHlwZSBdICkgewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQkJaWYgKCAhcmV0ICkgewoJCQkJCQkJaWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fCBzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCQkJaWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7CgkJCQkJCQkJCWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgalF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICksIGZhbHNlICk7CgkJCQkJCQkJfSBlbHNlIGlmICggZWxlbS5kZXRhY2hFdmVudCApIHsKCQkJCQkJCQkJZWxlbS5kZXRhY2hFdmVudCggIm9uIiArIHR5cGUsIGpRdWVyeS5kYXRhKCBlbGVtLCAiaGFuZGxlIiApICk7CgkJCQkJCQkJfQoJCQkJCQkJfQoJCQkJCQkJcmV0ID0gbnVsbDsKCQkJCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKCQkJZm9yICggcmV0IGluIGV2ZW50cyApIHsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmICggIXJldCApIHsKCQkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YSggZWxlbSwgImhhbmRsZSIgKTsKCQkJCWlmICggaGFuZGxlICkgewoJCQkJCWhhbmRsZS5lbGVtID0gbnVsbDsKCQkJCX0KCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sICJoYW5kbGUiICk7CgkJCX0KCQl9Cgl9LAoKCS8vIGJ1YmJsaW5nIGlzIGludGVybmFsCgl0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0gLyosIGJ1YmJsaW5nICovICkgewoJCS8vIEV2ZW50IG9iamVjdCBvciBldmVudCB0eXBlCgkJdmFyIHR5cGUgPSBldmVudC50eXBlIHx8IGV2ZW50LAoJCQlidWJibGluZyA9IGFyZ3VtZW50c1szXTsKCgkJaWYgKCAhYnViYmxpbmcgKSB7CgkJCWV2ZW50ID0gdHlwZW9mIGV2ZW50ID09PSAib2JqZWN0IiA/CgkJCQkvLyBqUXVlcnkuRXZlbnQgb2JqZWN0CgkJCQlldmVudFtleHBhbmRvXSA/IGV2ZW50IDoKCQkJCS8vIE9iamVjdCBsaXRlcmFsCgkJCQlqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuRXZlbnQodHlwZSksIGV2ZW50ICkgOgoJCQkJLy8gSnVzdCB0aGUgZXZlbnQgdHlwZSAoc3RyaW5nKQoJCQkJalF1ZXJ5LkV2ZW50KHR5cGUpOwoKCQkJaWYgKCB0eXBlLmluZGV4T2YoIiEiKSA+PSAwICkgewoJCQkJZXZlbnQudHlwZSA9IHR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKCQkJCWV2ZW50LmV4Y2x1c2l2ZSA9IHRydWU7CgkJCX0KCgkJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCgkJCWlmICggIWVsZW0gKSB7CgkJCQkvLyBEb24ndCBidWJibGUgY3VzdG9tIGV2ZW50cyB3aGVuIGdsb2JhbCAodG8gYXZvaWQgdG9vIG11Y2ggb3ZlcmhlYWQpCgkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCS8vIE9ubHkgdHJpZ2dlciBpZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZvciBpdAoJCQkJaWYgKCB0aGlzLmdsb2JhbFsgdHlwZSBdICkgewoJCQkJCWpRdWVyeS5lYWNoKCBqUXVlcnkuY2FjaGUsIGZ1bmN0aW9uKCkgewoJCQkJCQlpZiAoIHRoaXMuZXZlbnRzICYmIHRoaXMuZXZlbnRzW3R5cGVdICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGV2ZW50LCBkYXRhLCB0aGlzLmhhbmRsZS5lbGVtICk7CgkJCQkJCX0KCQkJCQl9KTsKCQkJCX0KCQkJfQoKCQkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgYSBzaW5nbGUgZWxlbWVudAoKCQkJLy8gZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQkJaWYgKCAhZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQl9CgoJCQkvLyBDbGVhbiB1cCBpbiBjYXNlIGl0IGlzIHJldXNlZAoJCQlldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7CgkJCWV2ZW50LnRhcmdldCA9IGVsZW07CgoJCQkvLyBDbG9uZSB0aGUgaW5jb21pbmcgZGF0YSwgaWYgYW55CgkJCWRhdGEgPSBqUXVlcnkubWFrZUFycmF5KCBkYXRhICk7CgkJCWRhdGEudW5zaGlmdCggZXZlbnQgKTsKCQl9CgoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtOwoKCQkvLyBUcmlnZ2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24KCQl2YXIgaGFuZGxlID0galF1ZXJ5LmRhdGEoIGVsZW0sICJoYW5kbGUiICk7CgkJaWYgKCBoYW5kbGUgKSB7CgkJCWhhbmRsZS5hcHBseSggZWxlbSwgZGF0YSApOwoJCX0KCgkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgbmF0aXZlIC5vbmZvbyBoYW5kbGVycyAoYW5kIG9uIGxpbmtzIHNpbmNlIHdlIGRvbid0IGNhbGwgLmNsaWNrKCkgZm9yIGxpbmtzKQoJCWlmICggKCFlbGVtWyB0eXBlIF0gfHwgKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT09ICJjbGljayIpKSAmJiBlbGVtWyJvbiIrdHlwZV0gJiYgZWxlbVsib24iK3R5cGVdLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkgewoJCQlldmVudC5yZXN1bHQgPSBmYWxzZTsKCQl9CgoJCS8vIFRyaWdnZXIgdGhlIG5hdGl2ZSBldmVudHMgKGV4Y2VwdCBmb3IgY2xpY2tzIG9uIGxpbmtzKQoJCWlmICggIWJ1YmJsaW5nICYmIGVsZW1bIHR5cGUgXSAmJiAhZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgJiYgIShqUXVlcnkubm9kZU5hbWUoZWxlbSwgJ2EnKSAmJiB0eXBlID09PSAiY2xpY2siKSApIHsKCQkJdGhpcy50cmlnZ2VyZWQgPSB0cnVlOwoJCQl0cnkgewoJCQkJZWxlbVsgdHlwZSBdKCk7CgkJCS8vIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJvciBmb3Igc29tZSBoaWRkZW4gZWxlbWVudHMKCQkJfSBjYXRjaCAoZSkge30KCQl9CgoJCXRoaXMudHJpZ2dlcmVkID0gZmFsc2U7CgoJCWlmICggIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCXZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50OwoJCQlpZiAoIHBhcmVudCApIHsKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgcGFyZW50LCB0cnVlICk7CgkJCX0KCQl9Cgl9LAoKCWhhbmRsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCS8vIHJldHVybmVkIHVuZGVmaW5lZCBvciBmYWxzZQoJCXZhciBhbGwsIGhhbmRsZXJzOwoKCQlldmVudCA9IGFyZ3VtZW50c1swXSA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5ldmVudCApOwoJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOwoKCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCgkJdmFyIG5hbWVzcGFjZXMgPSBldmVudC50eXBlLnNwbGl0KCIuIik7CgkJZXZlbnQudHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTsKCgkJLy8gQ2FjaGUgdGhpcyBub3csIGFsbCA9IHRydWUgbWVhbnMsIGFueSBoYW5kbGVyCgkJYWxsID0gIW5hbWVzcGFjZXMubGVuZ3RoICYmICFldmVudC5leGNsdXNpdmU7CgoJCXZhciBuYW1lc3BhY2UgPSBuZXcgUmVnRXhwKCIoXnxcXC4pIiArIG5hbWVzcGFjZXMuc2xpY2UoKS5zb3J0KCkuam9pbigiLipcXC4iKSArICIoXFwufCQpIik7CgoJCWhhbmRsZXJzID0gKCBqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikgfHwge30gKVsgZXZlbnQudHlwZSBdOwoKCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKCQkJdmFyIGhhbmRsZXIgPSBoYW5kbGVyc1sgaiBdOwoKCQkJLy8gRmlsdGVyIHRoZSBmdW5jdGlvbnMgYnkgY2xhc3MKCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoaGFuZGxlci50eXBlKSApIHsKCQkJCS8vIFBhc3MgaW4gYSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXRzZWxmCgkJCQkvLyBTbyB0aGF0IHdlIGNhbiBsYXRlciByZW1vdmUgaXQKCQkJCWV2ZW50LmhhbmRsZXIgPSBoYW5kbGVyOwoJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZXIuZGF0YTsKCgkJCQl2YXIgcmV0ID0gaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgoJCQkJaWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlldmVudC5yZXN1bHQgPSByZXQ7CgkJCQkJaWYgKCByZXQgPT09IGZhbHNlICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkgewoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJfQoJCX0KCX0sCgoJcHJvcHM6ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxhYmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBkZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbGF5ZXJYIGxheWVyWSBtZXRhS2V5IG5ld1ZhbHVlIG9mZnNldFggb2Zmc2V0WSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVsYXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdG9FbGVtZW50IHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKSwKCglmaXg6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIGV2ZW50WyBleHBhbmRvIF0gKSB7CgkJCXJldHVybiBldmVudDsKCQl9CgoJCS8vIHN0b3JlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0CgkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCgkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKCQlldmVudCA9IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApIHsKCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOwoJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOwoJCX0KCgkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgewoJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OyAvLyBGaXhlcyAjMTkyNSB3aGVyZSBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlcgoJCX0KCgkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgkJfQoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApIHsKCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgewoJCQl2YXIgZG9jID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBib2R5ID0gZG9jdW1lbnQuYm9keTsKCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7CgkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgKChldmVudC5jaGFyQ29kZSB8fCBldmVudC5jaGFyQ29kZSA9PT0gMCkgPyBldmVudC5jaGFyQ29kZSA6IGV2ZW50LmtleUNvZGUpICkgewoJCQlldmVudC53aGljaCA9IGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmtleUNvZGU7CgkJfQoKCQkvLyBBZGQgbWV0YUtleSB0byBub24tTWFjIGJyb3dzZXJzICh1c2UgY3RybCBmb3IgUEMncyBhbmQgTWV0YSBmb3IgTWFjcykKCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50LmN0cmxLZXkgKSB7CgkJCWV2ZW50Lm1ldGFLZXkgPSBldmVudC5jdHJsS2V5OwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAoJCS8vIE5vdGU6IGJ1dHRvbiBpcyBub3Qgbm9ybWFsaXplZCwgc28gZG9uJ3QgdXNlIGl0CgkJaWYgKCAhZXZlbnQud2hpY2ggJiYgZXZlbnQuYnV0dG9uICkgewoJCQlldmVudC53aGljaCA9IChldmVudC5idXR0b24gJiAxID8gMSA6ICggZXZlbnQuYnV0dG9uICYgMiA/IDMgOiAoIGV2ZW50LmJ1dHRvbiAmIDQgPyAyIDogMCApICkpOwoJCX0KCgkJcmV0dXJuIGV2ZW50OwoJfSwKCglwcm94eTogZnVuY3Rpb24oIGZuLCBwcm94eSwgdGhpc09iamVjdCApIHsKCQlpZiAoIHByb3h5ICE9PSB1bmRlZmluZWQgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKCBwcm94eSApICkgewoJCQl0aGlzT2JqZWN0ID0gcHJveHk7CgkJCXByb3h5ID0gdW5kZWZpbmVkOwoJCX0KCQkvLyBGSVhNRTogU2hvdWxkIHByb3h5IGJlIHJlZGVmaW5lZCB0byBiZSBhcHBsaWVkIHdpdGggdGhpc09iamVjdCBpZiBkZWZpbmVkPwoJCXByb3h5ID0gcHJveHkgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBmbi5hcHBseSggdGhpc09iamVjdCAhPT0gdW5kZWZpbmVkID8gdGhpc09iamVjdCA6IHRoaXMsIGFyZ3VtZW50cyApOyB9OwoJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAoJCXByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBwcm94eS5ndWlkIHx8IHRoaXMuZ3VpZCsrOwoJCS8vIFNvIHByb3h5IGNhbiBiZSBkZWNsYXJlZCBhcyBhbiBhcmd1bWVudAoJCXJldHVybiBwcm94eTsKCX0sCgoJc3BlY2lhbDogewoJCXJlYWR5OiB7CgkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKCQkJc2V0dXA6IGJpbmRSZWFkeSwKCQkJdGVhcmRvd246IGZ1bmN0aW9uKCkge30KCQl9LAoKCQlsaXZlOiB7CgkJCWFkZDogZnVuY3Rpb24oIHByb3h5LCBkYXRhLCBuYW1lc3BhY2VzICkgewoJCQkJalF1ZXJ5LmV4dGVuZCggcHJveHksIGRhdGEgfHwge30gKTsKCQkJCXByb3h5Lmd1aWQgKz0gZGF0YS5zZWxlY3RvciArIGRhdGEubGl2ZTsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIGRhdGEubGl2ZSwgbGl2ZUhhbmRsZXIgKTsKCQkJfSwKCgkJCXJlbW92ZTogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCQlpZiAoIG5hbWVzcGFjZXMubGVuZ3RoICkgewoJCQkJCXZhciByZW1vdmUgPSAwLCBuYW1lID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzWzBdICsgIihcXC58JCkiKTsKCgkJCQkJalF1ZXJ5LmVhY2goIChqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikubGl2ZSB8fCB7fSksIGZ1bmN0aW9uKCkgewoJCQkJCQlpZiAoIG5hbWUudGVzdCh0aGlzLnR5cGUpICkgewoJCQkJCQkJcmVtb3ZlKys7CgkJCQkJCX0KCQkJCQl9KTsKCgkJCQkJaWYgKCByZW1vdmUgPCAxICkgewoJCQkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBuYW1lc3BhY2VzWzBdLCBsaXZlSGFuZGxlciApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMgKXsKCS8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZAoJaWYgKCAhdGhpcy5wcmV2ZW50RGVmYXVsdCApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjICk7Cgl9CgoJLy8gRXZlbnQgb2JqZWN0CglpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgkvLyBFdmVudCB0eXBlCgl9IGVsc2UgewoJCXRoaXMudHlwZSA9IHNyYzsKCX0KCgkvLyB0aW1lU3RhbXAgaXMgYnVnZ3kgZm9yIHNvbWUgZXZlbnRzIG9uIEZpcmVmb3goIzM4NDMpCgkvLyBTbyB3ZSB3b24ndCByZWx5IG9uIHRoZSBuYXRpdmUgdmFsdWUKCXRoaXMudGltZVN0YW1wID0gbm93KCk7CgoJLy8gTWFyayBpdCBhcyBmaXhlZAoJdGhpc1sgZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHJldHVyblRydWUoKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCQkvLyBpZiBwcmV2ZW50RGVmYXVsdCBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQoJCWUucmV0dXJuVmFsdWUgPSBmYWxzZTsKCX0sCglzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlOwoKCQl2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDsKCQlpZiAoICFlICkgewoJCQlyZXR1cm47CgkJfQoJCS8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5hbCBldmVudAoJCWlmICggZS5zdG9wUHJvcGFnYXRpb24gKSB7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJfQoJCS8vIG90aGVyd2lzZSBzZXQgdGhlIGNhbmNlbEJ1YmJsZSBwcm9wZXJ0eSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgdG8gdHJ1ZSAoSUUpCgkJZS5jYW5jZWxCdWJibGUgPSB0cnVlOwoJfSwKCXN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjogZnVuY3Rpb24oKXsKCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfSwKCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCglpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKfTsKLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGluIGFub3RoZXIgZWxlbWVudAovLyBVc2VkIGluIGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgaGFuZGxlcnMKdmFyIHdpdGhpbkVsZW1lbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7CgkvLyBDaGVjayBpZiBtb3VzZShvdmVyfG91dCkgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgZWxlbWVudAoJdmFyIHBhcmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CgkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQoJd2hpbGUgKCBwYXJlbnQgJiYgcGFyZW50ICE9IHRoaXMgKSB7CgkJLy8gRmlyZWZveCBzb21ldGltZXMgYXNzaWducyByZWxhdGVkVGFyZ2V0IGEgWFVMIGVsZW1lbnQKCQkvLyB3aGljaCB3ZSBjYW5ub3QgYWNjZXNzIHRoZSBwYXJlbnROb2RlIHByb3BlcnR5IG9mCgkJdHJ5IHsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7IH0KCQkvLyBhc3N1bWluZyB3ZSd2ZSBsZWZ0IHRoZSBlbGVtZW50IHNpbmNlIHdlIG1vc3QgbGlrZWx5IG1vdXNlZG92ZXIgYSB4dWwgZWxlbWVudAoJCWNhdGNoKGUpIHsgYnJlYWs7IH0KCX0KCglpZiAoIHBhcmVudCAhPSB0aGlzICkgewoJCS8vIHNldCB0aGUgY29ycmVjdCBldmVudCB0eXBlCgkJZXZlbnQudHlwZSA9IGV2ZW50LmRhdGE7CgkJLy8gaGFuZGxlIGV2ZW50IGlmIHdlIGFjdHVhbGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgbm9uIHN1Yi1lbGVtZW50CgkJalF1ZXJ5LmV2ZW50LmhhbmRsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9Cn07CgpqUXVlcnkuZWFjaCh7Cgltb3VzZW92ZXI6ICdtb3VzZWVudGVyJywKCW1vdXNlb3V0OiAnbW91c2VsZWF2ZScKfSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHsKCWpRdWVyeS5ldmVudC5zcGVjaWFsWyBmaXggXSA9IHsKCQlzZXR1cDogZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCwgZml4ICk7CgkJfSwKCQl0ZWFyZG93bjogZnVuY3Rpb24oKXsKCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgb3JpZywgd2l0aGluRWxlbWVudCApOwoJCX0KCX07Cn0pOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CgliaW5kOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4sIHRoaXNPYmplY3QgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlpZiAoIGZuICE9PSB1bmRlZmluZWQgKSB7CgkJCQl0aGlzT2JqZWN0ID0gZm47CgkJCX0KCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCQlmbiA9IHRoaXNPYmplY3QgPT09IHVuZGVmaW5lZCA/IGZuIDogalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgdGhpc09iamVjdCApOwoJCXJldHVybiB0eXBlID09PSAidW5sb2FkIiA/IHRoaXMub25lKHR5cGUsIGRhdGEsIGZuLCB0aGlzT2JqZWN0KSA6IHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZSwgZm4sIGRhdGEgKTsKCQl9KTsKCX0sCgoJb25lOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4sIHRoaXNPYmplY3QgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlpZiAoIGZuICE9PSB1bmRlZmluZWQgKSB7CgkJCQl0aGlzT2JqZWN0ID0gZm47CgkJCX0KCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCQlmbiA9IHRoaXNPYmplY3QgPT09IHVuZGVmaW5lZCA/IGZuIDogalF1ZXJ5LmV2ZW50LnByb3h5KCBmbiwgdGhpc09iamVjdCApOwoJCXZhciBvbmUgPSBqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCWpRdWVyeSggdGhpcyApLnVuYmluZCggZXZlbnQsIG9uZSApOwoJCQlyZXR1cm4gZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX0pOwoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUsIG9uZSwgZGF0YSApOwoJCX0pOwoJfSwKCgl1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlLCBmbiApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlLCBmbiApOwoJCX0pOwoJfSwKCgl0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApOwoJCX0pOwoJfSwKCgl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7CgkJaWYgKCB0aGlzWzBdICkgewoJCQl2YXIgZXZlbnQgPSBqUXVlcnkuRXZlbnQoIHR5cGUgKTsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgdGhpc1swXSApOwoJCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKCgkJLy8gbGluayBhbGwgdGhlIGZ1bmN0aW9ucywgc28gYW55IG9mIHRoZW0gY2FuIHVuYmluZCB0aGlzIGNsaWNrIGhhbmRsZXIKCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkgewoJCQlqUXVlcnkuZXZlbnQucHJveHkoIGZuLCBhcmdzWyBpKysgXSApOwoJCX0KCgkJcmV0dXJuIHRoaXMuY2xpY2soIGpRdWVyeS5ldmVudC5wcm94eSggZm4sIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJLy8gRmlndXJlIG91dCB3aGljaCBmdW5jdGlvbiB0byBleGVjdXRlCgkJCXRoaXMubGFzdFRvZ2dsZSA9ICggdGhpcy5sYXN0VG9nZ2xlIHx8IDAgKSAlIGk7CgoJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3RvcAoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCgkJCXJldHVybiBhcmdzWyB0aGlzLmxhc3RUb2dnbGUrKyBdLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSB8fCBmYWxzZTsKCQl9KSk7Cgl9LAoKCWhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHsKCQlyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJCWJpbmRSZWFkeSgpOwoKCQkvLyBJZiB0aGUgRE9NIGlzIGFscmVhZHkgcmVhZHkKCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkgewoJCQkvLyBFeGVjdXRlIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseQoJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgoJCS8vIE90aGVyd2lzZSwgcmVtZW1iZXIgdGhlIGZ1bmN0aW9uIGZvciBsYXRlcgoJCX0gZWxzZSB7CgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIHdhaXQgbGlzdAoJCQlqUXVlcnkucmVhZHlMaXN0LnB1c2goIGZuICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJbGl2ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuLCB0aGlzT2JqZWN0ICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJaWYgKCBmbiAhPT0gdW5kZWZpbmVkICkgewoJCQkJdGhpc09iamVjdCA9IGZuOwoJCQl9CgkJCWZuID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS5iaW5kKCBsaXZlQ29udmVydCggdHlwZSwgdGhpcy5zZWxlY3RvciApLCB7CgkJCWRhdGE6IGRhdGEsIHNlbGVjdG9yOiB0aGlzLnNlbGVjdG9yLCBsaXZlOiB0eXBlCgkJfSwgZm4sIHRoaXNPYmplY3QgKTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJZGllOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJalF1ZXJ5KCB0aGlzLmNvbnRleHQgKS51bmJpbmQoIGxpdmVDb252ZXJ0KCB0eXBlLCB0aGlzLnNlbGVjdG9yICksIGZuID8geyBndWlkOiBmbi5ndWlkICsgdGhpcy5zZWxlY3RvciArIHR5cGUgfSA6IG51bGwgKTsKCQlyZXR1cm4gdGhpczsKCX0KfSk7CgpmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7Cgl2YXIgc3RvcCA9IHRydWUsIGVsZW1zID0gW10sIGFyZ3MgPSBhcmd1bWVudHM7CgoJalF1ZXJ5LmVhY2goIGpRdWVyeS5kYXRhKCB0aGlzLCAiZXZlbnRzIiApLmxpdmUgfHwgW10sIGZ1bmN0aW9uKCBpLCBmbiApIHsKCQlpZiAoIGZuLmxpdmUgPT09IGV2ZW50LnR5cGUgKSB7CgkJCXZhciBlbGVtID0galF1ZXJ5KCBldmVudC50YXJnZXQgKS5jbG9zZXN0KCBmbi5zZWxlY3RvciApWzBdOwoJCQlpZiAoIGVsZW0gKSB7CgkJCQllbGVtcy5wdXNoKHsgZWxlbTogZWxlbSwgZm46IGZuIH0pOwoJCQl9CgkJfQoJfSk7CgoJZWxlbXMuc29ydChmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4galF1ZXJ5LmRhdGEoIGEuZWxlbSwgImNsb3Nlc3QiICkgLSBqUXVlcnkuZGF0YSggYi5lbGVtLCAiY2xvc2VzdCIgKTsKCX0pOwoKCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbigpIHsKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpcy5lbGVtOwoJCWV2ZW50LmRhdGEgPSB0aGlzLmZuLmRhdGE7CgkJaWYgKCB0aGlzLmZuLmFwcGx5KCB0aGlzLmVsZW0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybiAoc3RvcCA9IGZhbHNlKTsKCQl9Cgl9KTsKCglyZXR1cm4gc3RvcDsKfQoKZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgewoJcmV0dXJuIFsibGl2ZSIsIHR5cGUsIHNlbGVjdG9yLnJlcGxhY2UoL1wuL2csICJgIikucmVwbGFjZSgvIC9nLCAifCIpXS5qb2luKCIuIik7Cn0KCmpRdWVyeS5leHRlbmQoewoJaXNSZWFkeTogZmFsc2UsCglyZWFkeUxpc3Q6IFtdLAoJLy8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeQoJcmVhZHk6IGZ1bmN0aW9uKCkgewoJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgbm90IGFscmVhZHkgbG9hZGVkCgkJaWYgKCAhalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CgoJCQkvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlCgkJCWlmICggalF1ZXJ5LnJlYWR5TGlzdCApIHsKCQkJCS8vIEV4ZWN1dGUgYWxsIG9mIHRoZW0KCQkJCXZhciBmbiwgaSA9IDA7CgkJCQl3aGlsZSAoIChmbiA9IGpRdWVyeS5yZWFkeUxpc3RbIGkrKyBdKSApIHsKCQkJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zCgkJCQlqUXVlcnkucmVhZHlMaXN0ID0gbnVsbDsKCQkJfQoKCQkJLy8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzCgkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VySGFuZGxlciggInJlYWR5IiApOwoJCX0KCX0KfSk7Cgp2YXIgcmVhZHlCb3VuZCA9IGZhbHNlOwoKZnVuY3Rpb24gYmluZFJlYWR5KCkgewoJaWYgKCByZWFkeUJvdW5kICkgcmV0dXJuOwoJcmVhZHlCb3VuZCA9IHRydWU7CgoJLy8gTW96aWxsYSwgT3BlcmEgYW5kIHdlYmtpdCBuaWdodGxpZXMgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBldmVudAoJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCS8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKCQlkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewoJCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlICk7CgkJCWpRdWVyeS5yZWFkeSgpOwoJCX0sIGZhbHNlICk7CgoJLy8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZAoJfSBlbHNlIGlmICggZG9jdW1lbnQuYXR0YWNoRXZlbnQgKSB7CgkJLy8gZW5zdXJlIGZpcmluZyBiZWZvcmUgb25sb2FkLAoJCS8vIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCWRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKCQkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQkJZG9jdW1lbnQuZGV0YWNoRXZlbnQoICJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlICk7CgkJCQlqUXVlcnkucmVhZHkoKTsKCQkJfQoJCX0pOwoKCQkvLyBJZiBJRSBhbmQgbm90IGFuIGlmcmFtZQoJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQlpZiAoIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCAmJiB3aW5kb3cgPT09IHdpbmRvdy50b3AgKSAoZnVuY3Rpb24oKSB7CgkJCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXRyeSB7CgkJCQkvLyBJZiBJRSBpcyB1c2VkLCB1c2UgdGhlIHRyaWNrIGJ5IERpZWdvIFBlcmluaQoJCQkJLy8gaHR0cDovL2phdmFzY3JpcHQubndib3guY29tL0lFQ29udGVudExvYWRlZC8KCQkJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOwoJCQl9IGNhdGNoKCBlcnJvciApIHsKCQkJCXNldFRpbWVvdXQoIGFyZ3VtZW50cy5jYWxsZWUsIDAgKTsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gYW5kIGV4ZWN1dGUgYW55IHdhaXRpbmcgZnVuY3Rpb25zCgkJCWpRdWVyeS5yZWFkeSgpOwoJCX0pKCk7Cgl9CgoJLy8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmsKCWpRdWVyeS5ldmVudC5hZGQoIHdpbmRvdywgImxvYWQiLCBqUXVlcnkucmVhZHkgKTsKfQoKalF1ZXJ5LmVhY2goICgiYmx1cixmb2N1cyxsb2FkLHJlc2l6ZSxzY3JvbGwsdW5sb2FkLGNsaWNrLGRibGNsaWNrLCIgKwoJIm1vdXNlZG93bixtb3VzZXVwLG1vdXNlbW92ZSxtb3VzZW92ZXIsbW91c2VvdXQsbW91c2VlbnRlcixtb3VzZWxlYXZlLCIgKwoJImNoYW5nZSxzZWxlY3Qsc3VibWl0LGtleWRvd24sa2V5cHJlc3Msa2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIpLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCgkvLyBIYW5kbGUgZXZlbnQgYmluZGluZwoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggZm4gKSB7CgkJcmV0dXJuIGZuID8gdGhpcy5iaW5kKCBuYW1lLCBmbiApIDogdGhpcy50cmlnZ2VyKCBuYW1lICk7Cgl9Owp9KTsKCi8vIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCi8vIEFuZCBwcmV2ZW50IGVycm9ycyBvbiByZWZyZXNoIHdpdGggZXZlbnRzIGxpa2UgbW91c2VvdmVyIGluIG90aGVyIGJyb3dzZXJzCi8vIFdpbmRvdyBpc24ndCBpbmNsdWRlZCBzbyBhcyBub3QgdG8gdW5iaW5kIGV4aXN0aW5nIHVubG9hZCBldmVudHMKLy8gTW9yZSBpbmZvOgovLyAgLSBodHRwOi8vaXNhYWNzY2hsdWV0ZXIuY29tLzIwMDYvMTAvbXNpZS1tZW1vcnktbGVha3MvCi8vICAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTI1MjU0MgpqUXVlcnkoIHdpbmRvdyApLmJpbmQoICd1bmxvYWQnLCBmdW5jdGlvbigpIHsKCWZvciAoIHZhciBpZCBpbiBqUXVlcnkuY2FjaGUgKSB7CgkJLy8gU2tpcCB0aGUgd2luZG93CgkJaWYgKCBpZCAhPSAxICYmIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIGpRdWVyeS5jYWNoZVsgaWQgXS5oYW5kbGUuZWxlbSApOwoJCX0KCX0KfSk7CihmdW5jdGlvbigpewoKCWpRdWVyeS5zdXBwb3J0ID0ge307CgoJdmFyIHJvb3QgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksCgkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSkuZ2V0VGltZSgpOwoKCWRpdi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJZGl2LmlubmVySFRNTCA9ICcgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0iL2EiIHN0eWxlPSJjb2xvcjpyZWQ7ZmxvYXQ6bGVmdDtvcGFjaXR5Oi41OyI+YTwvYT48c2VsZWN0PjxvcHRpb24+dGV4dDwvb3B0aW9uPjwvc2VsZWN0Pic7CgoJdmFyIGFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLAoJCWEgPSBkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXTsKCgkvLyBDYW4ndCBnZXQgYmFzaWMgdGVzdCBzdXBwb3J0CglpZiAoICFhbGwgfHwgIWFsbC5sZW5ndGggfHwgIWEgKSB7CgkJcmV0dXJuOwoJfQoKCWpRdWVyeS5zdXBwb3J0ID0gewoJCS8vIElFIHN0cmlwcyBsZWFkaW5nIHdoaXRlc3BhY2Ugd2hlbiAuaW5uZXJIVE1MIGlzIHVzZWQKCQlsZWFkaW5nV2hpdGVzcGFjZTogZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMywKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCgkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IikubGVuZ3RoLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBsaW5rIGVsZW1lbnRzIGdldCBzZXJpYWxpemVkIGNvcnJlY3RseSBieSBpbm5lckhUTUwKCQkvLyBUaGlzIHJlcXVpcmVzIGEgd3JhcHBlciBlbGVtZW50IGluIElFCgkJaHRtbFNlcmlhbGl6ZTogISFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsCgoJCS8vIEdldCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gZnJvbSBnZXRBdHRyaWJ1dGUKCQkvLyAoSUUgdXNlcyAuY3NzVGV4dCBpbnN0ZWQpCgkJc3R5bGU6IC9yZWQvLnRlc3QoIGEuZ2V0QXR0cmlidXRlKCJzdHlsZSIpICksCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IFVSTHMgYXJlbid0IG1hbmlwdWxhdGVkCgkJLy8gKElFIG5vcm1hbGl6ZXMgaXQgYnkgZGVmYXVsdCkKCQlocmVmTm9ybWFsaXplZDogYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSA9PT0gIi9hIiwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgZWxlbWVudCBvcGFjaXR5IGV4aXN0cwoJCS8vIChJRSB1c2VzIGZpbHRlciBpbnN0ZWFkKQoJCW9wYWNpdHk6IGEuc3R5bGUub3BhY2l0eSA9PT0gIjAuNSIsCgoJCS8vIFZlcmlmeSBzdHlsZSBmbG9hdCBleGlzdGVuY2UKCQkvLyAoSUUgdXNlcyBzdHlsZUZsb2F0IGluc3RlYWQgb2YgY3NzRmxvYXQpCgkJY3NzRmxvYXQ6ICEhYS5zdHlsZS5jc3NGbG9hdCwKCgkJLy8gV2lsbCBiZSBkZWZpbmVkIGxhdGVyCgkJc2NyaXB0RXZhbDogZmFsc2UsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWJveE1vZGVsOiBudWxsCgl9OwoKCXNjcmlwdC50eXBlID0gInRleHQvamF2YXNjcmlwdCI7Cgl0cnkgewoJCXNjcmlwdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoICJ3aW5kb3cuIiArIGlkICsgIj0xOyIgKSApOwoJfSBjYXRjaChlKXt9CgoJcm9vdC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgcm9vdC5maXJzdENoaWxkICk7CgoJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGV4ZWN1dGlvbiBvZiBjb2RlIHdvcmtzIGJ5IGluamVjdGluZyBhIHNjcmlwdAoJLy8gdGFnIHdpdGggYXBwZW5kQ2hpbGQvY3JlYXRlVGV4dE5vZGUKCS8vIChJRSBkb2Vzbid0IHN1cHBvcnQgdGhpcywgZmFpbHMsIGFuZCB1c2VzIC50ZXh0IGluc3RlYWQpCglpZiAoIHdpbmRvd1sgaWQgXSApIHsKCQlqUXVlcnkuc3VwcG9ydC5zY3JpcHRFdmFsID0gdHJ1ZTsKCQlkZWxldGUgd2luZG93WyBpZCBdOwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoKCWlmICggZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CgkJZGl2LmF0dGFjaEV2ZW50KCJvbmNsaWNrIiwgZnVuY3Rpb24gY2xpY2soKXsKCQkJLy8gQ2xvbmluZyBhIG5vZGUgc2hvdWxkbid0IGNvcHkgb3ZlciBhbnkKCQkJLy8gYm91bmQgZXZlbnQgaGFuZGxlcnMgKElFIGRvZXMgdGhpcykKCQkJalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUV2ZW50ID0gZmFsc2U7CgkJCWRpdi5kZXRhY2hFdmVudCgib25jbGljayIsIGNsaWNrKTsKCQl9KTsKCQlkaXYuY2xvbmVOb2RlKHRydWUpLmZpcmVFdmVudCgib25jbGljayIpOwoJfQoKCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKCS8vIGRvY3VtZW50LmJvZHkgbXVzdCBleGlzdCBiZWZvcmUgd2UgY2FuIGRvIHRoaXMKCWpRdWVyeShmdW5jdGlvbigpewoJCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCQlkaXYuc3R5bGUud2lkdGggPSBkaXYuc3R5bGUucGFkZGluZ0xlZnQgPSAiMXB4IjsKCgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZGl2ICk7CgkJalF1ZXJ5LmJveE1vZGVsID0galF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgPSBkaXYub2Zmc2V0V2lkdGggPT09IDI7CgkJZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCggZGl2ICkuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKCQlkaXYgPSBudWxsOwoJfSk7CgoJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKCXJvb3QgPSBzY3JpcHQgPSBkaXYgPSBhbGwgPSBhID0gbnVsbDsKfSkoKTsKCmpRdWVyeS5wcm9wcyA9IHsKCSJmb3IiOiAiaHRtbEZvciIsCgkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKCXJlYWRvbmx5OiAicmVhZE9ubHkiLAoJbWF4bGVuZ3RoOiAibWF4TGVuZ3RoIiwKCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJcm93c3BhbjogInJvd1NwYW4iLAoJY29sc3BhbjogImNvbFNwYW4iLAoJdGFiaW5kZXg6ICJ0YWJJbmRleCIKfTsKLy8gZXhjbHVkZSB0aGUgZm9sbG93aW5nIGNzcyBwcm9wZXJ0aWVzIHRvIGFkZCBweAp2YXIgZXhjbHVkZSA9IC96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9pLAoJLy8gY2FjaGUgY2hlY2sgZm9yIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUKCWdldENvbXB1dGVkU3R5bGUgPSBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlLAoJLy8gbm9ybWFsaXplIGZsb2F0IGNzcyBwcm9wZXJ0eQoJc3R5bGVGbG9hdCA9IGpRdWVyeS5zdXBwb3J0LmNzc0Zsb2F0ID8gImNzc0Zsb2F0IiA6ICJzdHlsZUZsb2F0IjsKCmpRdWVyeS5mbi5jc3MgPSBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7Cgl2YXIgb3B0aW9ucyA9IG5hbWUsIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKCglpZiAoIHR5cGVvZiBuYW1lID09PSAic3RyaW5nIiApIHsKCQkvLyBBcmUgd2Ugc2V0dGluZyB0aGUgc3R5bGU/CgkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gdGhpcy5sZW5ndGggPwoJCQkJalF1ZXJ5LmNzcyggdGhpc1swXSwgbmFtZSApIDoKCQkJCW51bGw7CgoJCS8vIENvbnZlcnQgbmFtZSwgdmFsdWUgcGFyYW1zIHRvIG9wdGlvbnMgaGFzaCBmb3JtYXQKCQl9IGVsc2UgewoJCQlvcHRpb25zID0ge307CgkJCW9wdGlvbnNbIG5hbWUgXSA9IHZhbHVlOwoJCX0KCX0KCgkvLyBGb3IgZWFjaCBlbGVtZW50Li4uCglmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IHRoaXNbaV07CgoJCS8vIFNldCBhbGwgdGhlIHN0eWxlcwoJCWZvciAoIHZhciBwcm9wIGluIG9wdGlvbnMgKSB7CgkJCXZhbHVlID0gb3B0aW9uc1twcm9wXTsKCgkJCWlmICggaXNGdW5jdGlvbiApIHsKCQkJCXZhbHVlID0gdmFsdWUuY2FsbCggZWxlbSwgaSApOwoJCQl9CgoJCQlpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gIm51bWJlciIgJiYgIWV4Y2x1ZGUudGVzdChwcm9wKSApIHsKCQkJCXZhbHVlID0gdmFsdWUgKyAicHgiOwoJCQl9CgoJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIHZhbHVlICk7CgkJfQoJfQoKCXJldHVybiB0aGlzOwp9OwoKalF1ZXJ5LmV4dGVuZCh7CglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgewoJCS8vIGRvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2RlcwoJCWlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4KQoJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQkvLyBpZ25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMgIzE1OTkKCQlpZiAoIChuYW1lID09ICd3aWR0aCcgfHwgbmFtZSA9PSAnaGVpZ2h0JykgJiYgcGFyc2VGbG9hdCh2YWx1ZSkgPCAwICkKCQkJdmFsdWUgPSB1bmRlZmluZWQ7CgoJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUgfHwgZWxlbSwgc2V0ID0gdmFsdWUgIT09IHVuZGVmaW5lZDsKCgkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSAmJiBuYW1lID09ICJvcGFjaXR5IiApIHsKCQkJaWYgKCBzZXQgKSB7CgkJCQkvLyBJRSBoYXMgdHJvdWJsZSB3aXRoIG9wYWNpdHkgaWYgaXQgZG9lcyBub3QgaGF2ZSBsYXlvdXQKCQkJCS8vIEZvcmNlIGl0IGJ5IHNldHRpbmcgdGhlIHpvb20gbGV2ZWwKCQkJCXN0eWxlLnpvb20gPSAxOwoKCQkJCS8vIFNldCB0aGUgYWxwaGEgZmlsdGVyIHRvIHNldCB0aGUgb3BhY2l0eQoJCQkJc3R5bGUuZmlsdGVyID0gKHN0eWxlLmZpbHRlciB8fCAiIikucmVwbGFjZSggL2FscGhhXChbXildKlwpLywgIiIgKSArCgkJCQkJKHBhcnNlSW50KCB2YWx1ZSApICsgJycgPT0gIk5hTiIgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIik7CgkJCX0KCgkJCXJldHVybiBzdHlsZS5maWx0ZXIgJiYgc3R5bGUuZmlsdGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CgkJCQkocGFyc2VGbG9hdCggc3R5bGUuZmlsdGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSApIC8gMTAwKSArICcnOgoJCQkJIiI7CgkJfQoKCQkvLyBNYWtlIHN1cmUgd2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCgkJaWYgKCAvZmxvYXQvaS50ZXN0KCBuYW1lICkgKQoJCQluYW1lID0gc3R5bGVGbG9hdDsKCgkJbmFtZSA9IG5hbWUucmVwbGFjZSgvLShbYS16XSkvaWcsIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKCQkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOwoJCX0pOwoKCQlpZiAoIHNldCApCgkJCXN0eWxlWyBuYW1lIF0gPSB2YWx1ZTsKCgkJcmV0dXJuIHN0eWxlWyBuYW1lIF07Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGZvcmNlLCBleHRyYSApIHsKCQlpZiAoIG5hbWUgPT0gIndpZHRoIiB8fCBuYW1lID09ICJoZWlnaHQiICkgewoJCQl2YXIgdmFsLCBwcm9wcyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiJibG9jayIgfSwgd2hpY2ggPSBuYW1lID09ICJ3aWR0aCIgPyBbICJMZWZ0IiwgIlJpZ2h0IiBdIDogWyAiVG9wIiwgIkJvdHRvbSIgXTsKCgkJCWZ1bmN0aW9uIGdldFdIKCkgewoJCQkJdmFsID0gbmFtZSA9PSAid2lkdGgiID8gZWxlbS5vZmZzZXRXaWR0aCA6IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQkJCWlmICggZXh0cmEgPT09ICJib3JkZXIiICkKCQkJCQlyZXR1cm47CgoJCQkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoICFleHRyYSApCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMsIHRydWUpKSB8fCAwOwoJCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkKCQkJCQkJdmFsICs9IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyggZWxlbSwgIm1hcmdpbiIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKCQkJCQllbHNlCgkJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoIGVsZW0sICJib3JkZXIiICsgdGhpcyArICJXaWR0aCIsIHRydWUpKSB8fCAwOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggZWxlbS5vZmZzZXRXaWR0aCAhPT0gMCApCgkJCQlnZXRXSCgpOwoJCQllbHNlCgkJCQlqUXVlcnkuc3dhcCggZWxlbSwgcHJvcHMsIGdldFdIICk7CgoJCQlyZXR1cm4gTWF0aC5tYXgoMCwgTWF0aC5yb3VuZCh2YWwpKTsKCQl9CgoJCXJldHVybiBqUXVlcnkuY3VyQ1NTKCBlbGVtLCBuYW1lLCBmb3JjZSApOwoJfSwKCgljdXJDU1M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSApIHsKCQl2YXIgcmV0LCBzdHlsZSA9IGVsZW0uc3R5bGUsIGZpbHRlcjsKCgkJLy8gSUUgdXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSAmJiBuYW1lID09PSAib3BhY2l0eSIgJiYgZWxlbS5jdXJyZW50U3R5bGUgKSB7CgkJCXJldCA9IChlbGVtLmN1cnJlbnRTdHlsZS5maWx0ZXIgfHwgIiIpLm1hdGNoKC9vcGFjaXR5PShbXildKikvKSA/CgkJCQkocGFyc2VGbG9hdChSZWdFeHAuJDEpIC8gMTAwKSArICIiIDoKCQkJCSIiOwoKCQkJcmV0dXJuIHJldCA9PT0gIiIgPwoJCQkJIjEiIDoKCQkJCXJldDsKCQl9CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSB1c2luZyB0aGUgcmlnaHQgbmFtZSBmb3IgZ2V0dGluZyB0aGUgZmxvYXQgdmFsdWUKCQlpZiAoIC9mbG9hdC9pLnRlc3QoIG5hbWUgKSApCgkJCW5hbWUgPSBzdHlsZUZsb2F0OwoKCQlpZiAoICFmb3JjZSAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkgewoJCQlyZXQgPSBzdHlsZVsgbmFtZSBdOwoKCQl9IGVsc2UgaWYgKCBnZXRDb21wdXRlZFN0eWxlICkgewoKCQkJLy8gT25seSAiZmxvYXQiIGlzIG5lZWRlZCBoZXJlCgkJCWlmICggL2Zsb2F0L2kudGVzdCggbmFtZSApICkKCQkJCW5hbWUgPSAiZmxvYXQiOwoKCQkJbmFtZSA9IG5hbWUucmVwbGFjZSggLyhbQS1aXSkvZywgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOwoKCQkJdmFyIGNvbXB1dGVkU3R5bGUgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApOwoKCQkJaWYgKCBjb21wdXRlZFN0eWxlICkKCQkJCXJldCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApOwoKCQkJLy8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHkKCQkJaWYgKCBuYW1lID09ICJvcGFjaXR5IiAmJiByZXQgPT0gIiIgKQoJCQkJcmV0ID0gIjEiOwoKCQl9IGVsc2UgaWYgKCBlbGVtLmN1cnJlbnRTdHlsZSApIHsKCQkJdmFyIGNhbWVsQ2FzZSA9IG5hbWUucmVwbGFjZSgvXC0oXHcpL2csIGZ1bmN0aW9uKGFsbCwgbGV0dGVyKXsKCQkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKCQkJfSk7CgoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdIHx8IGVsZW0uY3VycmVudFN0eWxlWyBjYW1lbENhc2UgXTsKCgkJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkJLy8gaHR0cDovL2VyaWsuZWFlLm5ldC9hcmNoaXZlcy8yMDA3LzA3LzI3LzE4LjU0LjE1LyNjb21tZW50LTEwMjI5MQoKCQkJLy8gSWYgd2UncmUgbm90IGRlYWxpbmcgd2l0aCBhIHJlZ3VsYXIgcGl4ZWwgbnVtYmVyCgkJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCQlpZiAoICEvXlxkKyhweCk/JC9pLnRlc3QoIHJldCApICYmIC9eXGQvLnRlc3QoIHJldCApICkgewoJCQkJLy8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlcwoJCQkJdmFyIGxlZnQgPSBzdHlsZS5sZWZ0LCByc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0OwoKCQkJCS8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXQKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQkJc3R5bGUubGVmdCA9IHJldCB8fCAwOwoJCQkJcmV0ID0gc3R5bGUucGl4ZWxMZWZ0ICsgInB4IjsKCgkJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzCgkJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSByc0xlZnQ7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEEgbWV0aG9kIGZvciBxdWlja2x5IHN3YXBwaW5nIGluL291dCBDU1MgcHJvcGVydGllcyB0byBnZXQgY29ycmVjdCBjYWxjdWxhdGlvbnMKCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQl2YXIgb2xkID0ge307CgkJLy8gUmVtZW1iZXIgdGhlIG9sZCB2YWx1ZXMsIGFuZCBpbnNlcnQgdGhlIG5ldyBvbmVzCgkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJb2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTsKCQl9CgoJCWNhbGxiYWNrLmNhbGwoIGVsZW0gKTsKCgkJLy8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzCgkJZm9yICggdmFyIG5hbWUgaW4gb3B0aW9ucyApCgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJfQp9KTtqUXVlcnkuZm4uZXh0ZW5kKHsKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZAoJX2xvYWQ6IGpRdWVyeS5mbi5sb2FkLAoKCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiApCgkJCXJldHVybiB0aGlzLl9sb2FkKCB1cmwgKTsKCgkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCIgIik7CgkJaWYgKCBvZmYgPj0gMCApIHsKCQkJdmFyIHNlbGVjdG9yID0gdXJsLnNsaWNlKG9mZiwgdXJsLmxlbmd0aCk7CgkJCXVybCA9IHVybC5zbGljZSgwLCBvZmYpOwoJCX0KCgkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CgkJdmFyIHR5cGUgPSAiR0VUIjsKCgkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCgkJaWYgKCBwYXJhbXMgKQoJCQkvLyBJZiBpdCdzIGEgZnVuY3Rpb24KCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7CgkJCQkvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFjawoJCQkJY2FsbGJhY2sgPSBwYXJhbXM7CgkJCQlwYXJhbXMgPSBudWxsOwoKCQkJLy8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZwoJCQl9IGVsc2UgaWYoIHR5cGVvZiBwYXJhbXMgPT09ICJvYmplY3QiICkgewoJCQkJcGFyYW1zID0galF1ZXJ5LnBhcmFtKCBwYXJhbXMgKTsKCQkJCXR5cGUgPSAiUE9TVCI7CgkJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoJCQl0eXBlOiB0eXBlLAoJCQlkYXRhVHlwZTogImh0bWwiLAoJCQlkYXRhOiBwYXJhbXMsCgkJCWNvbXBsZXRlOiBmdW5jdGlvbihyZXMsIHN0YXR1cyl7CgkJCQkvLyBJZiBzdWNjZXNzZnVsLCBpbmplY3QgdGhlIEhUTUwgaW50byBhbGwgdGhlIG1hdGNoZWQgZWxlbWVudHMKCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiB8fCBzdGF0dXMgPT0gIm5vdG1vZGlmaWVkIiApCgkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cwoJCQkJCQlqUXVlcnkoIjxkaXYvPiIpCgkJCQkJCQkvLyBpbmplY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2N1bWVudCBpbiwgcmVtb3ZpbmcgdGhlIHNjcmlwdHMKCQkJCQkJCS8vIHRvIGF2b2lkIGFueSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9ycyBpbiBJRQoJCQkJCQkJLmFwcGVuZChyZXMucmVzcG9uc2VUZXh0LnJlcGxhY2UoLzxzY3JpcHQoLnxccykqP1wvc2NyaXB0Pi9nLCAiIikpCgoJCQkJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZpZWQgZWxlbWVudHMKCQkJCQkJCS5maW5kKHNlbGVjdG9yKSA6CgoJCQkJCQkvLyBJZiBub3QsIGp1c3QgaW5qZWN0IHRoZSBmdWxsIHJlc3VsdAoJCQkJCQlyZXMucmVzcG9uc2VUZXh0ICk7CgoJCQkJaWYoIGNhbGxiYWNrICkKCQkJCQlzZWxmLmVhY2goIGNhbGxiYWNrLCBbcmVzLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCByZXNdICk7CgkJCX0KCQl9KTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJc2VyaWFsaXplOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4galF1ZXJ5LnBhcmFtKHRoaXMuc2VyaWFsaXplQXJyYXkoKSk7Cgl9LAoJc2VyaWFsaXplQXJyYXk6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm1hcChmdW5jdGlvbigpewoJCQlyZXR1cm4gdGhpcy5lbGVtZW50cyA/IGpRdWVyeS5tYWtlQXJyYXkodGhpcy5lbGVtZW50cykgOiB0aGlzOwoJCX0pCgkJLmZpbHRlcihmdW5jdGlvbigpewoJCQlyZXR1cm4gdGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmCgkJCQkodGhpcy5jaGVja2VkIHx8IC9zZWxlY3R8dGV4dGFyZWEvaS50ZXN0KHRoaXMubm9kZU5hbWUpIHx8CgkJCQkJL3RleHR8aGlkZGVufHBhc3N3b3JkfHNlYXJjaC9pLnRlc3QodGhpcy50eXBlKSk7CgkJfSkKCQkubWFwKGZ1bmN0aW9uKGksIGVsZW0pewoJCQl2YXIgdmFsID0galF1ZXJ5KHRoaXMpLnZhbCgpOwoJCQlyZXR1cm4gdmFsID09IG51bGwgPyBudWxsIDoKCQkJCWpRdWVyeS5pc0FycmF5KHZhbCkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24odmFsLCBpKXsKCQkJCQkJcmV0dXJuIHtuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWx9OwoJCQkJCX0pIDoKCQkJCQl7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKCQl9KS5nZXQoKTsKCX0KfSk7CgovLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50cwpqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxhamF4Q29tcGxldGUsYWpheEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLG8pewoJalF1ZXJ5LmZuW29dID0gZnVuY3Rpb24oZil7CgkJcmV0dXJuIHRoaXMuYmluZChvLCBmKTsKCX07Cn0pOwoKdmFyIGpzYyA9IG5vdygpOwoKalF1ZXJ5LmV4dGVuZCh7CgoJZ2V0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJY2FsbGJhY2sgPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6ICJHRVQiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CgkJcmV0dXJuIGpRdWVyeS5nZXQodXJsLCBudWxsLCBjYWxsYmFjaywgInNjcmlwdCIpOwoJfSwKCglnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHsKCQlyZXR1cm4galF1ZXJ5LmdldCh1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIpOwoJfSwKCglwb3N0OiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBkYXRhICkgKSB7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHt9OwoJCX0KCgkJcmV0dXJuIGpRdWVyeS5hamF4KHsKCQkJdHlwZTogIlBPU1QiLAoJCQl1cmw6IHVybCwKCQkJZGF0YTogZGF0YSwKCQkJc3VjY2VzczogY2FsbGJhY2ssCgkJCWRhdGFUeXBlOiB0eXBlCgkJfSk7Cgl9LAoKCWFqYXhTZXR1cDogZnVuY3Rpb24oIHNldHRpbmdzICkgewoJCWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7Cgl9LAoKCWFqYXhTZXR0aW5nczogewoJCXVybDogbG9jYXRpb24uaHJlZiwKCQlnbG9iYWw6IHRydWUsCgkJdHlwZTogIkdFVCIsCgkJY29udGVudFR5cGU6ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLAoJCXByb2Nlc3NEYXRhOiB0cnVlLAoJCWFzeW5jOiB0cnVlLAoJCS8qCgkJdGltZW91dDogMCwKCQlkYXRhOiBudWxsLAoJCXVzZXJuYW1lOiBudWxsLAoJCXBhc3N3b3JkOiBudWxsLAoJCSovCgkJLy8gQ3JlYXRlIHRoZSByZXF1ZXN0IG9iamVjdDsgTWljcm9zb2Z0IGZhaWxlZCB0byBwcm9wZXJseQoJCS8vIGltcGxlbWVudCB0aGUgWE1MSHR0cFJlcXVlc3QgaW4gSUU3LCBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCQkvLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZW4gYnkgY2FsbGluZyBqUXVlcnkuYWpheFNldHVwCgkJeGhyOmZ1bmN0aW9uKCl7CgkJCXJldHVybiB3aW5kb3cuQWN0aXZlWE9iamVjdCA/IG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpIDogbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CgkJfSwKCQlhY2NlcHRzOiB7CgkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAoJCQlodG1sOiAidGV4dC9odG1sIiwKCQkJc2NyaXB0OiAidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwKCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCIsCgkJCXRleHQ6ICJ0ZXh0L3BsYWluIiwKCQkJX2RlZmF1bHQ6ICIqLyoiCgkJfQoJfSwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoKCWFqYXg6IGZ1bmN0aW9uKCBzICkgewoJCS8vIEV4dGVuZCB0aGUgc2V0dGluZ3MsIGJ1dCByZS1leHRlbmQgJ3MnIHNvIHRoYXQgaXQgY2FuIGJlCgkJLy8gY2hlY2tlZCBhZ2FpbiBsYXRlciAoaW4gdGhlIHRlc3Qgc3VpdGUsIHNwZWNpZmljYWxseSkKCQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVlcnkuYWpheFNldHRpbmdzLCBzKSk7CgoJCXZhciBqc29ucCwganNyZSA9IC89XD8oJnwkKS9nLCBzdGF0dXMsIGRhdGEsCgkJCXR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKCgkJLy8gY29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApCgkJCXMuZGF0YSA9IGpRdWVyeS5wYXJhbShzLmRhdGEpOwoKCQkvLyBIYW5kbGUgSlNPTlAgUGFyYW1ldGVyIENhbGxiYWNrcwoJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgewoJCQlpZiAoIHR5cGUgPT0gIkdFVCIgKSB7CgkJCQlpZiAoICFzLnVybC5tYXRjaChqc3JlKSApCgkJCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsgIj0/IjsKCQkJfSBlbHNlIGlmICggIXMuZGF0YSB8fCAhcy5kYXRhLm1hdGNoKGpzcmUpICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgPyBzLmRhdGEgKyAiJiIgOiAiIikgKyAocy5qc29ucCB8fCAiY2FsbGJhY2siKSArICI9PyI7CgkJCXMuZGF0YVR5cGUgPSAianNvbiI7CgkJfQoKCQkvLyBCdWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KCQlpZiAoIHMuZGF0YVR5cGUgPT0gImpzb24iICYmIChzLmRhdGEgJiYgcy5kYXRhLm1hdGNoKGpzcmUpIHx8IHMudXJsLm1hdGNoKGpzcmUpKSApIHsKCQkJanNvbnAgPSAianNvbnAiICsganNjKys7CgoJCQkvLyBSZXBsYWNlIHRoZSA9PyBzZXF1ZW5jZSBib3RoIGluIHRoZSBxdWVyeSBzdHJpbmcgYW5kIHRoZSBkYXRhCgkJCWlmICggcy5kYXRhICkKCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBqc29ucCArICIkMSIpOwoJCQlzLnVybCA9IHMudXJsLnJlcGxhY2UoanNyZSwgIj0iICsganNvbnAgKyAiJDEiKTsKCgkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCgkJCS8vIHRoYXQgYSBKU09OUCBzdHlsZSByZXNwb25zZSBpcyBleGVjdXRlZCBwcm9wZXJseQoJCQlzLmRhdGFUeXBlID0gInNjcmlwdCI7CgoJCQkvLyBIYW5kbGUgSlNPTlAtc3R5bGUgbG9hZGluZwoJCQl3aW5kb3dbIGpzb25wIF0gPSBmdW5jdGlvbih0bXApewoJCQkJZGF0YSA9IHRtcDsKCQkJCXN1Y2Nlc3MoKTsKCQkJCWNvbXBsZXRlKCk7CgkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKCQkJCXdpbmRvd1sganNvbnAgXSA9IHVuZGVmaW5lZDsKCQkJCXRyeXsgZGVsZXRlIHdpbmRvd1sganNvbnAgXTsgfSBjYXRjaChlKXt9CgkJCQlpZiAoIGhlYWQgKQoJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQl9OwoJCX0KCgkJaWYgKCBzLmRhdGFUeXBlID09ICJzY3JpcHQiICYmIHMuY2FjaGUgPT0gbnVsbCApCgkJCXMuY2FjaGUgPSBmYWxzZTsKCgkJaWYgKCBzLmNhY2hlID09PSBmYWxzZSAmJiB0eXBlID09ICJHRVQiICkgewoJCQl2YXIgdHMgPSBub3coKTsKCQkJLy8gdHJ5IHJlcGxhY2luZyBfPSBpZiBpdCBpcyB0aGVyZQoJCQl2YXIgcmV0ID0gcy51cmwucmVwbGFjZSgvKFw/fCYpXz0uKj8oJnwkKS8sICIkMV89IiArIHRzICsgIiQyIik7CgkJCS8vIGlmIG5vdGhpbmcgd2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKCQkJcy51cmwgPSByZXQgKyAoKHJldCA9PSBzLnVybCkgPyAocy51cmwubWF0Y2goL1w/LykgPyAiJiIgOiAiPyIpICsgIl89IiArIHRzIDogIiIpOwoJCX0KCgkJLy8gSWYgZGF0YSBpcyBhdmFpbGFibGUsIGFwcGVuZCBkYXRhIHRvIHVybCBmb3IgZ2V0IHJlcXVlc3RzCgkJaWYgKCBzLmRhdGEgJiYgdHlwZSA9PSAiR0VUIiApIHsKCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0YTsKCQl9CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIHMuZ2xvYmFsICYmICEgalF1ZXJ5LmFjdGl2ZSsrICkKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgoJCS8vIE1hdGNoZXMgYW4gYWJzb2x1dGUgVVJMLCBhbmQgc2F2ZXMgdGhlIGRvbWFpbgoJCXZhciBwYXJ0cyA9IC9eKFx3KzopP1wvXC8oW15cLz8jXSspLy5leGVjKCBzLnVybCApOwoKCQkvLyBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgcmVtb3RlIGRvY3VtZW50CgkJLy8gYW5kIHRyeWluZyB0byBsb2FkIEpTT04gb3IgU2NyaXB0IHdpdGggYSBHRVQKCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNjcmlwdCIgJiYgdHlwZSA9PSAiR0VUIiAmJiBwYXJ0cwoJCQkmJiAoIHBhcnRzWzFdICYmIHBhcnRzWzFdICE9IGxvY2F0aW9uLnByb3RvY29sIHx8IHBhcnRzWzJdICE9IGxvY2F0aW9uLmhvc3QgKSl7CgoJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF07CgkJCXZhciBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKCQkJc2NyaXB0LnNyYyA9IHMudXJsOwoJCQlpZiAocy5zY3JpcHRDaGFyc2V0KQoJCQkJc2NyaXB0LmNoYXJzZXQgPSBzLnNjcmlwdENoYXJzZXQ7CgoJCQkvLyBIYW5kbGUgU2NyaXB0IGxvYWRpbmcKCQkJaWYgKCAhanNvbnAgKSB7CgkJCQl2YXIgZG9uZSA9IGZhbHNlOwoKCQkJCS8vIEF0dGFjaCBoYW5kbGVycyBmb3IgYWxsIGJyb3dzZXJzCgkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCl7CgkJCQkJaWYgKCAhZG9uZSAmJiAoIXRoaXMucmVhZHlTdGF0ZSB8fAoJCQkJCQkJdGhpcy5yZWFkeVN0YXRlID09ICJsb2FkZWQiIHx8IHRoaXMucmVhZHlTdGF0ZSA9PSAiY29tcGxldGUiKSApIHsKCQkJCQkJZG9uZSA9IHRydWU7CgkJCQkJCXN1Y2Nlc3MoKTsKCQkJCQkJY29tcGxldGUoKTsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgkJCQkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOwoJCQkJCX0KCQkJCX07CgkJCX0KCgkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkvLyBUaGlzIGFyaXNlcyB3aGVuIGEgYmFzZSBub2RlIGlzIHVzZWQgKCMyNzA5IGFuZCAjNDM3OCkuCgkJCWhlYWQuaW5zZXJ0QmVmb3JlKCBzY3JpcHQsIGhlYWQuZmlyc3RDaGlsZCApOwoKCQkJLy8gV2UgaGFuZGxlIGV2ZXJ5dGhpbmcgdXNpbmcgdGhlIHNjcmlwdCBlbGVtZW50IGluamVjdGlvbgoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIHJlcXVlc3REb25lID0gZmFsc2U7CgoJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBvYmplY3QKCQl2YXIgeGhyID0gcy54aHIoKTsKCgkJLy8gT3BlbiB0aGUgc29ja2V0CgkJLy8gUGFzc2luZyBudWxsIHVzZXJuYW1lLCBnZW5lcmF0ZXMgYSBsb2dpbiBwb3B1cCBvbiBPcGVyYSAoIzI4NjUpCgkJaWYoIHMudXNlcm5hbWUgKQoJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYywgcy51c2VybmFtZSwgcy5wYXNzd29yZCk7CgkJZWxzZQoJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYyk7CgoJCS8vIE5lZWQgYW4gZXh0cmEgdHJ5L2NhdGNoIGZvciBjcm9zcyBkb21haW4gcmVxdWVzdHMgaW4gRmlyZWZveCAzCgkJdHJ5IHsKCQkJLy8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50CgkJCWlmICggcy5kYXRhICkKCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlKTsKCgkJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCgkJCWlmICggcy5pZk1vZGlmaWVkICkKCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsCgkJCQkJalF1ZXJ5Lmxhc3RNb2RpZmllZFtzLnVybF0gfHwgIlRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIiApOwoKCQkJLy8gU2V0IGhlYWRlciBzbyB0aGUgY2FsbGVkIHNjcmlwdCBrbm93cyB0aGF0IGl0J3MgYW4gWE1MSHR0cFJlcXVlc3QKCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIlgtUmVxdWVzdGVkLVdpdGgiLCAiWE1MSHR0cFJlcXVlc3QiKTsKCgkJCS8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGUKCQkJeGhyLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsIHMuZGF0YVR5cGUgJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gPwoJCQkJcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gKyAiLCAqLyoiIDoKCQkJCXMuYWNjZXB0cy5fZGVmYXVsdCApOwoJCX0gY2F0Y2goZSl7fQoKCQkvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0CgkJaWYgKCBzLmJlZm9yZVNlbmQgJiYgcy5iZWZvcmVTZW5kKHhociwgcykgPT09IGZhbHNlICkgewoJCQkvLyBIYW5kbGUgdGhlIGdsb2JhbCBBSkFYIGNvdW50ZXIKCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCgkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOwoJCQkvLyBjbG9zZSBvcGVuZGVkIHNvY2tldAoJCQl4aHIuYWJvcnQoKTsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCBzLmdsb2JhbCApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCJhamF4U2VuZCIsIFt4aHIsIHNdKTsKCgkJLy8gV2FpdCBmb3IgYSByZXNwb25zZSB0byBjb21lIGJhY2sKCQl2YXIgb25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oaXNUaW1lb3V0KXsKCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGFib3J0ZWQsIGNsZWFyIHRoZSBpbnRlcnZhbCBhbmQgZGVjcmVtZW50IGpRdWVyeS5hY3RpdmUKCQkJaWYgKHhoci5yZWFkeVN0YXRlID09IDApIHsKCQkJCWlmIChpdmFsKSB7CgkJCQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAoJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CgkJCQkJaXZhbCA9IG51bGw7CgkJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQkJaWYgKCBzLmdsb2JhbCAmJiAhIC0talF1ZXJ5LmFjdGl2ZSApCgkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCS8vIFRoZSB0cmFuc2ZlciBpcyBjb21wbGV0ZSBhbmQgdGhlIGRhdGEgaXMgYXZhaWxhYmxlLCBvciB0aGUgcmVxdWVzdCB0aW1lZCBvdXQKCQkJfSBlbHNlIGlmICggIXJlcXVlc3REb25lICYmIHhociAmJiAoeGhyLnJlYWR5U3RhdGUgPT0gNCB8fCBpc1RpbWVvdXQgPT0gInRpbWVvdXQiKSApIHsKCQkJCXJlcXVlc3REb25lID0gdHJ1ZTsKCgkJCQkvLyBjbGVhciBwb2xsIGludGVydmFsCgkJCQlpZiAoaXZhbCkgewoJCQkJCWNsZWFySW50ZXJ2YWwoaXZhbCk7CgkJCQkJaXZhbCA9IG51bGw7CgkJCQl9CgoJCQkJc3RhdHVzID0gaXNUaW1lb3V0ID09ICJ0aW1lb3V0IiA/ICJ0aW1lb3V0IiA6CgkJCQkJIWpRdWVyeS5odHRwU3VjY2VzcyggeGhyICkgPyAiZXJyb3IiIDoKCQkJCQlzLmlmTW9kaWZpZWQgJiYgalF1ZXJ5Lmh0dHBOb3RNb2RpZmllZCggeGhyLCBzLnVybCApID8gIm5vdG1vZGlmaWVkIiA6CgkJCQkJInN1Y2Nlc3MiOwoKCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiApIHsKCQkJCQkvLyBXYXRjaCBmb3IsIGFuZCBjYXRjaCwgWE1MIGRvY3VtZW50IHBhcnNlIGVycm9ycwoJCQkJCXRyeSB7CgkJCQkJCS8vIHByb2Nlc3MgdGhlIGRhdGEgKHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBEYXRhIHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2spCgkJCQkJCWRhdGEgPSBqUXVlcnkuaHR0cERhdGEoIHhociwgcy5kYXRhVHlwZSwgcyApOwoJCQkJCX0gY2F0Y2goZSkgewoJCQkJCQlzdGF0dXMgPSAicGFyc2VyZXJyb3IiOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBub3Rtb2RpZmllZAoJCQkJaWYgKCBzdGF0dXMgPT0gInN1Y2Nlc3MiICkgewoJCQkJCS8vIENhY2hlIExhc3QtTW9kaWZpZWQgaGVhZGVyLCBpZiBpZk1vZGlmaWVkIG1vZGUuCgkJCQkJdmFyIG1vZFJlczsKCQkJCQl0cnkgewoJCQkJCQltb2RSZXMgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTsKCQkJCQl9IGNhdGNoKGUpIHt9IC8vIHN3YWxsb3cgZXhjZXB0aW9uIHRocm93biBieSBGRiBpZiBoZWFkZXIgaXMgbm90IGF2YWlsYWJsZQoKCQkJCQlpZiAoIHMuaWZNb2RpZmllZCAmJiBtb2RSZXMgKQoJCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSA9IG1vZFJlczsKCgkJCQkJLy8gSlNPTlAgaGFuZGxlcyBpdHMgb3duIHN1Y2Nlc3MgY2FsbGJhY2sKCQkJCQlpZiAoICFqc29ucCApCgkJCQkJCXN1Y2Nlc3MoKTsKCQkJCX0gZWxzZQoJCQkJCWpRdWVyeS5oYW5kbGVFcnJvcihzLCB4aHIsIHN0YXR1cyk7CgoJCQkJLy8gRmlyZSB0aGUgY29tcGxldGUgaGFuZGxlcnMKCQkJCWNvbXBsZXRlKCk7CgoJCQkJaWYgKCBpc1RpbWVvdXQgKQoJCQkJCXhoci5hYm9ydCgpOwoKCQkJCS8vIFN0b3AgbWVtb3J5IGxlYWtzCgkJCQlpZiAoIHMuYXN5bmMgKQoJCQkJCXhociA9IG51bGw7CgkJCX0KCQl9OwoKCQlpZiAoIHMuYXN5bmMgKSB7CgkJCS8vIGRvbid0IGF0dGFjaCB0aGUgaGFuZGxlciB0byB0aGUgcmVxdWVzdCwganVzdCBwb2xsIGl0IGluc3RlYWQKCQkJdmFyIGl2YWwgPSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVjaGFuZ2UsIDEzKTsKCgkJCS8vIFRpbWVvdXQgY2hlY2tlcgoJCQlpZiAoIHMudGltZW91dCA+IDAgKQoJCQkJc2V0VGltZW91dChmdW5jdGlvbigpewoJCQkJCS8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcmVxdWVzdCBpcyBzdGlsbCBoYXBwZW5pbmcKCQkJCQlpZiAoIHhociAmJiAhcmVxdWVzdERvbmUgKQoJCQkJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoICJ0aW1lb3V0IiApOwoJCQkJfSwgcy50aW1lb3V0KTsKCQl9CgoJCS8vIFNlbmQgdGhlIGRhdGEKCQl0cnkgewoJCQl4aHIuc2VuZCggdHlwZSA9PT0gIlBPU1QiID8gcy5kYXRhIDogbnVsbCApOwoJCX0gY2F0Y2goZSkgewoJCQlqUXVlcnkuaGFuZGxlRXJyb3IocywgeGhyLCBudWxsLCBlKTsKCQl9CgoJCS8vIGZpcmVmb3ggMS41IGRvZXNuJ3QgZmlyZSBzdGF0ZWNoYW5nZSBmb3Igc3luYyByZXF1ZXN0cwoJCWlmICggIXMuYXN5bmMgKQoJCQlvbnJlYWR5c3RhdGVjaGFuZ2UoKTsKCgkJZnVuY3Rpb24gc3VjY2VzcygpewoJCQkvLyBJZiBhIGxvY2FsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIGZpcmUgaXQgYW5kIHBhc3MgaXQgdGhlIGRhdGEKCQkJaWYgKCBzLnN1Y2Nlc3MgKQoJCQkJcy5zdWNjZXNzKCBkYXRhLCBzdGF0dXMgKTsKCgkJCS8vIEZpcmUgdGhlIGdsb2JhbCBjYWxsYmFjawoJCQlpZiAoIHMuZ2xvYmFsICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN1Y2Nlc3MiLCBbeGhyLCBzXSApOwoJCX0KCgkJZnVuY3Rpb24gY29tcGxldGUoKXsKCQkJLy8gUHJvY2VzcyByZXN1bHQKCQkJaWYgKCBzLmNvbXBsZXRlICkKCQkJCXMuY29tcGxldGUoeGhyLCBzdGF0dXMpOwoKCQkJLy8gVGhlIHJlcXVlc3Qgd2FzIGNvbXBsZXRlZAoJCQlpZiAoIHMuZ2xvYmFsICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgW3hociwgc10gKTsKCgkJCS8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlcgoJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0aXZlICkKCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJfQoKCQkvLyByZXR1cm4gWE1MSHR0cFJlcXVlc3QgdG8gYWxsb3cgYWJvcnRpbmcgdGhlIHJlcXVlc3QgZXRjLgoJCXJldHVybiB4aHI7Cgl9LAoKCWhhbmRsZUVycm9yOiBmdW5jdGlvbiggcywgeGhyLCBzdGF0dXMsIGUgKSB7CgkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBmaXJlIGl0CgkJaWYgKCBzLmVycm9yICkgcy5lcnJvciggeGhyLCBzdGF0dXMsIGUgKTsKCgkJLy8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCgkJaWYgKCBzLmdsb2JhbCApCgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheEVycm9yIiwgW3hociwgcywgZV0gKTsKCX0sCgoJLy8gQ291bnRlciBmb3IgaG9sZGluZyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBxdWVyaWVzCglhY3RpdmU6IDAsCgoJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBub3QKCWh0dHBTdWNjZXNzOiBmdW5jdGlvbiggeGhyICkgewoJCXRyeSB7CgkJCS8vIElFIGVycm9yIHNvbWV0aW1lcyByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0IHNvIHRyZWF0IGl0IGFzIHN1Y2Nlc3MsIHNlZSAjMTQ1MAoJCQlyZXR1cm4gIXhoci5zdGF0dXMgJiYgbG9jYXRpb24ucHJvdG9jb2wgPT0gImZpbGU6IiB8fAoJCQkJKCB4aHIuc3RhdHVzID49IDIwMCAmJiB4aHIuc3RhdHVzIDwgMzAwICkgfHwgeGhyLnN0YXR1cyA9PSAzMDQgfHwgeGhyLnN0YXR1cyA9PSAxMjIzOwoJCX0gY2F0Y2goZSl7fQoJCXJldHVybiBmYWxzZTsKCX0sCgoJLy8gRGV0ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCglodHRwTm90TW9kaWZpZWQ6IGZ1bmN0aW9uKCB4aHIsIHVybCApIHsKCQl0cnkgewoJCQl2YXIgeGhyUmVzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7CgoJCQkvLyBGaXJlZm94IGFsd2F5cyByZXR1cm5zIDIwMC4gY2hlY2sgTGFzdC1Nb2RpZmllZCBkYXRlCgkJCXJldHVybiB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHJSZXMgPT0galF1ZXJ5Lmxhc3RNb2RpZmllZFt1cmxdOwoJCX0gY2F0Y2goZSl7fQoJCXJldHVybiBmYWxzZTsKCX0sCgoJaHR0cERhdGE6IGZ1bmN0aW9uKCB4aHIsIHR5cGUsIHMgKSB7CgkJdmFyIGN0ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJjb250ZW50LXR5cGUiKSwKCQkJeG1sID0gdHlwZSA9PSAieG1sIiB8fCAhdHlwZSAmJiBjdCAmJiBjdC5pbmRleE9mKCJ4bWwiKSA+PSAwLAoJCQlkYXRhID0geG1sID8geGhyLnJlc3BvbnNlWE1MIDogeGhyLnJlc3BvbnNlVGV4dDsKCgkJaWYgKCB4bWwgJiYgZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFtZSA9PSAicGFyc2VyZXJyb3IiICkgewoJCQl0aHJvdyAicGFyc2VyZXJyb3IiOwoJCX0KCgkJLy8gQWxsb3cgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSByZXNwb25zZQoJCS8vIHMgIT0gbnVsbCBpcyBjaGVja2VkIHRvIGtlZXAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKCQlpZiAoIHMgJiYgcy5kYXRhRmlsdGVyICkgewoJCQlkYXRhID0gcy5kYXRhRmlsdGVyKCBkYXRhLCB0eXBlICk7CgkJfQoKCQkvLyBUaGUgZmlsdGVyIGNhbiBhY3R1YWxseSBwYXJzZSB0aGUgcmVzcG9uc2UKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCgkJCS8vIElmIHRoZSB0eXBlIGlzICJzY3JpcHQiLCBldmFsIGl0IGluIGdsb2JhbCBjb250ZXh0CgkJCWlmICggdHlwZSA9PT0gInNjcmlwdCIgKSB7CgkJCQlqUXVlcnkuZ2xvYmFsRXZhbCggZGF0YSApOwoJCQl9CgoJCQkvLyBHZXQgdGhlIEphdmFTY3JpcHQgb2JqZWN0LCBpZiBKU09OIGlzIHVzZWQuCgkJCWlmICggdHlwZSA9PSAianNvbiIgKSB7CgkJCQlpZiAoIHR5cGVvZiBKU09OID09PSAib2JqZWN0IiAmJiBKU09OLnBhcnNlICkgewoJCQkJCWRhdGEgPSBKU09OLnBhcnNlKCBkYXRhICk7CgkJCQl9IGVsc2UgewoJCQkJCWRhdGEgPSAobmV3IEZ1bmN0aW9uKCJyZXR1cm4gIiArIGRhdGEpKSgpOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gZGF0YTsKCX0sCgoJLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2YKCS8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZwoJcGFyYW06IGZ1bmN0aW9uKCBhICkgewoJCXZhciBzID0gWyBdOwoKCQlmdW5jdGlvbiBhZGQoIGtleSwgdmFsdWUgKXsKCQkJc1sgcy5sZW5ndGggXSA9IGVuY29kZVVSSUNvbXBvbmVudChrZXkpICsgJz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKTsKCQl9OwoKCQkvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheQoJCS8vIG9mIGZvcm0gZWxlbWVudHMKCQlpZiAoIGpRdWVyeS5pc0FycmF5KGEpIHx8IGEuanF1ZXJ5ICkKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpewoJCQkJYWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTsKCQkJfSk7CgoJCS8vIE90aGVyd2lzZSwgYXNzdW1lIHRoYXQgaXQncyBhbiBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzCgkJZWxzZQoJCQkvLyBTZXJpYWxpemUgdGhlIGtleS92YWx1ZXMKCQkJZm9yICggdmFyIGogaW4gYSApCgkJCQkvLyBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXkgdGhlbiB0aGUga2V5IG5hbWVzIG5lZWQgdG8gYmUgcmVwZWF0ZWQKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoYVtqXSkgKQoJCQkJCWpRdWVyeS5lYWNoKCBhW2pdLCBmdW5jdGlvbigpewoJCQkJCQlhZGQoIGosIHRoaXMgKTsKCQkJCQl9KTsKCQkJCWVsc2UKCQkJCQlhZGQoIGosIGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pID8gYVtqXSgpIDogYVtqXSApOwoKCQkvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uCgkJcmV0dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCAiKyIpOwoJfQoKfSk7CnZhciBlbGVtZGlzcGxheSA9IHt9LAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV07CgpmdW5jdGlvbiBnZW5GeCggdHlwZSwgbnVtICl7Cgl2YXIgb2JqID0ge307CglqUXVlcnkuZWFjaCggZnhBdHRycy5jb25jYXQuYXBwbHkoW10sIGZ4QXR0cnMuc2xpY2UoMCxudW0pKSwgZnVuY3Rpb24oKXsKCQlvYmpbIHRoaXMgXSA9IHR5cGU7Cgl9KTsKCXJldHVybiBvYmo7Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2spewoJCWlmICggc3BlZWQgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJzaG93IiwgMyksIHNwZWVkLCBjYWxsYmFjayk7CgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKXsKCQkJCXZhciBvbGQgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpOwoKCQkJCXRoaXNbaV0uc3R5bGUuZGlzcGxheSA9IG9sZCB8fCAiIjsKCgkJCQlpZiAoIGpRdWVyeS5jc3ModGhpc1tpXSwgImRpc3BsYXkiKSA9PT0gIm5vbmUiICkgewoJCQkJCXZhciB0YWdOYW1lID0gdGhpc1tpXS50YWdOYW1lLCBkaXNwbGF5OwoKCQkJCQlpZiAoIGVsZW1kaXNwbGF5WyB0YWdOYW1lIF0gKSB7CgkJCQkJCWRpc3BsYXkgPSBlbGVtZGlzcGxheVsgdGFnTmFtZSBdOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXZhciBlbGVtID0galF1ZXJ5KCI8IiArIHRhZ05hbWUgKyAiIC8+IikuYXBwZW5kVG8oImJvZHkiKTsKCgkJCQkJCWRpc3BsYXkgPSBlbGVtLmNzcygiZGlzcGxheSIpOwoJCQkJCQlpZiAoIGRpc3BsYXkgPT09ICJub25lIiApCgkJCQkJCQlkaXNwbGF5ID0gImJsb2NrIjsKCgkJCQkJCWVsZW0ucmVtb3ZlKCk7CgoJCQkJCQllbGVtZGlzcGxheVsgdGFnTmFtZSBdID0gZGlzcGxheTsKCQkJCQl9CgoJCQkJCWpRdWVyeS5kYXRhKHRoaXNbaV0sICJvbGRkaXNwbGF5IiwgZGlzcGxheSk7CgkJCQl9CgkJCX0KCgkJCS8vIFNldCB0aGUgZGlzcGxheSBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuZGF0YSh0aGlzW2ldLCAib2xkZGlzcGxheSIpIHx8ICIiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCWhpZGU6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKCQlpZiAoIHNwZWVkICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgiaGlkZSIsIDMpLCBzcGVlZCwgY2FsbGJhY2spOwoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICl7CgkJCQl2YXIgb2xkID0galF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiKTsKCQkJCWlmICggIW9sZCAmJiBvbGQgIT09ICJub25lIiApCgkJCQkJalF1ZXJ5LmRhdGEodGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBqUXVlcnkuY3NzKHRoaXNbaV0sICJkaXNwbGF5IikpOwoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApewoJCQkJdGhpc1tpXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9Cgl9LAoKCS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KCV90b2dnbGU6IGpRdWVyeS5mbi50b2dnbGUsCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApewoJCXZhciBib29sID0gdHlwZW9mIGZuID09PSAiYm9vbGVhbiI7CgoJCXJldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oZm4yKSA/CgkJCXRoaXMuX3RvZ2dsZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOgoJCQlmbiA9PSBudWxsIHx8IGJvb2wgPwoJCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCl7CgkJCQkJdmFyIHN0YXRlID0gYm9vbCA/IGZuIDogalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIik7CgkJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCQl9KSA6CgkJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yKTsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbihzcGVlZCx0byxjYWxsYmFjayl7CgkJcmV0dXJuIHRoaXMuZmlsdGVyKCI6aGlkZGVuIikuY3NzKCdvcGFjaXR5JywgMCkuc2hvdygpLmVuZCgpCgkJCQkJLmFuaW1hdGUoe29wYWNpdHk6IHRvfSwgc3BlZWQsIGNhbGxiYWNrKTsKCX0sCgoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOwoKCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpewoKCQkJdmFyIG9wdCA9IGpRdWVyeS5leHRlbmQoe30sIG9wdGFsbCksIHAsCgkJCQloaWRkZW4gPSB0aGlzLm5vZGVUeXBlID09IDEgJiYgalF1ZXJ5KHRoaXMpLmlzKCI6aGlkZGVuIiksCgkJCQlzZWxmID0gdGhpczsKCgkJCWZvciAoIHAgaW4gcHJvcCApIHsKCQkJCWlmICggcHJvcFtwXSA9PSAiaGlkZSIgJiYgaGlkZGVuIHx8IHByb3BbcF0gPT0gInNob3ciICYmICFoaWRkZW4gKQoJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCh0aGlzKTsKCgkJCQlpZiAoICggcCA9PSAiaGVpZ2h0IiB8fCBwID09ICJ3aWR0aCIgKSAmJiB0aGlzLnN0eWxlICkgewoJCQkJCS8vIFN0b3JlIGRpc3BsYXkgcHJvcGVydHkKCQkJCQlvcHQuZGlzcGxheSA9IGpRdWVyeS5jc3ModGhpcywgImRpc3BsYXkiKTsKCgkJCQkJLy8gTWFrZSBzdXJlIHRoYXQgbm90aGluZyBzbmVha3Mgb3V0CgkJCQkJb3B0Lm92ZXJmbG93ID0gdGhpcy5zdHlsZS5vdmVyZmxvdzsKCQkJCX0KCQkJfQoKCQkJaWYgKCBvcHQub3ZlcmZsb3cgIT0gbnVsbCApCgkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgoJCQlvcHQuY3VyQW5pbSA9IGpRdWVyeS5leHRlbmQoe30sIHByb3ApOwoKCQkJalF1ZXJ5LmVhY2goIHByb3AsIGZ1bmN0aW9uKG5hbWUsIHZhbCl7CgkJCQl2YXIgZSA9IG5ldyBqUXVlcnkuZngoIHNlbGYsIG9wdCwgbmFtZSApOwoKCQkJCWlmICggL3RvZ2dsZXxzaG93fGhpZGUvLnRlc3QodmFsKSApCgkJCQkJZVsgdmFsID09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oIHByb3AgKTsKCQkJCWVsc2UgewoJCQkJCXZhciBwYXJ0cyA9IHZhbC50b1N0cmluZygpLm1hdGNoKC9eKFsrLV09KT8oW1xkKy0uXSspKC4qKSQvKSwKCQkJCQkJc3RhcnQgPSBlLmN1cih0cnVlKSB8fCAwOwoKCQkJCQlpZiAoIHBhcnRzICkgewoJCQkJCQl2YXIgZW5kID0gcGFyc2VGbG9hdChwYXJ0c1syXSksCgkJCQkJCQl1bml0ID0gcGFydHNbM10gfHwgInB4IjsKCgkJCQkJCS8vIFdlIG5lZWQgdG8gY29tcHV0ZSBzdGFydGluZyB2YWx1ZQoJCQkJCQlpZiAoIHVuaXQgIT0gInB4IiApIHsKCQkJCQkJCXNlbGYuc3R5bGVbIG5hbWUgXSA9IChlbmQgfHwgMSkgKyB1bml0OwoJCQkJCQkJc3RhcnQgPSAoKGVuZCB8fCAxKSAvIGUuY3VyKHRydWUpKSAqIHN0YXJ0OwoJCQkJCQkJc2VsZi5zdHlsZVsgbmFtZSBdID0gc3RhcnQgKyB1bml0OwoJCQkJCQl9CgoJCQkJCQkvLyBJZiBhICs9Ly09IHRva2VuIHdhcyBwcm92aWRlZCwgd2UncmUgZG9pbmcgYSByZWxhdGl2ZSBhbmltYXRpb24KCQkJCQkJaWYgKCBwYXJ0c1sxXSApCgkJCQkJCQllbmQgPSAoKHBhcnRzWzFdID09ICItPSIgPyAtMSA6IDEpICogZW5kKSArIHN0YXJ0OwoKCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCBlbmQsIHVuaXQgKTsKCQkJCQl9IGVsc2UKCQkJCQkJZS5jdXN0b20oIHN0YXJ0LCB2YWwsICIiICk7CgkJCQl9CgkJCX0pOwoKCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCgkJCXJldHVybiB0cnVlOwoJCX0pOwoJfSwKCglzdG9wOiBmdW5jdGlvbihjbGVhclF1ZXVlLCBnb3RvRW5kKXsKCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKCgkJaWYgKGNsZWFyUXVldWUpCgkJCXRoaXMucXVldWUoW10pOwoKCQl0aGlzLmVhY2goZnVuY3Rpb24oKXsKCQkJLy8gZ28gaW4gcmV2ZXJzZSBvcmRlciBzbyBhbnl0aGluZyBhZGRlZCB0byB0aGUgcXVldWUgZHVyaW5nIHRoZSBsb29wIGlzIGlnbm9yZWQKCQkJZm9yICggdmFyIGkgPSB0aW1lcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKQoJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PSB0aGlzICkgewoJCQkJCWlmIChnb3RvRW5kKQoJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CgkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKCQkJCQl0aW1lcnMuc3BsaWNlKGksIDEpOwoJCQkJfQoJCX0pOwoKCQkvLyBzdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkCgkJaWYgKCFnb3RvRW5kKQoJCQl0aGlzLmRlcXVldWUoKTsKCgkJcmV0dXJuIHRoaXM7Cgl9Cgp9KTsKCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIsIDEpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApewoJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGNhbGxiYWNrICl7CgkJcmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglzcGVlZDogZnVuY3Rpb24oc3BlZWQsIGVhc2luZywgZm4pIHsKCQl2YXIgb3B0ID0gdHlwZW9mIHNwZWVkID09PSAib2JqZWN0IiA/IHNwZWVkIDogewoJCQljb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fAoJCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsCgkJCWR1cmF0aW9uOiBzcGVlZCwKCQkJZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFqUXVlcnkuaXNGdW5jdGlvbihlYXNpbmcpICYmIGVhc2luZwoJCX07CgoJCW9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gIm51bWJlciIgPyBvcHQuZHVyYXRpb24gOgoJCQlqUXVlcnkuZnguc3BlZWRzW29wdC5kdXJhdGlvbl0gfHwgalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgkJLy8gUXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCl7CgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApCgkJCQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHQub2xkICkgKQoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJfTsKCgkJcmV0dXJuIG9wdDsKCX0sCgoJZWFzaW5nOiB7CgkJbGluZWFyOiBmdW5jdGlvbiggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CgkJCXJldHVybiBmaXJzdE51bSArIGRpZmYgKiBwOwoJCX0sCgkJc3dpbmc6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuICgoLU1hdGguY29zKHAqTWF0aC5QSSkvMikgKyAwLjUpICogZGlmZiArIGZpcnN0TnVtOwoJCX0KCX0sCgoJdGltZXJzOiBbXSwKCglmeDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AgKXsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCgkJaWYgKCAhb3B0aW9ucy5vcmlnICkKCQkJb3B0aW9ucy5vcmlnID0ge307Cgl9Cgp9KTsKCmpRdWVyeS5meC5wcm90b3R5cGUgPSB7CgoJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKCXVwZGF0ZTogZnVuY3Rpb24oKXsKCQlpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoKCQkoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9wXSB8fCBqUXVlcnkuZnguc3RlcC5fZGVmYXVsdCkoIHRoaXMgKTsKCgkJLy8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gYmxvY2sgZm9yIGhlaWdodC93aWR0aCBhbmltYXRpb25zCgkJaWYgKCAoIHRoaXMucHJvcCA9PSAiaGVpZ2h0IiB8fCB0aGlzLnByb3AgPT0gIndpZHRoIiApICYmIHRoaXMuZWxlbS5zdHlsZSApCgkJCXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCX0sCgoJLy8gR2V0IHRoZSBjdXJyZW50IHNpemUKCWN1cjogZnVuY3Rpb24oZm9yY2UpewoJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApCgkJCXJldHVybiB0aGlzLmVsZW1bIHRoaXMucHJvcCBdOwoKCQl2YXIgciA9IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyh0aGlzLmVsZW0sIHRoaXMucHJvcCwgZm9yY2UpKTsKCQlyZXR1cm4gciAmJiByID4gLTEwMDAwID8gciA6IHBhcnNlRmxvYXQoalF1ZXJ5LmN1ckNTUyh0aGlzLmVsZW0sIHRoaXMucHJvcCkpIHx8IDA7Cgl9LAoKCS8vIFN0YXJ0IGFuIGFuaW1hdGlvbiBmcm9tIG9uZSBudW1iZXIgdG8gYW5vdGhlcgoJY3VzdG9tOiBmdW5jdGlvbihmcm9tLCB0bywgdW5pdCl7CgkJdGhpcy5zdGFydFRpbWUgPSBub3coKTsKCQl0aGlzLnN0YXJ0ID0gZnJvbTsKCQl0aGlzLmVuZCA9IHRvOwoJCXRoaXMudW5pdCA9IHVuaXQgfHwgdGhpcy51bml0IHx8ICJweCI7CgkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OwoJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CgoJCXZhciBzZWxmID0gdGhpczsKCQlmdW5jdGlvbiB0KGdvdG9FbmQpewoJCQlyZXR1cm4gc2VsZi5zdGVwKGdvdG9FbmQpOwoJCX0KCgkJdC5lbGVtID0gdGhpcy5lbGVtOwoKCQlpZiAoIHQoKSAmJiBqUXVlcnkudGltZXJzLnB1c2godCkgJiYgIXRpbWVySWQgKQoJCQl0aW1lcklkID0gc2V0SW50ZXJ2YWwoalF1ZXJ5LmZ4LnRpY2ssIDEzKTsKCX0sCgoJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgoJc2hvdzogZnVuY3Rpb24oKXsKCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0aGF0IHdlIGNhbiBnbyBiYWNrIHRvIGl0IGxhdGVyCgkJdGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5zdHlsZSggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKCQl0aGlzLm9wdGlvbnMuc2hvdyA9IHRydWU7CgoJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBzdGFydCBhdCBhIHNtYWxsIHdpZHRoL2hlaWdodCB0byBhdm9pZCBhbnkKCQkvLyBmbGFzaCBvZiBjb250ZW50CgkJdGhpcy5jdXN0b20odGhpcy5wcm9wID09ICJ3aWR0aCIgfHwgdGhpcy5wcm9wID09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KHRoaXMuZWxlbSkuc2hvdygpOwoJfSwKCgkvLyBTaW1wbGUgJ2hpZGUnIGZ1bmN0aW9uCgloaWRlOiBmdW5jdGlvbigpewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOwoJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKCgkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgoJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOwoJfSwKCgkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCglzdGVwOiBmdW5jdGlvbihnb3RvRW5kKXsKCQl2YXIgdCA9IG5vdygpOwoKCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyB0aGlzLnN0YXJ0VGltZSApIHsKCQkJdGhpcy5ub3cgPSB0aGlzLmVuZDsKCQkJdGhpcy5wb3MgPSB0aGlzLnN0YXRlID0gMTsKCQkJdGhpcy51cGRhdGUoKTsKCgkJCXRoaXMub3B0aW9ucy5jdXJBbmltWyB0aGlzLnByb3AgXSA9IHRydWU7CgoJCQl2YXIgZG9uZSA9IHRydWU7CgkJCWZvciAoIHZhciBpIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkKCQkJCWlmICggdGhpcy5vcHRpb25zLmN1ckFuaW1baV0gIT09IHRydWUgKQoJCQkJCWRvbmUgPSBmYWxzZTsKCgkJCWlmICggZG9uZSApIHsKCQkJCWlmICggdGhpcy5vcHRpb25zLmRpc3BsYXkgIT0gbnVsbCApIHsKCQkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKCQkJCQl0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3cgPSB0aGlzLm9wdGlvbnMub3ZlcmZsb3c7CgoJCQkJCS8vIFJlc2V0IHRoZSBkaXNwbGF5CgkJCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3BsYXkgPSB0aGlzLm9wdGlvbnMuZGlzcGxheTsKCQkJCQlpZiAoIGpRdWVyeS5jc3ModGhpcy5lbGVtLCAiZGlzcGxheSIpID09ICJub25lIiApCgkJCQkJCXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKCQkJCX0KCgkJCQkvLyBIaWRlIHRoZSBlbGVtZW50IGlmIHRoZSAiaGlkZSIgb3BlcmF0aW9uIHdhcyBkb25lCgkJCQlpZiAoIHRoaXMub3B0aW9ucy5oaWRlICkKCQkJCQlqUXVlcnkodGhpcy5lbGVtKS5oaWRlKCk7CgoJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgoJCQkJaWYgKCB0aGlzLm9wdGlvbnMuaGlkZSB8fCB0aGlzLm9wdGlvbnMuc2hvdyApCgkJCQkJZm9yICggdmFyIHAgaW4gdGhpcy5vcHRpb25zLmN1ckFuaW0gKQoJCQkJCQlqUXVlcnkuc3R5bGUodGhpcy5lbGVtLCBwLCB0aGlzLm9wdGlvbnMub3JpZ1twXSk7CgoJCQkJLy8gRXhlY3V0ZSB0aGUgY29tcGxldGUgZnVuY3Rpb24KCQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0gZWxzZSB7CgkJCXZhciBuID0gdCAtIHRoaXMuc3RhcnRUaW1lOwoJCQl0aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKCgkJCS8vIFBlcmZvcm0gdGhlIGVhc2luZyBmdW5jdGlvbiwgZGVmYXVsdHMgdG8gc3dpbmcKCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAic3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24pOwoJCQl0aGlzLm5vdyA9IHRoaXMuc3RhcnQgKyAoKHRoaXMuZW5kIC0gdGhpcy5zdGFydCkgKiB0aGlzLnBvcyk7CgoJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFuaW1hdGlvbgoJCQl0aGlzLnVwZGF0ZSgpOwoJCX0KCgkJcmV0dXJuIHRydWU7Cgl9Cgp9OwoKalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CgoJdGljazpmdW5jdGlvbigpewoJCXZhciB0aW1lcnMgPSBqUXVlcnkudGltZXJzOwoKCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKQoJCQlpZiAoICF0aW1lcnNbaV0oKSApCgkJCQl0aW1lcnMuc3BsaWNlKGktLSwgMSk7CgoJCWlmICggIXRpbWVycy5sZW5ndGggKQoJCQlqUXVlcnkuZnguc3RvcCgpOwoJfSwKCQkKCXN0b3A6ZnVuY3Rpb24oKXsKCQljbGVhckludGVydmFsKCB0aW1lcklkICk7CgkJdGltZXJJZCA9IG51bGw7Cgl9LAoJCglzcGVlZHM6ewoJCXNsb3c6IDYwMCwKIAkJZmFzdDogMjAwLAogCQkvLyBEZWZhdWx0IHNwZWVkCiAJCV9kZWZhdWx0OiA0MDAKCX0sCgoJc3RlcDogewoKCQlvcGFjaXR5OiBmdW5jdGlvbihmeCl7CgkJCWpRdWVyeS5zdHlsZShmeC5lbGVtLCAib3BhY2l0eSIsIGZ4Lm5vdyk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKGZ4KXsKCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkKCQkJCWZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSA9IGZ4Lm5vdyArIGZ4LnVuaXQ7CgkJCWVsc2UKCQkJCWZ4LmVsZW1bIGZ4LnByb3AgXSA9IGZ4Lm5vdzsKCQl9Cgl9Cn0pOwppZiAoICJnZXRCb3VuZGluZ0NsaWVudFJlY3QiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCApCglqUXVlcnkuZm4ub2Zmc2V0ID0gZnVuY3Rpb24oKSB7CgkJdmFyIGVsZW0gPSB0aGlzWzBdOwoJCWlmICggIWVsZW0gfHwgIWVsZW0ub3duZXJEb2N1bWVudCApIHJldHVybiBudWxsOwoJCWlmICggZWxlbSA9PT0gZWxlbS5vd25lckRvY3VtZW50LmJvZHkgKSByZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CgkJdmFyIGJveCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwgYm9keSA9IGRvYy5ib2R5LCBkb2NFbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudCwKCQkJY2xpZW50VG9wID0gZG9jRWxlbS5jbGllbnRUb3AgfHwgYm9keS5jbGllbnRUb3AgfHwgMCwgY2xpZW50TGVmdCA9IGRvY0VsZW0uY2xpZW50TGVmdCB8fCBib2R5LmNsaWVudExlZnQgfHwgMCwKCQkJdG9wICA9IGJveC50b3AgICsgKHNlbGYucGFnZVlPZmZzZXQgfHwgalF1ZXJ5LnN1cHBvcnQuYm94TW9kZWwgJiYgZG9jRWxlbS5zY3JvbGxUb3AgIHx8IGJvZHkuc2Nyb2xsVG9wICkgLSBjbGllbnRUb3AsCgkJCWxlZnQgPSBib3gubGVmdCArIChzZWxmLnBhZ2VYT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsTGVmdCB8fCBib2R5LnNjcm9sbExlZnQpIC0gY2xpZW50TGVmdDsKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKZWxzZQoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSByZXR1cm4gbnVsbDsKCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOwoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOwoKCQl2YXIgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQsIHByZXZPZmZzZXRQYXJlbnQgPSBlbGVtLAoJCQlkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQsIGNvbXB1dGVkU3R5bGUsIGRvY0VsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50LAoJCQlib2R5ID0gZG9jLmJvZHksIGRlZmF1bHRWaWV3ID0gZG9jLmRlZmF1bHRWaWV3LAoJCQlwcmV2Q29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCksCgkJCXRvcCA9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ID0gZWxlbS5vZmZzZXRMZWZ0OwoKCQl3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtICE9PSBib2R5ICYmIGVsZW0gIT09IGRvY0VsZW0gKSB7CgkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdXBwb3J0c0ZpeGVkUG9zaXRpb24gJiYgcHJldkNvbXB1dGVkU3R5bGUucG9zaXRpb24gPT09ICJmaXhlZCIgKSBicmVhazsKCQkJY29tcHV0ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSwgbnVsbCk7CgkJCXRvcCAtPSBlbGVtLnNjcm9sbFRvcCwgbGVmdCAtPSBlbGVtLnNjcm9sbExlZnQ7CgkJCWlmICggZWxlbSA9PT0gb2Zmc2V0UGFyZW50ICkgewoJCQkJdG9wICs9IGVsZW0ub2Zmc2V0VG9wLCBsZWZ0ICs9IGVsZW0ub2Zmc2V0TGVmdDsKCQkJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90QWRkQm9yZGVyICYmICEoalF1ZXJ5Lm9mZnNldC5kb2VzQWRkQm9yZGVyRm9yVGFibGVBbmRDZWxscyAmJiAvXnQoYWJsZXxkfGgpJC9pLnRlc3QoZWxlbS50YWdOYW1lKSkgKQoJCQkJCXRvcCAgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJUb3BXaWR0aCAgKSB8fCAwLAoJCQkJCWxlZnQgKz0gcGFyc2VGbG9hdCggY29tcHV0ZWRTdHlsZS5ib3JkZXJMZWZ0V2lkdGggKSB8fCAwOwoJCQkJcHJldk9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudCwgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1YnRyYWN0c0JvcmRlckZvck92ZXJmbG93Tm90VmlzaWJsZSAmJiBjb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9PSAidmlzaWJsZSIgKQoJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDAsCgkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoJCX0KCgkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKQoJCQl0b3AgICs9IGJvZHkub2Zmc2V0VG9wLAoJCQlsZWZ0ICs9IGJvZHkub2Zmc2V0TGVmdDsKCgkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApCgkJCXRvcCAgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsVG9wLCBib2R5LnNjcm9sbFRvcCApLAoJCQlsZWZ0ICs9IE1hdGgubWF4KCBkb2NFbGVtLnNjcm9sbExlZnQsIGJvZHkuc2Nyb2xsTGVmdCApOwoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKCmpRdWVyeS5vZmZzZXQgPSB7Cglpbml0aWFsaXplOiBmdW5jdGlvbigpIHsKCQl2YXIgYm9keSA9IGRvY3VtZW50LmJvZHksIGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpLCBpbm5lckRpdiwgY2hlY2tEaXYsIHRhYmxlLCB0ZCwgYm9keU1hcmdpblRvcCA9IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpblRvcCcsIHRydWUpICkgfHwgMCwKCQkJaHRtbCA9ICc8ZGl2IHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiPjxkaXY+PC9kaXY+PC9kaXY+PHRhYmxlIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7bWFyZ2luOjA7Ym9yZGVyOjVweCBzb2xpZCAjMDAwO3BhZGRpbmc6MDt3aWR0aDoxcHg7aGVpZ2h0OjFweDsiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCI+PHRyPjx0ZD48L3RkPjwvdHI+PC90YWJsZT4nOwoKCQlqUXVlcnkuZXh0ZW5kKCBjb250YWluZXIuc3R5bGUsIHsgcG9zaXRpb246ICdhYnNvbHV0ZScsIHRvcDogMCwgbGVmdDogMCwgbWFyZ2luOiAwLCBib3JkZXI6IDAsIHdpZHRoOiAnMXB4JywgaGVpZ2h0OiAnMXB4JywgdmlzaWJpbGl0eTogJ2hpZGRlbicgfSApOwoKCQljb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDsKCQlib2R5Lmluc2VydEJlZm9yZSggY29udGFpbmVyLCBib2R5LmZpcnN0Q2hpbGQgKTsKCQlpbm5lckRpdiA9IGNvbnRhaW5lci5maXJzdENoaWxkLCBjaGVja0RpdiA9IGlubmVyRGl2LmZpcnN0Q2hpbGQsIHRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOwoKCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CgoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJywgY2hlY2tEaXYuc3R5bGUudG9wID0gJzIwcHgnOwoJCXRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMjAgfHwgY2hlY2tEaXYub2Zmc2V0VG9wID09PSAxNSk7IC8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gJycsIGNoZWNrRGl2LnN0eWxlLnRvcCA9ICcnOwoKCQlpbm5lckRpdi5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nLCBpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7CgkJdGhpcy5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgPSAoY2hlY2tEaXYub2Zmc2V0VG9wID09PSAtNSk7CgoJCXRoaXMuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgPSAoYm9keS5vZmZzZXRUb3AgIT09IGJvZHlNYXJnaW5Ub3ApOwoKCQlib2R5LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTsKCQlqUXVlcnkub2Zmc2V0LmluaXRpYWxpemUgPSBmdW5jdGlvbigpe307CgkJCgkJYm9keSA9IGNvbnRhaW5lciA9IGlubmVyRGl2ID0gY2hlY2tEaXYgPSB0YWJsZSA9IHRkID0gbnVsbDsKCX0sCgoJYm9keU9mZnNldDogZnVuY3Rpb24oYm9keSkgewoJCWpRdWVyeS5vZmZzZXQuaW5pdGlhbGl6ZSgpOwoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwgbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKCQlpZiAoIGpRdWVyeS5vZmZzZXQuZG9lc05vdEluY2x1ZGVNYXJnaW5JbkJvZHlPZmZzZXQgKQoJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoYm9keSwgJ21hcmdpblRvcCcsICB0cnVlKSApIHx8IDAsCgkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhib2R5LCAnbWFyZ2luTGVmdCcsIHRydWUpICkgfHwgMDsKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfQp9OwoKCmpRdWVyeS5mbi5leHRlbmQoewoJcG9zaXRpb246IGZ1bmN0aW9uKCkgewoJCWlmICggIXRoaXNbMF0gKSByZXR1cm4gbnVsbDsKCgkJdmFyIGVsZW0gPSB0aGlzWzBdLAoKCQkvLyBHZXQgKnJlYWwqIG9mZnNldFBhcmVudAoJCW9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50KCksCgoJCS8vIEdldCBjb3JyZWN0IG9mZnNldHMKCQlvZmZzZXQgICAgICAgPSB0aGlzLm9mZnNldCgpLAoJCXBhcmVudE9mZnNldCA9IC9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQoKTsKCgkJLy8gU3VidHJhY3QgZWxlbWVudCBtYXJnaW5zCgkJLy8gbm90ZTogd2hlbiBhbiBlbGVtZW50IGhhcyBtYXJnaW46IGF1dG8gdGhlIG9mZnNldExlZnQgYW5kIG1hcmdpbkxlZnQKCQkvLyBhcmUgdGhlIHNhbWUgaW4gU2FmYXJpIGNhdXNpbmcgb2Zmc2V0LmxlZnQgdG8gaW5jb3JyZWN0bHkgYmUgMAoJCW9mZnNldC50b3AgIC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jdXJDU1MoZWxlbSwgJ21hcmdpblRvcCcsICB0cnVlKSApIHx8IDA7CgkJb2Zmc2V0LmxlZnQgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhlbGVtLCAnbWFyZ2luTGVmdCcsIHRydWUpICkgfHwgMDsKCgkJLy8gQWRkIG9mZnNldFBhcmVudCBib3JkZXJzCgkJcGFyZW50T2Zmc2V0LnRvcCAgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhvZmZzZXRQYXJlbnRbMF0sICdib3JkZXJUb3BXaWR0aCcsICB0cnVlKSApIHx8IDA7CgkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmN1ckNTUyhvZmZzZXRQYXJlbnRbMF0sICdib3JkZXJMZWZ0V2lkdGgnLCB0cnVlKSApIHx8IDA7CgoJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cwoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAoJCX07Cgl9LAoKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJdmFyIG9mZnNldFBhcmVudCA9IHRoaXNbMF0ub2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50LmJvZHk7CgkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNldFBhcmVudC50YWdOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnKSApCgkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJlbnQ7CgkJcmV0dXJuIGpRdWVyeSggb2Zmc2V0UGFyZW50ICk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCggWydMZWZ0JywgJ1RvcCddLCBmdW5jdGlvbihpLCBuYW1lKSB7Cgl2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyBuYW1lOwoKCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKCQlpZiAoICF0aGlzWzBdICkgcmV0dXJuIG51bGw7CgkJCgkJdmFyIGVsZW0gPSB0aGlzWzBdLCB3aW4gPSAoInNjcm9sbFRvIiBpbiBlbGVtICYmIGVsZW0uZG9jdW1lbnQpID8gZWxlbSA6CgkJCShlbGVtLm5vZGVOYW1lID09PSAiI2RvY3VtZW50IikgPyBlbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJCWZhbHNlOwoKCQlyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgPwoKCQkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXdpbiA9ICgic2Nyb2xsVG8iIGluIHRoaXMgJiYgdGhpcy5kb2N1bWVudCkgPyB0aGlzIDogCgkJCQkJKHRoaXMubm9kZU5hbWUgPT09ICIjZG9jdW1lbnQiKSA/IHRoaXMuZGVmYXVsdFZpZXcgfHwgdGhpcy5wYXJlbnRXaW5kb3cgOgoJCQkJCQlmYWxzZTsKCQkJCQoJCQkJd2luID8KCQkJCQl3aW4uc2Nyb2xsVG8oCgkJCQkJCSFpID8gdmFsIDogalF1ZXJ5KHdpbikuc2Nyb2xsTGVmdCgpLAoJCQkJCQkgaSA/IHZhbCA6IGpRdWVyeSh3aW4pLnNjcm9sbFRvcCgpCgkJCQkJKSA6CgkJCQkJdGhpc1sgbWV0aG9kIF0gPSB2YWw7CgkJCX0pIDoKCgkJCS8vIFJldHVybiB0aGUgc2Nyb2xsIG9mZnNldAoJCQl3aW4gPwoJCQkJd2luWyBpID8gJ3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCcgXSB8fAoJCQkJCWpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIHx8CgkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCWVsZW1bIG1ldGhvZCBdOwoJfTsKfSk7Ci8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKGksIG5hbWUpewoKCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bImlubmVyIiArIG5hbWVdID0gZnVuY3Rpb24oKXsKCQlyZXR1cm4gdGhpc1swXSA/CgkJCWpRdWVyeS5jc3MoIHRoaXNbMF0sIHR5cGUsIGZhbHNlLCAicGFkZGluZyIgKSA6CgkJCW51bGw7Cgl9OwoKCS8vIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoCglqUXVlcnkuZm5bIm91dGVyIiArIG5hbWVdID0gZnVuY3Rpb24obWFyZ2luKSB7CgkJcmV0dXJuIHRoaXNbMF0gPwoJCQlqUXVlcnkuY3NzKCB0aGlzWzBdLCB0eXBlLCBmYWxzZSwgbWFyZ2luID8gIm1hcmdpbiIgOiAiYm9yZGVyIiApIDoKCQkJbnVsbDsKCX07CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtICkgcmV0dXJuIG51bGw7CgkJcmV0dXJuICgic2Nyb2xsVG8iIGluIGVsZW0gJiYgZWxlbS5kb2N1bWVudCkgPyAvLyBkb2VzIGl0IHdhbGsgYW5kIHF1YWNrIGxpa2UgYSB3aW5kb3c/CgkJCS8vIEV2ZXJ5b25lIGVsc2UgdXNlIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCBvciBkb2N1bWVudC5ib2R5IGRlcGVuZGluZyBvbiBRdWlya3MgdnMgU3RhbmRhcmRzIG1vZGUKCQkJZWxlbS5kb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIgJiYgZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGllbnQiICsgbmFtZSBdIHx8CgkJCWVsZW0uZG9jdW1lbnQuYm9keVsgImNsaWVudCIgKyBuYW1lIF0gOgoKCQkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCQkoZWxlbS5ub2RlTmFtZSA9PT0gIiNkb2N1bWVudCIpID8gLy8gaXMgaXQgYSBkb2N1bWVudAoJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlcgoJCQkJTWF0aC5tYXgoCgkJCQkJZWxlbS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCQllbGVtLmJvZHlbInNjcm9sbCIgKyBuYW1lXSwgZWxlbS5kb2N1bWVudEVsZW1lbnRbInNjcm9sbCIgKyBuYW1lXSwKCQkJCQllbGVtLmJvZHlbIm9mZnNldCIgKyBuYW1lXSwgZWxlbS5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIgKyBuYW1lXQoJCQkJKSA6CgoJCQkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQkJCXNpemUgPT09IHVuZGVmaW5lZCA/CgkJCQkJLy8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudAoJCQkJCWpRdWVyeS5jc3MoIGVsZW0sIHR5cGUgKSA6CgoJCQkJCS8vIFNldCB0aGUgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50IChkZWZhdWx0IHRvIHBpeGVscyBpZiB2YWx1ZSBpcyB1bml0bGVzcykKCQkJCQl0aGlzLmNzcyggdHlwZSwgdHlwZW9mIHNpemUgPT09ICJzdHJpbmciID8gc2l6ZSA6IHNpemUgKyAicHgiICk7Cgl9OwoKfSk7Cn0pKHdpbmRvdyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery-1.7.1.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSB2MS43LjEganF1ZXJ5LmNvbSB8IGpxdWVyeS5vcmcvbGljZW5zZSAqLwooZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjeShhKXtyZXR1cm4gZi5pc1dpbmRvdyhhKT9hOmEubm9kZVR5cGU9PT05P2EuZGVmYXVsdFZpZXd8fGEucGFyZW50V2luZG93OiExfWZ1bmN0aW9uIGN2KGEpe2lmKCFja1thXSl7dmFyIGI9Yy5ib2R5LGQ9ZigiPCIrYSsiPiIpLmFwcGVuZFRvKGIpLGU9ZC5jc3MoImRpc3BsYXkiKTtkLnJlbW92ZSgpO2lmKGU9PT0ibm9uZSJ8fGU9PT0iIil7Y2x8fChjbD1jLmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpLGNsLmZyYW1lQm9yZGVyPWNsLndpZHRoPWNsLmhlaWdodD0wKSxiLmFwcGVuZENoaWxkKGNsKTtpZighY218fCFjbC5jcmVhdGVFbGVtZW50KWNtPShjbC5jb250ZW50V2luZG93fHxjbC5jb250ZW50RG9jdW1lbnQpLmRvY3VtZW50LGNtLndyaXRlKChjLmNvbXBhdE1vZGU9PT0iQ1NTMUNvbXBhdCI/IjwhZG9jdHlwZSBodG1sPiI6IiIpKyI8aHRtbD48Ym9keT4iKSxjbS5jbG9zZSgpO2Q9Y20uY3JlYXRlRWxlbWVudChhKSxjbS5ib2R5LmFwcGVuZENoaWxkKGQpLGU9Zi5jc3MoZCwiZGlzcGxheSIpLGIucmVtb3ZlQ2hpbGQoY2wpfWNrW2FdPWV9cmV0dXJuIGNrW2FdfWZ1bmN0aW9uIGN1KGEsYil7dmFyIGM9e307Zi5lYWNoKGNxLmNvbmNhdC5hcHBseShbXSxjcS5zbGljZSgwLGIpKSxmdW5jdGlvbigpe2NbdGhpc109YX0pO3JldHVybiBjfWZ1bmN0aW9uIGN0KCl7Y3I9Yn1mdW5jdGlvbiBjcygpe3NldFRpbWVvdXQoY3QsMCk7cmV0dXJuIGNyPWYubm93KCl9ZnVuY3Rpb24gY2ooKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1mdW5jdGlvbiBjaSgpe3RyeXtyZXR1cm4gbmV3IGEuWE1MSHR0cFJlcXVlc3R9Y2F0Y2goYil7fX1mdW5jdGlvbiBjYyhhLGMpe2EuZGF0YUZpbHRlciYmKGM9YS5kYXRhRmlsdGVyKGMsYS5kYXRhVHlwZSkpO3ZhciBkPWEuZGF0YVR5cGVzLGU9e30sZyxoLGk9ZC5sZW5ndGgsaixrPWRbMF0sbCxtLG4sbyxwO2ZvcihnPTE7ZzxpO2crKyl7aWYoZz09PTEpZm9yKGggaW4gYS5jb252ZXJ0ZXJzKXR5cGVvZiBoPT0ic3RyaW5nIiYmKGVbaC50b0xvd2VyQ2FzZSgpXT1hLmNvbnZlcnRlcnNbaF0pO2w9ayxrPWRbZ107aWYoaz09PSIqIilrPWw7ZWxzZSBpZihsIT09IioiJiZsIT09ayl7bT1sKyIgIitrLG49ZVttXXx8ZVsiKiAiK2tdO2lmKCFuKXtwPWI7Zm9yKG8gaW4gZSl7aj1vLnNwbGl0KCIgIik7aWYoalswXT09PWx8fGpbMF09PT0iKiIpe3A9ZVtqWzFdKyIgIitrXTtpZihwKXtvPWVbb10sbz09PSEwP249cDpwPT09ITAmJihuPW8pO2JyZWFrfX19fSFuJiYhcCYmZi5lcnJvcigiTm8gY29udmVyc2lvbiBmcm9tICIrbS5yZXBsYWNlKCIgIiwiIHRvICIpKSxuIT09ITAmJihjPW4/bihjKTpwKG8oYykpKX19cmV0dXJuIGN9ZnVuY3Rpb24gY2IoYSxjLGQpe3ZhciBlPWEuY29udGVudHMsZj1hLmRhdGFUeXBlcyxnPWEucmVzcG9uc2VGaWVsZHMsaCxpLGosaztmb3IoaSBpbiBnKWkgaW4gZCYmKGNbZ1tpXV09ZFtpXSk7d2hpbGUoZlswXT09PSIqIilmLnNoaWZ0KCksaD09PWImJihoPWEubWltZVR5cGV8fGMuZ2V0UmVzcG9uc2VIZWFkZXIoImNvbnRlbnQtdHlwZSIpKTtpZihoKWZvcihpIGluIGUpaWYoZVtpXSYmZVtpXS50ZXN0KGgpKXtmLnVuc2hpZnQoaSk7YnJlYWt9aWYoZlswXWluIGQpaj1mWzBdO2Vsc2V7Zm9yKGkgaW4gZCl7aWYoIWZbMF18fGEuY29udmVydGVyc1tpKyIgIitmWzBdXSl7aj1pO2JyZWFrfWt8fChrPWkpfWo9anx8a31pZihqKXtqIT09ZlswXSYmZi51bnNoaWZ0KGopO3JldHVybiBkW2pdfX1mdW5jdGlvbiBjYShhLGIsYyxkKXtpZihmLmlzQXJyYXkoYikpZi5lYWNoKGIsZnVuY3Rpb24oYixlKXtjfHxiRS50ZXN0KGEpP2QoYSxlKTpjYShhKyJbIisodHlwZW9mIGU9PSJvYmplY3QifHxmLmlzQXJyYXkoZSk/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoIWMmJmIhPW51bGwmJnR5cGVvZiBiPT0ib2JqZWN0Iilmb3IodmFyIGUgaW4gYiljYShhKyJbIitlKyJdIixiW2VdLGMsZCk7ZWxzZSBkKGEsYil9ZnVuY3Rpb24gYl8oYSxjKXt2YXIgZCxlLGc9Zi5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnN8fHt9O2ZvcihkIGluIGMpY1tkXSE9PWImJigoZ1tkXT9hOmV8fChlPXt9KSlbZF09Y1tkXSk7ZSYmZi5leHRlbmQoITAsYSxlKX1mdW5jdGlvbiBiJChhLGMsZCxlLGYsZyl7Zj1mfHxjLmRhdGFUeXBlc1swXSxnPWd8fHt9LGdbZl09ITA7dmFyIGg9YVtmXSxpPTAsaj1oP2gubGVuZ3RoOjAsaz1hPT09YlQsbDtmb3IoO2k8aiYmKGt8fCFsKTtpKyspbD1oW2ldKGMsZCxlKSx0eXBlb2YgbD09InN0cmluZyImJigha3x8Z1tsXT9sPWI6KGMuZGF0YVR5cGVzLnVuc2hpZnQobCksbD1iJChhLGMsZCxlLGwsZykpKTsoa3x8IWwpJiYhZ1siKiJdJiYobD1iJChhLGMsZCxlLCIqIixnKSk7cmV0dXJuIGx9ZnVuY3Rpb24gYlooYSl7cmV0dXJuIGZ1bmN0aW9uKGIsYyl7dHlwZW9mIGIhPSJzdHJpbmciJiYoYz1iLGI9IioiKTtpZihmLmlzRnVuY3Rpb24oYykpe3ZhciBkPWIudG9Mb3dlckNhc2UoKS5zcGxpdChiUCksZT0wLGc9ZC5sZW5ndGgsaCxpLGo7Zm9yKDtlPGc7ZSsrKWg9ZFtlXSxqPS9eXCsvLnRlc3QoaCksaiYmKGg9aC5zdWJzdHIoMSl8fCIqIiksaT1hW2hdPWFbaF18fFtdLGlbaj8idW5zaGlmdCI6InB1c2giXShjKX19fWZ1bmN0aW9uIGJDKGEsYixjKXt2YXIgZD1iPT09IndpZHRoIj9hLm9mZnNldFdpZHRoOmEub2Zmc2V0SGVpZ2h0LGU9Yj09PSJ3aWR0aCI/Yng6YnksZz0wLGg9ZS5sZW5ndGg7aWYoZD4wKXtpZihjIT09ImJvcmRlciIpZm9yKDtnPGg7ZysrKWN8fChkLT1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCksYz09PSJtYXJnaW4iP2QrPXBhcnNlRmxvYXQoZi5jc3MoYSxjK2VbZ10pKXx8MDpkLT1wYXJzZUZsb2F0KGYuY3NzKGEsImJvcmRlciIrZVtnXSsiV2lkdGgiKSl8fDA7cmV0dXJuIGQrInB4In1kPWJ6KGEsYixiKTtpZihkPDB8fGQ9PW51bGwpZD1hLnN0eWxlW2JdfHwwO2Q9cGFyc2VGbG9hdChkKXx8MDtpZihjKWZvcig7ZzxoO2crKylkKz1wYXJzZUZsb2F0KGYuY3NzKGEsInBhZGRpbmciK2VbZ10pKXx8MCxjIT09InBhZGRpbmciJiYoZCs9cGFyc2VGbG9hdChmLmNzcyhhLCJib3JkZXIiK2VbZ10rIldpZHRoIikpfHwwKSxjPT09Im1hcmdpbiImJihkKz1wYXJzZUZsb2F0KGYuY3NzKGEsYytlW2ddKSl8fDApO3JldHVybiBkKyJweCJ9ZnVuY3Rpb24gYnAoYSxiKXtiLnNyYz9mLmFqYXgoe3VybDpiLnNyYyxhc3luYzohMSxkYXRhVHlwZToic2NyaXB0In0pOmYuZ2xvYmFsRXZhbCgoYi50ZXh0fHxiLnRleHRDb250ZW50fHxiLmlubmVySFRNTHx8IiIpLnJlcGxhY2UoYmYsIi8qJDAqLyIpKSxiLnBhcmVudE5vZGUmJmIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiBibyhhKXt2YXIgYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2JoLmFwcGVuZENoaWxkKGIpLGIuaW5uZXJIVE1MPWEub3V0ZXJIVE1MO3JldHVybiBiLmZpcnN0Q2hpbGR9ZnVuY3Rpb24gYm4oYSl7dmFyIGI9KGEubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO2I9PT0iaW5wdXQiP2JtKGEpOmIhPT0ic2NyaXB0IiYmdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiJiZmLmdyZXAoYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKSxibSl9ZnVuY3Rpb24gYm0oYSl7aWYoYS50eXBlPT09ImNoZWNrYm94Inx8YS50eXBlPT09InJhZGlvIilhLmRlZmF1bHRDaGVja2VkPWEuY2hlY2tlZH1mdW5jdGlvbiBibChhKXtyZXR1cm4gdHlwZW9mIGEuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTp0eXBlb2YgYS5xdWVyeVNlbGVjdG9yQWxsIT0idW5kZWZpbmVkIj9hLnF1ZXJ5U2VsZWN0b3JBbGwoIioiKTpbXX1mdW5jdGlvbiBiayhhLGIpe3ZhciBjO2lmKGIubm9kZVR5cGU9PT0xKXtiLmNsZWFyQXR0cmlidXRlcyYmYi5jbGVhckF0dHJpYnV0ZXMoKSxiLm1lcmdlQXR0cmlidXRlcyYmYi5tZXJnZUF0dHJpYnV0ZXMoYSksYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7aWYoYz09PSJvYmplY3QiKWIub3V0ZXJIVE1MPWEub3V0ZXJIVE1MO2Vsc2UgaWYoYyE9PSJpbnB1dCJ8fGEudHlwZSE9PSJjaGVja2JveCImJmEudHlwZSE9PSJyYWRpbyIpe2lmKGM9PT0ib3B0aW9uIiliLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkO2Vsc2UgaWYoYz09PSJpbnB1dCJ8fGM9PT0idGV4dGFyZWEiKWIuZGVmYXVsdFZhbHVlPWEuZGVmYXVsdFZhbHVlfWVsc2UgYS5jaGVja2VkJiYoYi5kZWZhdWx0Q2hlY2tlZD1iLmNoZWNrZWQ9YS5jaGVja2VkKSxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSk7Yi5yZW1vdmVBdHRyaWJ1dGUoZi5leHBhbmRvKX19ZnVuY3Rpb24gYmooYSxiKXtpZihiLm5vZGVUeXBlPT09MSYmISFmLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxnPWYuX2RhdGEoYSksaD1mLl9kYXRhKGIsZyksaT1nLmV2ZW50cztpZihpKXtkZWxldGUgaC5oYW5kbGUsaC5ldmVudHM9e307Zm9yKGMgaW4gaSlmb3IoZD0wLGU9aVtjXS5sZW5ndGg7ZDxlO2QrKylmLmV2ZW50LmFkZChiLGMrKGlbY11bZF0ubmFtZXNwYWNlPyIuIjoiIikraVtjXVtkXS5uYW1lc3BhY2UsaVtjXVtkXSxpW2NdW2RdLmRhdGEpfWguZGF0YSYmKGguZGF0YT1mLmV4dGVuZCh7fSxoLmRhdGEpKX19ZnVuY3Rpb24gYmkoYSxiKXtyZXR1cm4gZi5ub2RlTmFtZShhLCJ0YWJsZSIpP2EuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF18fGEuYXBwZW5kQ2hpbGQoYS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRib2R5IikpOmF9ZnVuY3Rpb24gVShhKXt2YXIgYj1WLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfWZ1bmN0aW9uIFQoYSxiLGMpe2I9Ynx8MDtpZihmLmlzRnVuY3Rpb24oYikpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7dmFyIGU9ISFiLmNhbGwoYSxkLGEpO3JldHVybiBlPT09Y30pO2lmKGIubm9kZVR5cGUpcmV0dXJuIGYuZ3JlcChhLGZ1bmN0aW9uKGEsZCl7cmV0dXJuIGE9PT1iPT09Y30pO2lmKHR5cGVvZiBiPT0ic3RyaW5nIil7dmFyIGQ9Zi5ncmVwKGEsZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZVR5cGU9PT0xfSk7aWYoTy50ZXN0KGIpKXJldHVybiBmLmZpbHRlcihiLGQsIWMpO2I9Zi5maWx0ZXIoYixkKX1yZXR1cm4gZi5ncmVwKGEsZnVuY3Rpb24oYSxkKXtyZXR1cm4gZi5pbkFycmF5KGEsYik+PTA9PT1jfSl9ZnVuY3Rpb24gUyhhKXtyZXR1cm4hYXx8IWEucGFyZW50Tm9kZXx8YS5wYXJlbnROb2RlLm5vZGVUeXBlPT09MTF9ZnVuY3Rpb24gSygpe3JldHVybiEwfWZ1bmN0aW9uIEooKXtyZXR1cm4hMX1mdW5jdGlvbiBuKGEsYixjKXt2YXIgZD1iKyJkZWZlciIsZT1iKyJxdWV1ZSIsZz1iKyJtYXJrIixoPWYuX2RhdGEoYSxkKTtoJiYoYz09PSJxdWV1ZSJ8fCFmLl9kYXRhKGEsZSkpJiYoYz09PSJtYXJrInx8IWYuX2RhdGEoYSxnKSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXshZi5fZGF0YShhLGUpJiYhZi5fZGF0YShhLGcpJiYoZi5yZW1vdmVEYXRhKGEsZCwhMCksaC5maXJlKCkpfSwwKX1mdW5jdGlvbiBtKGEpe2Zvcih2YXIgYiBpbiBhKXtpZihiPT09ImRhdGEiJiZmLmlzRW1wdHlPYmplY3QoYVtiXSkpY29udGludWU7aWYoYiE9PSJ0b0pTT04iKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGwoYSxjLGQpe2lmKGQ9PT1iJiZhLm5vZGVUeXBlPT09MSl7dmFyIGU9ImRhdGEtIitjLnJlcGxhY2UoaywiLSQxIikudG9Mb3dlckNhc2UoKTtkPWEuZ2V0QXR0cmlidXRlKGUpO2lmKHR5cGVvZiBkPT0ic3RyaW5nIil7dHJ5e2Q9ZD09PSJ0cnVlIj8hMDpkPT09ImZhbHNlIj8hMTpkPT09Im51bGwiP251bGw6Zi5pc051bWVyaWMoZCk/cGFyc2VGbG9hdChkKTpqLnRlc3QoZCk/Zi5wYXJzZUpTT04oZCk6ZH1jYXRjaChnKXt9Zi5kYXRhKGEsYyxkKX1lbHNlIGQ9Yn1yZXR1cm4gZH1mdW5jdGlvbiBoKGEpe3ZhciBiPWdbYV09e30sYyxkO2E9YS5zcGxpdCgvXHMrLyk7Zm9yKGM9MCxkPWEubGVuZ3RoO2M8ZDtjKyspYlthW2NdXT0hMDtyZXR1cm4gYn12YXIgYz1hLmRvY3VtZW50LGQ9YS5uYXZpZ2F0b3IsZT1hLmxvY2F0aW9uLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBKKCl7aWYoIWUuaXNSZWFkeSl7dHJ5e2MuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7c2V0VGltZW91dChKLDEpO3JldHVybn1lLnJlYWR5KCl9fXZhciBlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBlLmZuLmluaXQoYSxiLGgpfSxmPWEualF1ZXJ5LGc9YS4kLGgsaT0vXig/OlteIzxdKig8W1x3XFddKz4pW14+XSokfCMoW1x3XC1dKikkKS8saj0vXFMvLGs9L15ccysvLGw9L1xzKyQvLG09L148KFx3KylccypcLz8+KD86PFwvXDE+KT8kLyxuPS9eW1xdLDp7fVxzXSokLyxvPS9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2cscD0vIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2cscT0vKD86Xnw6fCwpKD86XHMqXFspKy9nLHI9Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8scz0vKG9wZXJhKSg/Oi4qdmVyc2lvbik/WyBcL10oW1x3Ll0rKS8sdD0vKG1zaWUpIChbXHcuXSspLyx1PS8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sdj0vLShbYS16XXxbMC05XSkvaWcsdz0vXi1tcy0vLHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYisiIikudG9VcHBlckNhc2UoKX0seT1kLnVzZXJBZ2VudCx6LEEsQixDPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcsRD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LEU9QXJyYXkucHJvdG90eXBlLnB1c2gsRj1BcnJheS5wcm90b3R5cGUuc2xpY2UsRz1TdHJpbmcucHJvdG90eXBlLnRyaW0sSD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZixJPXt9O2UuZm49ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaW5pdDpmdW5jdGlvbihhLGQsZil7dmFyIGcsaCxqLGs7aWYoIWEpcmV0dXJuIHRoaXM7aWYoYS5ub2RlVHlwZSl7dGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKGE9PT0iYm9keSImJiFkJiZjLmJvZHkpe3RoaXMuY29udGV4dD1jLHRoaXNbMF09Yy5ib2R5LHRoaXMuc2VsZWN0b3I9YSx0aGlzLmxlbmd0aD0xO3JldHVybiB0aGlzfWlmKHR5cGVvZiBhPT0ic3RyaW5nIil7YS5jaGFyQXQoMCkhPT0iPCJ8fGEuY2hhckF0KGEubGVuZ3RoLTEpIT09Ij4ifHxhLmxlbmd0aDwzP2c9aS5leGVjKGEpOmc9W251bGwsYSxudWxsXTtpZihnJiYoZ1sxXXx8IWQpKXtpZihnWzFdKXtkPWQgaW5zdGFuY2VvZiBlP2RbMF06ZCxrPWQ/ZC5vd25lckRvY3VtZW50fHxkOmMsaj1tLmV4ZWMoYSksaj9lLmlzUGxhaW5PYmplY3QoZCk/KGE9W2MuY3JlYXRlRWxlbWVudChqWzFdKV0sZS5mbi5hdHRyLmNhbGwoYSxkLCEwKSk6YT1bay5jcmVhdGVFbGVtZW50KGpbMV0pXTooaj1lLmJ1aWxkRnJhZ21lbnQoW2dbMV1dLFtrXSksYT0oai5jYWNoZWFibGU/ZS5jbG9uZShqLmZyYWdtZW50KTpqLmZyYWdtZW50KS5jaGlsZE5vZGVzKTtyZXR1cm4gZS5tZXJnZSh0aGlzLGEpfWg9Yy5nZXRFbGVtZW50QnlJZChnWzJdKTtpZihoJiZoLnBhcmVudE5vZGUpe2lmKGguaWQhPT1nWzJdKXJldHVybiBmLmZpbmQoYSk7dGhpcy5sZW5ndGg9MSx0aGlzWzBdPWh9dGhpcy5jb250ZXh0PWMsdGhpcy5zZWxlY3Rvcj1hO3JldHVybiB0aGlzfXJldHVybiFkfHxkLmpxdWVyeT8oZHx8ZikuZmluZChhKTp0aGlzLmNvbnN0cnVjdG9yKGQpLmZpbmQoYSl9aWYoZS5pc0Z1bmN0aW9uKGEpKXJldHVybiBmLnJlYWR5KGEpO2Euc2VsZWN0b3IhPT1iJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpO3JldHVybiBlLm1ha2VBcnJheShhLHRoaXMpfSxzZWxlY3RvcjoiIixqcXVlcnk6IjEuNy4xIixsZW5ndGg6MCxzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RofSx0b0FycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIEYuY2FsbCh0aGlzLDApfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/dGhpcy50b0FycmF5KCk6YTwwP3RoaXNbdGhpcy5sZW5ndGgrYV06dGhpc1thXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10aGlzLmNvbnN0cnVjdG9yKCk7ZS5pc0FycmF5KGEpP0UuYXBwbHkoZCxhKTplLm1lcmdlKGQsYSksZC5wcmV2T2JqZWN0PXRoaXMsZC5jb250ZXh0PXRoaXMuY29udGV4dCxiPT09ImZpbmQiP2Quc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisodGhpcy5zZWxlY3Rvcj8iICI6IiIpK2M6YiYmKGQuc2VsZWN0b3I9dGhpcy5zZWxlY3RvcisiLiIrYisiKCIrYysiKSIpO3JldHVybiBkfSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGUuZWFjaCh0aGlzLGEsYil9LHJlYWR5OmZ1bmN0aW9uKGEpe2UuYmluZFJlYWR5KCksQS5hZGQoYSk7cmV0dXJuIHRoaXN9LGVxOmZ1bmN0aW9uKGEpe2E9K2E7cmV0dXJuIGE9PT0tMT90aGlzLnNsaWNlKGEpOnRoaXMuc2xpY2UoYSxhKzEpfSxmaXJzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKDApfSxsYXN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoLTEpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhGLmFwcGx5KHRoaXMsYXJndW1lbnRzKSwic2xpY2UiLEYuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSl9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKG51bGwpfSxwdXNoOkUsc29ydDpbXS5zb3J0LHNwbGljZTpbXS5zcGxpY2V9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLmV4dGVuZD1lLmZuLmV4dGVuZD1mdW5jdGlvbigpe3ZhciBhLGMsZCxmLGcsaCxpPWFyZ3VtZW50c1swXXx8e30saj0xLGs9YXJndW1lbnRzLmxlbmd0aCxsPSExO3R5cGVvZiBpPT0iYm9vbGVhbiImJihsPWksaT1hcmd1bWVudHNbMV18fHt9LGo9MiksdHlwZW9mIGkhPSJvYmplY3QiJiYhZS5pc0Z1bmN0aW9uKGkpJiYoaT17fSksaz09PWomJihpPXRoaXMsLS1qKTtmb3IoO2o8aztqKyspaWYoKGE9YXJndW1lbnRzW2pdKSE9bnVsbClmb3IoYyBpbiBhKXtkPWlbY10sZj1hW2NdO2lmKGk9PT1mKWNvbnRpbnVlO2wmJmYmJihlLmlzUGxhaW5PYmplY3QoZil8fChnPWUuaXNBcnJheShmKSkpPyhnPyhnPSExLGg9ZCYmZS5pc0FycmF5KGQpP2Q6W10pOmg9ZCYmZS5pc1BsYWluT2JqZWN0KGQpP2Q6e30saVtjXT1lLmV4dGVuZChsLGgsZikpOmYhPT1iJiYoaVtjXT1mKX1yZXR1cm4gaX0sZS5leHRlbmQoe25vQ29uZmxpY3Q6ZnVuY3Rpb24oYil7YS4kPT09ZSYmKGEuJD1nKSxiJiZhLmpRdWVyeT09PWUmJihhLmpRdWVyeT1mKTtyZXR1cm4gZX0saXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxob2xkUmVhZHk6ZnVuY3Rpb24oYSl7YT9lLnJlYWR5V2FpdCsrOmUucmVhZHkoITApfSxyZWFkeTpmdW5jdGlvbihhKXtpZihhPT09ITAmJiEtLWUucmVhZHlXYWl0fHxhIT09ITAmJiFlLmlzUmVhZHkpe2lmKCFjLmJvZHkpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtlLmlzUmVhZHk9ITA7aWYoYSE9PSEwJiYtLWUucmVhZHlXYWl0PjApcmV0dXJuO0EuZmlyZVdpdGgoYyxbZV0pLGUuZm4udHJpZ2dlciYmZShjKS50cmlnZ2VyKCJyZWFkeSIpLm9mZigicmVhZHkiKX19LGJpbmRSZWFkeTpmdW5jdGlvbigpe2lmKCFBKXtBPWUuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpO2lmKGMucmVhZHlTdGF0ZT09PSJjb21wbGV0ZSIpcmV0dXJuIHNldFRpbWVvdXQoZS5yZWFkeSwxKTtpZihjLmFkZEV2ZW50TGlzdGVuZXIpYy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCLCExKSxhLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLGUucmVhZHksITEpO2Vsc2UgaWYoYy5hdHRhY2hFdmVudCl7Yy5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxhLmF0dGFjaEV2ZW50KCJvbmxvYWQiLGUucmVhZHkpO3ZhciBiPSExO3RyeXtiPWEuZnJhbWVFbGVtZW50PT1udWxsfWNhdGNoKGQpe31jLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCYmYiYmSigpfX19LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJmdW5jdGlvbiJ9LGlzQXJyYXk6QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24oYSl7cmV0dXJuIGUudHlwZShhKT09PSJhcnJheSJ9LGlzV2luZG93OmZ1bmN0aW9uKGEpe3JldHVybiBhJiZ0eXBlb2YgYT09Im9iamVjdCImJiJzZXRJbnRlcnZhbCJpbiBhfSxpc051bWVyaWM6ZnVuY3Rpb24oYSl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQoYSkpJiZpc0Zpbml0ZShhKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbD9TdHJpbmcoYSk6SVtDLmNhbGwoYSldfHwib2JqZWN0In0saXNQbGFpbk9iamVjdDpmdW5jdGlvbihhKXtpZighYXx8ZS50eXBlKGEpIT09Im9iamVjdCJ8fGEubm9kZVR5cGV8fGUuaXNXaW5kb3coYSkpcmV0dXJuITE7dHJ5e2lmKGEuY29uc3RydWN0b3ImJiFELmNhbGwoYSwiY29uc3RydWN0b3IiKSYmIUQuY2FsbChhLmNvbnN0cnVjdG9yLnByb3RvdHlwZSwiaXNQcm90b3R5cGVPZiIpKXJldHVybiExfWNhdGNoKGMpe3JldHVybiExfXZhciBkO2ZvcihkIGluIGEpO3JldHVybiBkPT09Ynx8RC5jYWxsKGEsZCl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiIGluIGEpcmV0dXJuITE7cmV0dXJuITB9LGVycm9yOmZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihhKX0scGFyc2VKU09OOmZ1bmN0aW9uKGIpe2lmKHR5cGVvZiBiIT0ic3RyaW5nInx8IWIpcmV0dXJuIG51bGw7Yj1lLnRyaW0oYik7aWYoYS5KU09OJiZhLkpTT04ucGFyc2UpcmV0dXJuIGEuSlNPTi5wYXJzZShiKTtpZihuLnRlc3QoYi5yZXBsYWNlKG8sIkAiKS5yZXBsYWNlKHAsIl0iKS5yZXBsYWNlKHEsIiIpKSlyZXR1cm4obmV3IEZ1bmN0aW9uKCJyZXR1cm4gIitiKSkoKTtlLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LHBhcnNlWE1MOmZ1bmN0aW9uKGMpe3ZhciBkLGY7dHJ5e2EuRE9NUGFyc2VyPyhmPW5ldyBET01QYXJzZXIsZD1mLnBhcnNlRnJvbVN0cmluZyhjLCJ0ZXh0L3htbCIpKTooZD1uZXcgQWN0aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTERPTSIpLGQuYXN5bmM9ImZhbHNlIixkLmxvYWRYTUwoYykpfWNhdGNoKGcpe2Q9Yn0oIWR8fCFkLmRvY3VtZW50RWxlbWVudHx8ZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgicGFyc2VyZXJyb3IiKS5sZW5ndGgpJiZlLmVycm9yKCJJbnZhbGlkIFhNTDogIitjKTtyZXR1cm4gZH0sbm9vcDpmdW5jdGlvbigpe30sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZqLnRlc3QoYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UodywibXMtIikucmVwbGFjZSh2LHgpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk9PT1iLnRvVXBwZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxjLGQpe3ZhciBmLGc9MCxoPWEubGVuZ3RoLGk9aD09PWJ8fGUuaXNGdW5jdGlvbihhKTtpZihkKXtpZihpKXtmb3IoZiBpbiBhKWlmKGMuYXBwbHkoYVtmXSxkKT09PSExKWJyZWFrfWVsc2UgZm9yKDtnPGg7KWlmKGMuYXBwbHkoYVtnKytdLGQpPT09ITEpYnJlYWt9ZWxzZSBpZihpKXtmb3IoZiBpbiBhKWlmKGMuY2FsbChhW2ZdLGYsYVtmXSk9PT0hMSlicmVha31lbHNlIGZvcig7ZzxoOylpZihjLmNhbGwoYVtnXSxnLGFbZysrXSk9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpHP2Z1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOkcuY2FsbChhKX06ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGw/IiI6KGErIiIpLnJlcGxhY2UoaywiIikucmVwbGFjZShsLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107aWYoYSE9bnVsbCl7dmFyIGQ9ZS50eXBlKGEpO2EubGVuZ3RoPT1udWxsfHxkPT09InN0cmluZyJ8fGQ9PT0iZnVuY3Rpb24ifHxkPT09InJlZ2V4cCJ8fGUuaXNXaW5kb3coYSk/RS5jYWxsKGMsYSk6ZS5tZXJnZShjLGEpfXJldHVybiBjfSxpbkFycmF5OmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihiKXtpZihIKXJldHVybiBILmNhbGwoYixhLGMpO2Q9Yi5sZW5ndGgsYz1jP2M8MD9NYXRoLm1heCgwLGQrYyk6YzowO2Zvcig7YzxkO2MrKylpZihjIGluIGImJmJbY109PT1hKXJldHVybiBjfXJldHVybi0xfSxtZXJnZTpmdW5jdGlvbihhLGMpe3ZhciBkPWEubGVuZ3RoLGU9MDtpZih0eXBlb2YgYy5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZj1jLmxlbmd0aDtlPGY7ZSsrKWFbZCsrXT1jW2VdO2Vsc2Ugd2hpbGUoY1tlXSE9PWIpYVtkKytdPWNbZSsrXTthLmxlbmd0aD1kO3JldHVybiBhfSxncmVwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1bXSxlO2M9ISFjO2Zvcih2YXIgZj0wLGc9YS5sZW5ndGg7ZjxnO2YrKyllPSEhYihhW2ZdLGYpLGMhPT1lJiZkLnB1c2goYVtmXSk7cmV0dXJuIGR9LG1hcDpmdW5jdGlvbihhLGMsZCl7dmFyIGYsZyxoPVtdLGk9MCxqPWEubGVuZ3RoLGs9YSBpbnN0YW5jZW9mIGV8fGohPT1iJiZ0eXBlb2Ygaj09Im51bWJlciImJihqPjAmJmFbMF0mJmFbai0xXXx8aj09PTB8fGUuaXNBcnJheShhKSk7aWYoaylmb3IoO2k8ajtpKyspZj1jKGFbaV0saSxkKSxmIT1udWxsJiYoaFtoLmxlbmd0aF09Zik7ZWxzZSBmb3IoZyBpbiBhKWY9YyhhW2ddLGcsZCksZiE9bnVsbCYmKGhbaC5sZW5ndGhdPWYpO3JldHVybiBoLmNvbmNhdC5hcHBseShbXSxoKX0sZ3VpZDoxLHByb3h5OmZ1bmN0aW9uKGEsYyl7aWYodHlwZW9mIGM9PSJzdHJpbmciKXt2YXIgZD1hW2NdO2M9YSxhPWR9aWYoIWUuaXNGdW5jdGlvbihhKSlyZXR1cm4gYjt2YXIgZj1GLmNhbGwoYXJndW1lbnRzLDIpLGc9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hcHBseShjLGYuY29uY2F0KEYuY2FsbChhcmd1bWVudHMpKSl9O2cuZ3VpZD1hLmd1aWQ9YS5ndWlkfHxnLmd1aWR8fGUuZ3VpZCsrO3JldHVybiBnfSxhY2Nlc3M6ZnVuY3Rpb24oYSxjLGQsZixnLGgpe3ZhciBpPWEubGVuZ3RoO2lmKHR5cGVvZiBjPT0ib2JqZWN0Iil7Zm9yKHZhciBqIGluIGMpZS5hY2Nlc3MoYSxqLGNbal0sZixnLGQpO3JldHVybiBhfWlmKGQhPT1iKXtmPSFoJiZmJiZlLmlzRnVuY3Rpb24oZCk7Zm9yKHZhciBrPTA7azxpO2srKylnKGFba10sYyxmP2QuY2FsbChhW2tdLGssZyhhW2tdLGMpKTpkLGgpO3JldHVybiBhfXJldHVybiBpP2coYVswXSxjKTpifSxub3c6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0sdWFNYXRjaDpmdW5jdGlvbihhKXthPWEudG9Mb3dlckNhc2UoKTt2YXIgYj1yLmV4ZWMoYSl8fHMuZXhlYyhhKXx8dC5leGVjKGEpfHxhLmluZGV4T2YoImNvbXBhdGlibGUiKTwwJiZ1LmV4ZWMoYSl8fFtdO3JldHVybnticm93c2VyOmJbMV18fCIiLHZlcnNpb246YlsyXXx8IjAifX0sc3ViOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiLGMpe3JldHVybiBuZXcgYS5mbi5pbml0KGIsYyl9ZS5leHRlbmQoITAsYSx0aGlzKSxhLnN1cGVyY2xhc3M9dGhpcyxhLmZuPWEucHJvdG90eXBlPXRoaXMoKSxhLmZuLmNvbnN0cnVjdG9yPWEsYS5zdWI9dGhpcy5zdWIsYS5mbi5pbml0PWZ1bmN0aW9uKGQsZil7ZiYmZiBpbnN0YW5jZW9mIGUmJiEoZiBpbnN0YW5jZW9mIGEpJiYoZj1hKGYpKTtyZXR1cm4gZS5mbi5pbml0LmNhbGwodGhpcyxkLGYsYil9LGEuZm4uaW5pdC5wcm90b3R5cGU9YS5mbjt2YXIgYj1hKGMpO3JldHVybiBhfSxicm93c2VyOnt9fSksZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLGZ1bmN0aW9uKGEsYil7SVsiW29iamVjdCAiK2IrIl0iXT1iLnRvTG93ZXJDYXNlKCl9KSx6PWUudWFNYXRjaCh5KSx6LmJyb3dzZXImJihlLmJyb3dzZXJbei5icm93c2VyXT0hMCxlLmJyb3dzZXIudmVyc2lvbj16LnZlcnNpb24pLGUuYnJvd3Nlci53ZWJraXQmJihlLmJyb3dzZXIuc2FmYXJpPSEwKSxqLnRlc3QoIiAiKSYmKGs9L15bXHNceEEwXSsvLGw9L1tcc1x4QTBdKyQvKSxoPWUoYyksYy5hZGRFdmVudExpc3RlbmVyP0I9ZnVuY3Rpb24oKXtjLnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEIsITEpLGUucmVhZHkoKX06Yy5hdHRhY2hFdmVudCYmKEI9ZnVuY3Rpb24oKXtjLnJlYWR5U3RhdGU9PT0iY29tcGxldGUiJiYoYy5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIixCKSxlLnJlYWR5KCkpfSk7cmV0dXJuIGV9KCksZz17fTtmLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPWE/Z1thXXx8aChhKTp7fTt2YXIgYz1bXSxkPVtdLGUsaSxqLGssbCxtPWZ1bmN0aW9uKGIpe3ZhciBkLGUsZyxoLGk7Zm9yKGQ9MCxlPWIubGVuZ3RoO2Q8ZTtkKyspZz1iW2RdLGg9Zi50eXBlKGcpLGg9PT0iYXJyYXkiP20oZyk6aD09PSJmdW5jdGlvbiImJighYS51bmlxdWV8fCFvLmhhcyhnKSkmJmMucHVzaChnKX0sbj1mdW5jdGlvbihiLGYpe2Y9Znx8W10sZT0hYS5tZW1vcnl8fFtiLGZdLGk9ITAsbD1qfHwwLGo9MCxrPWMubGVuZ3RoO2Zvcig7YyYmbDxrO2wrKylpZihjW2xdLmFwcGx5KGIsZik9PT0hMSYmYS5zdG9wT25GYWxzZSl7ZT0hMDticmVha31pPSExLGMmJihhLm9uY2U/ZT09PSEwP28uZGlzYWJsZSgpOmM9W106ZCYmZC5sZW5ndGgmJihlPWQuc2hpZnQoKSxvLmZpcmVXaXRoKGVbMF0sZVsxXSkpKX0sbz17YWRkOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGE9Yy5sZW5ndGg7bShhcmd1bWVudHMpLGk/az1jLmxlbmd0aDplJiZlIT09ITAmJihqPWEsbihlWzBdLGVbMV0pKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7aWYoYyl7dmFyIGI9YXJndW1lbnRzLGQ9MCxlPWIubGVuZ3RoO2Zvcig7ZDxlO2QrKylmb3IodmFyIGY9MDtmPGMubGVuZ3RoO2YrKylpZihiW2RdPT09Y1tmXSl7aSYmZjw9ayYmKGstLSxmPD1sJiZsLS0pLGMuc3BsaWNlKGYtLSwxKTtpZihhLnVuaXF1ZSlicmVha319cmV0dXJuIHRoaXN9LGhhczpmdW5jdGlvbihhKXtpZihjKXt2YXIgYj0wLGQ9Yy5sZW5ndGg7Zm9yKDtiPGQ7YisrKWlmKGE9PT1jW2JdKXJldHVybiEwfXJldHVybiExfSxlbXB0eTpmdW5jdGlvbigpe2M9W107cmV0dXJuIHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtjPWQ9ZT1iO3JldHVybiB0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFjfSxsb2NrOmZ1bmN0aW9uKCl7ZD1iLCghZXx8ZT09PSEwKSYmby5kaXNhYmxlKCk7cmV0dXJuIHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFkfSxmaXJlV2l0aDpmdW5jdGlvbihiLGMpe2QmJihpP2Eub25jZXx8ZC5wdXNoKFtiLGNdKTooIWEub25jZXx8IWUpJiZuKGIsYykpO3JldHVybiB0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7by5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFlfX07cmV0dXJuIG99O3ZhciBpPVtdLnNsaWNlO2YuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1mLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxjPWYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGQ9Zi5DYWxsYmFja3MoIm1lbW9yeSIpLGU9InBlbmRpbmciLGc9e3Jlc29sdmU6YixyZWplY3Q6Yyxub3RpZnk6ZH0saD17ZG9uZTpiLmFkZCxmYWlsOmMuYWRkLHByb2dyZXNzOmQuYWRkLHN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGV9LGlzUmVzb2x2ZWQ6Yi5maXJlZCxpc1JlamVjdGVkOmMuZmlyZWQsdGhlbjpmdW5jdGlvbihhLGIsYyl7aS5kb25lKGEpLmZhaWwoYikucHJvZ3Jlc3MoYyk7cmV0dXJuIHRoaXN9LGFsd2F5czpmdW5jdGlvbigpe2kuZG9uZS5hcHBseShpLGFyZ3VtZW50cykuZmFpbC5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXN9LHBpcGU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLkRlZmVycmVkKGZ1bmN0aW9uKGQpe2YuZWFjaCh7ZG9uZTpbYSwicmVzb2x2ZSJdLGZhaWw6W2IsInJlamVjdCJdLHByb2dyZXNzOltjLCJub3RpZnkiXX0sZnVuY3Rpb24oYSxiKXt2YXIgYz1iWzBdLGU9YlsxXSxnO2YuaXNGdW5jdGlvbihjKT9pW2FdKGZ1bmN0aW9uKCl7Zz1jLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnJiZmLmlzRnVuY3Rpb24oZy5wcm9taXNlKT9nLnByb21pc2UoKS50aGVuKGQucmVzb2x2ZSxkLnJlamVjdCxkLm5vdGlmeSk6ZFtlKyJXaXRoIl0odGhpcz09PWk/ZDp0aGlzLFtnXSl9KTppW2FdKGRbZV0pfSl9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClhPWg7ZWxzZSBmb3IodmFyIGIgaW4gaClhW2JdPWhbYl07cmV0dXJuIGF9fSxpPWgucHJvbWlzZSh7fSksajtmb3IoaiBpbiBnKWlbal09Z1tqXS5maXJlLGlbaisiV2l0aCJdPWdbal0uZmlyZVdpdGg7aS5kb25lKGZ1bmN0aW9uKCl7ZT0icmVzb2x2ZWQifSxjLmRpc2FibGUsZC5sb2NrKS5mYWlsKGZ1bmN0aW9uKCl7ZT0icmVqZWN0ZWQifSxiLmRpc2FibGUsZC5sb2NrKSxhJiZhLmNhbGwoaSxpKTtyZXR1cm4gaX0sd2hlbjpmdW5jdGlvbihhKXtmdW5jdGlvbiBtKGEpe3JldHVybiBmdW5jdGlvbihiKXtlW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9pLmNhbGwoYXJndW1lbnRzLDApOmIsai5ub3RpZnlXaXRoKGssZSl9fWZ1bmN0aW9uIGwoYSl7cmV0dXJuIGZ1bmN0aW9uKGMpe2JbYV09YXJndW1lbnRzLmxlbmd0aD4xP2kuY2FsbChhcmd1bWVudHMsMCk6YywtLWd8fGoucmVzb2x2ZVdpdGgoaixiKX19dmFyIGI9aS5jYWxsKGFyZ3VtZW50cywwKSxjPTAsZD1iLmxlbmd0aCxlPUFycmF5KGQpLGc9ZCxoPWQsaj1kPD0xJiZhJiZmLmlzRnVuY3Rpb24oYS5wcm9taXNlKT9hOmYuRGVmZXJyZWQoKSxrPWoucHJvbWlzZSgpO2lmKGQ+MSl7Zm9yKDtjPGQ7YysrKWJbY10mJmJbY10ucHJvbWlzZSYmZi5pc0Z1bmN0aW9uKGJbY10ucHJvbWlzZSk/YltjXS5wcm9taXNlKCkudGhlbihsKGMpLGoucmVqZWN0LG0oYykpOi0tZztnfHxqLnJlc29sdmVXaXRoKGosYil9ZWxzZSBqIT09YSYmai5yZXNvbHZlV2l0aChqLGQ/W2FdOltdKTtyZXR1cm4ga319KSxmLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgYixkLGUsZyxoLGksaixrLGwsbSxuLG8scCxxPWMuY3JlYXRlRWxlbWVudCgiZGl2Iikscj1jLmRvY3VtZW50RWxlbWVudDtxLnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwidCIpLHEuaW5uZXJIVE1MPSIgICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIiksZT1xLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF07aWYoIWR8fCFkLmxlbmd0aHx8IWUpcmV0dXJue307Zz1jLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLGg9Zy5hcHBlbmRDaGlsZChjLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKSxpPXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IilbMF0sYj17bGVhZGluZ1doaXRlc3BhY2U6cS5maXJzdENoaWxkLm5vZGVUeXBlPT09Myx0Ym9keTohcS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsaHRtbFNlcmlhbGl6ZTohIXEuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKS5sZW5ndGgsc3R5bGU6L3RvcC8udGVzdChlLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksaHJlZk5vcm1hbGl6ZWQ6ZS5nZXRBdHRyaWJ1dGUoImhyZWYiKT09PSIvYSIsb3BhY2l0eTovXjAuNTUvLnRlc3QoZS5zdHlsZS5vcGFjaXR5KSxjc3NGbG9hdDohIWUuc3R5bGUuY3NzRmxvYXQsY2hlY2tPbjppLnZhbHVlPT09Im9uIixvcHRTZWxlY3RlZDpoLnNlbGVjdGVkLGdldFNldEF0dHJpYnV0ZTpxLmNsYXNzTmFtZSE9PSJ0IixlbmN0eXBlOiEhYy5jcmVhdGVFbGVtZW50KCJmb3JtIikuZW5jdHlwZSxodG1sNUNsb25lOmMuY3JlYXRlRWxlbWVudCgibmF2IikuY2xvbmVOb2RlKCEwKS5vdXRlckhUTUwhPT0iPDpuYXY+PC86bmF2PiIsc3VibWl0QnViYmxlczohMCxjaGFuZ2VCdWJibGVzOiEwLGZvY3VzaW5CdWJibGVzOiExLGRlbGV0ZUV4cGFuZG86ITAsbm9DbG9uZUV2ZW50OiEwLGlubGluZUJsb2NrTmVlZHNMYXlvdXQ6ITEsc2hyaW5rV3JhcEJsb2NrczohMSxyZWxpYWJsZU1hcmdpblJpZ2h0OiEwfSxpLmNoZWNrZWQ9ITAsYi5ub0Nsb25lQ2hlY2tlZD1pLmNsb25lTm9kZSghMCkuY2hlY2tlZCxnLmRpc2FibGVkPSEwLGIub3B0RGlzYWJsZWQ9IWguZGlzYWJsZWQ7dHJ5e2RlbGV0ZSBxLnRlc3R9Y2F0Y2gocyl7Yi5kZWxldGVFeHBhbmRvPSExfSFxLmFkZEV2ZW50TGlzdGVuZXImJnEuYXR0YWNoRXZlbnQmJnEuZmlyZUV2ZW50JiYocS5hdHRhY2hFdmVudCgib25jbGljayIsZnVuY3Rpb24oKXtiLm5vQ2xvbmVFdmVudD0hMX0pLHEuY2xvbmVOb2RlKCEwKS5maXJlRXZlbnQoIm9uY2xpY2siKSksaT1jLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksaS52YWx1ZT0idCIsaS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGIucmFkaW9WYWx1ZT1pLnZhbHVlPT09InQiLGkuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiY2hlY2tlZCIpLHEuYXBwZW5kQ2hpbGQoaSksaz1jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxrLmFwcGVuZENoaWxkKHEubGFzdENoaWxkKSxiLmNoZWNrQ2xvbmU9ay5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsYi5hcHBlbmRDaGVja2VkPWkuY2hlY2tlZCxrLnJlbW92ZUNoaWxkKGkpLGsuYXBwZW5kQ2hpbGQocSkscS5pbm5lckhUTUw9IiIsYS5nZXRDb21wdXRlZFN0eWxlJiYoaj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGouc3R5bGUud2lkdGg9IjAiLGouc3R5bGUubWFyZ2luUmlnaHQ9IjAiLHEuc3R5bGUud2lkdGg9IjJweCIscS5hcHBlbmRDaGlsZChqKSxiLnJlbGlhYmxlTWFyZ2luUmlnaHQ9KHBhcnNlSW50KChhLmdldENvbXB1dGVkU3R5bGUoaixudWxsKXx8e21hcmdpblJpZ2h0OjB9KS5tYXJnaW5SaWdodCwxMCl8fDApPT09MCk7aWYocS5hdHRhY2hFdmVudClmb3IobyBpbntzdWJtaXQ6MSxjaGFuZ2U6MSxmb2N1c2luOjF9KW49Im9uIitvLHA9biBpbiBxLHB8fChxLnNldEF0dHJpYnV0ZShuLCJyZXR1cm47IikscD10eXBlb2YgcVtuXT09ImZ1bmN0aW9uIiksYltvKyJCdWJibGVzIl09cDtrLnJlbW92ZUNoaWxkKHEpLGs9Zz1oPWo9cT1pPW51bGwsZihmdW5jdGlvbigpe3ZhciBhLGQsZSxnLGgsaSxqLGssbSxuLG8scj1jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF07IXJ8fChqPTEsaz0icG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3dpZHRoOjFweDtoZWlnaHQ6MXB4O21hcmdpbjowOyIsbT0idmlzaWJpbGl0eTpoaWRkZW47Ym9yZGVyOjA7IixuPSJzdHlsZT0nIitrKyJib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowOyciLG89IjxkaXYgIituKyI+PGRpdj48L2Rpdj48L2Rpdj4iKyI8dGFibGUgIituKyIgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz4iKyI8dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiIsYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGEuc3R5bGUuY3NzVGV4dD1tKyJ3aWR0aDowO2hlaWdodDowO3Bvc2l0aW9uOnN0YXRpYzt0b3A6MDttYXJnaW4tdG9wOiIraisicHgiLHIuaW5zZXJ0QmVmb3JlKGEsci5maXJzdENoaWxkKSxxPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksYS5hcHBlbmRDaGlsZChxKSxxLmlubmVySFRNTD0iPHRhYmxlPjx0cj48dGQgc3R5bGU9J3BhZGRpbmc6MDtib3JkZXI6MDtkaXNwbGF5Om5vbmUnPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGw9cS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxwPWxbMF0ub2Zmc2V0SGVpZ2h0PT09MCxsWzBdLnN0eWxlLmRpc3BsYXk9IiIsbFsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixiLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cz1wJiZsWzBdLm9mZnNldEhlaWdodD09PTAscS5pbm5lckhUTUw9IiIscS5zdHlsZS53aWR0aD1xLnN0eWxlLnBhZGRpbmdMZWZ0PSIxcHgiLGYuYm94TW9kZWw9Yi5ib3hNb2RlbD1xLm9mZnNldFdpZHRoPT09Mix0eXBlb2YgcS5zdHlsZS56b29tIT0idW5kZWZpbmVkIiYmKHEuc3R5bGUuZGlzcGxheT0iaW5saW5lIixxLnN0eWxlLnpvb209MSxiLmlubGluZUJsb2NrTmVlZHNMYXlvdXQ9cS5vZmZzZXRXaWR0aD09PTIscS5zdHlsZS5kaXNwbGF5PSIiLHEuaW5uZXJIVE1MPSI8ZGl2IHN0eWxlPSd3aWR0aDo0cHg7Jz48L2Rpdj4iLGIuc2hyaW5rV3JhcEJsb2Nrcz1xLm9mZnNldFdpZHRoIT09MikscS5zdHlsZS5jc3NUZXh0PWsrbSxxLmlubmVySFRNTD1vLGQ9cS5maXJzdENoaWxkLGU9ZC5maXJzdENoaWxkLGg9ZC5uZXh0U2libGluZy5maXJzdENoaWxkLmZpcnN0Q2hpbGQsaT17ZG9lc05vdEFkZEJvcmRlcjplLm9mZnNldFRvcCE9PTUsZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHM6aC5vZmZzZXRUb3A9PT01fSxlLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsZS5zdHlsZS50b3A9IjIwcHgiLGkuZml4ZWRQb3NpdGlvbj1lLm9mZnNldFRvcD09PTIwfHxlLm9mZnNldFRvcD09PTE1LGUuc3R5bGUucG9zaXRpb249ZS5zdHlsZS50b3A9IiIsZC5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixkLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIsaS5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGU9ZS5vZmZzZXRUb3A9PT0tNSxpLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0PXIub2Zmc2V0VG9wIT09aixyLnJlbW92ZUNoaWxkKGEpLHE9YT1udWxsLGYuZXh0ZW5kKGIsaSkpfSk7cmV0dXJuIGJ9KCk7dmFyIGo9L14oPzpcey4qXH18XFsuKlxdKSQvLGs9LyhbQS1aXSkvZztmLmV4dGVuZCh7Y2FjaGU6e30sdXVpZDowLGV4cGFuZG86ImpRdWVyeSIrKGYuZm4uanF1ZXJ5K01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLG5vRGF0YTp7ZW1iZWQ6ITAsb2JqZWN0OiJjbHNpZDpEMjdDREI2RS1BRTZELTExY2YtOTZCOC00NDQ1NTM1NDAwMDAiLGFwcGxldDohMH0saGFzRGF0YTpmdW5jdGlvbihhKXthPWEubm9kZVR5cGU/Zi5jYWNoZVthW2YuZXhwYW5kb11dOmFbZi5leHBhbmRvXTtyZXR1cm4hIWEmJiFtKGEpfSxkYXRhOmZ1bmN0aW9uKGEsYyxkLGUpe2lmKCEhZi5hY2NlcHREYXRhKGEpKXt2YXIgZyxoLGksaj1mLmV4cGFuZG8saz10eXBlb2YgYz09InN0cmluZyIsbD1hLm5vZGVUeXBlLG09bD9mLmNhY2hlOmEsbj1sP2Fbal06YVtqXSYmaixvPWM9PT0iZXZlbnRzIjtpZigoIW58fCFtW25dfHwhbyYmIWUmJiFtW25dLmRhdGEpJiZrJiZkPT09YilyZXR1cm47bnx8KGw/YVtqXT1uPSsrZi51dWlkOm49aiksbVtuXXx8KG1bbl09e30sbHx8KG1bbl0udG9KU09OPWYubm9vcCkpO2lmKHR5cGVvZiBjPT0ib2JqZWN0Inx8dHlwZW9mIGM9PSJmdW5jdGlvbiIpZT9tW25dPWYuZXh0ZW5kKG1bbl0sYyk6bVtuXS5kYXRhPWYuZXh0ZW5kKG1bbl0uZGF0YSxjKTtnPWg9bVtuXSxlfHwoaC5kYXRhfHwoaC5kYXRhPXt9KSxoPWguZGF0YSksZCE9PWImJihoW2YuY2FtZWxDYXNlKGMpXT1kKTtpZihvJiYhaFtjXSlyZXR1cm4gZy5ldmVudHM7az8oaT1oW2NdLGk9PW51bGwmJihpPWhbZi5jYW1lbENhc2UoYyldKSk6aT1oO3JldHVybiBpfX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhLGIsYyl7aWYoISFmLmFjY2VwdERhdGEoYSkpe3ZhciBkLGUsZyxoPWYuZXhwYW5kbyxpPWEubm9kZVR5cGUsaj1pP2YuY2FjaGU6YSxrPWk/YVtoXTpoO2lmKCFqW2tdKXJldHVybjtpZihiKXtkPWM/altrXTpqW2tdLmRhdGE7aWYoZCl7Zi5pc0FycmF5KGIpfHwoYiBpbiBkP2I9W2JdOihiPWYuY2FtZWxDYXNlKGIpLGIgaW4gZD9iPVtiXTpiPWIuc3BsaXQoIiAiKSkpO2ZvcihlPTAsZz1iLmxlbmd0aDtlPGc7ZSsrKWRlbGV0ZSBkW2JbZV1dO2lmKCEoYz9tOmYuaXNFbXB0eU9iamVjdCkoZCkpcmV0dXJufX1pZighYyl7ZGVsZXRlIGpba10uZGF0YTtpZighbShqW2tdKSlyZXR1cm59Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG98fCFqLnNldEludGVydmFsP2RlbGV0ZSBqW2tdOmpba109bnVsbCxpJiYoZi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG8/ZGVsZXRlIGFbaF06YS5yZW1vdmVBdHRyaWJ1dGU/YS5yZW1vdmVBdHRyaWJ1dGUoaCk6YVtoXT1udWxsKX19LF9kYXRhOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZi5kYXRhKGEsYixjLCEwKX0sYWNjZXB0RGF0YTpmdW5jdGlvbihhKXtpZihhLm5vZGVOYW1lKXt2YXIgYj1mLm5vRGF0YVthLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldO2lmKGIpcmV0dXJuIGIhPT0hMCYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKT09PWJ9cmV0dXJuITB9fSksZi5mbi5leHRlbmQoe2RhdGE6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlLGcsaD1udWxsO2lmKHR5cGVvZiBhPT0idW5kZWZpbmVkIil7aWYodGhpcy5sZW5ndGgpe2g9Zi5kYXRhKHRoaXNbMF0pO2lmKHRoaXNbMF0ubm9kZVR5cGU9PT0xJiYhZi5fZGF0YSh0aGlzWzBdLCJwYXJzZWRBdHRycyIpKXtlPXRoaXNbMF0uYXR0cmlidXRlcztmb3IodmFyIGk9MCxqPWUubGVuZ3RoO2k8ajtpKyspZz1lW2ldLm5hbWUsZy5pbmRleE9mKCJkYXRhLSIpPT09MCYmKGc9Zi5jYW1lbENhc2UoZy5zdWJzdHJpbmcoNSkpLGwodGhpc1swXSxnLGhbZ10pKTtmLl9kYXRhKHRoaXNbMF0sInBhcnNlZEF0dHJzIiwhMCl9fXJldHVybiBofWlmKHR5cGVvZiBhPT0ib2JqZWN0IilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kYXRhKHRoaXMsYSl9KTtkPWEuc3BsaXQoIi4iKSxkWzFdPWRbMV0/Ii4iK2RbMV06IiI7aWYoYz09PWIpe2g9dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrZFsxXSsiISIsW2RbMF1dKSxoPT09YiYmdGhpcy5sZW5ndGgmJihoPWYuZGF0YSh0aGlzWzBdLGEpLGg9bCh0aGlzWzBdLGEsaCkpO3JldHVybiBoPT09YiYmZFsxXT90aGlzLmRhdGEoZFswXSk6aH1yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxlPVtkWzBdLGNdO2IudHJpZ2dlckhhbmRsZXIoInNldERhdGEiK2RbMV0rIiEiLGUpLGYuZGF0YSh0aGlzLGEsYyksYi50cmlnZ2VySGFuZGxlcigiY2hhbmdlRGF0YSIrZFsxXSsiISIsZSl9KX0scmVtb3ZlRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5yZW1vdmVEYXRhKHRoaXMsYSl9KX19KSxmLmV4dGVuZCh7X21hcms6ZnVuY3Rpb24oYSxiKXthJiYoYj0oYnx8ImZ4IikrIm1hcmsiLGYuX2RhdGEoYSxiLChmLl9kYXRhKGEsYil8fDApKzEpKX0sX3VubWFyazpmdW5jdGlvbihhLGIsYyl7YSE9PSEwJiYoYz1iLGI9YSxhPSExKTtpZihiKXtjPWN8fCJmeCI7dmFyIGQ9YysibWFyayIsZT1hPzA6KGYuX2RhdGEoYixkKXx8MSktMTtlP2YuX2RhdGEoYixkLGUpOihmLnJlbW92ZURhdGEoYixkLCEwKSxuKGIsYywibWFyayIpKX19LHF1ZXVlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZDtpZihhKXtiPShifHwiZngiKSsicXVldWUiLGQ9Zi5fZGF0YShhLGIpLGMmJighZHx8Zi5pc0FycmF5KGMpP2Q9Zi5fZGF0YShhLGIsZi5tYWtlQXJyYXkoYykpOmQucHVzaChjKSk7cmV0dXJuIGR8fFtdfX0sZGVxdWV1ZTpmdW5jdGlvbihhLGIpe2I9Ynx8ImZ4Ijt2YXIgYz1mLnF1ZXVlKGEsYiksZD1jLnNoaWZ0KCksZT17fTtkPT09ImlucHJvZ3Jlc3MiJiYoZD1jLnNoaWZ0KCkpLGQmJihiPT09ImZ4IiYmYy51bnNoaWZ0KCJpbnByb2dyZXNzIiksZi5fZGF0YShhLGIrIi5ydW4iLGUpLGQuY2FsbChhLGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKGEsYil9LGUpKSxjLmxlbmd0aHx8KGYucmVtb3ZlRGF0YShhLGIrInF1ZXVlICIrYisiLnJ1biIsITApLG4oYSxiLCJxdWV1ZSIpKX19KSxmLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxjKXt0eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT0iZngiKTtpZihjPT09YilyZXR1cm4gZi5xdWV1ZSh0aGlzWzBdLGEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1mLnF1ZXVlKHRoaXMsYSxjKTthPT09ImZ4IiYmYlswXSE9PSJpbnByb2dyZXNzIiYmZi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5kZXF1ZXVlKHRoaXMsYSl9KX0sZGVsYXk6ZnVuY3Rpb24oYSxiKXthPWYuZng/Zi5meC5zcGVlZHNbYV18fGE6YSxiPWJ8fCJmeCI7cmV0dXJuIHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBtKCl7LS1ofHxkLnJlc29sdmVXaXRoKGUsW2VdKX10eXBlb2YgYSE9InN0cmluZyImJihjPWEsYT1iKSxhPWF8fCJmeCI7dmFyIGQ9Zi5EZWZlcnJlZCgpLGU9dGhpcyxnPWUubGVuZ3RoLGg9MSxpPWErImRlZmVyIixqPWErInF1ZXVlIixrPWErIm1hcmsiLGw7d2hpbGUoZy0tKWlmKGw9Zi5kYXRhKGVbZ10saSxiLCEwKXx8KGYuZGF0YShlW2ddLGosYiwhMCl8fGYuZGF0YShlW2ddLGssYiwhMCkpJiZmLmRhdGEoZVtnXSxpLGYuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLCEwKSloKyssbC5hZGQobSk7bSgpO3JldHVybiBkLnByb21pc2UoKX19KTt2YXIgbz0vW1xuXHRccl0vZyxwPS9ccysvLHE9L1xyL2cscj0vXig/OmJ1dHRvbnxpbnB1dCkkL2kscz0vXig/OmJ1dHRvbnxpbnB1dHxvYmplY3R8c2VsZWN0fHRleHRhcmVhKSQvaSx0PS9eYSg/OnJlYSk/JC9pLHU9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksdj1mLnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlLHcseCx5O2YuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGYuYWNjZXNzKHRoaXMsYSxiLCEwLGYuYXR0cil9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YucmVtb3ZlQXR0cih0aGlzLGEpfSl9LHByb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGIsITAsZi5wcm9wKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXthPWYucHJvcEZpeFthXXx8YTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09YixkZWxldGUgdGhpc1thXX1jYXRjaChjKXt9fSl9LGFkZENsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlLGcsaCxpO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2YodGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoYSYmdHlwZW9mIGE9PSJzdHJpbmciKXtiPWEuc3BsaXQocCk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2U9dGhpc1tjXTtpZihlLm5vZGVUeXBlPT09MSlpZighZS5jbGFzc05hbWUmJmIubGVuZ3RoPT09MSllLmNsYXNzTmFtZT1hO2Vsc2V7Zz0iICIrZS5jbGFzc05hbWUrIiAiO2ZvcihoPTAsaT1iLmxlbmd0aDtoPGk7aCsrKX5nLmluZGV4T2YoIiAiK2JbaF0rIiAiKXx8KGcrPWJbaF0rIiAiKTtlLmNsYXNzTmFtZT1mLnRyaW0oZyl9fX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGcsaCxpLGo7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS5yZW1vdmVDbGFzcyhhLmNhbGwodGhpcyxiLHRoaXMuY2xhc3NOYW1lKSl9KTtpZihhJiZ0eXBlb2YgYT09InN0cmluZyJ8fGE9PT1iKXtjPShhfHwiIikuc3BsaXQocCk7Zm9yKGQ9MCxlPXRoaXMubGVuZ3RoO2Q8ZTtkKyspe2c9dGhpc1tkXTtpZihnLm5vZGVUeXBlPT09MSYmZy5jbGFzc05hbWUpaWYoYSl7aD0oIiAiK2cuY2xhc3NOYW1lKyIgIikucmVwbGFjZShvLCIgIik7Zm9yKGk9MCxqPWMubGVuZ3RoO2k8ajtpKyspaD1oLnJlcGxhY2UoIiAiK2NbaV0rIiAiLCIgIik7Zy5jbGFzc05hbWU9Zi50cmltKGgpfWVsc2UgZy5jbGFzc05hbWU9IiJ9fXJldHVybiB0aGlzfSx0b2dnbGVDbGFzczpmdW5jdGlvbihhLGIpe3ZhciBjPXR5cGVvZiBhLGQ9dHlwZW9mIGI9PSJib29sZWFuIjtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoYz09PSJzdHJpbmciKXt2YXIgZSxnPTAsaD1mKHRoaXMpLGk9YixqPWEuc3BsaXQocCk7d2hpbGUoZT1qW2crK10paT1kP2k6IWguaGFzQ2xhc3MoZSksaFtpPyJhZGRDbGFzcyI6InJlbW92ZUNsYXNzIl0oZSl9ZWxzZSBpZihjPT09InVuZGVmaW5lZCJ8fGM9PT0iYm9vbGVhbiIpdGhpcy5jbGFzc05hbWUmJmYuX2RhdGEodGhpcywiX19jbGFzc05hbWVfXyIsdGhpcy5jbGFzc05hbWUpLHRoaXMuY2xhc3NOYW1lPXRoaXMuY2xhc3NOYW1lfHxhPT09ITE/IiI6Zi5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIifSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe3ZhciBiPSIgIithKyIgIixjPTAsZD10aGlzLmxlbmd0aDtmb3IoO2M8ZDtjKyspaWYodGhpc1tjXS5ub2RlVHlwZT09PTEmJigiICIrdGhpc1tjXS5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKG8sIiAiKS5pbmRleE9mKGIpPi0xKXJldHVybiEwO3JldHVybiExfSx2YWw6ZnVuY3Rpb24oYSl7dmFyIGMsZCxlLGc9dGhpc1swXTt7aWYoISFhcmd1bWVudHMubGVuZ3RoKXtlPWYuaXNGdW5jdGlvbihhKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGQpe3ZhciBnPWYodGhpcyksaDtpZih0aGlzLm5vZGVUeXBlPT09MSl7ZT9oPWEuY2FsbCh0aGlzLGQsZy52YWwoKSk6aD1hLGg9PW51bGw/aD0iIjp0eXBlb2YgaD09Im51bWJlciI/aCs9IiI6Zi5pc0FycmF5KGgpJiYoaD1mLm1hcChoLGZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsPyIiOmErIiJ9KSksYz1mLnZhbEhvb2tzW3RoaXMubm9kZU5hbWUudG9Mb3dlckNhc2UoKV18fGYudmFsSG9va3NbdGhpcy50eXBlXTtpZighY3x8ISgic2V0ImluIGMpfHxjLnNldCh0aGlzLGgsInZhbHVlIik9PT1iKXRoaXMudmFsdWU9aH19KX1pZihnKXtjPWYudmFsSG9va3NbZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXXx8Zi52YWxIb29rc1tnLnR5cGVdO2lmKGMmJiJnZXQiaW4gYyYmKGQ9Yy5nZXQoZywidmFsdWUiKSkhPT1iKXJldHVybiBkO2Q9Zy52YWx1ZTtyZXR1cm4gdHlwZW9mIGQ9PSJzdHJpbmciP2QucmVwbGFjZShxLCIiKTpkPT1udWxsPyIiOmR9fX19KSxmLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEuYXR0cmlidXRlcy52YWx1ZTtyZXR1cm4hYnx8Yi5zcGVjaWZpZWQ/YS52YWx1ZTphLnRleHR9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZSxnPWEuc2VsZWN0ZWRJbmRleCxoPVtdLGk9YS5vcHRpb25zLGo9YS50eXBlPT09InNlbGVjdC1vbmUiO2lmKGc8MClyZXR1cm4gbnVsbDtjPWo/ZzowLGQ9aj9nKzE6aS5sZW5ndGg7Zm9yKDtjPGQ7YysrKXtlPWlbY107aWYoZS5zZWxlY3RlZCYmKGYuc3VwcG9ydC5vcHREaXNhYmxlZD8hZS5kaXNhYmxlZDplLmdldEF0dHJpYnV0ZSgiZGlzYWJsZWQiKT09PW51bGwpJiYoIWUucGFyZW50Tm9kZS5kaXNhYmxlZHx8IWYubm9kZU5hbWUoZS5wYXJlbnROb2RlLCJvcHRncm91cCIpKSl7Yj1mKGUpLnZhbCgpO2lmKGopcmV0dXJuIGI7aC5wdXNoKGIpfX1pZihqJiYhaC5sZW5ndGgmJmkubGVuZ3RoKXJldHVybiBmKGlbZ10pLnZhbCgpO3JldHVybiBofSxzZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1mLm1ha2VBcnJheShiKTtmKGEpLmZpbmQoIm9wdGlvbiIpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPWYuaW5BcnJheShmKHRoaXMpLnZhbCgpLGMpPj0wfSksYy5sZW5ndGh8fChhLnNlbGVjdGVkSW5kZXg9LTEpO3JldHVybiBjfX19LGF0dHJGbjp7dmFsOiEwLGNzczohMCxodG1sOiEwLHRleHQ6ITAsZGF0YTohMCx3aWR0aDohMCxoZWlnaHQ6ITAsb2Zmc2V0OiEwfSxhdHRyOmZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBnLGgsaSxqPWEubm9kZVR5cGU7aWYoISFhJiZqIT09MyYmaiE9PTgmJmohPT0yKXtpZihlJiZjIGluIGYuYXR0ckZuKXJldHVybiBmKGEpW2NdKGQpO2lmKHR5cGVvZiBhLmdldEF0dHJpYnV0ZT09InVuZGVmaW5lZCIpcmV0dXJuIGYucHJvcChhLGMsZCk7aT1qIT09MXx8IWYuaXNYTUxEb2MoYSksaSYmKGM9Yy50b0xvd2VyQ2FzZSgpLGg9Zi5hdHRySG9va3NbY118fCh1LnRlc3QoYyk/eDp3KSk7aWYoZCE9PWIpe2lmKGQ9PT1udWxsKXtmLnJlbW92ZUF0dHIoYSxjKTtyZXR1cm59aWYoaCYmInNldCJpbiBoJiZpJiYoZz1oLnNldChhLGQsYykpIT09YilyZXR1cm4gZzthLnNldEF0dHJpYnV0ZShjLCIiK2QpO3JldHVybiBkfWlmKGgmJiJnZXQiaW4gaCYmaSYmKGc9aC5nZXQoYSxjKSkhPT1udWxsKXJldHVybiBnO2c9YS5nZXRBdHRyaWJ1dGUoYyk7cmV0dXJuIGc9PT1udWxsP2I6Z319LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZyxoPTA7aWYoYiYmYS5ub2RlVHlwZT09PTEpe2Q9Yi50b0xvd2VyQ2FzZSgpLnNwbGl0KHApLGc9ZC5sZW5ndGg7Zm9yKDtoPGc7aCsrKWU9ZFtoXSxlJiYoYz1mLnByb3BGaXhbZV18fGUsZi5hdHRyKGEsZSwiIiksYS5yZW1vdmVBdHRyaWJ1dGUodj9lOmMpLHUudGVzdChlKSYmYyBpbiBhJiYoYVtjXT0hMSkpfX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oYSxiKXtpZihyLnRlc3QoYS5ub2RlTmFtZSkmJmEucGFyZW50Tm9kZSlmLmVycm9yKCJ0eXBlIHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiKTtlbHNlIGlmKCFmLnN1cHBvcnQucmFkaW9WYWx1ZSYmYj09PSJyYWRpbyImJmYubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTthLnNldEF0dHJpYnV0ZSgidHlwZSIsYiksYyYmKGEudmFsdWU9Yyk7cmV0dXJuIGJ9fX0sdmFsdWU6e2dldDpmdW5jdGlvbihhLGIpe2lmKHcmJmYubm9kZU5hbWUoYSwiYnV0dG9uIikpcmV0dXJuIHcuZ2V0KGEsYik7cmV0dXJuIGIgaW4gYT9hLnZhbHVlOm51bGx9LHNldDpmdW5jdGlvbihhLGIsYyl7aWYodyYmZi5ub2RlTmFtZShhLCJidXR0b24iKSlyZXR1cm4gdy5zZXQoYSxiLGMpO2EudmFsdWU9Yn19fSxwcm9wRml4Ont0YWJpbmRleDoidGFiSW5kZXgiLHJlYWRvbmx5OiJyZWFkT25seSIsImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSIsbWF4bGVuZ3RoOiJtYXhMZW5ndGgiLGNlbGxzcGFjaW5nOiJjZWxsU3BhY2luZyIsY2VsbHBhZGRpbmc6ImNlbGxQYWRkaW5nIixyb3dzcGFuOiJyb3dTcGFuIixjb2xzcGFuOiJjb2xTcGFuIix1c2VtYXA6InVzZU1hcCIsZnJhbWVib3JkZXI6ImZyYW1lQm9yZGVyIixjb250ZW50ZWRpdGFibGU6ImNvbnRlbnRFZGl0YWJsZSJ9LHByb3A6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlLGcsaCxpPWEubm9kZVR5cGU7aWYoISFhJiZpIT09MyYmaSE9PTgmJmkhPT0yKXtoPWkhPT0xfHwhZi5pc1hNTERvYyhhKSxoJiYoYz1mLnByb3BGaXhbY118fGMsZz1mLnByb3BIb29rc1tjXSk7cmV0dXJuIGQhPT1iP2cmJiJzZXQiaW4gZyYmKGU9Zy5zZXQoYSxkLGMpKSE9PWI/ZTphW2NdPWQ6ZyYmImdldCJpbiBnJiYoZT1nLmdldChhLGMpKSE9PW51bGw/ZTphW2NdfX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2V0QXR0cmlidXRlTm9kZSgidGFiaW5kZXgiKTtyZXR1cm4gYyYmYy5zcGVjaWZpZWQ/cGFyc2VJbnQoYy52YWx1ZSwxMCk6cy50ZXN0KGEubm9kZU5hbWUpfHx0LnRlc3QoYS5ub2RlTmFtZSkmJmEuaHJlZj8wOmJ9fX19KSxmLmF0dHJIb29rcy50YWJpbmRleD1mLnByb3BIb29rcy50YWJJbmRleCx4PXtnZXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZCxlPWYucHJvcChhLGMpO3JldHVybiBlPT09ITB8fHR5cGVvZiBlIT0iYm9vbGVhbiImJihkPWEuZ2V0QXR0cmlidXRlTm9kZShjKSkmJmQubm9kZVZhbHVlIT09ITE/Yy50b0xvd2VyQ2FzZSgpOmJ9LHNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7Yj09PSExP2YucmVtb3ZlQXR0cihhLGMpOihkPWYucHJvcEZpeFtjXXx8YyxkIGluIGEmJihhW2RdPSEwKSxhLnNldEF0dHJpYnV0ZShjLGMudG9Mb3dlckNhc2UoKSkpO3JldHVybiBjfX0sdnx8KHk9e25hbWU6ITAsaWQ6ITB9LHc9Zi52YWxIb29rcy5idXR0b249e2dldDpmdW5jdGlvbihhLGMpe3ZhciBkO2Q9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkJiYoeVtjXT9kLm5vZGVWYWx1ZSE9PSIiOmQuc3BlY2lmaWVkKT9kLm5vZGVWYWx1ZTpifSxzZXQ6ZnVuY3Rpb24oYSxiLGQpe3ZhciBlPWEuZ2V0QXR0cmlidXRlTm9kZShkKTtlfHwoZT1jLmNyZWF0ZUF0dHJpYnV0ZShkKSxhLnNldEF0dHJpYnV0ZU5vZGUoZSkpO3JldHVybiBlLm5vZGVWYWx1ZT1iKyIifX0sZi5hdHRySG9va3MudGFiaW5kZXguc2V0PXcuc2V0LGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmF0dHJIb29rc1tiXT1mLmV4dGVuZChmLmF0dHJIb29rc1tiXSx7c2V0OmZ1bmN0aW9uKGEsYyl7aWYoYz09PSIiKXthLnNldEF0dHJpYnV0ZShiLCJhdXRvIik7cmV0dXJuIGN9fX0pfSksZi5hdHRySG9va3MuY29udGVudGVkaXRhYmxlPXtnZXQ6dy5nZXQsc2V0OmZ1bmN0aW9uKGEsYixjKXtiPT09IiImJihiPSJmYWxzZSIpLHcuc2V0KGEsYixjKX19KSxmLnN1cHBvcnQuaHJlZk5vcm1hbGl6ZWR8fGYuZWFjaChbImhyZWYiLCJzcmMiLCJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYyl7Zi5hdHRySG9va3NbY109Zi5leHRlbmQoZi5hdHRySG9va3NbY10se2dldDpmdW5jdGlvbihhKXt2YXIgZD1hLmdldEF0dHJpYnV0ZShjLDIpO3JldHVybiBkPT09bnVsbD9iOmR9fSl9KSxmLnN1cHBvcnQuc3R5bGV8fChmLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKXx8Yn0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD0iIitifX0pLGYuc3VwcG9ydC5vcHRTZWxlY3RlZHx8KGYucHJvcEhvb2tzLnNlbGVjdGVkPWYuZXh0ZW5kKGYucHJvcEhvb2tzLnNlbGVjdGVkLHtnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO2ImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCk7cmV0dXJuIG51bGx9fSkpLGYuc3VwcG9ydC5lbmN0eXBlfHwoZi5wcm9wRml4LmVuY3R5cGU9ImVuY29kaW5nIiksZi5zdXBwb3J0LmNoZWNrT258fGYuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2YudmFsSG9va3NbdGhpc109e2dldDpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoInZhbHVlIik9PT1udWxsPyJvbiI6YS52YWx1ZX19fSksZi5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7Zi52YWxIb29rc1t0aGlzXT1mLmV4dGVuZChmLnZhbEhvb2tzW3RoaXNdLHtzZXQ6ZnVuY3Rpb24oYSxiKXtpZihmLmlzQXJyYXkoYikpcmV0dXJuIGEuY2hlY2tlZD1mLmluQXJyYXkoZihhKS52YWwoKSxiKT49MH19KX0pO3ZhciB6PS9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSxBPS9eKFteXC5dKik/KD86XC4oLispKT8kLyxCPS9cYmhvdmVyKFwuXFMrKT9cYi8sQz0vXmtleS8sRD0vXig/Om1vdXNlfGNvbnRleHRtZW51KXxjbGljay8sRT0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sRj0vXihcdyopKD86IyhbXHdcLV0rKSk/KD86XC4oW1x3XC1dKykpPyQvLEc9ZnVuY3Rpb24oYSl7dmFyIGI9Ri5leGVjKGEpO2ImJihiWzFdPShiWzFdfHwiIikudG9Mb3dlckNhc2UoKSxiWzNdPWJbM10mJm5ldyBSZWdFeHAoIig/Ol58XFxzKSIrYlszXSsiKD86XFxzfCQpIikpO3JldHVybiBifSxIPWZ1bmN0aW9uKGEsYil7dmFyIGM9YS5hdHRyaWJ1dGVzfHx7fTtyZXR1cm4oIWJbMV18fGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWJbMV0pJiYoIWJbMl18fChjLmlkfHx7fSkudmFsdWU9PT1iWzJdKSYmKCFiWzNdfHxiWzNdLnRlc3QoKGNbImNsYXNzIl18fHt9KS52YWx1ZSkpfSxJPWZ1bmN0aW9uKGEpe3JldHVybiBmLmV2ZW50LnNwZWNpYWwuaG92ZXI/YTphLnJlcGxhY2UoQiwibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpfTsKZi5ldmVudD17YWRkOmZ1bmN0aW9uKGEsYyxkLGUsZyl7dmFyIGgsaSxqLGssbCxtLG4sbyxwLHEscixzO2lmKCEoYS5ub2RlVHlwZT09PTN8fGEubm9kZVR5cGU9PT04fHwhY3x8IWR8fCEoaD1mLl9kYXRhKGEpKSkpe2QuaGFuZGxlciYmKHA9ZCxkPXAuaGFuZGxlciksZC5ndWlkfHwoZC5ndWlkPWYuZ3VpZCsrKSxqPWguZXZlbnRzLGp8fChoLmV2ZW50cz1qPXt9KSxpPWguaGFuZGxlLGl8fChoLmhhbmRsZT1pPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgZiE9InVuZGVmaW5lZCImJighYXx8Zi5ldmVudC50cmlnZ2VyZWQhPT1hLnR5cGUpP2YuZXZlbnQuZGlzcGF0Y2guYXBwbHkoaS5lbGVtLGFyZ3VtZW50cyk6Yn0saS5lbGVtPWEpLGM9Zi50cmltKEkoYykpLnNwbGl0KCIgIik7Zm9yKGs9MDtrPGMubGVuZ3RoO2srKyl7bD1BLmV4ZWMoY1trXSl8fFtdLG09bFsxXSxuPShsWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCkscz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG09KGc/cy5kZWxlZ2F0ZVR5cGU6cy5iaW5kVHlwZSl8fG0scz1mLmV2ZW50LnNwZWNpYWxbbV18fHt9LG89Zi5leHRlbmQoe3R5cGU6bSxvcmlnVHlwZTpsWzFdLGRhdGE6ZSxoYW5kbGVyOmQsZ3VpZDpkLmd1aWQsc2VsZWN0b3I6ZyxxdWljazpHKGcpLG5hbWVzcGFjZTpuLmpvaW4oIi4iKX0scCkscj1qW21dO2lmKCFyKXtyPWpbbV09W10sci5kZWxlZ2F0ZUNvdW50PTA7aWYoIXMuc2V0dXB8fHMuc2V0dXAuY2FsbChhLGUsbixpKT09PSExKWEuYWRkRXZlbnRMaXN0ZW5lcj9hLmFkZEV2ZW50TGlzdGVuZXIobSxpLCExKTphLmF0dGFjaEV2ZW50JiZhLmF0dGFjaEV2ZW50KCJvbiIrbSxpKX1zLmFkZCYmKHMuYWRkLmNhbGwoYSxvKSxvLmhhbmRsZXIuZ3VpZHx8KG8uaGFuZGxlci5ndWlkPWQuZ3VpZCkpLGc/ci5zcGxpY2Uoci5kZWxlZ2F0ZUNvdW50KyssMCxvKTpyLnB1c2gobyksZi5ldmVudC5nbG9iYWxbbV09ITB9YT1udWxsfX0sZ2xvYmFsOnt9LHJlbW92ZTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBnPWYuaGFzRGF0YShhKSYmZi5fZGF0YShhKSxoLGksaixrLGwsbSxuLG8scCxxLHIscztpZighIWcmJiEhKG89Zy5ldmVudHMpKXtiPWYudHJpbShJKGJ8fCIiKSkuc3BsaXQoIiAiKTtmb3IoaD0wO2g8Yi5sZW5ndGg7aCsrKXtpPUEuZXhlYyhiW2hdKXx8W10saj1rPWlbMV0sbD1pWzJdO2lmKCFqKXtmb3IoaiBpbiBvKWYuZXZlbnQucmVtb3ZlKGEsaitiW2hdLGMsZCwhMCk7Y29udGludWV9cD1mLmV2ZW50LnNwZWNpYWxbal18fHt9LGo9KGQ/cC5kZWxlZ2F0ZVR5cGU6cC5iaW5kVHlwZSl8fGoscj1vW2pdfHxbXSxtPXIubGVuZ3RoLGw9bD9uZXcgUmVnRXhwKCIoXnxcXC4pIitsLnNwbGl0KCIuIikuc29ydCgpLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSsiKFxcLnwkKSIpOm51bGw7Zm9yKG49MDtuPHIubGVuZ3RoO24rKylzPXJbbl0sKGV8fGs9PT1zLm9yaWdUeXBlKSYmKCFjfHxjLmd1aWQ9PT1zLmd1aWQpJiYoIWx8fGwudGVzdChzLm5hbWVzcGFjZSkpJiYoIWR8fGQ9PT1zLnNlbGVjdG9yfHxkPT09IioqIiYmcy5zZWxlY3RvcikmJihyLnNwbGljZShuLS0sMSkscy5zZWxlY3RvciYmci5kZWxlZ2F0ZUNvdW50LS0scC5yZW1vdmUmJnAucmVtb3ZlLmNhbGwoYSxzKSk7ci5sZW5ndGg9PT0wJiZtIT09ci5sZW5ndGgmJigoIXAudGVhcmRvd258fHAudGVhcmRvd24uY2FsbChhLGwpPT09ITEpJiZmLnJlbW92ZUV2ZW50KGEsaixnLmhhbmRsZSksZGVsZXRlIG9bal0pfWYuaXNFbXB0eU9iamVjdChvKSYmKHE9Zy5oYW5kbGUscSYmKHEuZWxlbT1udWxsKSxmLnJlbW92ZURhdGEoYSxbImV2ZW50cyIsImhhbmRsZSJdLCEwKSl9fSxjdXN0b21FdmVudDp7Z2V0RGF0YTohMCxzZXREYXRhOiEwLGNoYW5nZURhdGE6ITB9LHRyaWdnZXI6ZnVuY3Rpb24oYyxkLGUsZyl7aWYoIWV8fGUubm9kZVR5cGUhPT0zJiZlLm5vZGVUeXBlIT09OCl7dmFyIGg9Yy50eXBlfHxjLGk9W10saixrLGwsbSxuLG8scCxxLHIscztpZihFLnRlc3QoaCtmLmV2ZW50LnRyaWdnZXJlZCkpcmV0dXJuO2guaW5kZXhPZigiISIpPj0wJiYoaD1oLnNsaWNlKDAsLTEpLGs9ITApLGguaW5kZXhPZigiLiIpPj0wJiYoaT1oLnNwbGl0KCIuIiksaD1pLnNoaWZ0KCksaS5zb3J0KCkpO2lmKCghZXx8Zi5ldmVudC5jdXN0b21FdmVudFtoXSkmJiFmLmV2ZW50Lmdsb2JhbFtoXSlyZXR1cm47Yz10eXBlb2YgYz09Im9iamVjdCI/Y1tmLmV4cGFuZG9dP2M6bmV3IGYuRXZlbnQoaCxjKTpuZXcgZi5FdmVudChoKSxjLnR5cGU9aCxjLmlzVHJpZ2dlcj0hMCxjLmV4Y2x1c2l2ZT1rLGMubmFtZXNwYWNlPWkuam9pbigiLiIpLGMubmFtZXNwYWNlX3JlPWMubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK2kuam9pbigiXFwuKD86LipcXC4pPyIpKyIoXFwufCQpIik6bnVsbCxvPWguaW5kZXhPZigiOiIpPDA/Im9uIitoOiIiO2lmKCFlKXtqPWYuY2FjaGU7Zm9yKGwgaW4gailqW2xdLmV2ZW50cyYmaltsXS5ldmVudHNbaF0mJmYuZXZlbnQudHJpZ2dlcihjLGQsaltsXS5oYW5kbGUuZWxlbSwhMCk7cmV0dXJufWMucmVzdWx0PWIsYy50YXJnZXR8fChjLnRhcmdldD1lKSxkPWQhPW51bGw/Zi5tYWtlQXJyYXkoZCk6W10sZC51bnNoaWZ0KGMpLHA9Zi5ldmVudC5zcGVjaWFsW2hdfHx7fTtpZihwLnRyaWdnZXImJnAudHJpZ2dlci5hcHBseShlLGQpPT09ITEpcmV0dXJuO3I9W1tlLHAuYmluZFR5cGV8fGhdXTtpZighZyYmIXAubm9CdWJibGUmJiFmLmlzV2luZG93KGUpKXtzPXAuZGVsZWdhdGVUeXBlfHxoLG09RS50ZXN0KHMraCk/ZTplLnBhcmVudE5vZGUsbj1udWxsO2Zvcig7bTttPW0ucGFyZW50Tm9kZSlyLnB1c2goW20sc10pLG49bTtuJiZuPT09ZS5vd25lckRvY3VtZW50JiZyLnB1c2goW24uZGVmYXVsdFZpZXd8fG4ucGFyZW50V2luZG93fHxhLHNdKX1mb3IobD0wO2w8ci5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7bCsrKW09cltsXVswXSxjLnR5cGU9cltsXVsxXSxxPShmLl9kYXRhKG0sImV2ZW50cyIpfHx7fSlbYy50eXBlXSYmZi5fZGF0YShtLCJoYW5kbGUiKSxxJiZxLmFwcGx5KG0sZCkscT1vJiZtW29dLHEmJmYuYWNjZXB0RGF0YShtKSYmcS5hcHBseShtLGQpPT09ITEmJmMucHJldmVudERlZmF1bHQoKTtjLnR5cGU9aCwhZyYmIWMuaXNEZWZhdWx0UHJldmVudGVkKCkmJighcC5fZGVmYXVsdHx8cC5fZGVmYXVsdC5hcHBseShlLm93bmVyRG9jdW1lbnQsZCk9PT0hMSkmJihoIT09ImNsaWNrInx8IWYubm9kZU5hbWUoZSwiYSIpKSYmZi5hY2NlcHREYXRhKGUpJiZvJiZlW2hdJiYoaCE9PSJmb2N1cyImJmghPT0iYmx1ciJ8fGMudGFyZ2V0Lm9mZnNldFdpZHRoIT09MCkmJiFmLmlzV2luZG93KGUpJiYobj1lW29dLG4mJihlW29dPW51bGwpLGYuZXZlbnQudHJpZ2dlcmVkPWgsZVtoXSgpLGYuZXZlbnQudHJpZ2dlcmVkPWIsbiYmKGVbb109bikpO3JldHVybiBjLnJlc3VsdH19LGRpc3BhdGNoOmZ1bmN0aW9uKGMpe2M9Zi5ldmVudC5maXgoY3x8YS5ldmVudCk7dmFyIGQ9KGYuX2RhdGEodGhpcywiZXZlbnRzIil8fHt9KVtjLnR5cGVdfHxbXSxlPWQuZGVsZWdhdGVDb3VudCxnPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLGg9IWMuZXhjbHVzaXZlJiYhYy5uYW1lc3BhY2UsaT1bXSxqLGssbCxtLG4sbyxwLHEscixzLHQ7Z1swXT1jLGMuZGVsZWdhdGVUYXJnZXQ9dGhpcztpZihlJiYhYy50YXJnZXQuZGlzYWJsZWQmJighYy5idXR0b258fGMudHlwZSE9PSJjbGljayIpKXttPWYodGhpcyksbS5jb250ZXh0PXRoaXMub3duZXJEb2N1bWVudHx8dGhpcztmb3IobD1jLnRhcmdldDtsIT10aGlzO2w9bC5wYXJlbnROb2RlfHx0aGlzKXtvPXt9LHE9W10sbVswXT1sO2ZvcihqPTA7ajxlO2orKylyPWRbal0scz1yLnNlbGVjdG9yLG9bc109PT1iJiYob1tzXT1yLnF1aWNrP0gobCxyLnF1aWNrKTptLmlzKHMpKSxvW3NdJiZxLnB1c2gocik7cS5sZW5ndGgmJmkucHVzaCh7ZWxlbTpsLG1hdGNoZXM6cX0pfX1kLmxlbmd0aD5lJiZpLnB1c2goe2VsZW06dGhpcyxtYXRjaGVzOmQuc2xpY2UoZSl9KTtmb3Ioaj0wO2o8aS5sZW5ndGgmJiFjLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7aisrKXtwPWlbal0sYy5jdXJyZW50VGFyZ2V0PXAuZWxlbTtmb3Ioaz0wO2s8cC5tYXRjaGVzLmxlbmd0aCYmIWMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKTtrKyspe3I9cC5tYXRjaGVzW2tdO2lmKGh8fCFjLm5hbWVzcGFjZSYmIXIubmFtZXNwYWNlfHxjLm5hbWVzcGFjZV9yZSYmYy5uYW1lc3BhY2VfcmUudGVzdChyLm5hbWVzcGFjZSkpYy5kYXRhPXIuZGF0YSxjLmhhbmRsZU9iaj1yLG49KChmLmV2ZW50LnNwZWNpYWxbci5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fHIuaGFuZGxlcikuYXBwbHkocC5lbGVtLGcpLG4hPT1iJiYoYy5yZXN1bHQ9bixuPT09ITEmJihjLnByZXZlbnREZWZhdWx0KCksYy5zdG9wUHJvcGFnYXRpb24oKSkpfX1yZXR1cm4gYy5yZXN1bHR9LHByb3BzOiJhdHRyQ2hhbmdlIGF0dHJOYW1lIHJlbGF0ZWROb2RlIHNyY0VsZW1lbnQgYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXthLndoaWNoPT1udWxsJiYoYS53aGljaD1iLmNoYXJDb2RlIT1udWxsP2IuY2hhckNvZGU6Yi5rZXlDb2RlKTtyZXR1cm4gYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsZixnLGg9ZC5idXR0b24saT1kLmZyb21FbGVtZW50O2EucGFnZVg9PW51bGwmJmQuY2xpZW50WCE9bnVsbCYmKGU9YS50YXJnZXQub3duZXJEb2N1bWVudHx8YyxmPWUuZG9jdW1lbnRFbGVtZW50LGc9ZS5ib2R5LGEucGFnZVg9ZC5jbGllbnRYKyhmJiZmLnNjcm9sbExlZnR8fGcmJmcuc2Nyb2xsTGVmdHx8MCktKGYmJmYuY2xpZW50TGVmdHx8ZyYmZy5jbGllbnRMZWZ0fHwwKSxhLnBhZ2VZPWQuY2xpZW50WSsoZiYmZi5zY3JvbGxUb3B8fGcmJmcuc2Nyb2xsVG9wfHwwKS0oZiYmZi5jbGllbnRUb3B8fGcmJmcuY2xpZW50VG9wfHwwKSksIWEucmVsYXRlZFRhcmdldCYmaSYmKGEucmVsYXRlZFRhcmdldD1pPT09YS50YXJnZXQ/ZC50b0VsZW1lbnQ6aSksIWEud2hpY2gmJmghPT1iJiYoYS53aGljaD1oJjE/MTpoJjI/MzpoJjQ/MjowKTtyZXR1cm4gYX19LGZpeDpmdW5jdGlvbihhKXtpZihhW2YuZXhwYW5kb10pcmV0dXJuIGE7dmFyIGQsZSxnPWEsaD1mLmV2ZW50LmZpeEhvb2tzW2EudHlwZV18fHt9LGk9aC5wcm9wcz90aGlzLnByb3BzLmNvbmNhdChoLnByb3BzKTp0aGlzLnByb3BzO2E9Zi5FdmVudChnKTtmb3IoZD1pLmxlbmd0aDtkOyllPWlbLS1kXSxhW2VdPWdbZV07YS50YXJnZXR8fChhLnRhcmdldD1nLnNyY0VsZW1lbnR8fGMpLGEudGFyZ2V0Lm5vZGVUeXBlPT09MyYmKGEudGFyZ2V0PWEudGFyZ2V0LnBhcmVudE5vZGUpLGEubWV0YUtleT09PWImJihhLm1ldGFLZXk9YS5jdHJsS2V5KTtyZXR1cm4gaC5maWx0ZXI/aC5maWx0ZXIoYSxnKTphfSxzcGVjaWFsOntyZWFkeTp7c2V0dXA6Zi5iaW5kUmVhZHl9LGxvYWQ6e25vQnViYmxlOiEwfSxmb2N1czp7ZGVsZWdhdGVUeXBlOiJmb2N1c2luIn0sYmx1cjp7ZGVsZWdhdGVUeXBlOiJmb2N1c291dCJ9LGJlZm9yZXVubG9hZDp7c2V0dXA6ZnVuY3Rpb24oYSxiLGMpe2YuaXNXaW5kb3codGhpcykmJih0aGlzLm9uYmVmb3JldW5sb2FkPWMpfSx0ZWFyZG93bjpmdW5jdGlvbihhLGIpe3RoaXMub25iZWZvcmV1bmxvYWQ9PT1iJiYodGhpcy5vbmJlZm9yZXVubG9hZD1udWxsKX19fSxzaW11bGF0ZTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1mLmV4dGVuZChuZXcgZi5FdmVudCxjLHt0eXBlOmEsaXNTaW11bGF0ZWQ6ITAsb3JpZ2luYWxFdmVudDp7fX0pO2Q/Zi5ldmVudC50cmlnZ2VyKGUsbnVsbCxiKTpmLmV2ZW50LmRpc3BhdGNoLmNhbGwoYixlKSxlLmlzRGVmYXVsdFByZXZlbnRlZCgpJiZjLnByZXZlbnREZWZhdWx0KCl9fSxmLmV2ZW50LmhhbmRsZT1mLmV2ZW50LmRpc3BhdGNoLGYucmVtb3ZlRXZlbnQ9Yy5yZW1vdmVFdmVudExpc3RlbmVyP2Z1bmN0aW9uKGEsYixjKXthLnJlbW92ZUV2ZW50TGlzdGVuZXImJmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLGMsITEpfTpmdW5jdGlvbihhLGIsYyl7YS5kZXRhY2hFdmVudCYmYS5kZXRhY2hFdmVudCgib24iK2IsYyl9LGYuRXZlbnQ9ZnVuY3Rpb24oYSxiKXtpZighKHRoaXMgaW5zdGFuY2VvZiBmLkV2ZW50KSlyZXR1cm4gbmV3IGYuRXZlbnQoYSxiKTthJiZhLnR5cGU/KHRoaXMub3JpZ2luYWxFdmVudD1hLHRoaXMudHlwZT1hLnR5cGUsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS5kZWZhdWx0UHJldmVudGVkfHxhLnJldHVyblZhbHVlPT09ITF8fGEuZ2V0UHJldmVudERlZmF1bHQmJmEuZ2V0UHJldmVudERlZmF1bHQoKT9LOkopOnRoaXMudHlwZT1hLGImJmYuZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fGYubm93KCksdGhpc1tmLmV4cGFuZG9dPSEwfSxmLkV2ZW50LnByb3RvdHlwZT17cHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oKXt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1LO3ZhciBhPXRoaXMub3JpZ2luYWxFdmVudDshYXx8KGEucHJldmVudERlZmF1bHQ/YS5wcmV2ZW50RGVmYXVsdCgpOmEucmV0dXJuVmFsdWU9ITEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPUs7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50OyFhfHwoYS5zdG9wUHJvcGFnYXRpb24mJmEuc3RvcFByb3BhZ2F0aW9uKCksYS5jYW5jZWxCdWJibGU9ITApfSxzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPUssdGhpcy5zdG9wUHJvcGFnYXRpb24oKX0saXNEZWZhdWx0UHJldmVudGVkOkosaXNQcm9wYWdhdGlvblN0b3BwZWQ6Sixpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpKfSxmLmVhY2goe21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSxmdW5jdGlvbihhLGIpe2YuZXZlbnQuc3BlY2lhbFthXT17ZGVsZWdhdGVUeXBlOmIsYmluZFR5cGU6YixoYW5kbGU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxkPWEucmVsYXRlZFRhcmdldCxlPWEuaGFuZGxlT2JqLGc9ZS5zZWxlY3RvcixoO2lmKCFkfHxkIT09YyYmIWYuY29udGFpbnMoYyxkKSlhLnR5cGU9ZS5vcmlnVHlwZSxoPWUuaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyksYS50eXBlPWI7cmV0dXJuIGh9fX0pLGYuc3VwcG9ydC5zdWJtaXRCdWJibGVzfHwoZi5ldmVudC5zcGVjaWFsLnN1Ym1pdD17c2V0dXA6ZnVuY3Rpb24oKXtpZihmLm5vZGVOYW1lKHRoaXMsImZvcm0iKSlyZXR1cm4hMTtmLmV2ZW50LmFkZCh0aGlzLCJjbGljay5fc3VibWl0IGtleXByZXNzLl9zdWJtaXQiLGZ1bmN0aW9uKGEpe3ZhciBjPWEudGFyZ2V0LGQ9Zi5ub2RlTmFtZShjLCJpbnB1dCIpfHxmLm5vZGVOYW1lKGMsImJ1dHRvbiIpP2MuZm9ybTpiO2QmJiFkLl9zdWJtaXRfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChkLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1RyaWdnZXImJmYuZXZlbnQuc2ltdWxhdGUoInN1Ym1pdCIsdGhpcy5wYXJlbnROb2RlLGEsITApfSksZC5fc3VibWl0X2F0dGFjaGVkPSEwKX0pfSx0ZWFyZG93bjpmdW5jdGlvbigpe2lmKGYubm9kZU5hbWUodGhpcywiZm9ybSIpKXJldHVybiExO2YuZXZlbnQucmVtb3ZlKHRoaXMsIi5fc3VibWl0Iil9fSksZi5zdXBwb3J0LmNoYW5nZUJ1YmJsZXN8fChmLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe2lmKHoudGVzdCh0aGlzLm5vZGVOYW1lKSl7aWYodGhpcy50eXBlPT09ImNoZWNrYm94Inx8dGhpcy50eXBlPT09InJhZGlvIilmLmV2ZW50LmFkZCh0aGlzLCJwcm9wZXJ0eWNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXthLm9yaWdpbmFsRXZlbnQucHJvcGVydHlOYW1lPT09ImNoZWNrZWQiJiYodGhpcy5fanVzdF9jaGFuZ2VkPSEwKX0pLGYuZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpe3RoaXMuX2p1c3RfY2hhbmdlZCYmIWEuaXNUcmlnZ2VyJiYodGhpcy5fanVzdF9jaGFuZ2VkPSExLGYuZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKSl9KTtyZXR1cm4hMX1mLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDt6LnRlc3QoYi5ub2RlTmFtZSkmJiFiLl9jaGFuZ2VfYXR0YWNoZWQmJihmLmV2ZW50LmFkZChiLCJjaGFuZ2UuX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiYhYS5pc1NpbXVsYXRlZCYmIWEuaXNUcmlnZ2VyJiZmLmV2ZW50LnNpbXVsYXRlKCJjaGFuZ2UiLHRoaXMucGFyZW50Tm9kZSxhLCEwKX0pLGIuX2NoYW5nZV9hdHRhY2hlZD0hMCl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O2lmKHRoaXMhPT1ifHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8Yi50eXBlIT09InJhZGlvIiYmYi50eXBlIT09ImNoZWNrYm94IilyZXR1cm4gYS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7Zi5ldmVudC5yZW1vdmUodGhpcywiLl9jaGFuZ2UiKTtyZXR1cm4gei50ZXN0KHRoaXMubm9kZU5hbWUpfX0pLGYuc3VwcG9ydC5mb2N1c2luQnViYmxlc3x8Zi5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBkPTAsZT1mdW5jdGlvbihhKXtmLmV2ZW50LnNpbXVsYXRlKGIsYS50YXJnZXQsZi5ldmVudC5maXgoYSksITApfTtmLmV2ZW50LnNwZWNpYWxbYl09e3NldHVwOmZ1bmN0aW9uKCl7ZCsrPT09MCYmYy5hZGRFdmVudExpc3RlbmVyKGEsZSwhMCl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7LS1kPT09MCYmYy5yZW1vdmVFdmVudExpc3RlbmVyKGEsZSwhMCl9fX0pLGYuZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGMsZCxlLGcpe3ZhciBoLGk7aWYodHlwZW9mIGE9PSJvYmplY3QiKXt0eXBlb2YgYyE9InN0cmluZyImJihkPWMsYz1iKTtmb3IoaSBpbiBhKXRoaXMub24oaSxjLGQsYVtpXSxnKTtyZXR1cm4gdGhpc31kPT1udWxsJiZlPT1udWxsPyhlPWMsZD1jPWIpOmU9PW51bGwmJih0eXBlb2YgYz09InN0cmluZyI/KGU9ZCxkPWIpOihlPWQsZD1jLGM9YikpO2lmKGU9PT0hMSllPUo7ZWxzZSBpZighZSlyZXR1cm4gdGhpcztnPT09MSYmKGg9ZSxlPWZ1bmN0aW9uKGEpe2YoKS5vZmYoYSk7cmV0dXJuIGguYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLmd1aWQ9aC5ndWlkfHwoaC5ndWlkPWYuZ3VpZCsrKSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQuYWRkKHRoaXMsYSxlLGQsYyl9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uLmNhbGwodGhpcyxhLGIsYyxkLDEpfSxvZmY6ZnVuY3Rpb24oYSxjLGQpe2lmKGEmJmEucHJldmVudERlZmF1bHQmJmEuaGFuZGxlT2JqKXt2YXIgZT1hLmhhbmRsZU9iajtmKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihlLm5hbWVzcGFjZT9lLnR5cGUrIi4iK2UubmFtZXNwYWNlOmUudHlwZSxlLnNlbGVjdG9yLGUuaGFuZGxlcik7cmV0dXJuIHRoaXN9aWYodHlwZW9mIGE9PSJvYmplY3QiKXtmb3IodmFyIGcgaW4gYSl0aGlzLm9mZihnLGMsYVtnXSk7cmV0dXJuIHRoaXN9aWYoYz09PSExfHx0eXBlb2YgYz09ImZ1bmN0aW9uIilkPWMsYz1iO2Q9PT0hMSYmKGQ9Sik7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2YuZXZlbnQucmVtb3ZlKHRoaXMsYSxkLGMpfSl9LGJpbmQ6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm9uKGEsbnVsbCxiLGMpfSx1bmJpbmQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5vZmYoYSxudWxsLGIpfSxsaXZlOmZ1bmN0aW9uKGEsYixjKXtmKHRoaXMuY29udGV4dCkub24oYSx0aGlzLnNlbGVjdG9yLGIsYyk7cmV0dXJuIHRoaXN9LGRpZTpmdW5jdGlvbihhLGIpe2YodGhpcy5jb250ZXh0KS5vZmYoYSx0aGlzLnNlbGVjdG9yfHwiKioiLGIpO3JldHVybiB0aGlzfSxkZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5vbihiLGEsYyxkKX0sdW5kZWxlZ2F0ZTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PTE/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGEsYyl9LHRyaWdnZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Zi5ldmVudC50cmlnZ2VyKGEsYix0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihhLGIpe2lmKHRoaXNbMF0pcmV0dXJuIGYuZXZlbnQudHJpZ2dlcihhLGIsdGhpc1swXSwhMCl9LHRvZ2dsZTpmdW5jdGlvbihhKXt2YXIgYj1hcmd1bWVudHMsYz1hLmd1aWR8fGYuZ3VpZCsrLGQ9MCxlPWZ1bmN0aW9uKGMpe3ZhciBlPShmLl9kYXRhKHRoaXMsImxhc3RUb2dnbGUiK2EuZ3VpZCl8fDApJWQ7Zi5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIithLmd1aWQsZSsxKSxjLnByZXZlbnREZWZhdWx0KCk7cmV0dXJuIGJbZV0uYXBwbHkodGhpcyxhcmd1bWVudHMpfHwhMX07ZS5ndWlkPWM7d2hpbGUoZDxiLmxlbmd0aCliW2QrK10uZ3VpZD1jO3JldHVybiB0aGlzLmNsaWNrKGUpfSxob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX19KSxmLmVhY2goImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIG1vdXNlZG93biBtb3VzZXVwIG1vdXNlbW92ZSBtb3VzZW92ZXIgbW91c2VvdXQgbW91c2VlbnRlciBtb3VzZWxlYXZlIGNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgZXJyb3IgY29udGV4dG1lbnUiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtmLmZuW2JdPWZ1bmN0aW9uKGEsYyl7Yz09bnVsbCYmKGM9YSxhPW51bGwpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjA/dGhpcy5vbihiLG51bGwsYSxjKTp0aGlzLnRyaWdnZXIoYil9LGYuYXR0ckZuJiYoZi5hdHRyRm5bYl09ITApLEMudGVzdChiKSYmKGYuZXZlbnQuZml4SG9va3NbYl09Zi5ldmVudC5rZXlIb29rcyksRC50ZXN0KGIpJiYoZi5ldmVudC5maXhIb29rc1tiXT1mLmV2ZW50Lm1vdXNlSG9va3MpfSksZnVuY3Rpb24oKXtmdW5jdGlvbiB4KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWlmKGoubm9kZVR5cGU9PT0xKXtnfHwoaltkXT1jLGouc2l6c2V0PWgpO2lmKHR5cGVvZiBiIT0ic3RyaW5nIil7aWYoaj09PWIpe2s9ITA7YnJlYWt9fWVsc2UgaWYobS5maWx0ZXIoYixbal0pLmxlbmd0aD4wKXtrPWo7YnJlYWt9fWo9althXX1lW2hdPWt9fX1mdW5jdGlvbiB3KGEsYixjLGUsZixnKXtmb3IodmFyIGg9MCxpPWUubGVuZ3RoO2g8aTtoKyspe3ZhciBqPWVbaF07aWYoail7dmFyIGs9ITE7aj1qW2FdO3doaWxlKGope2lmKGpbZF09PT1jKXtrPWVbai5zaXpzZXRdO2JyZWFrfWoubm9kZVR5cGU9PT0xJiYhZyYmKGpbZF09YyxqLnNpenNldD1oKTtpZihqLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iKXtrPWo7YnJlYWt9aj1qW2FdfWVbaF09a319fXZhciBhPS8oKD86XCgoPzpcKFteKCldK1wpfFteKCldKykrXCl8XFsoPzpcW1teXFtcXV0qXF18WyciXVteJyJdKlsnIl18W15cW1xdJyJdKykrXF18XFwufFteID4rfiwoXFtcXF0rKSt8Wz4rfl0pKFxzKixccyopPygoPzoufFxyfFxuKSopL2csZD0ic2l6Y2FjaGUiKyhNYXRoLnJhbmRvbSgpKyIiKS5yZXBsYWNlKCIuIiwiIiksZT0wLGc9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxoPSExLGk9ITAsaj0vXFwvZyxrPS9cclxuL2csbD0vXFcvO1swLDBdLnNvcnQoZnVuY3Rpb24oKXtpPSExO3JldHVybiAwfSk7dmFyIG09ZnVuY3Rpb24oYixkLGUsZil7ZT1lfHxbXSxkPWR8fGM7dmFyIGg9ZDtpZihkLm5vZGVUeXBlIT09MSYmZC5ub2RlVHlwZSE9PTkpcmV0dXJuW107aWYoIWJ8fHR5cGVvZiBiIT0ic3RyaW5nIilyZXR1cm4gZTt2YXIgaSxqLGssbCxuLHEscix0LHU9ITAsdj1tLmlzWE1MKGQpLHc9W10seD1iO2Rve2EuZXhlYygiIiksaT1hLmV4ZWMoeCk7aWYoaSl7eD1pWzNdLHcucHVzaChpWzFdKTtpZihpWzJdKXtsPWlbM107YnJlYWt9fX13aGlsZShpKTtpZih3Lmxlbmd0aD4xJiZwLmV4ZWMoYikpaWYody5sZW5ndGg9PT0yJiZvLnJlbGF0aXZlW3dbMF1dKWo9eSh3WzBdK3dbMV0sZCxmKTtlbHNle2o9by5yZWxhdGl2ZVt3WzBdXT9bZF06bSh3LnNoaWZ0KCksZCk7d2hpbGUody5sZW5ndGgpYj13LnNoaWZ0KCksby5yZWxhdGl2ZVtiXSYmKGIrPXcuc2hpZnQoKSksaj15KGIsaixmKX1lbHNleyFmJiZ3Lmxlbmd0aD4xJiZkLm5vZGVUeXBlPT09OSYmIXYmJm8ubWF0Y2guSUQudGVzdCh3WzBdKSYmIW8ubWF0Y2guSUQudGVzdCh3W3cubGVuZ3RoLTFdKSYmKG49bS5maW5kKHcuc2hpZnQoKSxkLHYpLGQ9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldClbMF06bi5zZXRbMF0pO2lmKGQpe249Zj97ZXhwcjp3LnBvcCgpLHNldDpzKGYpfTptLmZpbmQody5wb3AoKSx3Lmxlbmd0aD09PTEmJih3WzBdPT09In4ifHx3WzBdPT09IisiKSYmZC5wYXJlbnROb2RlP2QucGFyZW50Tm9kZTpkLHYpLGo9bi5leHByP20uZmlsdGVyKG4uZXhwcixuLnNldCk6bi5zZXQsdy5sZW5ndGg+MD9rPXMoaik6dT0hMTt3aGlsZSh3Lmxlbmd0aClxPXcucG9wKCkscj1xLG8ucmVsYXRpdmVbcV0/cj13LnBvcCgpOnE9IiIscj09bnVsbCYmKHI9ZCksby5yZWxhdGl2ZVtxXShrLHIsdil9ZWxzZSBrPXc9W119a3x8KGs9aiksa3x8bS5lcnJvcihxfHxiKTtpZihnLmNhbGwoayk9PT0iW29iamVjdCBBcnJheV0iKWlmKCF1KWUucHVzaC5hcHBseShlLGspO2Vsc2UgaWYoZCYmZC5ub2RlVHlwZT09PTEpZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiYoa1t0XT09PSEwfHxrW3RdLm5vZGVUeXBlPT09MSYmbS5jb250YWlucyhkLGtbdF0pKSYmZS5wdXNoKGpbdF0pO2Vsc2UgZm9yKHQ9MDtrW3RdIT1udWxsO3QrKylrW3RdJiZrW3RdLm5vZGVUeXBlPT09MSYmZS5wdXNoKGpbdF0pO2Vsc2UgcyhrLGUpO2wmJihtKGwsaCxlLGYpLG0udW5pcXVlU29ydChlKSk7cmV0dXJuIGV9O20udW5pcXVlU29ydD1mdW5jdGlvbihhKXtpZih1KXtoPWksYS5zb3J0KHUpO2lmKGgpZm9yKHZhciBiPTE7YjxhLmxlbmd0aDtiKyspYVtiXT09PWFbYi0xXSYmYS5zcGxpY2UoYi0tLDEpfXJldHVybiBhfSxtLm1hdGNoZXM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShhLG51bGwsbnVsbCxiKX0sbS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbShiLG51bGwsbnVsbCxbYV0pLmxlbmd0aD4wfSxtLmZpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaTtpZighYSlyZXR1cm5bXTtmb3IoZT0wLGY9by5vcmRlci5sZW5ndGg7ZTxmO2UrKyl7aD1vLm9yZGVyW2VdO2lmKGc9by5sZWZ0TWF0Y2hbaF0uZXhlYyhhKSl7aT1nWzFdLGcuc3BsaWNlKDEsMSk7aWYoaS5zdWJzdHIoaS5sZW5ndGgtMSkhPT0iXFwiKXtnWzFdPShnWzFdfHwiIikucmVwbGFjZShqLCIiKSxkPW8uZmluZFtoXShnLGIsYyk7aWYoZCE9bnVsbCl7YT1hLnJlcGxhY2Uoby5tYXRjaFtoXSwiIik7YnJlYWt9fX19ZHx8KGQ9dHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiP2IuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKTpbXSk7cmV0dXJue3NldDpkLGV4cHI6YX19LG0uZmlsdGVyPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmLGcsaCxpLGosayxsLG4scCxxPWEscj1bXSxzPWMsdD1jJiZjWzBdJiZtLmlzWE1MKGNbMF0pO3doaWxlKGEmJmMubGVuZ3RoKXtmb3IoaCBpbiBvLmZpbHRlcilpZigoZj1vLmxlZnRNYXRjaFtoXS5leGVjKGEpKSE9bnVsbCYmZlsyXSl7az1vLmZpbHRlcltoXSxsPWZbMV0sZz0hMSxmLnNwbGljZSgxLDEpO2lmKGwuc3Vic3RyKGwubGVuZ3RoLTEpPT09IlxcIiljb250aW51ZTtzPT09ciYmKHI9W10pO2lmKG8ucHJlRmlsdGVyW2hdKXtmPW8ucHJlRmlsdGVyW2hdKGYscyxkLHIsZSx0KTtpZighZilnPWk9ITA7ZWxzZSBpZihmPT09ITApY29udGludWV9aWYoZilmb3Iobj0wOyhqPXNbbl0pIT1udWxsO24rKylqJiYoaT1rKGosZixuLHMpLHA9ZV5pLGQmJmkhPW51bGw/cD9nPSEwOnNbbl09ITE6cCYmKHIucHVzaChqKSxnPSEwKSk7aWYoaSE9PWIpe2R8fChzPXIpLGE9YS5yZXBsYWNlKG8ubWF0Y2hbaF0sIiIpO2lmKCFnKXJldHVybltdO2JyZWFrfX1pZihhPT09cSlpZihnPT1udWxsKW0uZXJyb3IoYSk7ZWxzZSBicmVhaztxPWF9cmV0dXJuIHN9LG0uZXJyb3I9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiAiK2EpfTt2YXIgbj1tLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYyxkPWEubm9kZVR5cGUsZT0iIjtpZihkKXtpZihkPT09MXx8ZD09PTkpe2lmKHR5cGVvZiBhLnRleHRDb250ZW50PT0ic3RyaW5nIilyZXR1cm4gYS50ZXh0Q29udGVudDtpZih0eXBlb2YgYS5pbm5lclRleHQ9PSJzdHJpbmciKXJldHVybiBhLmlubmVyVGV4dC5yZXBsYWNlKGssIiIpO2ZvcihhPWEuZmlyc3RDaGlsZDthO2E9YS5uZXh0U2libGluZyllKz1uKGEpfWVsc2UgaWYoZD09PTN8fGQ9PT00KXJldHVybiBhLm5vZGVWYWx1ZX1lbHNlIGZvcihiPTA7Yz1hW2JdO2IrKyljLm5vZGVUeXBlIT09OCYmKGUrPW4oYykpO3JldHVybiBlfSxvPW0uc2VsZWN0b3JzPXtvcmRlcjpbIklEIiwiTkFNRSIsIlRBRyJdLG1hdGNoOntJRDovIygoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKS8sQ0xBU1M6L1wuKCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspLyxOQU1FOi9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLyxBVFRSOi9cW1xzKigoPzpbXHdcdTAwYzAtXHVGRkZGXC1dfFxcLikrKVxzKig/OihcUz89KVxzKig/OihbJyJdKSguKj8pXDN8KCM/KD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKil8KXwpXHMqXF0vLFRBRzovXigoPzpbXHdcdTAwYzAtXHVGRkZGXCpcLV18XFwuKSspLyxDSElMRDovOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LyxQT1M6LzoobnRofGVxfGd0fGx0fGZpcnN0fGxhc3R8ZXZlbnxvZGQpKD86XCgoXGQqKVwpKT8oPz1bXlwtXXwkKS8sUFNFVURPOi86KCg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSspKD86XCgoWyciXT8pKCg/OlwoW15cKV0rXCl8W15cKFwpXSopKylcMlwpKT8vfSxsZWZ0TWF0Y2g6e30sYXR0ck1hcDp7ImNsYXNzIjoiY2xhc3NOYW1lIiwiZm9yIjoiaHRtbEZvciJ9LGF0dHJIYW5kbGU6e2hyZWY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJocmVmIil9LHR5cGU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0QXR0cmlidXRlKCJ0eXBlIil9fSxyZWxhdGl2ZTp7IisiOmZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGI9PSJzdHJpbmciLGQ9YyYmIWwudGVzdChiKSxlPWMmJiFkO2QmJihiPWIudG9Mb3dlckNhc2UoKSk7Zm9yKHZhciBmPTAsZz1hLmxlbmd0aCxoO2Y8ZztmKyspaWYoaD1hW2ZdKXt3aGlsZSgoaD1oLnByZXZpb3VzU2libGluZykmJmgubm9kZVR5cGUhPT0xKTthW2ZdPWV8fGgmJmgubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PWI/aHx8ITE6aD09PWJ9ZSYmbS5maWx0ZXIoYixhLCEwKX0sIj4iOmZ1bmN0aW9uKGEsYil7dmFyIGMsZD10eXBlb2YgYj09InN0cmluZyIsZT0wLGY9YS5sZW5ndGg7aWYoZCYmIWwudGVzdChiKSl7Yj1iLnRvTG93ZXJDYXNlKCk7Zm9yKDtlPGY7ZSsrKXtjPWFbZV07aWYoYyl7dmFyIGc9Yy5wYXJlbnROb2RlO2FbZV09Zy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yj9nOiExfX19ZWxzZXtmb3IoO2U8ZjtlKyspYz1hW2VdLGMmJihhW2VdPWQ/Yy5wYXJlbnROb2RlOmMucGFyZW50Tm9kZT09PWIpO2QmJm0uZmlsdGVyKGIsYSwhMCl9fSwiIjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInBhcmVudE5vZGUiLGIsZixhLGQsYyl9LCJ+IjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZj1lKyssZz14O3R5cGVvZiBiPT0ic3RyaW5nIiYmIWwudGVzdChiKSYmKGI9Yi50b0xvd2VyQ2FzZSgpLGQ9YixnPXcpLGcoInByZXZpb3VzU2libGluZyIsYixmLGEsZCxjKX19LGZpbmQ6e0lEOmZ1bmN0aW9uKGEsYixjKXtpZih0eXBlb2YgYi5nZXRFbGVtZW50QnlJZCE9InVuZGVmaW5lZCImJiFjKXt2YXIgZD1iLmdldEVsZW1lbnRCeUlkKGFbMV0pO3JldHVybiBkJiZkLnBhcmVudE5vZGU/W2RdOltdfX0sTkFNRTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlOYW1lIT0idW5kZWZpbmVkIil7dmFyIGM9W10sZD1iLmdldEVsZW1lbnRzQnlOYW1lKGFbMV0pO2Zvcih2YXIgZT0wLGY9ZC5sZW5ndGg7ZTxmO2UrKylkW2VdLmdldEF0dHJpYnV0ZSgibmFtZSIpPT09YVsxXSYmYy5wdXNoKGRbZV0pO3JldHVybiBjLmxlbmd0aD09PTA/bnVsbDpjfX0sVEFHOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPSJ1bmRlZmluZWQiKXJldHVybiBiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGFbMV0pfX0scHJlRmlsdGVyOntDTEFTUzpmdW5jdGlvbihhLGIsYyxkLGUsZil7YT0iICIrYVsxXS5yZXBsYWNlKGosIiIpKyIgIjtpZihmKXJldHVybiBhO2Zvcih2YXIgZz0wLGg7KGg9YltnXSkhPW51bGw7ZysrKWgmJihlXihoLmNsYXNzTmFtZSYmKCIgIitoLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UoL1tcdFxuXHJdL2csIiAiKS5pbmRleE9mKGEpPj0wKT9jfHxkLnB1c2goaCk6YyYmKGJbZ109ITEpKTtyZXR1cm4hMX0sSUQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKX0sVEFHOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGFbMV0ucmVwbGFjZShqLCIiKS50b0xvd2VyQ2FzZSgpfSxDSElMRDpmdW5jdGlvbihhKXtpZihhWzFdPT09Im50aCIpe2FbMl18fG0uZXJyb3IoYVswXSksYVsyXT1hWzJdLnJlcGxhY2UoL15cK3xccyovZywiIik7dmFyIGI9LygtPykoXGQqKSg/Om4oWytcLV0/XGQqKSk/Ly5leGVjKGFbMl09PT0iZXZlbiImJiIybiJ8fGFbMl09PT0ib2RkIiYmIjJuKzEifHwhL1xELy50ZXN0KGFbMl0pJiYiMG4rIithWzJdfHxhWzJdKTthWzJdPWJbMV0rKGJbMl18fDEpLTAsYVszXT1iWzNdLTB9ZWxzZSBhWzJdJiZtLmVycm9yKGFbMF0pO2FbMF09ZSsrO3JldHVybiBhfSxBVFRSOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgZz1hWzFdPWFbMV0ucmVwbGFjZShqLCIiKTshZiYmby5hdHRyTWFwW2ddJiYoYVsxXT1vLmF0dHJNYXBbZ10pLGFbNF09KGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGosIiIpLGFbMl09PT0ifj0iJiYoYVs0XT0iICIrYVs0XSsiICIpO3JldHVybiBhfSxQU0VVRE86ZnVuY3Rpb24oYixjLGQsZSxmKXtpZihiWzFdPT09Im5vdCIpaWYoKGEuZXhlYyhiWzNdKXx8IiIpLmxlbmd0aD4xfHwvXlx3Ly50ZXN0KGJbM10pKWJbM109bShiWzNdLG51bGwsbnVsbCxjKTtlbHNle3ZhciBnPW0uZmlsdGVyKGJbM10sYyxkLCEwXmYpO2R8fGUucHVzaC5hcHBseShlLGcpO3JldHVybiExfWVsc2UgaWYoby5tYXRjaC5QT1MudGVzdChiWzBdKXx8by5tYXRjaC5DSElMRC50ZXN0KGJbMF0pKXJldHVybiEwO3JldHVybiBifSxQT1M6ZnVuY3Rpb24oYSl7YS51bnNoaWZ0KCEwKTtyZXR1cm4gYX19LGZpbHRlcnM6e2VuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMSYmYS50eXBlIT09ImhpZGRlbiJ9LGRpc2FibGVkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc2FibGVkPT09ITB9LGNoZWNrZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2hlY2tlZD09PSEwfSxzZWxlY3RlZDpmdW5jdGlvbihhKXthLnBhcmVudE5vZGUmJmEucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O3JldHVybiBhLnNlbGVjdGVkPT09ITB9LHBhcmVudDpmdW5jdGlvbihhKXtyZXR1cm4hIWEuZmlyc3RDaGlsZH0sZW1wdHk6ZnVuY3Rpb24oYSl7cmV0dXJuIWEuZmlyc3RDaGlsZH0saGFzOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4hIW0oY1szXSxhKS5sZW5ndGh9LGhlYWRlcjpmdW5jdGlvbihhKXtyZXR1cm4vaFxkL2kudGVzdChhLm5vZGVOYW1lKX0sdGV4dDpmdW5jdGlvbihhKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgidHlwZSIpLGM9YS50eXBlO3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYidGV4dCI9PT1jJiYoYj09PWN8fGI9PT1udWxsKX0scmFkaW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJpbnB1dCImJiJyYWRpbyI9PT1hLnR5cGV9LGNoZWNrYm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiY2hlY2tib3giPT09YS50eXBlfSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiZmlsZSI9PT1hLnR5cGV9LHBhc3N3b3JkOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYicGFzc3dvcmQiPT09YS50eXBlfSxzdWJtaXQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybihiPT09ImlucHV0Inx8Yj09PSJidXR0b24iKSYmInN1Ym1pdCI9PT1hLnR5cGV9LGltYWdlOmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYiaW1hZ2UiPT09YS50eXBlfSxyZXNldDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKGI9PT0iaW5wdXQifHxiPT09ImJ1dHRvbiIpJiYicmVzZXQiPT09YS50eXBlfSxidXR0b246ZnVuY3Rpb24oYSl7dmFyIGI9YS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBiPT09ImlucHV0IiYmImJ1dHRvbiI9PT1hLnR5cGV8fGI9PT0iYnV0dG9uIn0saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpfSxmb2N1czpmdW5jdGlvbihhKXtyZXR1cm4gYT09PWEub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50fX0sc2V0RmlsdGVyczp7Zmlyc3Q6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PTB9LGxhc3Q6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGI9PT1kLmxlbmd0aC0xfSxldmVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIlMj09PTB9LG9kZDpmdW5jdGlvbihhLGIpe3JldHVybiBiJTI9PT0xfSxsdDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI8Y1szXS0wfSxndDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI+Y1szXS0wfSxudGg6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBjWzNdLTA9PT1ifSxlcTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGNbM10tMD09PWJ9fSxmaWx0ZXI6e1BTRVVETzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzFdLGY9by5maWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCk7aWYoZT09PSJjb250YWlucyIpcmV0dXJuKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0fHxuKFthXSl8fCIiKS5pbmRleE9mKGJbM10pPj0wO2lmKGU9PT0ibm90Iil7dmFyIGc9YlszXTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspaWYoZ1toXT09PWEpcmV0dXJuITE7cmV0dXJuITB9bS5lcnJvcihlKX0sQ0hJTEQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxlLGYsZyxoLGksaixrPWJbMV0sbD1hO3N3aXRjaChrKXtjYXNlIm9ubHkiOmNhc2UiZmlyc3QiOndoaWxlKGw9bC5wcmV2aW91c1NpYmxpbmcpaWYobC5ub2RlVHlwZT09PTEpcmV0dXJuITE7aWYoaz09PSJmaXJzdCIpcmV0dXJuITA7bD1hO2Nhc2UibGFzdCI6d2hpbGUobD1sLm5leHRTaWJsaW5nKWlmKGwubm9kZVR5cGU9PT0xKXJldHVybiExO3JldHVybiEwO2Nhc2UibnRoIjpjPWJbMl0sZT1iWzNdO2lmKGM9PT0xJiZlPT09MClyZXR1cm4hMDtmPWJbMF0sZz1hLnBhcmVudE5vZGU7aWYoZyYmKGdbZF0hPT1mfHwhYS5ub2RlSW5kZXgpKXtpPTA7Zm9yKGw9Zy5maXJzdENoaWxkO2w7bD1sLm5leHRTaWJsaW5nKWwubm9kZVR5cGU9PT0xJiYobC5ub2RlSW5kZXg9KytpKTtnW2RdPWZ9aj1hLm5vZGVJbmRleC1lO3JldHVybiBjPT09MD9qPT09MDpqJWM9PT0wJiZqL2M+PTB9fSxJRDpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVUeXBlPT09MSYmYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifSxUQUc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYj09PSIqIiYmYS5ub2RlVHlwZT09PTF8fCEhYS5ub2RlTmFtZSYmYS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09Yn0sQ0xBU1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oIiAiKyhhLmNsYXNzTmFtZXx8YS5nZXRBdHRyaWJ1dGUoImNsYXNzIikpKyIgIikuaW5kZXhPZihiKT4tMX0sQVRUUjpmdW5jdGlvbihhLGIpe3ZhciBjPWJbMV0sZD1tLmF0dHI/bS5hdHRyKGEsYyk6by5hdHRySGFuZGxlW2NdP28uYXR0ckhhbmRsZVtjXShhKTphW2NdIT1udWxsP2FbY106YS5nZXRBdHRyaWJ1dGUoYyksZT1kKyIiLGY9YlsyXSxnPWJbNF07cmV0dXJuIGQ9PW51bGw/Zj09PSIhPSI6IWYmJm0uYXR0cj9kIT1udWxsOmY9PT0iPSI/ZT09PWc6Zj09PSIqPSI/ZS5pbmRleE9mKGcpPj0wOmY9PT0ifj0iPygiICIrZSsiICIpLmluZGV4T2YoZyk+PTA6Zz9mPT09IiE9Ij9lIT09ZzpmPT09Il49Ij9lLmluZGV4T2YoZyk9PT0wOmY9PT0iJD0iP2Uuc3Vic3RyKGUubGVuZ3RoLWcubGVuZ3RoKT09PWc6Zj09PSJ8PSI/ZT09PWd8fGUuc3Vic3RyKDAsZy5sZW5ndGgrMSk9PT1nKyItIjohMTplJiZkIT09ITF9LFBPUzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgZT1iWzJdLGY9by5zZXRGaWx0ZXJzW2VdO2lmKGYpcmV0dXJuIGYoYSxjLGIsZCl9fX0scD1vLm1hdGNoLlBPUyxxPWZ1bmN0aW9uKGEsYil7cmV0dXJuIlxcIisoYi0wKzEpfTtmb3IodmFyIHIgaW4gby5tYXRjaClvLm1hdGNoW3JdPW5ldyBSZWdFeHAoby5tYXRjaFtyXS5zb3VyY2UrLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSxvLmxlZnRNYXRjaFtyXT1uZXcgUmVnRXhwKC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2Urby5tYXRjaFtyXS5zb3VyY2UucmVwbGFjZSgvXFwoXGQrKS9nLHEpKTt2YXIgcz1mdW5jdGlvbihhLGIpe2E9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwwKTtpZihiKXtiLnB1c2guYXBwbHkoYixhKTtyZXR1cm4gYn1yZXR1cm4gYX07dHJ5e0FycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsMClbMF0ubm9kZVR5cGV9Y2F0Y2godCl7cz1mdW5jdGlvbihhLGIpe3ZhciBjPTAsZD1ifHxbXTtpZihnLmNhbGwoYSk9PT0iW29iamVjdCBBcnJheV0iKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGQsYSk7ZWxzZSBpZih0eXBlb2YgYS5sZW5ndGg9PSJudW1iZXIiKWZvcih2YXIgZT1hLmxlbmd0aDtjPGU7YysrKWQucHVzaChhW2NdKTtlbHNlIGZvcig7YVtjXTtjKyspZC5wdXNoKGFbY10pO3JldHVybiBkfX12YXIgdSx2O2MuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uP3U9ZnVuY3Rpb24oYSxiKXtpZihhPT09Yil7aD0hMDtyZXR1cm4gMH1pZighYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbnx8IWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24pcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24/LTE6MTtyZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSY0Py0xOjF9Oih1PWZ1bmN0aW9uKGEsYil7aWYoYT09PWIpe2g9ITA7cmV0dXJuIDB9aWYoYS5zb3VyY2VJbmRleCYmYi5zb3VyY2VJbmRleClyZXR1cm4gYS5zb3VyY2VJbmRleC1iLnNvdXJjZUluZGV4O3ZhciBjLGQsZT1bXSxmPVtdLGc9YS5wYXJlbnROb2RlLGk9Yi5wYXJlbnROb2RlLGo9ZztpZihnPT09aSlyZXR1cm4gdihhLGIpO2lmKCFnKXJldHVybi0xO2lmKCFpKXJldHVybiAxO3doaWxlKGopZS51bnNoaWZ0KGopLGo9ai5wYXJlbnROb2RlO2o9aTt3aGlsZShqKWYudW5zaGlmdChqKSxqPWoucGFyZW50Tm9kZTtjPWUubGVuZ3RoLGQ9Zi5sZW5ndGg7Zm9yKHZhciBrPTA7azxjJiZrPGQ7aysrKWlmKGVba10hPT1mW2tdKXJldHVybiB2KGVba10sZltrXSk7cmV0dXJuIGs9PT1jP3YoYSxmW2tdLC0xKTp2KGVba10sYiwxKX0sdj1mdW5jdGlvbihhLGIsYyl7aWYoYT09PWIpcmV0dXJuIGM7dmFyIGQ9YS5uZXh0U2libGluZzt3aGlsZShkKXtpZihkPT09YilyZXR1cm4tMTtkPWQubmV4dFNpYmxpbmd9cmV0dXJuIDF9KSxmdW5jdGlvbigpe3ZhciBhPWMuY3JlYXRlRWxlbWVudCgiZGl2IiksZD0ic2NyaXB0IisobmV3IERhdGUpLmdldFRpbWUoKSxlPWMuZG9jdW1lbnRFbGVtZW50O2EuaW5uZXJIVE1MPSI8YSBuYW1lPSciK2QrIicvPiIsZS5pbnNlcnRCZWZvcmUoYSxlLmZpcnN0Q2hpbGQpLGMuZ2V0RWxlbWVudEJ5SWQoZCkmJihvLmZpbmQuSUQ9ZnVuY3Rpb24oYSxjLGQpe2lmKHR5cGVvZiBjLmdldEVsZW1lbnRCeUlkIT0idW5kZWZpbmVkIiYmIWQpe3ZhciBlPWMuZ2V0RWxlbWVudEJ5SWQoYVsxXSk7cmV0dXJuIGU/ZS5pZD09PWFbMV18fHR5cGVvZiBlLmdldEF0dHJpYnV0ZU5vZGUhPSJ1bmRlZmluZWQiJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlPT09YVsxXT9bZV06YjpbXX19LG8uZmlsdGVyLklEPWZ1bmN0aW9uKGEsYil7dmFyIGM9dHlwZW9mIGEuZ2V0QXR0cmlidXRlTm9kZSE9InVuZGVmaW5lZCImJmEuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gYS5ub2RlVHlwZT09PTEmJmMmJmMubm9kZVZhbHVlPT09Yn0pLGUucmVtb3ZlQ2hpbGQoYSksZT1hPW51bGx9KCksZnVuY3Rpb24oKXt2YXIgYT1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2EuYXBwZW5kQ2hpbGQoYy5jcmVhdGVDb21tZW50KCIiKSksYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aD4wJiYoby5maW5kLlRBRz1mdW5jdGlvbihhLGIpe3ZhciBjPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoYVsxXSk7aWYoYVsxXT09PSIqIil7dmFyIGQ9W107Zm9yKHZhciBlPTA7Y1tlXTtlKyspY1tlXS5ub2RlVHlwZT09PTEmJmQucHVzaChjW2VdKTtjPWR9cmV0dXJuIGN9KSxhLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsYS5maXJzdENoaWxkJiZ0eXBlb2YgYS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSE9InVuZGVmaW5lZCImJmEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSE9PSIjIiYmKG8uYXR0ckhhbmRsZS5ocmVmPWZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZSgiaHJlZiIsMil9KSxhPW51bGx9KCksYy5xdWVyeVNlbGVjdG9yQWxsJiZmdW5jdGlvbigpe3ZhciBhPW0sYj1jLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9Il9fc2l6emxlX18iO2IuaW5uZXJIVE1MPSI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7aWYoIWIucXVlcnlTZWxlY3RvckFsbHx8Yi5xdWVyeVNlbGVjdG9yQWxsKCIuVEVTVCIpLmxlbmd0aCE9PTApe209ZnVuY3Rpb24oYixlLGYsZyl7ZT1lfHxjO2lmKCFnJiYhbS5pc1hNTChlKSl7dmFyIGg9L14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoYik7aWYoaCYmKGUubm9kZVR5cGU9PT0xfHxlLm5vZGVUeXBlPT09OSkpe2lmKGhbMV0pcmV0dXJuIHMoZS5nZXRFbGVtZW50c0J5VGFnTmFtZShiKSxmKTtpZihoWzJdJiZvLmZpbmQuQ0xBU1MmJmUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gcyhlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaFsyXSksZil9aWYoZS5ub2RlVHlwZT09PTkpe2lmKGI9PT0iYm9keSImJmUuYm9keSlyZXR1cm4gcyhbZS5ib2R5XSxmKTtpZihoJiZoWzNdKXt2YXIgaT1lLmdldEVsZW1lbnRCeUlkKGhbM10pO2lmKCFpfHwhaS5wYXJlbnROb2RlKXJldHVybiBzKFtdLGYpO2lmKGkuaWQ9PT1oWzNdKXJldHVybiBzKFtpXSxmKX10cnl7cmV0dXJuIHMoZS5xdWVyeVNlbGVjdG9yQWxsKGIpLGYpfWNhdGNoKGope319ZWxzZSBpZihlLm5vZGVUeXBlPT09MSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIT09Im9iamVjdCIpe3ZhciBrPWUsbD1lLmdldEF0dHJpYnV0ZSgiaWQiKSxuPWx8fGQscD1lLnBhcmVudE5vZGUscT0vXlxzKlsrfl0vLnRlc3QoYik7bD9uPW4ucmVwbGFjZSgvJy9nLCJcXCQmIik6ZS5zZXRBdHRyaWJ1dGUoImlkIixuKSxxJiZwJiYoZT1lLnBhcmVudE5vZGUpO3RyeXtpZighcXx8cClyZXR1cm4gcyhlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZD0nIituKyInXSAiK2IpLGYpfWNhdGNoKHIpe31maW5hbGx5e2x8fGsucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGEoYixlLGYsZyl9O2Zvcih2YXIgZSBpbiBhKW1bZV09YVtlXTtiPW51bGx9fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5kb2N1bWVudEVsZW1lbnQsYj1hLm1hdGNoZXNTZWxlY3Rvcnx8YS5tb3pNYXRjaGVzU2VsZWN0b3J8fGEud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxhLm1zTWF0Y2hlc1NlbGVjdG9yO2lmKGIpe3ZhciBkPSFiLmNhbGwoYy5jcmVhdGVFbGVtZW50KCJkaXYiKSwiZGl2IiksZT0hMTt0cnl7Yi5jYWxsKGMuZG9jdW1lbnRFbGVtZW50LCJbdGVzdCE9JyddOnNpenpsZSIpfWNhdGNoKGYpe2U9ITB9bS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxjKXtjPWMucmVwbGFjZSgvXD1ccyooW14nIlxdXSopXHMqXF0vZywiPSckMSddIik7aWYoIW0uaXNYTUwoYSkpdHJ5e2lmKGV8fCFvLm1hdGNoLlBTRVVETy50ZXN0KGMpJiYhLyE9Ly50ZXN0KGMpKXt2YXIgZj1iLmNhbGwoYSxjKTtpZihmfHwhZHx8YS5kb2N1bWVudCYmYS5kb2N1bWVudC5ub2RlVHlwZSE9PTExKXJldHVybiBmfX1jYXRjaChnKXt9cmV0dXJuIG0oYyxudWxsLG51bGwsW2FdKS5sZW5ndGg+MH19fSgpLGZ1bmN0aW9uKCl7dmFyIGE9Yy5jcmVhdGVFbGVtZW50KCJkaXYiKTthLmlubmVySFRNTD0iPGRpdiBjbGFzcz0ndGVzdCBlJz48L2Rpdj48ZGl2IGNsYXNzPSd0ZXN0Jz48L2Rpdj4iO2lmKCEhYS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZhLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGghPT0wKXthLmxhc3RDaGlsZC5jbGFzc05hbWU9ImUiO2lmKGEuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aD09PTEpcmV0dXJuO28ub3JkZXIuc3BsaWNlKDEsMCwiQ0xBU1MiKSxvLmZpbmQuQ0xBU1M9ZnVuY3Rpb24oYSxiLGMpe2lmKHR5cGVvZiBiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUhPSJ1bmRlZmluZWQiJiYhYylyZXR1cm4gYi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGFbMV0pfSxhPW51bGx9fSgpLGMuZG9jdW1lbnRFbGVtZW50LmNvbnRhaW5zP20uY29udGFpbnM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYSE9PWImJihhLmNvbnRhaW5zP2EuY29udGFpbnMoYik6ITApfTpjLmRvY3VtZW50RWxlbWVudC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbj9tLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSYxNil9Om0uY29udGFpbnM9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbS5pc1hNTD1mdW5jdGlvbihhKXt2YXIgYj0oYT9hLm93bmVyRG9jdW1lbnR8fGE6MCkuZG9jdW1lbnRFbGVtZW50O3JldHVybiBiP2Iubm9kZU5hbWUhPT0iSFRNTCI6ITF9O3ZhciB5PWZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlPVtdLGY9IiIsZz1iLm5vZGVUeXBlP1tiXTpiO3doaWxlKGQ9by5tYXRjaC5QU0VVRE8uZXhlYyhhKSlmKz1kWzBdLGE9YS5yZXBsYWNlKG8ubWF0Y2guUFNFVURPLCIiKTthPW8ucmVsYXRpdmVbYV0/YSsiKiI6YTtmb3IodmFyIGg9MCxpPWcubGVuZ3RoO2g8aTtoKyspbShhLGdbaF0sZSxjKTtyZXR1cm4gbS5maWx0ZXIoZixlKX07bS5hdHRyPWYuYXR0cixtLnNlbGVjdG9ycy5hdHRyTWFwPXt9LGYuZmluZD1tLGYuZXhwcj1tLnNlbGVjdG9ycyxmLmV4cHJbIjoiXT1mLmV4cHIuZmlsdGVycyxmLnVuaXF1ZT1tLnVuaXF1ZVNvcnQsZi50ZXh0PW0uZ2V0VGV4dCxmLmlzWE1MRG9jPW0uaXNYTUwsZi5jb250YWlucz1tLmNvbnRhaW5zfSgpO3ZhciBMPS9VbnRpbCQvLE09L14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sTj0vLC8sTz0vXi5bXjojXFtcLixdKiQvLFA9QXJyYXkucHJvdG90eXBlLnNsaWNlLFE9Zi5leHByLm1hdGNoLlBPUyxSPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O2YuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYyxkO2lmKHR5cGVvZiBhIT0ic3RyaW5nIilyZXR1cm4gZihhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYz0wLGQ9Yi5sZW5ndGg7YzxkO2MrKylpZihmLmNvbnRhaW5zKGJbY10sdGhpcykpcmV0dXJuITB9KTt2YXIgZT10aGlzLnB1c2hTdGFjaygiIiwiZmluZCIsYSksZyxoLGk7Zm9yKGM9MCxkPXRoaXMubGVuZ3RoO2M8ZDtjKyspe2c9ZS5sZW5ndGgsZi5maW5kKGEsdGhpc1tjXSxlKTtpZihjPjApZm9yKGg9ZztoPGUubGVuZ3RoO2grKylmb3IoaT0wO2k8ZztpKyspaWYoZVtpXT09PWVbaF0pe2Uuc3BsaWNlKGgtLSwxKTticmVha319cmV0dXJuIGV9LGhhczpmdW5jdGlvbihhKXt2YXIgYj1mKGEpO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgYT0wLGM9Yi5sZW5ndGg7YTxjO2ErKylpZihmLmNvbnRhaW5zKHRoaXMsYlthXSkpcmV0dXJuITB9KX0sbm90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnB1c2hTdGFjayhUKHRoaXMsYSwhMSksIm5vdCIsYSl9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soVCh0aGlzLGEsITApLCJmaWx0ZXIiLGEpfSxpczpmdW5jdGlvbihhKXtyZXR1cm4hIWEmJih0eXBlb2YgYT09InN0cmluZyI/US50ZXN0KGEpP2YoYSx0aGlzLmNvbnRleHQpLmluZGV4KHRoaXNbMF0pPj0wOmYuZmlsdGVyKGEsdGhpcykubGVuZ3RoPjA6dGhpcy5maWx0ZXIoYSkubGVuZ3RoPjApfSxjbG9zZXN0OmZ1bmN0aW9uKGEsYil7dmFyIGM9W10sZCxlLGc9dGhpc1swXTtpZihmLmlzQXJyYXkoYSkpe3ZhciBoPTE7d2hpbGUoZyYmZy5vd25lckRvY3VtZW50JiZnIT09Yil7Zm9yKGQ9MDtkPGEubGVuZ3RoO2QrKylmKGcpLmlzKGFbZF0pJiZjLnB1c2goe3NlbGVjdG9yOmFbZF0sZWxlbTpnLGxldmVsOmh9KTtnPWcucGFyZW50Tm9kZSxoKyt9cmV0dXJuIGN9dmFyIGk9US50ZXN0KGEpfHx0eXBlb2YgYSE9InN0cmluZyI/ZihhLGJ8fHRoaXMuY29udGV4dCk6MDtmb3IoZD0wLGU9dGhpcy5sZW5ndGg7ZDxlO2QrKyl7Zz10aGlzW2RdO3doaWxlKGcpe2lmKGk/aS5pbmRleChnKT4tMTpmLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGcsYSkpe2MucHVzaChnKTticmVha31nPWcucGFyZW50Tm9kZTtpZighZ3x8IWcub3duZXJEb2N1bWVudHx8Zz09PWJ8fGcubm9kZVR5cGU9PT0xMSlicmVha319Yz1jLmxlbmd0aD4xP2YudW5pcXVlKGMpOmM7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGMsImNsb3Nlc3QiLGEpfSxpbmRleDpmdW5jdGlvbihhKXtpZighYSlyZXR1cm4gdGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMucHJldkFsbCgpLmxlbmd0aDotMTtpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIGYuaW5BcnJheSh0aGlzWzBdLGYoYSkpO3JldHVybiBmLmluQXJyYXkoYS5qcXVlcnk/YVswXTphLHRoaXMpfSxhZGQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYT09InN0cmluZyI/ZihhLGIpOmYubWFrZUFycmF5KGEmJmEubm9kZVR5cGU/W2FdOmEpLGQ9Zi5tZXJnZSh0aGlzLmdldCgpLGMpO3JldHVybiB0aGlzLnB1c2hTdGFjayhTKGNbMF0pfHxTKGRbMF0pP2Q6Zi51bmlxdWUoZCkpfSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCl9fSksZi5lYWNoKHtwYXJlbnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5wYXJlbnROb2RlO3JldHVybiBiJiZiLm5vZGVUeXBlIT09MTE/YjpudWxsfSxwYXJlbnRzOmZ1bmN0aW9uKGEpe3JldHVybiBmLmRpcihhLCJwYXJlbnROb2RlIil9LHBhcmVudHNVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInBhcmVudE5vZGUiLGMpfSxuZXh0OmZ1bmN0aW9uKGEpe3JldHVybiBmLm50aChhLDIsIm5leHRTaWJsaW5nIil9LHByZXY6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubnRoKGEsMiwicHJldmlvdXNTaWJsaW5nIil9LG5leHRBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsIm5leHRTaWJsaW5nIil9LHByZXZBbGw6ZnVuY3Rpb24oYSl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIpfSxuZXh0VW50aWw6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmRpcihhLCJuZXh0U2libGluZyIsYyl9LHByZXZVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGYuZGlyKGEsInByZXZpb3VzU2libGluZyIsYyl9LHNpYmxpbmdzOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsYSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGEpe3JldHVybiBmLnNpYmxpbmcoYS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGYubm9kZU5hbWUoYSwiaWZyYW1lIik/YS5jb250ZW50RG9jdW1lbnR8fGEuY29udGVudFdpbmRvdy5kb2N1bWVudDpmLm1ha2VBcnJheShhLmNoaWxkTm9kZXMpfX0sZnVuY3Rpb24oYSxiKXtmLmZuW2FdPWZ1bmN0aW9uKGMsZCl7dmFyIGU9Zi5tYXAodGhpcyxiLGMpO0wudGVzdChhKXx8KGQ9YyksZCYmdHlwZW9mIGQ9PSJzdHJpbmciJiYoZT1mLmZpbHRlcihkLGUpKSxlPXRoaXMubGVuZ3RoPjEmJiFSW2FdP2YudW5pcXVlKGUpOmUsKHRoaXMubGVuZ3RoPjF8fE4udGVzdChkKSkmJk0udGVzdChhKSYmKGU9ZS5yZXZlcnNlKCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhlLGEsUC5jYWxsKGFyZ3VtZW50cykuam9pbigiLCIpKX19KSxmLmV4dGVuZCh7ZmlsdGVyOmZ1bmN0aW9uKGEsYixjKXtjJiYoYT0iOm5vdCgiK2ErIikiKTtyZXR1cm4gYi5sZW5ndGg9PT0xP2YuZmluZC5tYXRjaGVzU2VsZWN0b3IoYlswXSxhKT9bYlswXV06W106Zi5maW5kLm1hdGNoZXMoYSxiKX0sZGlyOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZT1bXSxnPWFbY107d2hpbGUoZyYmZy5ub2RlVHlwZSE9PTkmJihkPT09Ynx8Zy5ub2RlVHlwZSE9PTF8fCFmKGcpLmlzKGQpKSlnLm5vZGVUeXBlPT09MSYmZS5wdXNoKGcpLGc9Z1tjXTtyZXR1cm4gZX0sbnRoOmZ1bmN0aW9uKGEsYixjLGQpe2I9Ynx8MTt2YXIgZT0wO2Zvcig7YTthPWFbY10paWYoYS5ub2RlVHlwZT09PTEmJisrZT09PWIpYnJlYWs7cmV0dXJuIGF9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXt2YXIgYz1bXTtmb3IoO2E7YT1hLm5leHRTaWJsaW5nKWEubm9kZVR5cGU9PT0xJiZhIT09YiYmYy5wdXNoKGEpO3JldHVybiBjfX0pO3ZhciBWPSJhYmJyfGFydGljbGV8YXNpZGV8YXVkaW98Y2FudmFzfGRhdGFsaXN0fGRldGFpbHN8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGhlYWRlcnxoZ3JvdXB8bWFya3xtZXRlcnxuYXZ8b3V0cHV0fHByb2dyZXNzfHNlY3Rpb258c3VtbWFyeXx0aW1lfHZpZGVvIixXPS8galF1ZXJ5XGQrPSIoPzpcZCt8bnVsbCkiL2csWD0vXlxzKy8sWT0vPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbXHc6XSspW14+XSopXC8+L2lnLFo9LzwoW1x3Ol0rKS8sJD0vPHRib2R5L2ksXz0vPHwmIz9cdys7LyxiYT0vPCg/OnNjcmlwdHxzdHlsZSkvaSxiYj0vPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLGJjPW5ldyBSZWdFeHAoIjwoPzoiK1YrIikiLCJpIiksYmQ9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksYmU9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSxiZj0vXlxzKjwhKD86XFtDREFUQVxbfFwtXC0pLyxiZz17b3B0aW9uOlsxLCI8c2VsZWN0IG11bHRpcGxlPSdtdWx0aXBsZSc+IiwiPC9zZWxlY3Q+Il0sbGVnZW5kOlsxLCI8ZmllbGRzZXQ+IiwiPC9maWVsZHNldD4iXSx0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sdHI6WzIsIjx0YWJsZT48dGJvZHk+IiwiPC90Ym9keT48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfSxiaD1VKGMpO2JnLm9wdGdyb3VwPWJnLm9wdGlvbixiZy50Ym9keT1iZy50Zm9vdD1iZy5jb2xncm91cD1iZy5jYXB0aW9uPWJnLnRoZWFkLGJnLnRoPWJnLnRkLGYuc3VwcG9ydC5odG1sU2VyaWFsaXplfHwoYmcuX2RlZmF1bHQ9WzEsImRpdjxkaXY+IiwiPC9kaXY+Il0pLGYuZm4uZXh0ZW5kKHt0ZXh0OmZ1bmN0aW9uKGEpe2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy50ZXh0KGEuY2FsbCh0aGlzLGIsYy50ZXh0KCkpKX0pO2lmKHR5cGVvZiBhIT0ib2JqZWN0IiYmYSE9PWIpcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoKHRoaXNbMF0mJnRoaXNbMF0ub3duZXJEb2N1bWVudHx8YykuY3JlYXRlVGV4dE5vZGUoYSkpO3JldHVybiBmLnRleHQodGhpcyl9LHdyYXBBbGw6ZnVuY3Rpb24oYSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7Zih0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPWYoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJmEuZmlyc3RDaGlsZC5ub2RlVHlwZT09PTEpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtpZihmLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXtmKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9KTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Zih0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1mLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXtmKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7Zi5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fGYodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITAsZnVuY3Rpb24oYSl7dGhpcy5ub2RlVHlwZT09PTEmJnRoaXMuYXBwZW5kQ2hpbGQoYSl9KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywhMCxmdW5jdGlvbihhKXt0aGlzLm5vZGVUeXBlPT09MSYmdGhpcy5pbnNlcnRCZWZvcmUoYSx0aGlzLmZpcnN0Q2hpbGQpfSl9LGJlZm9yZTpmdW5jdGlvbigpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsITEsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShhLHRoaXMpfSk7aWYoYXJndW1lbnRzLmxlbmd0aCl7dmFyIGE9Zi5jbGVhbihhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLHRoaXMudG9BcnJheSgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soYSwiYmVmb3JlIixhcmd1bWVudHMpfX0sYWZ0ZXI6ZnVuY3Rpb24oKXtpZih0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGUpcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCExLGZ1bmN0aW9uKGEpe3RoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSx0aGlzLm5leHRTaWJsaW5nKX0pO2lmKGFyZ3VtZW50cy5sZW5ndGgpe3ZhciBhPXRoaXMucHVzaFN0YWNrKHRoaXMsImFmdGVyIixhcmd1bWVudHMpO2EucHVzaC5hcHBseShhLGYuY2xlYW4oYXJndW1lbnRzKSk7cmV0dXJuIGF9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkOyhkPXRoaXNbY10pIT1udWxsO2MrKylpZighYXx8Zi5maWx0ZXIoYSxbZF0pLmxlbmd0aCkhYiYmZC5ub2RlVHlwZT09PTEmJihmLmNsZWFuRGF0YShkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikpLGYuY2xlYW5EYXRhKFtkXSkpLGQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGQpO3JldHVybiB0aGlzfSxlbXB0eTpmdW5jdGlvbigpCntmb3IodmFyIGE9MCxiOyhiPXRoaXNbYV0pIT1udWxsO2ErKyl7Yi5ub2RlVHlwZT09PTEmJmYuY2xlYW5EYXRhKGIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSk7d2hpbGUoYi5maXJzdENoaWxkKWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX1yZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oYSxiKXthPWE9PW51bGw/ITE6YSxiPWI9PW51bGw/YTpiO3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiBmLmNsb25lKHRoaXMsYSxiKX0pfSxodG1sOmZ1bmN0aW9uKGEpe2lmKGE9PT1iKXJldHVybiB0aGlzWzBdJiZ0aGlzWzBdLm5vZGVUeXBlPT09MT90aGlzWzBdLmlubmVySFRNTC5yZXBsYWNlKFcsIiIpOm51bGw7aWYodHlwZW9mIGE9PSJzdHJpbmciJiYhYmEudGVzdChhKSYmKGYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZXx8IVgudGVzdChhKSkmJiFiZ1soWi5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSl7YT1hLnJlcGxhY2UoWSwiPCQxPjwvJDI+Iik7dHJ5e2Zvcih2YXIgYz0wLGQ9dGhpcy5sZW5ndGg7YzxkO2MrKyl0aGlzW2NdLm5vZGVUeXBlPT09MSYmKGYuY2xlYW5EYXRhKHRoaXNbY10uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSksdGhpc1tjXS5pbm5lckhUTUw9YSl9Y2F0Y2goZSl7dGhpcy5lbXB0eSgpLmFwcGVuZChhKX19ZWxzZSBmLmlzRnVuY3Rpb24oYSk/dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Yy5odG1sKGEuY2FsbCh0aGlzLGIsYy5odG1sKCkpKX0pOnRoaXMuZW1wdHkoKS5hcHBlbmQoYSk7cmV0dXJuIHRoaXN9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKGEpe2lmKHRoaXNbMF0mJnRoaXNbMF0ucGFyZW50Tm9kZSl7aWYoZi5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7dmFyIGM9Zih0aGlzKSxkPWMuaHRtbCgpO2MucmVwbGFjZVdpdGgoYS5jYWxsKHRoaXMsYixkKSl9KTt0eXBlb2YgYSE9InN0cmluZyImJihhPWYoYSkuZGV0YWNoKCkpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj10aGlzLm5leHRTaWJsaW5nLGM9dGhpcy5wYXJlbnROb2RlO2YodGhpcykucmVtb3ZlKCksYj9mKGIpLmJlZm9yZShhKTpmKGMpLmFwcGVuZChhKX0pfXJldHVybiB0aGlzLmxlbmd0aD90aGlzLnB1c2hTdGFjayhmKGYuaXNGdW5jdGlvbihhKT9hKCk6YSksInJlcGxhY2VXaXRoIixhKTp0aGlzfSxkZXRhY2g6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmVtb3ZlKGEsITApfSxkb21NYW5pcDpmdW5jdGlvbihhLGMsZCl7dmFyIGUsZyxoLGksaj1hWzBdLGs9W107aWYoIWYuc3VwcG9ydC5jaGVja0Nsb25lJiZhcmd1bWVudHMubGVuZ3RoPT09MyYmdHlwZW9mIGo9PSJzdHJpbmciJiZiZC50ZXN0KGopKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmKHRoaXMpLmRvbU1hbmlwKGEsYyxkLCEwKX0pO2lmKGYuaXNGdW5jdGlvbihqKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGUpe3ZhciBnPWYodGhpcyk7YVswXT1qLmNhbGwodGhpcyxlLGM/Zy5odG1sKCk6YiksZy5kb21NYW5pcChhLGMsZCl9KTtpZih0aGlzWzBdKXtpPWomJmoucGFyZW50Tm9kZSxmLnN1cHBvcnQucGFyZW50Tm9kZSYmaSYmaS5ub2RlVHlwZT09PTExJiZpLmNoaWxkTm9kZXMubGVuZ3RoPT09dGhpcy5sZW5ndGg/ZT17ZnJhZ21lbnQ6aX06ZT1mLmJ1aWxkRnJhZ21lbnQoYSx0aGlzLGspLGg9ZS5mcmFnbWVudCxoLmNoaWxkTm9kZXMubGVuZ3RoPT09MT9nPWg9aC5maXJzdENoaWxkOmc9aC5maXJzdENoaWxkO2lmKGcpe2M9YyYmZi5ub2RlTmFtZShnLCJ0ciIpO2Zvcih2YXIgbD0wLG09dGhpcy5sZW5ndGgsbj1tLTE7bDxtO2wrKylkLmNhbGwoYz9iaSh0aGlzW2xdLGcpOnRoaXNbbF0sZS5jYWNoZWFibGV8fG0+MSYmbDxuP2YuY2xvbmUoaCwhMCwhMCk6aCl9ay5sZW5ndGgmJmYuZWFjaChrLGJwKX1yZXR1cm4gdGhpc319KSxmLmJ1aWxkRnJhZ21lbnQ9ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGcsaCxpLGo9YVswXTtiJiZiWzBdJiYoaT1iWzBdLm93bmVyRG9jdW1lbnR8fGJbMF0pLGkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudHx8KGk9YyksYS5sZW5ndGg9PT0xJiZ0eXBlb2Ygaj09InN0cmluZyImJmoubGVuZ3RoPDUxMiYmaT09PWMmJmouY2hhckF0KDApPT09IjwiJiYhYmIudGVzdChqKSYmKGYuc3VwcG9ydC5jaGVja0Nsb25lfHwhYmQudGVzdChqKSkmJihmLnN1cHBvcnQuaHRtbDVDbG9uZXx8IWJjLnRlc3QoaikpJiYoZz0hMCxoPWYuZnJhZ21lbnRzW2pdLGgmJmghPT0xJiYoZT1oKSksZXx8KGU9aS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZi5jbGVhbihhLGksZSxkKSksZyYmKGYuZnJhZ21lbnRzW2pdPWg/ZToxKTtyZXR1cm57ZnJhZ21lbnQ6ZSxjYWNoZWFibGU6Z319LGYuZnJhZ21lbnRzPXt9LGYuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGEsYil7Zi5mblthXT1mdW5jdGlvbihjKXt2YXIgZD1bXSxlPWYoYyksZz10aGlzLmxlbmd0aD09PTEmJnRoaXNbMF0ucGFyZW50Tm9kZTtpZihnJiZnLm5vZGVUeXBlPT09MTEmJmcuY2hpbGROb2Rlcy5sZW5ndGg9PT0xJiZlLmxlbmd0aD09PTEpe2VbYl0odGhpc1swXSk7cmV0dXJuIHRoaXN9Zm9yKHZhciBoPTAsaT1lLmxlbmd0aDtoPGk7aCsrKXt2YXIgaj0oaD4wP3RoaXMuY2xvbmUoITApOnRoaXMpLmdldCgpO2YoZVtoXSlbYl0oaiksZD1kLmNvbmNhdChqKX1yZXR1cm4gdGhpcy5wdXNoU3RhY2soZCxhLGUuc2VsZWN0b3IpfX0pLGYuZXh0ZW5kKHtjbG9uZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxnLGg9Zi5zdXBwb3J0Lmh0bWw1Q2xvbmV8fCFiYy50ZXN0KCI8IithLm5vZGVOYW1lKT9hLmNsb25lTm9kZSghMCk6Ym8oYSk7aWYoKCFmLnN1cHBvcnQubm9DbG9uZUV2ZW50fHwhZi5zdXBwb3J0Lm5vQ2xvbmVDaGVja2VkKSYmKGEubm9kZVR5cGU9PT0xfHxhLm5vZGVUeXBlPT09MTEpJiYhZi5pc1hNTERvYyhhKSl7YmsoYSxoKSxkPWJsKGEpLGU9YmwoaCk7Zm9yKGc9MDtkW2ddOysrZyllW2ddJiZiayhkW2ddLGVbZ10pfWlmKGIpe2JqKGEsaCk7aWYoYyl7ZD1ibChhKSxlPWJsKGgpO2ZvcihnPTA7ZFtnXTsrK2cpYmooZFtnXSxlW2ddKX19ZD1lPW51bGw7cmV0dXJuIGh9LGNsZWFuOmZ1bmN0aW9uKGEsYixkLGUpe3ZhciBnO2I9Ynx8Yyx0eXBlb2YgYi5jcmVhdGVFbGVtZW50PT0idW5kZWZpbmVkIiYmKGI9Yi5vd25lckRvY3VtZW50fHxiWzBdJiZiWzBdLm93bmVyRG9jdW1lbnR8fGMpO3ZhciBoPVtdLGk7Zm9yKHZhciBqPTAsazsoaz1hW2pdKSE9bnVsbDtqKyspe3R5cGVvZiBrPT0ibnVtYmVyIiYmKGsrPSIiKTtpZighayljb250aW51ZTtpZih0eXBlb2Ygaz09InN0cmluZyIpaWYoIV8udGVzdChrKSlrPWIuY3JlYXRlVGV4dE5vZGUoayk7ZWxzZXtrPWsucmVwbGFjZShZLCI8JDE+PC8kMj4iKTt2YXIgbD0oWi5leGVjKGspfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLG09YmdbbF18fGJnLl9kZWZhdWx0LG49bVswXSxvPWIuY3JlYXRlRWxlbWVudCgiZGl2Iik7Yj09PWM/YmguYXBwZW5kQ2hpbGQobyk6VShiKS5hcHBlbmRDaGlsZChvKSxvLmlubmVySFRNTD1tWzFdK2srbVsyXTt3aGlsZShuLS0pbz1vLmxhc3RDaGlsZDtpZighZi5zdXBwb3J0LnRib2R5KXt2YXIgcD0kLnRlc3QoaykscT1sPT09InRhYmxlIiYmIXA/by5maXJzdENoaWxkJiZvLmZpcnN0Q2hpbGQuY2hpbGROb2RlczptWzFdPT09Ijx0YWJsZT4iJiYhcD9vLmNoaWxkTm9kZXM6W107Zm9yKGk9cS5sZW5ndGgtMTtpPj0wOy0taSlmLm5vZGVOYW1lKHFbaV0sInRib2R5IikmJiFxW2ldLmNoaWxkTm9kZXMubGVuZ3RoJiZxW2ldLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocVtpXSl9IWYuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSYmWC50ZXN0KGspJiZvLmluc2VydEJlZm9yZShiLmNyZWF0ZVRleHROb2RlKFguZXhlYyhrKVswXSksby5maXJzdENoaWxkKSxrPW8uY2hpbGROb2Rlc312YXIgcjtpZighZi5zdXBwb3J0LmFwcGVuZENoZWNrZWQpaWYoa1swXSYmdHlwZW9mIChyPWsubGVuZ3RoKT09Im51bWJlciIpZm9yKGk9MDtpPHI7aSsrKWJuKGtbaV0pO2Vsc2UgYm4oayk7ay5ub2RlVHlwZT9oLnB1c2goayk6aD1mLm1lcmdlKGgsayl9aWYoZCl7Zz1mdW5jdGlvbihhKXtyZXR1cm4hYS50eXBlfHxiZS50ZXN0KGEudHlwZSl9O2ZvcihqPTA7aFtqXTtqKyspaWYoZSYmZi5ub2RlTmFtZShoW2pdLCJzY3JpcHQiKSYmKCFoW2pdLnR5cGV8fGhbal0udHlwZS50b0xvd2VyQ2FzZSgpPT09InRleHQvamF2YXNjcmlwdCIpKWUucHVzaChoW2pdLnBhcmVudE5vZGU/aFtqXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGhbal0pOmhbal0pO2Vsc2V7aWYoaFtqXS5ub2RlVHlwZT09PTEpe3ZhciBzPWYuZ3JlcChoW2pdLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSxnKTtoLnNwbGljZS5hcHBseShoLFtqKzEsMF0uY29uY2F0KHMpKX1kLmFwcGVuZENoaWxkKGhbal0pfX1yZXR1cm4gaH0sY2xlYW5EYXRhOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZD1mLmNhY2hlLGU9Zi5ldmVudC5zcGVjaWFsLGc9Zi5zdXBwb3J0LmRlbGV0ZUV4cGFuZG87Zm9yKHZhciBoPTAsaTsoaT1hW2hdKSE9bnVsbDtoKyspe2lmKGkubm9kZU5hbWUmJmYubm9EYXRhW2kubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pY29udGludWU7Yz1pW2YuZXhwYW5kb107aWYoYyl7Yj1kW2NdO2lmKGImJmIuZXZlbnRzKXtmb3IodmFyIGogaW4gYi5ldmVudHMpZVtqXT9mLmV2ZW50LnJlbW92ZShpLGopOmYucmVtb3ZlRXZlbnQoaSxqLGIuaGFuZGxlKTtiLmhhbmRsZSYmKGIuaGFuZGxlLmVsZW09bnVsbCl9Zz9kZWxldGUgaVtmLmV4cGFuZG9dOmkucmVtb3ZlQXR0cmlidXRlJiZpLnJlbW92ZUF0dHJpYnV0ZShmLmV4cGFuZG8pLGRlbGV0ZSBkW2NdfX19fSk7dmFyIGJxPS9hbHBoYVwoW14pXSpcKS9pLGJyPS9vcGFjaXR5PShbXildKikvLGJzPS8oW0EtWl18Xm1zKS9nLGJ0PS9eLT9cZCsoPzpweCk/JC9pLGJ1PS9eLT9cZC8sYnY9L14oW1wtK10pPShbXC0rLlxkZV0rKS8sYnc9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LGJ4PVsiTGVmdCIsIlJpZ2h0Il0sYnk9WyJUb3AiLCJCb3R0b20iXSxieixiQSxiQjtmLmZuLmNzcz1mdW5jdGlvbihhLGMpe2lmKGFyZ3VtZW50cy5sZW5ndGg9PT0yJiZjPT09YilyZXR1cm4gdGhpcztyZXR1cm4gZi5hY2Nlc3ModGhpcyxhLGMsITAsZnVuY3Rpb24oYSxjLGQpe3JldHVybiBkIT09Yj9mLnN0eWxlKGEsYyxkKTpmLmNzcyhhLGMpfSl9LGYuZXh0ZW5kKHtjc3NIb29rczp7b3BhY2l0eTp7Z2V0OmZ1bmN0aW9uKGEsYil7aWYoYil7dmFyIGM9YnooYSwib3BhY2l0eSIsIm9wYWNpdHkiKTtyZXR1cm4gYz09PSIiPyIxIjpjfXJldHVybiBhLnN0eWxlLm9wYWNpdHl9fX0sY3NzTnVtYmVyOntmaWxsT3BhY2l0eTohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6Zi5zdXBwb3J0LmNzc0Zsb2F0PyJjc3NGbG9hdCI6InN0eWxlRmxvYXQifSxzdHlsZTpmdW5jdGlvbihhLGMsZCxlKXtpZighIWEmJmEubm9kZVR5cGUhPT0zJiZhLm5vZGVUeXBlIT09OCYmISFhLnN0eWxlKXt2YXIgZyxoLGk9Zi5jYW1lbENhc2UoYyksaj1hLnN0eWxlLGs9Zi5jc3NIb29rc1tpXTtjPWYuY3NzUHJvcHNbaV18fGk7aWYoZD09PWIpe2lmKGsmJiJnZXQiaW4gayYmKGc9ay5nZXQoYSwhMSxlKSkhPT1iKXJldHVybiBnO3JldHVybiBqW2NdfWg9dHlwZW9mIGQsaD09PSJzdHJpbmciJiYoZz1idi5leGVjKGQpKSYmKGQ9KyhnWzFdKzEpKitnWzJdK3BhcnNlRmxvYXQoZi5jc3MoYSxjKSksaD0ibnVtYmVyIik7aWYoZD09bnVsbHx8aD09PSJudW1iZXIiJiZpc05hTihkKSlyZXR1cm47aD09PSJudW1iZXIiJiYhZi5jc3NOdW1iZXJbaV0mJihkKz0icHgiKTtpZigha3x8ISgic2V0ImluIGspfHwoZD1rLnNldChhLGQpKSE9PWIpdHJ5e2pbY109ZH1jYXRjaChsKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYyxkKXt2YXIgZSxnO2M9Zi5jYW1lbENhc2UoYyksZz1mLmNzc0hvb2tzW2NdLGM9Zi5jc3NQcm9wc1tjXXx8YyxjPT09ImNzc0Zsb2F0IiYmKGM9ImZsb2F0Iik7aWYoZyYmImdldCJpbiBnJiYoZT1nLmdldChhLCEwLGQpKSE9PWIpcmV0dXJuIGU7aWYoYnopcmV0dXJuIGJ6KGEsYyl9LHN3YXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXt9O2Zvcih2YXIgZSBpbiBiKWRbZV09YS5zdHlsZVtlXSxhLnN0eWxlW2VdPWJbZV07Yy5jYWxsKGEpO2ZvcihlIGluIGIpYS5zdHlsZVtlXT1kW2VdfX0pLGYuY3VyQ1NTPWYuY3NzLGYuZWFjaChbImhlaWdodCIsIndpZHRoIl0sZnVuY3Rpb24oYSxiKXtmLmNzc0hvb2tzW2JdPXtnZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlO2lmKGMpe2lmKGEub2Zmc2V0V2lkdGghPT0wKXJldHVybiBiQyhhLGIsZCk7Zi5zd2FwKGEsYncsZnVuY3Rpb24oKXtlPWJDKGEsYixkKX0pO3JldHVybiBlfX0sc2V0OmZ1bmN0aW9uKGEsYil7aWYoIWJ0LnRlc3QoYikpcmV0dXJuIGI7Yj1wYXJzZUZsb2F0KGIpO2lmKGI+PTApcmV0dXJuIGIrInB4In19fSksZi5zdXBwb3J0Lm9wYWNpdHl8fChmLmNzc0hvb2tzLm9wYWNpdHk9e2dldDpmdW5jdGlvbihhLGIpe3JldHVybiBici50ZXN0KChiJiZhLmN1cnJlbnRTdHlsZT9hLmN1cnJlbnRTdHlsZS5maWx0ZXI6YS5zdHlsZS5maWx0ZXIpfHwiIik/cGFyc2VGbG9hdChSZWdFeHAuJDEpLzEwMCsiIjpiPyIxIjoiIn0sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGM9YS5zdHlsZSxkPWEuY3VycmVudFN0eWxlLGU9Zi5pc051bWVyaWMoYik/ImFscGhhKG9wYWNpdHk9IitiKjEwMCsiKSI6IiIsZz1kJiZkLmZpbHRlcnx8Yy5maWx0ZXJ8fCIiO2Muem9vbT0xO2lmKGI+PTEmJmYudHJpbShnLnJlcGxhY2UoYnEsIiIpKT09PSIiKXtjLnJlbW92ZUF0dHJpYnV0ZSgiZmlsdGVyIik7aWYoZCYmIWQuZmlsdGVyKXJldHVybn1jLmZpbHRlcj1icS50ZXN0KGcpP2cucmVwbGFjZShicSxlKTpnKyIgIitlfX0pLGYoZnVuY3Rpb24oKXtmLnN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodHx8KGYuY3NzSG9va3MubWFyZ2luUmlnaHQ9e2dldDpmdW5jdGlvbihhLGIpe3ZhciBjO2Yuc3dhcChhLHtkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxmdW5jdGlvbigpe2I/Yz1ieihhLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW5SaWdodCIpOmM9YS5zdHlsZS5tYXJnaW5SaWdodH0pO3JldHVybiBjfX0pfSksYy5kZWZhdWx0VmlldyYmYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlJiYoYkE9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7Yj1iLnJlcGxhY2UoYnMsIi0kMSIpLnRvTG93ZXJDYXNlKCksKGQ9YS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSYmKGU9ZC5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkpJiYoYz1lLmdldFByb3BlcnR5VmFsdWUoYiksYz09PSIiJiYhZi5jb250YWlucyhhLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGEpJiYoYz1mLnN0eWxlKGEsYikpKTtyZXR1cm4gY30pLGMuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSYmKGJCPWZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9YS5jdXJyZW50U3R5bGUmJmEuY3VycmVudFN0eWxlW2JdLGc9YS5zdHlsZTtmPT09bnVsbCYmZyYmKGU9Z1tiXSkmJihmPWUpLCFidC50ZXN0KGYpJiZidS50ZXN0KGYpJiYoYz1nLmxlZnQsZD1hLnJ1bnRpbWVTdHlsZSYmYS5ydW50aW1lU3R5bGUubGVmdCxkJiYoYS5ydW50aW1lU3R5bGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxnLmxlZnQ9Yj09PSJmb250U2l6ZSI/IjFlbSI6Znx8MCxmPWcucGl4ZWxMZWZ0KyJweCIsZy5sZWZ0PWMsZCYmKGEucnVudGltZVN0eWxlLmxlZnQ9ZCkpO3JldHVybiBmPT09IiI/ImF1dG8iOmZ9KSxiej1iQXx8YkIsZi5leHByJiZmLmV4cHIuZmlsdGVycyYmKGYuZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXt2YXIgYj1hLm9mZnNldFdpZHRoLGM9YS5vZmZzZXRIZWlnaHQ7cmV0dXJuIGI9PT0wJiZjPT09MHx8IWYuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMmJihhLnN0eWxlJiZhLnN0eWxlLmRpc3BsYXl8fGYuY3NzKGEsImRpc3BsYXkiKSk9PT0ibm9uZSJ9LGYuZXhwci5maWx0ZXJzLnZpc2libGU9ZnVuY3Rpb24oYSl7cmV0dXJuIWYuZXhwci5maWx0ZXJzLmhpZGRlbihhKX0pO3ZhciBiRD0vJTIwL2csYkU9L1xbXF0kLyxiRj0vXHI/XG4vZyxiRz0vIy4qJC8sYkg9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9tZyxiST0vXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksYko9L14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxiSz0vXig/OkdFVHxIRUFEKSQvLGJMPS9eXC9cLy8sYk09L1w/LyxiTj0vPHNjcmlwdFxiW148XSooPzooPyE8XC9zY3JpcHQ+KTxbXjxdKikqPFwvc2NyaXB0Pi9naSxiTz0vXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSxiUD0vXHMrLyxiUT0vKFs/Jl0pXz1bXiZdKi8sYlI9L14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLGJTPWYuZm4ubG9hZCxiVD17fSxiVT17fSxiVixiVyxiWD1bIiovIl0rWyIqIl07dHJ5e2JWPWUuaHJlZn1jYXRjaChiWSl7YlY9Yy5jcmVhdGVFbGVtZW50KCJhIiksYlYuaHJlZj0iIixiVj1iVi5ocmVmfWJXPWJSLmV4ZWMoYlYudG9Mb3dlckNhc2UoKSl8fFtdLGYuZm4uZXh0ZW5kKHtsb2FkOmZ1bmN0aW9uKGEsYyxkKXtpZih0eXBlb2YgYSE9InN0cmluZyImJmJTKXJldHVybiBiUy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYoIXRoaXMubGVuZ3RoKXJldHVybiB0aGlzO3ZhciBlPWEuaW5kZXhPZigiICIpO2lmKGU+PTApe3ZhciBnPWEuc2xpY2UoZSxhLmxlbmd0aCk7YT1hLnNsaWNlKDAsZSl9dmFyIGg9IkdFVCI7YyYmKGYuaXNGdW5jdGlvbihjKT8oZD1jLGM9Yik6dHlwZW9mIGM9PSJvYmplY3QiJiYoYz1mLnBhcmFtKGMsZi5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWwpLGg9IlBPU1QiKSk7dmFyIGk9dGhpcztmLmFqYXgoe3VybDphLHR5cGU6aCxkYXRhVHlwZToiaHRtbCIsZGF0YTpjLGNvbXBsZXRlOmZ1bmN0aW9uKGEsYixjKXtjPWEucmVzcG9uc2VUZXh0LGEuaXNSZXNvbHZlZCgpJiYoYS5kb25lKGZ1bmN0aW9uKGEpe2M9YX0pLGkuaHRtbChnP2YoIjxkaXY+IikuYXBwZW5kKGMucmVwbGFjZShiTiwiIikpLmZpbmQoZyk6YykpLGQmJmkuZWFjaChkLFtjLGIsYV0pfX0pO3JldHVybiB0aGlzfSxzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gZi5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzP2YubWFrZUFycmF5KHRoaXMuZWxlbWVudHMpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uYW1lJiYhdGhpcy5kaXNhYmxlZCYmKHRoaXMuY2hlY2tlZHx8Yk8udGVzdCh0aGlzLm5vZGVOYW1lKXx8YkkudGVzdCh0aGlzLnR5cGUpKX0pLm1hcChmdW5jdGlvbihhLGIpe3ZhciBjPWYodGhpcykudmFsKCk7cmV0dXJuIGM9PW51bGw/bnVsbDpmLmlzQXJyYXkoYyk/Zi5tYXAoYyxmdW5jdGlvbihhLGMpe3JldHVybntuYW1lOmIubmFtZSx2YWx1ZTphLnJlcGxhY2UoYkYsIlxyXG4iKX19KTp7bmFtZTpiLm5hbWUsdmFsdWU6Yy5yZXBsYWNlKGJGLCJcclxuIil9fSkuZ2V0KCl9fSksZi5lYWNoKCJhamF4U3RhcnQgYWpheFN0b3AgYWpheENvbXBsZXRlIGFqYXhFcnJvciBhamF4U3VjY2VzcyBhamF4U2VuZCIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe2YuZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxmLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oYSxjKXtmW2NdPWZ1bmN0aW9uKGEsZCxlLGcpe2YuaXNGdW5jdGlvbihkKSYmKGc9Z3x8ZSxlPWQsZD1iKTtyZXR1cm4gZi5hamF4KHt0eXBlOmMsdXJsOmEsZGF0YTpkLHN1Y2Nlc3M6ZSxkYXRhVHlwZTpnfSl9fSksZi5leHRlbmQoe2dldFNjcmlwdDpmdW5jdGlvbihhLGMpe3JldHVybiBmLmdldChhLGIsYywic2NyaXB0Iil9LGdldEpTT046ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBmLmdldChhLGIsYywianNvbiIpfSxhamF4U2V0dXA6ZnVuY3Rpb24oYSxiKXtiP2JfKGEsZi5hamF4U2V0dGluZ3MpOihiPWEsYT1mLmFqYXhTZXR0aW5ncyksYl8oYSxiKTtyZXR1cm4gYX0sYWpheFNldHRpbmdzOnt1cmw6YlYsaXNMb2NhbDpiSi50ZXN0KGJXWzFdKSxnbG9iYWw6ITAsdHlwZToiR0VUIixjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixwcm9jZXNzRGF0YTohMCxhc3luYzohMCxhY2NlcHRzOnt4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGh0bWw6InRleHQvaHRtbCIsdGV4dDoidGV4dC9wbGFpbiIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0IiwiKiI6Ylh9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjphLlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjpmLnBhcnNlSlNPTiwidGV4dCB4bWwiOmYucGFyc2VYTUx9LGZsYXRPcHRpb25zOntjb250ZXh0OiEwLHVybDohMH19LGFqYXhQcmVmaWx0ZXI6YlooYlQpLGFqYXhUcmFuc3BvcnQ6YlooYlUpLGFqYXg6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiB3KGEsYyxsLG0pe2lmKHMhPT0yKXtzPTIscSYmY2xlYXJUaW1lb3V0KHEpLHA9YixuPW18fCIiLHYucmVhZHlTdGF0ZT1hPjA/NDowO3ZhciBvLHIsdSx3PWMseD1sP2NiKGQsdixsKTpiLHksejtpZihhPj0yMDAmJmE8MzAwfHxhPT09MzA0KXtpZihkLmlmTW9kaWZpZWQpe2lmKHk9di5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpKWYubGFzdE1vZGlmaWVkW2tdPXk7aWYoej12LmdldFJlc3BvbnNlSGVhZGVyKCJFdGFnIikpZi5ldGFnW2tdPXp9aWYoYT09PTMwNCl3PSJub3Rtb2RpZmllZCIsbz0hMDtlbHNlIHRyeXtyPWNjKGQseCksdz0ic3VjY2VzcyIsbz0hMH1jYXRjaChBKXt3PSJwYXJzZXJlcnJvciIsdT1BfX1lbHNle3U9dztpZighd3x8YSl3PSJlcnJvciIsYTwwJiYoYT0wKX12LnN0YXR1cz1hLHYuc3RhdHVzVGV4dD0iIisoY3x8dyksbz9oLnJlc29sdmVXaXRoKGUsW3Isdyx2XSk6aC5yZWplY3RXaXRoKGUsW3Ysdyx1XSksdi5zdGF0dXNDb2RlKGopLGo9Yix0JiZnLnRyaWdnZXIoImFqYXgiKyhvPyJTdWNjZXNzIjoiRXJyb3IiKSxbdixkLG8/cjp1XSksaS5maXJlV2l0aChlLFt2LHddKSx0JiYoZy50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFt2LGRdKSwtLWYuYWN0aXZlfHxmLmV2ZW50LnRyaWdnZXIoImFqYXhTdG9wIikpfX10eXBlb2YgYT09Im9iamVjdCImJihjPWEsYT1iKSxjPWN8fHt9O3ZhciBkPWYuYWpheFNldHVwKHt9LGMpLGU9ZC5jb250ZXh0fHxkLGc9ZSE9PWQmJihlLm5vZGVUeXBlfHxlIGluc3RhbmNlb2YgZik/ZihlKTpmLmV2ZW50LGg9Zi5EZWZlcnJlZCgpLGk9Zi5DYWxsYmFja3MoIm9uY2UgbWVtb3J5Iiksaj1kLnN0YXR1c0NvZGV8fHt9LGssbD17fSxtPXt9LG4sbyxwLHEscixzPTAsdCx1LHY9e3JlYWR5U3RhdGU6MCxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7aWYoIXMpe3ZhciBjPWEudG9Mb3dlckNhc2UoKTthPW1bY109bVtjXXx8YSxsW2FdPWJ9cmV0dXJuIHRoaXN9LGdldEFsbFJlc3BvbnNlSGVhZGVyczpmdW5jdGlvbigpe3JldHVybiBzPT09Mj9uOm51bGx9LGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBjO2lmKHM9PT0yKXtpZighbyl7bz17fTt3aGlsZShjPWJILmV4ZWMobikpb1tjWzFdLnRvTG93ZXJDYXNlKCldPWNbMl19Yz1vW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIGM9PT1iP251bGw6Y30sb3ZlcnJpZGVNaW1lVHlwZTpmdW5jdGlvbihhKXtzfHwoZC5taW1lVHlwZT1hKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7YT1hfHwiYWJvcnQiLHAmJnAuYWJvcnQoYSksdygwLGEpO3JldHVybiB0aGlzfX07aC5wcm9taXNlKHYpLHYuc3VjY2Vzcz12LmRvbmUsdi5lcnJvcj12LmZhaWwsdi5jb21wbGV0ZT1pLmFkZCx2LnN0YXR1c0NvZGU9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI7aWYoczwyKWZvcihiIGluIGEpaltiXT1baltiXSxhW2JdXTtlbHNlIGI9YVt2LnN0YXR1c10sdi50aGVuKGIsYil9cmV0dXJuIHRoaXN9LGQudXJsPSgoYXx8ZC51cmwpKyIiKS5yZXBsYWNlKGJHLCIiKS5yZXBsYWNlKGJMLGJXWzFdKyIvLyIpLGQuZGF0YVR5cGVzPWYudHJpbShkLmRhdGFUeXBlfHwiKiIpLnRvTG93ZXJDYXNlKCkuc3BsaXQoYlApLGQuY3Jvc3NEb21haW49PW51bGwmJihyPWJSLmV4ZWMoZC51cmwudG9Mb3dlckNhc2UoKSksZC5jcm9zc0RvbWFpbj0hKCFyfHxyWzFdPT1iV1sxXSYmclsyXT09YldbMl0mJihyWzNdfHwoclsxXT09PSJodHRwOiI/ODA6NDQzKSk9PShiV1szXXx8KGJXWzFdPT09Imh0dHA6Ij84MDo0NDMpKSkpLGQuZGF0YSYmZC5wcm9jZXNzRGF0YSYmdHlwZW9mIGQuZGF0YSE9InN0cmluZyImJihkLmRhdGE9Zi5wYXJhbShkLmRhdGEsZC50cmFkaXRpb25hbCkpLGIkKGJULGQsYyx2KTtpZihzPT09MilyZXR1cm4hMTt0PWQuZ2xvYmFsLGQudHlwZT1kLnR5cGUudG9VcHBlckNhc2UoKSxkLmhhc0NvbnRlbnQ9IWJLLnRlc3QoZC50eXBlKSx0JiZmLmFjdGl2ZSsrPT09MCYmZi5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKTtpZighZC5oYXNDb250ZW50KXtkLmRhdGEmJihkLnVybCs9KGJNLnRlc3QoZC51cmwpPyImIjoiPyIpK2QuZGF0YSxkZWxldGUgZC5kYXRhKSxrPWQudXJsO2lmKGQuY2FjaGU9PT0hMSl7dmFyIHg9Zi5ub3coKSx5PWQudXJsLnJlcGxhY2UoYlEsIiQxXz0iK3gpO2QudXJsPXkrKHk9PT1kLnVybD8oYk0udGVzdChkLnVybCk/IiYiOiI/IikrIl89Iit4OiIiKX19KGQuZGF0YSYmZC5oYXNDb250ZW50JiZkLmNvbnRlbnRUeXBlIT09ITF8fGMuY29udGVudFR5cGUpJiZ2LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsZC5jb250ZW50VHlwZSksZC5pZk1vZGlmaWVkJiYoaz1rfHxkLnVybCxmLmxhc3RNb2RpZmllZFtrXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Nb2RpZmllZC1TaW5jZSIsZi5sYXN0TW9kaWZpZWRba10pLGYuZXRhZ1trXSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJJZi1Ob25lLU1hdGNoIixmLmV0YWdba10pKSx2LnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsZC5kYXRhVHlwZXNbMF0mJmQuYWNjZXB0c1tkLmRhdGFUeXBlc1swXV0/ZC5hY2NlcHRzW2QuZGF0YVR5cGVzWzBdXSsoZC5kYXRhVHlwZXNbMF0hPT0iKiI/IiwgIitiWCsiOyBxPTAuMDEiOiIiKTpkLmFjY2VwdHNbIioiXSk7Zm9yKHUgaW4gZC5oZWFkZXJzKXYuc2V0UmVxdWVzdEhlYWRlcih1LGQuaGVhZGVyc1t1XSk7aWYoZC5iZWZvcmVTZW5kJiYoZC5iZWZvcmVTZW5kLmNhbGwoZSx2LGQpPT09ITF8fHM9PT0yKSl7di5hYm9ydCgpO3JldHVybiExfWZvcih1IGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbdV0oZFt1XSk7cD1iJChiVSxkLGMsdik7aWYoIXApdygtMSwiTm8gVHJhbnNwb3J0Iik7ZWxzZXt2LnJlYWR5U3RhdGU9MSx0JiZnLnRyaWdnZXIoImFqYXhTZW5kIixbdixkXSksZC5hc3luYyYmZC50aW1lb3V0PjAmJihxPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2LmFib3J0KCJ0aW1lb3V0Iil9LGQudGltZW91dCkpO3RyeXtzPTEscC5zZW5kKGwsdyl9Y2F0Y2goeil7aWYoczwyKXcoLTEseik7ZWxzZSB0aHJvdyB6fX1yZXR1cm4gdn0scGFyYW06ZnVuY3Rpb24oYSxjKXt2YXIgZD1bXSxlPWZ1bmN0aW9uKGEsYil7Yj1mLmlzRnVuY3Rpb24oYik/YigpOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2M9PT1iJiYoYz1mLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCk7aWYoZi5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIWYuaXNQbGFpbk9iamVjdChhKSlmLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IodmFyIGcgaW4gYSljYShnLGFbZ10sYyxlKTtyZXR1cm4gZC5qb2luKCImIikucmVwbGFjZShiRCwiKyIpfX0pLGYuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fX0pO3ZhciBjZD1mLm5vdygpLGNlPS8oXD0pXD8oJnwkKXxcP1w/L2k7Zi5hamF4U2V0dXAoe2pzb25wOiJjYWxsYmFjayIsanNvbnBDYWxsYmFjazpmdW5jdGlvbigpe3JldHVybiBmLmV4cGFuZG8rIl8iK2NkKyt9fSksZi5hamF4UHJlZmlsdGVyKCJqc29uIGpzb25wIixmdW5jdGlvbihiLGMsZCl7dmFyIGU9Yi5jb250ZW50VHlwZT09PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiJiZ0eXBlb2YgYi5kYXRhPT0ic3RyaW5nIjtpZihiLmRhdGFUeXBlc1swXT09PSJqc29ucCJ8fGIuanNvbnAhPT0hMSYmKGNlLnRlc3QoYi51cmwpfHxlJiZjZS50ZXN0KGIuZGF0YSkpKXt2YXIgZyxoPWIuanNvbnBDYWxsYmFjaz1mLmlzRnVuY3Rpb24oYi5qc29ucENhbGxiYWNrKT9iLmpzb25wQ2FsbGJhY2soKTpiLmpzb25wQ2FsbGJhY2ssaT1hW2hdLGo9Yi51cmwsaz1iLmRhdGEsbD0iJDEiK2grIiQyIjtiLmpzb25wIT09ITEmJihqPWoucmVwbGFjZShjZSxsKSxiLnVybD09PWomJihlJiYoaz1rLnJlcGxhY2UoY2UsbCkpLGIuZGF0YT09PWsmJihqKz0oL1w/Ly50ZXN0KGopPyImIjoiPyIpK2IuanNvbnArIj0iK2gpKSksYi51cmw9aixiLmRhdGE9ayxhW2hdPWZ1bmN0aW9uKGEpe2c9W2FdfSxkLmFsd2F5cyhmdW5jdGlvbigpe2FbaF09aSxnJiZmLmlzRnVuY3Rpb24oaSkmJmFbaF0oZ1swXSl9KSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtnfHxmLmVycm9yKGgrIiB3YXMgbm90IGNhbGxlZCIpO3JldHVybiBnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiI7cmV0dXJuInNjcmlwdCJ9fSksZi5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9qYXZhc2NyaXB0fGVjbWFzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe2YuZ2xvYmFsRXZhbChhKTtyZXR1cm4gYX19fSksZi5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe2EuY2FjaGU9PT1iJiYoYS5jYWNoZT0hMSksYS5jcm9zc0RvbWFpbiYmKGEudHlwZT0iR0VUIixhLmdsb2JhbD0hMSl9KSxmLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oYSl7aWYoYS5jcm9zc0RvbWFpbil7dmFyIGQsZT1jLmhlYWR8fGMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8Yy5kb2N1bWVudEVsZW1lbnQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZixnKXtkPWMuY3JlYXRlRWxlbWVudCgic2NyaXB0IiksZC5hc3luYz0iYXN5bmMiLGEuc2NyaXB0Q2hhcnNldCYmKGQuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGQuc3JjPWEudXJsLGQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7aWYoY3x8IWQucmVhZHlTdGF0ZXx8L2xvYWRlZHxjb21wbGV0ZS8udGVzdChkLnJlYWR5U3RhdGUpKWQub25sb2FkPWQub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsZSYmZC5wYXJlbnROb2RlJiZlLnJlbW92ZUNoaWxkKGQpLGQ9YixjfHxnKDIwMCwic3VjY2VzcyIpfSxlLmluc2VydEJlZm9yZShkLGUuZmlyc3RDaGlsZCl9LGFib3J0OmZ1bmN0aW9uKCl7ZCYmZC5vbmxvYWQoMCwxKX19fX0pO3ZhciBjZj1hLkFjdGl2ZVhPYmplY3Q/ZnVuY3Rpb24oKXtmb3IodmFyIGEgaW4gY2gpY2hbYV0oMCwxKX06ITEsY2c9MCxjaDtmLmFqYXhTZXR0aW5ncy54aHI9YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmY2koKXx8Y2ooKX06Y2ksZnVuY3Rpb24oYSl7Zi5leHRlbmQoZi5zdXBwb3J0LHthamF4OiEhYSxjb3JzOiEhYSYmIndpdGhDcmVkZW50aWFscyJpbiBhfSl9KGYuYWpheFNldHRpbmdzLnhocigpKSxmLnN1cHBvcnQuYWpheCYmZi5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGMpe2lmKCFjLmNyb3NzRG9tYWlufHxmLnN1cHBvcnQuY29ycyl7dmFyIGQ7cmV0dXJue3NlbmQ6ZnVuY3Rpb24oZSxnKXt2YXIgaD1jLnhocigpLGksajtjLnVzZXJuYW1lP2gub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyxjLnVzZXJuYW1lLGMucGFzc3dvcmQpOmgub3BlbihjLnR5cGUsYy51cmwsYy5hc3luYyk7aWYoYy54aHJGaWVsZHMpZm9yKGogaW4gYy54aHJGaWVsZHMpaFtqXT1jLnhockZpZWxkc1tqXTtjLm1pbWVUeXBlJiZoLm92ZXJyaWRlTWltZVR5cGUmJmgub3ZlcnJpZGVNaW1lVHlwZShjLm1pbWVUeXBlKSwhYy5jcm9zc0RvbWFpbiYmIWVbIlgtUmVxdWVzdGVkLVdpdGgiXSYmKGVbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTt0cnl7Zm9yKGogaW4gZSloLnNldFJlcXVlc3RIZWFkZXIoaixlW2pdKX1jYXRjaChrKXt9aC5zZW5kKGMuaGFzQ29udGVudCYmYy5kYXRhfHxudWxsKSxkPWZ1bmN0aW9uKGEsZSl7dmFyIGosayxsLG0sbjt0cnl7aWYoZCYmKGV8fGgucmVhZHlTdGF0ZT09PTQpKXtkPWIsaSYmKGgub25yZWFkeXN0YXRlY2hhbmdlPWYubm9vcCxjZiYmZGVsZXRlIGNoW2ldKTtpZihlKWgucmVhZHlTdGF0ZSE9PTQmJmguYWJvcnQoKTtlbHNle2o9aC5zdGF0dXMsbD1oLmdldEFsbFJlc3BvbnNlSGVhZGVycygpLG09e30sbj1oLnJlc3BvbnNlWE1MLG4mJm4uZG9jdW1lbnRFbGVtZW50JiYobS54bWw9biksbS50ZXh0PWgucmVzcG9uc2VUZXh0O3RyeXtrPWguc3RhdHVzVGV4dH1jYXRjaChvKXtrPSIifSFqJiZjLmlzTG9jYWwmJiFjLmNyb3NzRG9tYWluP2o9bS50ZXh0PzIwMDo0MDQ6aj09PTEyMjMmJihqPTIwNCl9fX1jYXRjaChwKXtlfHxnKC0xLHApfW0mJmcoaixrLG0sbCl9LCFjLmFzeW5jfHxoLnJlYWR5U3RhdGU9PT00P2QoKTooaT0rK2NnLGNmJiYoY2h8fChjaD17fSxmKGEpLnVubG9hZChjZikpLGNoW2ldPWQpLGgub25yZWFkeXN0YXRlY2hhbmdlPWQpfSxhYm9ydDpmdW5jdGlvbigpe2QmJmQoMCwxKX19fX0pO3ZhciBjaz17fSxjbCxjbSxjbj0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sY289L14oWytcLV09KT8oW1xkKy5cLV0rKShbYS16JV0qKSQvaSxjcCxjcT1bWyJoZWlnaHQiLCJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iLCJwYWRkaW5nVG9wIiwicGFkZGluZ0JvdHRvbSJdLFsid2lkdGgiLCJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLFsib3BhY2l0eSJdXSxjcjtmLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJzaG93IiwzKSxhLGIsYyk7Zm9yKHZhciBnPTAsaD10aGlzLmxlbmd0aDtnPGg7ZysrKWQ9dGhpc1tnXSxkLnN0eWxlJiYoZT1kLnN0eWxlLmRpc3BsYXksIWYuX2RhdGEoZCwib2xkZGlzcGxheSIpJiZlPT09Im5vbmUiJiYoZT1kLnN0eWxlLmRpc3BsYXk9IiIpLGU9PT0iIiYmZi5jc3MoZCwiZGlzcGxheSIpPT09Im5vbmUiJiZmLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGN2KGQubm9kZU5hbWUpKSk7Zm9yKGc9MDtnPGg7ZysrKXtkPXRoaXNbZ107aWYoZC5zdHlsZSl7ZT1kLnN0eWxlLmRpc3BsYXk7aWYoZT09PSIifHxlPT09Im5vbmUiKWQuc3R5bGUuZGlzcGxheT1mLl9kYXRhKGQsIm9sZGRpc3BsYXkiKXx8IiJ9fXJldHVybiB0aGlzfSxoaWRlOmZ1bmN0aW9uKGEsYixjKXtpZihhfHxhPT09MClyZXR1cm4gdGhpcy5hbmltYXRlKGN1KCJoaWRlIiwzKSxhLGIsYyk7dmFyIGQsZSxnPTAsaD10aGlzLmxlbmd0aDtmb3IoO2c8aDtnKyspZD10aGlzW2ddLGQuc3R5bGUmJihlPWYuY3NzKGQsImRpc3BsYXkiKSxlIT09Im5vbmUiJiYhZi5fZGF0YShkLCJvbGRkaXNwbGF5IikmJmYuX2RhdGEoZCwib2xkZGlzcGxheSIsZSkpO2ZvcihnPTA7ZzxoO2crKyl0aGlzW2ddLnN0eWxlJiYodGhpc1tnXS5zdHlsZS5kaXNwbGF5PSJub25lIik7cmV0dXJuIHRoaXN9LF90b2dnbGU6Zi5mbi50b2dnbGUsdG9nZ2xlOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD10eXBlb2YgYT09ImJvb2xlYW4iO2YuaXNGdW5jdGlvbihhKSYmZi5pc0Z1bmN0aW9uKGIpP3RoaXMuX3RvZ2dsZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6YT09bnVsbHx8ZD90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1kP2E6Zih0aGlzKS5pcygiOmhpZGRlbiIpO2YodGhpcylbYj8ic2hvdyI6ImhpZGUiXSgpfSk6dGhpcy5hbmltYXRlKGN1KCJ0b2dnbGUiLDMpLGEsYixjKTtyZXR1cm4gdGhpc30sZmFkZVRvOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6Yn0sYSxjLGQpfSxhbmltYXRlOmZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGcoKXtlLnF1ZXVlPT09ITEmJmYuX21hcmsodGhpcyk7dmFyIGI9Zi5leHRlbmQoe30sZSksYz10aGlzLm5vZGVUeXBlPT09MSxkPWMmJmYodGhpcykuaXMoIjpoaWRkZW4iKSxnLGgsaSxqLGssbCxtLG4sbztiLmFuaW1hdGVkUHJvcGVydGllcz17fTtmb3IoaSBpbiBhKXtnPWYuY2FtZWxDYXNlKGkpLGkhPT1nJiYoYVtnXT1hW2ldLGRlbGV0ZSBhW2ldKSxoPWFbZ10sZi5pc0FycmF5KGgpPyhiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1oWzFdLGg9YVtnXT1oWzBdKTpiLmFuaW1hdGVkUHJvcGVydGllc1tnXT1iLnNwZWNpYWxFYXNpbmcmJmIuc3BlY2lhbEVhc2luZ1tnXXx8Yi5lYXNpbmd8fCJzd2luZyI7aWYoaD09PSJoaWRlIiYmZHx8aD09PSJzaG93IiYmIWQpcmV0dXJuIGIuY29tcGxldGUuY2FsbCh0aGlzKTtjJiYoZz09PSJoZWlnaHQifHxnPT09IndpZHRoIikmJihiLm92ZXJmbG93PVt0aGlzLnN0eWxlLm92ZXJmbG93LHRoaXMuc3R5bGUub3ZlcmZsb3dYLHRoaXMuc3R5bGUub3ZlcmZsb3dZXSxmLmNzcyh0aGlzLCJkaXNwbGF5Iik9PT0iaW5saW5lIiYmZi5jc3ModGhpcywiZmxvYXQiKT09PSJub25lIiYmKCFmLnN1cHBvcnQuaW5saW5lQmxvY2tOZWVkc0xheW91dHx8Y3YodGhpcy5ub2RlTmFtZSk9PT0iaW5saW5lIj90aGlzLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI6dGhpcy5zdHlsZS56b29tPTEpKX1iLm92ZXJmbG93IT1udWxsJiYodGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIik7Zm9yKGkgaW4gYSlqPW5ldyBmLmZ4KHRoaXMsYixpKSxoPWFbaV0sY24udGVzdChoKT8obz1mLl9kYXRhKHRoaXMsInRvZ2dsZSIraSl8fChoPT09InRvZ2dsZSI/ZD8ic2hvdyI6ImhpZGUiOjApLG8/KGYuX2RhdGEodGhpcywidG9nZ2xlIitpLG89PT0ic2hvdyI/ImhpZGUiOiJzaG93IiksaltvXSgpKTpqW2hdKCkpOihrPWNvLmV4ZWMoaCksbD1qLmN1cigpLGs/KG09cGFyc2VGbG9hdChrWzJdKSxuPWtbM118fChmLmNzc051bWJlcltpXT8iIjoicHgiKSxuIT09InB4IiYmKGYuc3R5bGUodGhpcyxpLChtfHwxKStuKSxsPShtfHwxKS9qLmN1cigpKmwsZi5zdHlsZSh0aGlzLGksbCtuKSksa1sxXSYmKG09KGtbMV09PT0iLT0iPy0xOjEpKm0rbCksai5jdXN0b20obCxtLG4pKTpqLmN1c3RvbShsLGgsIiIpKTtyZXR1cm4hMH12YXIgZT1mLnNwZWVkKGIsYyxkKTtpZihmLmlzRW1wdHlPYmplY3QoYSkpcmV0dXJuIHRoaXMuZWFjaChlLmNvbXBsZXRlLFshMV0pO2E9Zi5leHRlbmQoe30sYSk7cmV0dXJuIGUucXVldWU9PT0hMT90aGlzLmVhY2goZyk6dGhpcy5xdWV1ZShlLnF1ZXVlLGcpfSxzdG9wOmZ1bmN0aW9uKGEsYyxkKXt0eXBlb2YgYSE9InN0cmluZyImJihkPWMsYz1hLGE9YiksYyYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGEsYixjKXt2YXIgZT1iW2NdO2YucmVtb3ZlRGF0YShhLGMsITApLGUuc3RvcChkKX12YXIgYixjPSExLGU9Zi50aW1lcnMsZz1mLl9kYXRhKHRoaXMpO2R8fGYuX3VubWFyayghMCx0aGlzKTtpZihhPT1udWxsKWZvcihiIGluIGcpZ1tiXSYmZ1tiXS5zdG9wJiZiLmluZGV4T2YoIi5ydW4iKT09PWIubGVuZ3RoLTQmJmgodGhpcyxnLGIpO2Vsc2UgZ1tiPWErIi5ydW4iXSYmZ1tiXS5zdG9wJiZoKHRoaXMsZyxiKTtmb3IoYj1lLmxlbmd0aDtiLS07KWVbYl0uZWxlbT09PXRoaXMmJihhPT1udWxsfHxlW2JdLnF1ZXVlPT09YSkmJihkP2VbYl0oITApOmVbYl0uc2F2ZVN0YXRlKCksYz0hMCxlLnNwbGljZShiLDEpKTsoIWR8fCFjKSYmZi5kZXF1ZXVlKHRoaXMsYSl9KX19KSxmLmVhY2goe3NsaWRlRG93bjpjdSgic2hvdyIsMSksc2xpZGVVcDpjdSgiaGlkZSIsMSksc2xpZGVUb2dnbGU6Y3UoInRvZ2dsZSIsMSksZmFkZUluOntvcGFjaXR5OiJzaG93In0sZmFkZU91dDp7b3BhY2l0eToiaGlkZSJ9LGZhZGVUb2dnbGU6e29wYWNpdHk6InRvZ2dsZSJ9fSxmdW5jdGlvbihhLGIpe2YuZm5bYV09ZnVuY3Rpb24oYSxjLGQpe3JldHVybiB0aGlzLmFuaW1hdGUoYixhLGMsZCl9fSksZi5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKGEsYixjKXt2YXIgZD1hJiZ0eXBlb2YgYT09Im9iamVjdCI/Zi5leHRlbmQoe30sYSk6e2NvbXBsZXRlOmN8fCFjJiZifHxmLmlzRnVuY3Rpb24oYSkmJmEsZHVyYXRpb246YSxlYXNpbmc6YyYmYnx8YiYmIWYuaXNGdW5jdGlvbihiKSYmYn07ZC5kdXJhdGlvbj1mLmZ4Lm9mZj8wOnR5cGVvZiBkLmR1cmF0aW9uPT0ibnVtYmVyIj9kLmR1cmF0aW9uOmQuZHVyYXRpb24gaW4gZi5meC5zcGVlZHM/Zi5meC5zcGVlZHNbZC5kdXJhdGlvbl06Zi5meC5zcGVlZHMuX2RlZmF1bHQ7aWYoZC5xdWV1ZT09bnVsbHx8ZC5xdWV1ZT09PSEwKWQucXVldWU9ImZ4IjtkLm9sZD1kLmNvbXBsZXRlLGQuY29tcGxldGU9ZnVuY3Rpb24oYSl7Zi5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlP2YuZGVxdWV1ZSh0aGlzLGQucXVldWUpOmEhPT0hMSYmZi5fdW5tYXJrKHRoaXMpfTtyZXR1cm4gZH0sZWFzaW5nOntsaW5lYXI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGMrZCphfSxzd2luZzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4oLU1hdGguY29zKGEqTWF0aC5QSSkvMisuNSkqZCtjfX0sdGltZXJzOltdLGZ4OmZ1bmN0aW9uKGEsYixjKXt0aGlzLm9wdGlvbnM9Yix0aGlzLmVsZW09YSx0aGlzLnByb3A9YyxiLm9yaWc9Yi5vcmlnfHx7fX19KSxmLmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnN0ZXAmJnRoaXMub3B0aW9ucy5zdGVwLmNhbGwodGhpcy5lbGVtLHRoaXMubm93LHRoaXMpLChmLmZ4LnN0ZXBbdGhpcy5wcm9wXXx8Zi5meC5zdGVwLl9kZWZhdWx0KSh0aGlzKX0sY3VyOmZ1bmN0aW9uKCl7aWYodGhpcy5lbGVtW3RoaXMucHJvcF0hPW51bGwmJighdGhpcy5lbGVtLnN0eWxlfHx0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXT09bnVsbCkpcmV0dXJuIHRoaXMuZWxlbVt0aGlzLnByb3BdO3ZhciBhLGI9Zi5jc3ModGhpcy5lbGVtLHRoaXMucHJvcCk7cmV0dXJuIGlzTmFOKGE9cGFyc2VGbG9hdChiKSk/IWJ8fGI9PT0iYXV0byI/MDpiOmF9LGN1c3RvbTpmdW5jdGlvbihhLGMsZCl7ZnVuY3Rpb24gaChhKXtyZXR1cm4gZS5zdGVwKGEpfXZhciBlPXRoaXMsZz1mLmZ4O3RoaXMuc3RhcnRUaW1lPWNyfHxjcygpLHRoaXMuZW5kPWMsdGhpcy5ub3c9dGhpcy5zdGFydD1hLHRoaXMucG9zPXRoaXMuc3RhdGU9MCx0aGlzLnVuaXQ9ZHx8dGhpcy51bml0fHwoZi5jc3NOdW1iZXJbdGhpcy5wcm9wXT8iIjoicHgiKSxoLnF1ZXVlPXRoaXMub3B0aW9ucy5xdWV1ZSxoLmVsZW09dGhpcy5lbGVtLGguc2F2ZVN0YXRlPWZ1bmN0aW9uKCl7ZS5vcHRpb25zLmhpZGUmJmYuX2RhdGEoZS5lbGVtLCJmeHNob3ciK2UucHJvcCk9PT1iJiZmLl9kYXRhKGUuZWxlbSwiZnhzaG93IitlLnByb3AsZS5zdGFydCl9LGgoKSYmZi50aW1lcnMucHVzaChoKSYmIWNwJiYoY3A9c2V0SW50ZXJ2YWwoZy50aWNrLGcuaW50ZXJ2YWwpKX0sc2hvdzpmdW5jdGlvbigpe3ZhciBhPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCk7dGhpcy5vcHRpb25zLm9yaWdbdGhpcy5wcm9wXT1hfHxmLnN0eWxlKHRoaXMuZWxlbSx0aGlzLnByb3ApLHRoaXMub3B0aW9ucy5zaG93PSEwLGEhPT1iP3RoaXMuY3VzdG9tKHRoaXMuY3VyKCksYSk6dGhpcy5jdXN0b20odGhpcy5wcm9wPT09IndpZHRoInx8dGhpcy5wcm9wPT09ImhlaWdodCI/MTowLHRoaXMuY3VyKCkpLGYodGhpcy5lbGVtKS5zaG93KCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdPWYuX2RhdGEodGhpcy5lbGVtLCJmeHNob3ciK3RoaXMucHJvcCl8fGYuc3R5bGUodGhpcy5lbGVtLHRoaXMucHJvcCksdGhpcy5vcHRpb25zLmhpZGU9ITAsdGhpcy5jdXN0b20odGhpcy5jdXIoKSwwKX0sc3RlcDpmdW5jdGlvbihhKXt2YXIgYixjLGQsZT1jcnx8Y3MoKSxnPSEwLGg9dGhpcy5lbGVtLGk9dGhpcy5vcHRpb25zO2lmKGF8fGU+PWkuZHVyYXRpb24rdGhpcy5zdGFydFRpbWUpe3RoaXMubm93PXRoaXMuZW5kLHRoaXMucG9zPXRoaXMuc3RhdGU9MSx0aGlzLnVwZGF0ZSgpLGkuYW5pbWF0ZWRQcm9wZXJ0aWVzW3RoaXMucHJvcF09ITA7Zm9yKGIgaW4gaS5hbmltYXRlZFByb3BlcnRpZXMpaS5hbmltYXRlZFByb3BlcnRpZXNbYl0hPT0hMCYmKGc9ITEpO2lmKGcpe2kub3ZlcmZsb3chPW51bGwmJiFmLnN1cHBvcnQuc2hyaW5rV3JhcEJsb2NrcyYmZi5lYWNoKFsiIiwiWCIsIlkiXSxmdW5jdGlvbihhLGIpe2guc3R5bGVbIm92ZXJmbG93IitiXT1pLm92ZXJmbG93W2FdfSksaS5oaWRlJiZmKGgpLmhpZGUoKTtpZihpLmhpZGV8fGkuc2hvdylmb3IoYiBpbiBpLmFuaW1hdGVkUHJvcGVydGllcylmLnN0eWxlKGgsYixpLm9yaWdbYl0pLGYucmVtb3ZlRGF0YShoLCJmeHNob3ciK2IsITApLGYucmVtb3ZlRGF0YShoLCJ0b2dnbGUiK2IsITApO2Q9aS5jb21wbGV0ZSxkJiYoaS5jb21wbGV0ZT0hMSxkLmNhbGwoaCkpfXJldHVybiExfWkuZHVyYXRpb249PUluZmluaXR5P3RoaXMubm93PWU6KGM9ZS10aGlzLnN0YXJ0VGltZSx0aGlzLnN0YXRlPWMvaS5kdXJhdGlvbix0aGlzLnBvcz1mLmVhc2luZ1tpLmFuaW1hdGVkUHJvcGVydGllc1t0aGlzLnByb3BdXSh0aGlzLnN0YXRlLGMsMCwxLGkuZHVyYXRpb24pLHRoaXMubm93PXRoaXMuc3RhcnQrKHRoaXMuZW5kLXRoaXMuc3RhcnQpKnRoaXMucG9zKSx0aGlzLnVwZGF0ZSgpO3JldHVybiEwfX0sZi5leHRlbmQoZi5meCx7dGljazpmdW5jdGlvbigpe3ZhciBhLGI9Zi50aW1lcnMsYz0wO2Zvcig7YzxiLmxlbmd0aDtjKyspYT1iW2NdLCFhKCkmJmJbY109PT1hJiZiLnNwbGljZShjLS0sMSk7Yi5sZW5ndGh8fGYuZnguc3RvcCgpfSxpbnRlcnZhbDoxMyxzdG9wOmZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbChjcCksY3A9bnVsbH0sc3BlZWRzOntzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LHN0ZXA6e29wYWNpdHk6ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sIm9wYWNpdHkiLGEubm93KX0sX2RlZmF1bHQ6ZnVuY3Rpb24oYSl7YS5lbGVtLnN0eWxlJiZhLmVsZW0uc3R5bGVbYS5wcm9wXSE9bnVsbD9hLmVsZW0uc3R5bGVbYS5wcm9wXT1hLm5vdythLnVuaXQ6YS5lbGVtW2EucHJvcF09YS5ub3d9fX0pLGYuZWFjaChbIndpZHRoIiwiaGVpZ2h0Il0sZnVuY3Rpb24oYSxiKXtmLmZ4LnN0ZXBbYl09ZnVuY3Rpb24oYSl7Zi5zdHlsZShhLmVsZW0sYixNYXRoLm1heCgwLGEubm93KSthLnVuaXQpfX0pLGYuZXhwciYmZi5leHByLmZpbHRlcnMmJihmLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gZi5ncmVwKGYudGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofSk7dmFyIGN3PS9edCg/OmFibGV8ZHxoKSQvaSxjeD0vXig/OmJvZHl8aHRtbCkkL2k7ImdldEJvdW5kaW5nQ2xpZW50UmVjdCJpbiBjLmRvY3VtZW50RWxlbWVudD9mLmZuLm9mZnNldD1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdLGM7aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dHJ5e2M9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jYXRjaChkKXt9dmFyIGU9Yi5vd25lckRvY3VtZW50LGc9ZS5kb2N1bWVudEVsZW1lbnQ7aWYoIWN8fCFmLmNvbnRhaW5zKGcsYikpcmV0dXJuIGM/e3RvcDpjLnRvcCxsZWZ0OmMubGVmdH06e3RvcDowLGxlZnQ6MH07dmFyIGg9ZS5ib2R5LGk9Y3koZSksaj1nLmNsaWVudFRvcHx8aC5jbGllbnRUb3B8fDAsaz1nLmNsaWVudExlZnR8fGguY2xpZW50TGVmdHx8MCxsPWkucGFnZVlPZmZzZXR8fGYuc3VwcG9ydC5ib3hNb2RlbCYmZy5zY3JvbGxUb3B8fGguc2Nyb2xsVG9wLG09aS5wYWdlWE9mZnNldHx8Zi5zdXBwb3J0LmJveE1vZGVsJiZnLnNjcm9sbExlZnR8fGguc2Nyb2xsTGVmdCxuPWMudG9wK2wtaixvPWMubGVmdCttLWs7cmV0dXJue3RvcDpuLGxlZnQ6b319OmYuZm4ub2Zmc2V0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF07aWYoYSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe2Yub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTtpZighYnx8IWIub3duZXJEb2N1bWVudClyZXR1cm4gbnVsbDtpZihiPT09Yi5vd25lckRvY3VtZW50LmJvZHkpcmV0dXJuIGYub2Zmc2V0LmJvZHlPZmZzZXQoYik7dmFyIGMsZD1iLm9mZnNldFBhcmVudCxlPWIsZz1iLm93bmVyRG9jdW1lbnQsaD1nLmRvY3VtZW50RWxlbWVudCxpPWcuYm9keSxqPWcuZGVmYXVsdFZpZXcsaz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGw9Yi5vZmZzZXRUb3AsbT1iLm9mZnNldExlZnQ7d2hpbGUoKGI9Yi5wYXJlbnROb2RlKSYmYiE9PWkmJmIhPT1oKXtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiYmay5wb3NpdGlvbj09PSJmaXhlZCIpYnJlYWs7Yz1qP2ouZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmIuY3VycmVudFN0eWxlLGwtPWIuc2Nyb2xsVG9wLG0tPWIuc2Nyb2xsTGVmdCxiPT09ZCYmKGwrPWIub2Zmc2V0VG9wLG0rPWIub2Zmc2V0TGVmdCxmLnN1cHBvcnQuZG9lc05vdEFkZEJvcmRlciYmKCFmLnN1cHBvcnQuZG9lc0FkZEJvcmRlckZvclRhYmxlQW5kQ2VsbHN8fCFjdy50ZXN0KGIubm9kZU5hbWUpKSYmKGwrPXBhcnNlRmxvYXQoYy5ib3JkZXJUb3BXaWR0aCl8fDAsbSs9cGFyc2VGbG9hdChjLmJvcmRlckxlZnRXaWR0aCl8fDApLGU9ZCxkPWIub2Zmc2V0UGFyZW50KSxmLnN1cHBvcnQuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlJiZjLm92ZXJmbG93IT09InZpc2libGUiJiYobCs9cGFyc2VGbG9hdChjLmJvcmRlclRvcFdpZHRoKXx8MCxtKz1wYXJzZUZsb2F0KGMuYm9yZGVyTGVmdFdpZHRoKXx8MCksaz1jfWlmKGsucG9zaXRpb249PT0icmVsYXRpdmUifHxrLnBvc2l0aW9uPT09InN0YXRpYyIpbCs9aS5vZmZzZXRUb3AsbSs9aS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5maXhlZFBvc2l0aW9uJiZrLnBvc2l0aW9uPT09ImZpeGVkIiYmKGwrPU1hdGgubWF4KGguc2Nyb2xsVG9wLGkuc2Nyb2xsVG9wKSxtKz1NYXRoLm1heChoLnNjcm9sbExlZnQsaS5zY3JvbGxMZWZ0KSk7cmV0dXJue3RvcDpsLGxlZnQ6bX19LGYub2Zmc2V0PXtib2R5T2Zmc2V0OmZ1bmN0aW9uKGEpe3ZhciBiPWEub2Zmc2V0VG9wLGM9YS5vZmZzZXRMZWZ0O2Yuc3VwcG9ydC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCYmKGIrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luVG9wIikpfHwwLGMrPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCk7cmV0dXJue3RvcDpiLGxlZnQ6Y319LHNldE9mZnNldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9Zi5jc3MoYSwicG9zaXRpb24iKTtkPT09InN0YXRpYyImJihhLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpO3ZhciBlPWYoYSksZz1lLm9mZnNldCgpLGg9Zi5jc3MoYSwidG9wIiksaT1mLmNzcyhhLCJsZWZ0Iiksaj0oZD09PSJhYnNvbHV0ZSJ8fGQ9PT0iZml4ZWQiKSYmZi5pbkFycmF5KCJhdXRvIixbaCxpXSk+LTEsaz17fSxsPXt9LG0sbjtqPyhsPWUucG9zaXRpb24oKSxtPWwudG9wLG49bC5sZWZ0KToobT1wYXJzZUZsb2F0KGgpfHwwLG49cGFyc2VGbG9hdChpKXx8MCksZi5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGcpKSxiLnRvcCE9bnVsbCYmKGsudG9wPWIudG9wLWcudG9wK20pLGIubGVmdCE9bnVsbCYmKGsubGVmdD1iLmxlZnQtZy5sZWZ0K24pLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLGspOmUuY3NzKGspfX0sZi5mbi5leHRlbmQoe3Bvc2l0aW9uOmZ1bmN0aW9uKCl7aWYoIXRoaXNbMF0pcmV0dXJuIG51bGw7dmFyIGE9dGhpc1swXSxiPXRoaXMub2Zmc2V0UGFyZW50KCksYz10aGlzLm9mZnNldCgpLGQ9Y3gudGVzdChiWzBdLm5vZGVOYW1lKT97dG9wOjAsbGVmdDowfTpiLm9mZnNldCgpO2MudG9wLT1wYXJzZUZsb2F0KGYuY3NzKGEsIm1hcmdpblRvcCIpKXx8MCxjLmxlZnQtPXBhcnNlRmxvYXQoZi5jc3MoYSwibWFyZ2luTGVmdCIpKXx8MCxkLnRvcCs9cGFyc2VGbG9hdChmLmNzcyhiWzBdLCJib3JkZXJUb3BXaWR0aCIpKXx8MCxkLmxlZnQrPXBhcnNlRmxvYXQoZi5jc3MoYlswXSwiYm9yZGVyTGVmdFdpZHRoIikpfHwwO3JldHVybnt0b3A6Yy50b3AtZC50b3AsbGVmdDpjLmxlZnQtZC5sZWZ0fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vZmZzZXRQYXJlbnR8fGMuYm9keTt3aGlsZShhJiYhY3gudGVzdChhLm5vZGVOYW1lKSYmZi5jc3MoYSwicG9zaXRpb24iKT09PSJzdGF0aWMiKWE9YS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGF9KX19KSxmLmVhY2goWyJMZWZ0IiwiVG9wIl0sZnVuY3Rpb24oYSxjKXt2YXIgZD0ic2Nyb2xsIitjO2YuZm5bZF09ZnVuY3Rpb24oYyl7dmFyIGUsZztpZihjPT09Yil7ZT10aGlzWzBdO2lmKCFlKXJldHVybiBudWxsO2c9Y3koZSk7cmV0dXJuIGc/InBhZ2VYT2Zmc2V0ImluIGc/Z1thPyJwYWdlWU9mZnNldCI6InBhZ2VYT2Zmc2V0Il06Zi5zdXBwb3J0LmJveE1vZGVsJiZnLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXXx8Zy5kb2N1bWVudC5ib2R5W2RdOmVbZF19cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2c9Y3kodGhpcyksZz9nLnNjcm9sbFRvKGE/ZihnKS5zY3JvbGxMZWZ0KCk6YyxhP2M6ZihnKS5zY3JvbGxUb3AoKSk6dGhpc1tkXT1jfSl9fSksZi5lYWNoKFsiSGVpZ2h0IiwiV2lkdGgiXSxmdW5jdGlvbihhLGMpe3ZhciBkPWMudG9Mb3dlckNhc2UoKTtmLmZuWyJpbm5lciIrY109ZnVuY3Rpb24oKXt2YXIgYT10aGlzWzBdO3JldHVybiBhP2Euc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhhLGQsInBhZGRpbmciKSk6dGhpc1tkXSgpOm51bGx9LGYuZm5bIm91dGVyIitjXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzWzBdO3JldHVybiBiP2Iuc3R5bGU/cGFyc2VGbG9hdChmLmNzcyhiLGQsYT8ibWFyZ2luIjoiYm9yZGVyIikpOnRoaXNbZF0oKTpudWxsfSxmLmZuW2RdPWZ1bmN0aW9uKGEpe3ZhciBlPXRoaXNbMF07aWYoIWUpcmV0dXJuIGE9PW51bGw/bnVsbDp0aGlzO2lmKGYuaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe3ZhciBjPWYodGhpcyk7Y1tkXShhLmNhbGwodGhpcyxiLGNbZF0oKSkpfSk7aWYoZi5pc1dpbmRvdyhlKSl7dmFyIGc9ZS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10saD1lLmRvY3VtZW50LmJvZHk7cmV0dXJuIGUuZG9jdW1lbnQuY29tcGF0TW9kZT09PSJDU1MxQ29tcGF0IiYmZ3x8aCYmaFsiY2xpZW50IitjXXx8Z31pZihlLm5vZGVUeXBlPT09OSlyZXR1cm4gTWF0aC5tYXgoZS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrY10sZS5ib2R5WyJzY3JvbGwiK2NdLGUuZG9jdW1lbnRFbGVtZW50WyJzY3JvbGwiK2NdLGUuYm9keVsib2Zmc2V0IitjXSxlLmRvY3VtZW50RWxlbWVudFsib2Zmc2V0IitjXSk7aWYoYT09PWIpe3ZhciBpPWYuY3NzKGUsZCksaj1wYXJzZUZsb2F0KGkpO3JldHVybiBmLmlzTnVtZXJpYyhqKT9qOml9cmV0dXJuIHRoaXMuY3NzKGQsdHlwZW9mIGE9PSJzdHJpbmciP2E6YSsicHgiKX19KSxhLmpRdWVyeT1hLiQ9Zix0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZkZWZpbmUuYW1kJiZkZWZpbmUuYW1kLmpRdWVyeSYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIGZ9KX0pKHdpbmRvdyk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.bgiframe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMCBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFZlcnNpb24gMi4xLjMtcHJlCiAqLwoKKGZ1bmN0aW9uKCQpewoKJC5mbi5iZ2lmcmFtZSA9ICgkLmJyb3dzZXIubXNpZSAmJiAvbXNpZSA2XC4wL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSA/IGZ1bmN0aW9uKHMpIHsKICAgIHMgPSAkLmV4dGVuZCh7CiAgICAgICAgdG9wICAgICA6ICdhdXRvJywgLy8gYXV0byA9PSAuY3VycmVudFN0eWxlLmJvcmRlclRvcFdpZHRoCiAgICAgICAgbGVmdCAgICA6ICdhdXRvJywgLy8gYXV0byA9PSAuY3VycmVudFN0eWxlLmJvcmRlckxlZnRXaWR0aAogICAgICAgIHdpZHRoICAgOiAnYXV0bycsIC8vIGF1dG8gPT0gb2Zmc2V0V2lkdGgKICAgICAgICBoZWlnaHQgIDogJ2F1dG8nLCAvLyBhdXRvID09IG9mZnNldEhlaWdodAogICAgICAgIG9wYWNpdHkgOiB0cnVlLAogICAgICAgIHNyYyAgICAgOiAnamF2YXNjcmlwdDpmYWxzZTsnCiAgICB9LCBzKTsKICAgIHZhciBodG1sID0gJzxpZnJhbWUgY2xhc3M9ImJnaWZyYW1lImZyYW1lYm9yZGVyPSIwInRhYmluZGV4PSItMSJzcmM9Iicrcy5zcmMrJyInKwogICAgICAgICAgICAgICAgICAgJ3N0eWxlPSJkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6LTE7JysKICAgICAgICAgICAgICAgICAgICAgICAocy5vcGFjaXR5ICE9PSBmYWxzZT8nZmlsdGVyOkFscGhhKE9wYWNpdHk9XCcwXCcpOyc6JycpKwogICAgICAgICAgICAgICAgICAgICAgICd0b3A6Jysocy50b3A9PSdhdXRvJz8nZXhwcmVzc2lvbigoKHBhcnNlSW50KHRoaXMucGFyZW50Tm9kZS5jdXJyZW50U3R5bGUuYm9yZGVyVG9wV2lkdGgpfHwwKSotMSkrXCdweFwnKSc6cHJvcChzLnRvcCkpKyc7JysKICAgICAgICAgICAgICAgICAgICAgICAnbGVmdDonKyhzLmxlZnQ9PSdhdXRvJz8nZXhwcmVzc2lvbigoKHBhcnNlSW50KHRoaXMucGFyZW50Tm9kZS5jdXJyZW50U3R5bGUuYm9yZGVyTGVmdFdpZHRoKXx8MCkqLTEpK1wncHhcJyknOnByb3Aocy5sZWZ0KSkrJzsnKwogICAgICAgICAgICAgICAgICAgICAgICd3aWR0aDonKyhzLndpZHRoPT0nYXV0byc/J2V4cHJlc3Npb24odGhpcy5wYXJlbnROb2RlLm9mZnNldFdpZHRoK1wncHhcJyknOnByb3Aocy53aWR0aCkpKyc7JysKICAgICAgICAgICAgICAgICAgICAgICAnaGVpZ2h0OicrKHMuaGVpZ2h0PT0nYXV0byc/J2V4cHJlc3Npb24odGhpcy5wYXJlbnROb2RlLm9mZnNldEhlaWdodCtcJ3B4XCcpJzpwcm9wKHMuaGVpZ2h0KSkrJzsnKwogICAgICAgICAgICAgICAgJyIvPic7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICggJCh0aGlzKS5jaGlsZHJlbignaWZyYW1lLmJnaWZyYW1lJykubGVuZ3RoID09PSAwICkKICAgICAgICAgICAgdGhpcy5pbnNlcnRCZWZvcmUoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCksIHRoaXMuZmlyc3RDaGlsZCApOwogICAgfSk7Cn0gOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pOwoKLy8gb2xkIGFsaWFzCiQuZm4uYmdJZnJhbWUgPSAkLmZuLmJnaWZyYW1lOwoKZnVuY3Rpb24gcHJvcChuKSB7CiAgICByZXR1cm4gbiAmJiBuLmNvbnN0cnVjdG9yID09PSBOdW1iZXIgPyBuICsgJ3B4JyA6IG47Cn0KCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.bgiframe.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMCBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFZlcnNpb24gMi4xLjMtcHJlCiAqLwooZnVuY3Rpb24oJCl7JC5mbi5iZ2lmcmFtZT0oJC5icm93c2VyLm1zaWUmJi9tc2llIDZcLjAvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpP2Z1bmN0aW9uKHMpe3M9JC5leHRlbmQoe3RvcDonYXV0bycsbGVmdDonYXV0bycsd2lkdGg6J2F1dG8nLGhlaWdodDonYXV0bycsb3BhY2l0eTp0cnVlLHNyYzonamF2YXNjcmlwdDpmYWxzZTsnfSxzKTt2YXIgaHRtbD0nPGlmcmFtZSBjbGFzcz0iYmdpZnJhbWUiZnJhbWVib3JkZXI9IjAidGFiaW5kZXg9Ii0xInNyYz0iJytzLnNyYysnIicrJ3N0eWxlPSJkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6LTE7JysKKHMub3BhY2l0eSE9PWZhbHNlPydmaWx0ZXI6QWxwaGEoT3BhY2l0eT1cJzBcJyk7JzonJykrJ3RvcDonKyhzLnRvcD09J2F1dG8nPydleHByZXNzaW9uKCgocGFyc2VJbnQodGhpcy5wYXJlbnROb2RlLmN1cnJlbnRTdHlsZS5ib3JkZXJUb3BXaWR0aCl8fDApKi0xKStcJ3B4XCcpJzpwcm9wKHMudG9wKSkrJzsnKydsZWZ0OicrKHMubGVmdD09J2F1dG8nPydleHByZXNzaW9uKCgocGFyc2VJbnQodGhpcy5wYXJlbnROb2RlLmN1cnJlbnRTdHlsZS5ib3JkZXJMZWZ0V2lkdGgpfHwwKSotMSkrXCdweFwnKSc6cHJvcChzLmxlZnQpKSsnOycrJ3dpZHRoOicrKHMud2lkdGg9PSdhdXRvJz8nZXhwcmVzc2lvbih0aGlzLnBhcmVudE5vZGUub2Zmc2V0V2lkdGgrXCdweFwnKSc6cHJvcChzLndpZHRoKSkrJzsnKydoZWlnaHQ6Jysocy5oZWlnaHQ9PSdhdXRvJz8nZXhwcmVzc2lvbih0aGlzLnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0K1wncHhcJyknOnByb3Aocy5oZWlnaHQpKSsnOycrJyIvPic7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKCQodGhpcykuY2hpbGRyZW4oJ2lmcmFtZS5iZ2lmcmFtZScpLmxlbmd0aD09PTApCnRoaXMuaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaHRtbCksdGhpcy5maXJzdENoaWxkKTt9KTt9OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM7fSk7JC5mbi5iZ0lmcmFtZT0kLmZuLmJnaWZyYW1lO2Z1bmN0aW9uIHByb3Aobil7cmV0dXJuIG4mJm4uY29uc3RydWN0b3I9PT1OdW1iZXI/bisncHgnOm47fX0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.hoverIntent.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/LyoqCiogaG92ZXJJbnRlbnQgaXMgc2ltaWxhciB0byBqUXVlcnkncyBidWlsdC1pbiAiaG92ZXIiIGZ1bmN0aW9uIGV4Y2VwdCB0aGF0CiogaW5zdGVhZCBvZiBmaXJpbmcgdGhlIG9uTW91c2VPdmVyIGV2ZW50IGltbWVkaWF0ZWx5LCBob3ZlckludGVudCBjaGVja3MKKiB0byBzZWUgaWYgdGhlIHVzZXIncyBtb3VzZSBoYXMgc2xvd2VkIGRvd24gKGJlbmVhdGggdGhlIHNlbnNpdGl2aXR5CiogdGhyZXNob2xkKSBiZWZvcmUgZmlyaW5nIHRoZSBvbk1vdXNlT3ZlciBldmVudC4KKiAKKiBob3ZlckludGVudCByNSAvLyAyMDA3LjAzLjI3IC8vIGpRdWVyeSAxLjEuMgoqIDxodHRwOi8vY2hlcm5lLm5ldC9icmlhbi9yZXNvdXJjZXMvanF1ZXJ5LmhvdmVySW50ZW50Lmh0bWw+CiogCiogaG92ZXJJbnRlbnQgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlIGluIGFsbCBwZXJzb25hbCBvciBjb21tZXJjaWFsIAoqIHByb2plY3RzIHVuZGVyIGJvdGggTUlUIGFuZCBHUEwgbGljZW5zZXMuIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGNob29zZSAKKiB0aGUgbGljZW5zZSB0aGF0IGJlc3Qgc3VpdHMgeW91ciBwcm9qZWN0LCBhbmQgdXNlIGl0IGFjY29yZGluZ2x5LgoqIAoqIC8vIGJhc2ljIHVzYWdlIChqdXN0IGxpa2UgLmhvdmVyKSByZWNlaXZlcyBvbk1vdXNlT3ZlciBhbmQgb25Nb3VzZU91dCBmdW5jdGlvbnMKKiAkKCJ1bCBsaSIpLmhvdmVySW50ZW50KCBzaG93TmF2ICwgaGlkZU5hdiApOwoqIAoqIC8vIGFkdmFuY2VkIHVzYWdlIHJlY2VpdmVzIGNvbmZpZ3VyYXRpb24gb2JqZWN0IG9ubHkKKiAkKCJ1bCBsaSIpLmhvdmVySW50ZW50KHsKKglzZW5zaXRpdml0eTogMiwgLy8gbnVtYmVyID0gc2Vuc2l0aXZpdHkgdGhyZXNob2xkIChtdXN0IGJlIDEgb3IgaGlnaGVyKQoqCWludGVydmFsOiA1MCwgICAvLyBudW1iZXIgPSBtaWxsaXNlY29uZHMgb2YgcG9sbGluZyBpbnRlcnZhbAoqCW92ZXI6IHNob3dOYXYsICAvLyBmdW5jdGlvbiA9IG9uTW91c2VPdmVyIGNhbGxiYWNrIChyZXF1aXJlZCkKKgl0aW1lb3V0OiAxMDAsICAgLy8gbnVtYmVyID0gbWlsbGlzZWNvbmRzIGRlbGF5IGJlZm9yZSBvbk1vdXNlT3V0IGZ1bmN0aW9uIGNhbGwKKglvdXQ6IGhpZGVOYXYgICAgLy8gZnVuY3Rpb24gPSBvbk1vdXNlT3V0IGNhbGxiYWNrIChyZXF1aXJlZCkKKiB9KTsKKiAKKiBAcGFyYW0gIGYgIG9uTW91c2VPdmVyIGZ1bmN0aW9uIHx8IEFuIG9iamVjdCB3aXRoIGNvbmZpZ3VyYXRpb24gb3B0aW9ucwoqIEBwYXJhbSAgZyAgb25Nb3VzZU91dCBmdW5jdGlvbiAgfHwgTm90aGluZyAodXNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvYmplY3QpCiogQHJldHVybiAgICBUaGUgb2JqZWN0IChha2EgInRoaXMiKSB0aGF0IGNhbGxlZCBob3ZlckludGVudCwgYW5kIHRoZSBldmVudCBvYmplY3QKKiBAYXV0aG9yICAgIEJyaWFuIENoZXJuZSA8YnJpYW5AY2hlcm5lLm5ldD4KKiAKKiBtb2RpZmllZCBieSBLYXJsIFN3ZWRiZXJnLiBOYW1lc3BhY2VkIGV2ZW50cyBpbiBvcmRlciB0byB3b3JrIGJldHRlciB3aXRoIGNsdWVUaXAgcGx1Z2luCiovCihmdW5jdGlvbigkKSB7CgkkLmZuLmhvdmVySW50ZW50ID0gZnVuY3Rpb24oZixnKSB7CgkJLy8gZGVmYXVsdCBjb25maWd1cmF0aW9uIG9wdGlvbnMKCQl2YXIgY2ZnID0gewoJCQlzZW5zaXRpdml0eTogNywKCQkJaW50ZXJ2YWw6IDEwMCwKCQkJdGltZW91dDogMAoJCX07CgkJLy8gb3ZlcnJpZGUgY29uZmlndXJhdGlvbiBvcHRpb25zIHdpdGggdXNlciBzdXBwbGllZCBvYmplY3QKCQljZmcgPSAkLmV4dGVuZChjZmcsIGcgPyB7IG92ZXI6IGYsIG91dDogZyB9IDogZiApOwoKCQkvLyBpbnN0YW50aWF0ZSB2YXJpYWJsZXMKCQkvLyBjWCwgY1kgPSBjdXJyZW50IFggYW5kIFkgcG9zaXRpb24gb2YgbW91c2UsIHVwZGF0ZWQgYnkgbW91c2Vtb3ZlIGV2ZW50CgkJLy8gcFgsIHBZID0gcHJldmlvdXMgWCBhbmQgWSBwb3NpdGlvbiBvZiBtb3VzZSwgc2V0IGJ5IG1vdXNlb3ZlciBhbmQgcG9sbGluZyBpbnRlcnZhbAoJCXZhciBjWCwgY1ksIHBYLCBwWTsKCgkJLy8gQSBwcml2YXRlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIG1vdXNlIHBvc2l0aW9uCgkJdmFyIHRyYWNrID0gZnVuY3Rpb24oZXYpIHsKCQkJY1ggPSBldi5wYWdlWDsKCQkJY1kgPSBldi5wYWdlWTsKCQl9OwoKCQkvLyBBIHByaXZhdGUgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBjdXJyZW50IGFuZCBwcmV2aW91cyBtb3VzZSBwb3NpdGlvbgoJCXZhciBjb21wYXJlID0gZnVuY3Rpb24oZXYsb2IpIHsKCQkJb2IuaG92ZXJJbnRlbnRfdCA9IGNsZWFyVGltZW91dChvYi5ob3ZlckludGVudF90KTsKCQkJLy8gY29tcGFyZSBtb3VzZSBwb3NpdGlvbnMgdG8gc2VlIGlmIHRoZXkndmUgY3Jvc3NlZCB0aGUgdGhyZXNob2xkCgkJCWlmICggKCBNYXRoLmFicyhwWC1jWCkgKyBNYXRoLmFicyhwWS1jWSkgKSA8IGNmZy5zZW5zaXRpdml0eSApIHsKCQkJCSQob2IpLnVuYmluZCgibW91c2Vtb3ZlIix0cmFjayk7CgkJCQkvLyBzZXQgaG92ZXJJbnRlbnQgc3RhdGUgdG8gdHJ1ZSAoc28gbW91c2VPdXQgY2FuIGJlIGNhbGxlZCkKCQkJCW9iLmhvdmVySW50ZW50X3MgPSAxOwoJCQkJcmV0dXJuIGNmZy5vdmVyLmFwcGx5KG9iLFtldl0pOwoJCQl9IGVsc2UgewoJCQkJLy8gc2V0IHByZXZpb3VzIGNvb3JkaW5hdGVzIGZvciBuZXh0IHRpbWUKCQkJCXBYID0gY1g7IHBZID0gY1k7CgkJCQkvLyB1c2Ugc2VsZi1jYWxsaW5nIHRpbWVvdXQsIGd1YXJhbnRlZXMgaW50ZXJ2YWxzIGFyZSBzcGFjZWQgb3V0IHByb3Blcmx5IChhdm9pZHMgSmF2YVNjcmlwdCB0aW1lciBidWdzKQoJCQkJb2IuaG92ZXJJbnRlbnRfdCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCl7Y29tcGFyZShldiwgb2IpO30gLCBjZmcuaW50ZXJ2YWwgKTsKCQkJfQoJCX07CgoJCS8vIEEgcHJpdmF0ZSBmdW5jdGlvbiBmb3IgZGVsYXlpbmcgdGhlIG1vdXNlT3V0IGZ1bmN0aW9uCgkJdmFyIGRlbGF5ID0gZnVuY3Rpb24oZXYsb2IpIHsKCQkJb2IuaG92ZXJJbnRlbnRfdCA9IGNsZWFyVGltZW91dChvYi5ob3ZlckludGVudF90KTsKCQkJb2IuaG92ZXJJbnRlbnRfcyA9IDA7CgkJCXJldHVybiBjZmcub3V0LmFwcGx5KG9iLFtldl0pOwoJCX07CgoJCS8vIEEgcHJpdmF0ZSBmdW5jdGlvbiBmb3IgaGFuZGxpbmcgbW91c2UgJ2hvdmVyaW5nJwoJCXZhciBoYW5kbGVIb3ZlciA9IGZ1bmN0aW9uKGUpIHsKCQkJLy8gbmV4dCB0aHJlZSBsaW5lcyBjb3BpZWQgZnJvbSBqUXVlcnkuaG92ZXIsIGlnbm9yZSBjaGlsZHJlbiBvbk1vdXNlT3Zlci9vbk1vdXNlT3V0CgkJCXZhciBwID0gKGUudHlwZSA9PSAibW91c2VvdmVyIiA/IGUuZnJvbUVsZW1lbnQgOiBlLnRvRWxlbWVudCkgfHwgZS5yZWxhdGVkVGFyZ2V0OwoJCQl3aGlsZSAoIHAgJiYgcCAhPSB0aGlzICkgeyB0cnkgeyBwID0gcC5wYXJlbnROb2RlOyB9IGNhdGNoKGUpIHsgcCA9IHRoaXM7IH0gfQoJCQlpZiAoIHAgPT0gdGhpcyApIHsgcmV0dXJuIGZhbHNlOyB9CgoJCQkvLyBjb3B5IG9iamVjdHMgdG8gYmUgcGFzc2VkIGludG8gdCAocmVxdWlyZWQgZm9yIGV2ZW50IG9iamVjdCB0byBiZSBwYXNzZWQgaW4gSUUpCgkJCXZhciBldiA9IGpRdWVyeS5leHRlbmQoe30sZSk7CgkJCXZhciBvYiA9IHRoaXM7CgoJCQkvLyBjYW5jZWwgaG92ZXJJbnRlbnQgdGltZXIgaWYgaXQgZXhpc3RzCgkJCWlmIChvYi5ob3ZlckludGVudF90KSB7IG9iLmhvdmVySW50ZW50X3QgPSBjbGVhclRpbWVvdXQob2IuaG92ZXJJbnRlbnRfdCk7IH0KCgkJCS8vIGVsc2UgZS50eXBlID09ICJvbm1vdXNlb3ZlciIKCQkJaWYgKGUudHlwZSA9PSAibW91c2VvdmVyIikgewoJCQkJLy8gc2V0ICJwcmV2aW91cyIgWCBhbmQgWSBwb3NpdGlvbiBiYXNlZCBvbiBpbml0aWFsIGVudHJ5IHBvaW50CgkJCQlwWCA9IGV2LnBhZ2VYOyBwWSA9IGV2LnBhZ2VZOwoJCQkJLy8gdXBkYXRlICJjdXJyZW50IiBYIGFuZCBZIHBvc2l0aW9uIGJhc2VkIG9uIG1vdXNlbW92ZQoJCQkJJChvYikuYmluZCgibW91c2Vtb3ZlLmNsdWV0aXAiLHRyYWNrKTsKCQkJCS8vIHN0YXJ0IHBvbGxpbmcgaW50ZXJ2YWwgKHNlbGYtY2FsbGluZyB0aW1lb3V0KSB0byBjb21wYXJlIG1vdXNlIGNvb3JkaW5hdGVzIG92ZXIgdGltZQoJCQkJaWYgKG9iLmhvdmVySW50ZW50X3MgIT0gMSkgeyBvYi5ob3ZlckludGVudF90ID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXtjb21wYXJlKGV2LG9iKTt9ICwgY2ZnLmludGVydmFsICk7fQoKCQkJLy8gZWxzZSBlLnR5cGUgPT0gIm9ubW91c2VvdXQiCgkJCX0gZWxzZSB7CgkJCQkvLyB1bmJpbmQgZXhwZW5zaXZlIG1vdXNlbW92ZSBldmVudAoJCQkJJChvYikudW5iaW5kKCJtb3VzZW1vdmUuY2x1ZXRpcCIsdHJhY2spOwoJCQkJLy8gaWYgaG92ZXJJbnRlbnQgc3RhdGUgaXMgdHJ1ZSwgdGhlbiBjYWxsIHRoZSBtb3VzZU91dCBmdW5jdGlvbiBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CgkJCQlpZiAob2IuaG92ZXJJbnRlbnRfcyA9PSAxKSB7IG9iLmhvdmVySW50ZW50X3QgPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpe2RlbGF5KGV2LG9iKTt9ICwgY2ZnLnRpbWVvdXQgKTt9CgkJCX0KCQl9OwoKCQkvLyBiaW5kIHRoZSBmdW5jdGlvbiB0byB0aGUgdHdvIGV2ZW50IGxpc3RlbmVycwoJCXJldHVybiB0aGlzLmJpbmQoJ21vdXNlb3Zlci5jbHVldGlwJywgaGFuZGxlSG92ZXIpLmJpbmQoJ21vdXNlb3V0LmNsdWV0aXAnLCBoYW5kbGVIb3Zlcik7Cgl9Owp9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/jquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjEuNi4zCiAqIGh0dHA6Ly9qcXVlcnkuY29tLwogKgogKiBDb3B5cmlnaHQgMjAxMSwgSm9obiBSZXNpZwogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgb3IgR1BMIFZlcnNpb24gMiBsaWNlbnNlcy4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBJbmNsdWRlcyBTaXp6bGUuanMKICogaHR0cDovL3NpenpsZWpzLmNvbS8KICogQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCwgQlNELCBhbmQgR1BMIExpY2Vuc2VzLgogKgogKiBEYXRlOiBXZWQgQXVnIDMxIDEwOjUwOjMzIDIwMTEgLTA0MDAKICovCihmdW5jdGlvbiggd2luZG93LCB1bmRlZmluZWQgKSB7CgovLyBVc2UgdGhlIGNvcnJlY3QgZG9jdW1lbnQgYWNjb3JkaW5nbHkgd2l0aCB3aW5kb3cgYXJndW1lbnQgKHNhbmRib3gpCnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudCwKCW5hdmlnYXRvciA9IHdpbmRvdy5uYXZpZ2F0b3IsCglsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbjsKdmFyIGpRdWVyeSA9IChmdW5jdGlvbigpIHsKCi8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5CnZhciBqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJLy8gVGhlIGpRdWVyeSBvYmplY3QgaXMgYWN0dWFsbHkganVzdCB0aGUgaW5pdCBjb25zdHJ1Y3RvciAnZW5oYW5jZWQnCgkJcmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKTsKCX0sCgoJLy8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlCglfalF1ZXJ5ID0gd2luZG93LmpRdWVyeSwKCgkvLyBNYXAgb3ZlciB0aGUgJCBpbiBjYXNlIG9mIG92ZXJ3cml0ZQoJXyQgPSB3aW5kb3cuJCwKCgkvLyBBIGNlbnRyYWwgcmVmZXJlbmNlIHRvIHRoZSByb290IGpRdWVyeShkb2N1bWVudCkKCXJvb3RqUXVlcnksCgoJLy8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Mgb3IgSUQgc3RyaW5ncwoJLy8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKQoJcXVpY2tFeHByID0gL14oPzpbXiM8XSooPFtcd1xXXSs+KVtePl0qJHwjKFtcd1wtXSopJCkvLAoKCS8vIENoZWNrIGlmIGEgc3RyaW5nIGhhcyBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBpdAoJcm5vdHdoaXRlID0gL1xTLywKCgkvLyBVc2VkIGZvciB0cmltbWluZyB3aGl0ZXNwYWNlCgl0cmltTGVmdCA9IC9eXHMrLywKCXRyaW1SaWdodCA9IC9ccyskLywKCgkvLyBDaGVjayBmb3IgZGlnaXRzCglyZGlnaXQgPSAvXGQvLAoKCS8vIE1hdGNoIGEgc3RhbmRhbG9uZSB0YWcKCXJzaW5nbGVUYWcgPSAvXjwoXHcrKVxzKlwvPz4oPzo8XC9cMT4pPyQvLAoKCS8vIEpTT04gUmVnRXhwCglydmFsaWRjaGFycyA9IC9eW1xdLDp7fVxzXSokLywKCXJ2YWxpZGVzY2FwZSA9IC9cXCg/OlsiXFxcL2JmbnJ0XXx1WzAtOWEtZkEtRl17NH0pL2csCglydmFsaWR0b2tlbnMgPSAvIlteIlxcXG5ccl0qInx0cnVlfGZhbHNlfG51bGx8LT9cZCsoPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/L2csCglydmFsaWRicmFjZXMgPSAvKD86Xnw6fCwpKD86XHMqXFspKy9nLAoKCS8vIFVzZXJhZ2VudCBSZWdFeHAKCXJ3ZWJraXQgPSAvKHdlYmtpdClbIFwvXShbXHcuXSspLywKCXJvcGVyYSA9IC8ob3BlcmEpKD86Lip2ZXJzaW9uKT9bIFwvXShbXHcuXSspLywKCXJtc2llID0gLyhtc2llKSAoW1x3Ll0rKS8sCglybW96aWxsYSA9IC8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKykpPy8sCgoJLy8gTWF0Y2hlcyBkYXNoZWQgc3RyaW5nIGZvciBjYW1lbGl6aW5nCglyZGFzaEFscGhhID0gLy0oW2Etel18WzAtOV0pL2lnLAoJcm1zUHJlZml4ID0gL14tbXMtLywKCgkvLyBVc2VkIGJ5IGpRdWVyeS5jYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpCglmY2FtZWxDYXNlID0gZnVuY3Rpb24oIGFsbCwgbGV0dGVyICkgewoJCXJldHVybiAoIGxldHRlciArICIiICkudG9VcHBlckNhc2UoKTsKCX0sCgoJLy8gS2VlcCBhIFVzZXJBZ2VudCBzdHJpbmcgZm9yIHVzZSB3aXRoIGpRdWVyeS5icm93c2VyCgl1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50LAoKCS8vIEZvciBtYXRjaGluZyB0aGUgZW5naW5lIGFuZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyCglicm93c2VyTWF0Y2gsCgoJLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5CglyZWFkeUxpc3QsCgoJLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIKCURPTUNvbnRlbnRMb2FkZWQsCgoJLy8gU2F2ZSBhIHJlZmVyZW5jZSB0byBzb21lIGNvcmUgbWV0aG9kcwoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzT3duID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSwKCXB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaCwKCXNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLAoJdHJpbSA9IFN0cmluZy5wcm90b3R5cGUudHJpbSwKCWluZGV4T2YgPSBBcnJheS5wcm90b3R5cGUuaW5kZXhPZiwKCgkvLyBbW0NsYXNzXV0gLT4gdHlwZSBwYWlycwoJY2xhc3MydHlwZSA9IHt9OwoKalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKCWNvbnN0cnVjdG9yOiBqUXVlcnksCglpbml0OiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3RqUXVlcnkgKSB7CgkJdmFyIG1hdGNoLCBlbGVtLCByZXQsIGRvYzsKCgkJLy8gSGFuZGxlICQoIiIpLCAkKG51bGwpLCBvciAkKHVuZGVmaW5lZCkKCQlpZiAoICFzZWxlY3RvciApIHsKCQkJcmV0dXJuIHRoaXM7CgkJfQoKCQkvLyBIYW5kbGUgJChET01FbGVtZW50KQoJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7CgkJCXRoaXMuY29udGV4dCA9IHRoaXNbMF0gPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCWlmICggc2VsZWN0b3IgPT09ICJib2R5IiAmJiAhY29udGV4dCAmJiBkb2N1bWVudC5ib2R5ICkgewoJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJdGhpc1swXSA9IGRvY3VtZW50LmJvZHk7CgkJCXRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKCQkJdGhpcy5sZW5ndGggPSAxOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCS8vIEhhbmRsZSBIVE1MIHN0cmluZ3MKCQlpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCS8vIEFyZSB3ZSBkZWFsaW5nIHdpdGggSFRNTCBzdHJpbmcgb3IgYW4gSUQ/CgkJCWlmICggc2VsZWN0b3IuY2hhckF0KDApID09PSAiPCIgJiYgc2VsZWN0b3IuY2hhckF0KCBzZWxlY3Rvci5sZW5ndGggLSAxICkgPT09ICI+IiAmJiBzZWxlY3Rvci5sZW5ndGggPj0gMyApIHsKCQkJCS8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrCgkJCQltYXRjaCA9IFsgbnVsbCwgc2VsZWN0b3IsIG51bGwgXTsKCgkJCX0gZWxzZSB7CgkJCQltYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwoJCQl9CgoJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVkIGZvciAjaWQKCQkJaWYgKCBtYXRjaCAmJiAobWF0Y2hbMV0gfHwgIWNvbnRleHQpICkgewoKCQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQoJCQkJaWYgKCBtYXRjaFsxXSApIHsKCQkJCQljb250ZXh0ID0gY29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSA/IGNvbnRleHRbMF0gOiBjb250ZXh0OwoJCQkJCWRvYyA9IChjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCk7CgoJCQkJCS8vIElmIGEgc2luZ2xlIHN0cmluZyBpcyBwYXNzZWQgaW4gYW5kIGl0J3MgYSBzaW5nbGUgdGFnCgkJCQkJLy8ganVzdCBkbyBhIGNyZWF0ZUVsZW1lbnQgYW5kIHNraXAgdGhlIHJlc3QKCQkJCQlyZXQgPSByc2luZ2xlVGFnLmV4ZWMoIHNlbGVjdG9yICk7CgoJCQkJCWlmICggcmV0ICkgewoJCQkJCQlpZiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb250ZXh0ICkgKSB7CgkJCQkJCQlzZWxlY3RvciA9IFsgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggcmV0WzFdICkgXTsKCQkJCQkJCWpRdWVyeS5mbi5hdHRyLmNhbGwoIHNlbGVjdG9yLCBjb250ZXh0LCB0cnVlICk7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJc2VsZWN0b3IgPSBbIGRvYy5jcmVhdGVFbGVtZW50KCByZXRbMV0gKSBdOwoJCQkJCQl9CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldCA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBbIG1hdGNoWzFdIF0sIFsgZG9jIF0gKTsKCQkJCQkJc2VsZWN0b3IgPSAocmV0LmNhY2hlYWJsZSA/IGpRdWVyeS5jbG9uZShyZXQuZnJhZ21lbnQpIDogcmV0LmZyYWdtZW50KS5jaGlsZE5vZGVzOwoJCQkJCX0KCgkJCQkJcmV0dXJuIGpRdWVyeS5tZXJnZSggdGhpcywgc2VsZWN0b3IgKTsKCgkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCgkJCQl9IGVsc2UgewoJCQkJCWVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbMl0gKTsKCgkJCQkJLy8gQ2hlY2sgcGFyZW50Tm9kZSB0byBjYXRjaCB3aGVuIEJsYWNrYmVycnkgNC42IHJldHVybnMKCQkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIElFIGFuZCBPcGVyYSByZXR1cm4gaXRlbXMKCQkJCQkJLy8gYnkgbmFtZSBpbnN0ZWFkIG9mIElECgkJCQkJCWlmICggZWxlbS5pZCAhPT0gbWF0Y2hbMl0gKSB7CgkJCQkJCQlyZXR1cm4gcm9vdGpRdWVyeS5maW5kKCBzZWxlY3RvciApOwoJCQkJCQl9CgoJCQkJCQkvLyBPdGhlcndpc2UsIHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CgkJCQkJCXRoaXMubGVuZ3RoID0gMTsKCQkJCQkJdGhpc1swXSA9IGVsZW07CgkJCQkJfQoKCQkJCQl0aGlzLmNvbnRleHQgPSBkb2N1bWVudDsKCQkJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9CgoJCQkvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKQoJCQl9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHsKCQkJCXJldHVybiAoY29udGV4dCB8fCByb290alF1ZXJ5KS5maW5kKCBzZWxlY3RvciApOwoKCQkJLy8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpCgkJCS8vICh3aGljaCBpcyBqdXN0IGVxdWl2YWxlbnQgdG86ICQoY29udGV4dCkuZmluZChleHByKQoJCQl9IGVsc2UgewoJCQkJcmV0dXJuIHRoaXMuY29uc3RydWN0b3IoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOwoJCQl9CgoJCS8vIEhBTkRMRTogJChmdW5jdGlvbikKCQkvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHkKCQl9IGVsc2UgaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHsKCQkJcmV0dXJuIHJvb3RqUXVlcnkucmVhZHkoIHNlbGVjdG9yICk7CgkJfQoKCQlpZiAoc2VsZWN0b3Iuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCkgewoJCQl0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3Iuc2VsZWN0b3I7CgkJCXRoaXMuY29udGV4dCA9IHNlbGVjdG9yLmNvbnRleHQ7CgkJfQoKCQlyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTsKCX0sCgoJLy8gU3RhcnQgd2l0aCBhbiBlbXB0eSBzZWxlY3RvcgoJc2VsZWN0b3I6ICIiLAoKCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWQKCWpxdWVyeTogIjEuNi4zIiwKCgkvLyBUaGUgZGVmYXVsdCBsZW5ndGggb2YgYSBqUXVlcnkgb2JqZWN0IGlzIDAKCWxlbmd0aDogMCwKCgkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAoJc2l6ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubGVuZ3RoOwoJfSwKCgl0b0FycmF5OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gc2xpY2UuY2FsbCggdGhpcywgMCApOwoJfSwKCgkvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SCgkvLyBHZXQgdGhlIHdob2xlIG1hdGNoZWQgZWxlbWVudCBzZXQgYXMgYSBjbGVhbiBhcnJheQoJZ2V0OiBmdW5jdGlvbiggbnVtICkgewoJCXJldHVybiBudW0gPT0gbnVsbCA/CgoJCQkvLyBSZXR1cm4gYSAnY2xlYW4nIGFycmF5CgkJCXRoaXMudG9BcnJheSgpIDoKCgkJCS8vIFJldHVybiBqdXN0IHRoZSBvYmplY3QKCQkJKCBudW0gPCAwID8gdGhpc1sgdGhpcy5sZW5ndGggKyBudW0gXSA6IHRoaXNbIG51bSBdICk7Cgl9LAoKCS8vIFRha2UgYW4gYXJyYXkgb2YgZWxlbWVudHMgYW5kIHB1c2ggaXQgb250byB0aGUgc3RhY2sKCS8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KQoJcHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMsIG5hbWUsIHNlbGVjdG9yICkgewoJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0CgkJdmFyIHJldCA9IHRoaXMuY29uc3RydWN0b3IoKTsKCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggZWxlbXMgKSApIHsKCQkJcHVzaC5hcHBseSggcmV0LCBlbGVtcyApOwoKCQl9IGVsc2UgewoJCQlqUXVlcnkubWVyZ2UoIHJldCwgZWxlbXMgKTsKCQl9CgoJCS8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpCgkJcmV0LnByZXZPYmplY3QgPSB0aGlzOwoKCQlyZXQuY29udGV4dCA9IHRoaXMuY29udGV4dDsKCgkJaWYgKCBuYW1lID09PSAiZmluZCIgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAodGhpcy5zZWxlY3RvciA/ICIgIiA6ICIiKSArIHNlbGVjdG9yOwoJCX0gZWxzZSBpZiAoIG5hbWUgKSB7CgkJCXJldC5zZWxlY3RvciA9IHRoaXMuc2VsZWN0b3IgKyAiLiIgKyBuYW1lICsgIigiICsgc2VsZWN0b3IgKyAiKSI7CgkJfQoKCQkvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldAoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuCgkvLyAoWW91IGNhbiBzZWVkIHRoZSBhcmd1bWVudHMgd2l0aCBhbiBhcnJheSBvZiBhcmdzLCBidXQgdGhpcyBpcwoJLy8gb25seSB1c2VkIGludGVybmFsbHkuKQoJZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrLCBhcmdzICkgewoJCXJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2ssIGFyZ3MgKTsKCX0sCgoJcmVhZHk6IGZ1bmN0aW9uKCBmbiApIHsKCQkvLyBBdHRhY2ggdGhlIGxpc3RlbmVycwoJCWpRdWVyeS5iaW5kUmVhZHkoKTsKCgkJLy8gQWRkIHRoZSBjYWxsYmFjawoJCXJlYWR5TGlzdC5kb25lKCBmbiApOwoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZXE6IGZ1bmN0aW9uKCBpICkgewoJCXJldHVybiBpID09PSAtMSA/CgkJCXRoaXMuc2xpY2UoIGkgKSA6CgkJCXRoaXMuc2xpY2UoIGksICtpICsgMSApOwoJfSwKCglmaXJzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIDAgKTsKCX0sCgoJbGFzdDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZXEoIC0xICk7Cgl9LAoKCXNsaWNlOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHNsaWNlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJInNsaWNlIiwgc2xpY2UuY2FsbChhcmd1bWVudHMpLmpvaW4oIiwiKSApOwoJfSwKCgltYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHsKCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAodGhpcywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7CgkJfSkpOwoJfSwKCgllbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLnByZXZPYmplY3QgfHwgdGhpcy5jb25zdHJ1Y3RvcihudWxsKTsKCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJLy8gQmVoYXZlcyBsaWtlIGFuIEFycmF5J3MgbWV0aG9kLCBub3QgbGlrZSBhIGpRdWVyeSBtZXRob2QuCglwdXNoOiBwdXNoLAoJc29ydDogW10uc29ydCwKCXNwbGljZTogW10uc3BsaWNlCn07CgovLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uCmpRdWVyeS5mbi5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjsKCmpRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVuY3Rpb24oKSB7Cgl2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsCgkJdGFyZ2V0ID0gYXJndW1lbnRzWzBdIHx8IHt9LAoJCWkgPSAxLAoJCWxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCgkJZGVlcCA9IGZhbHNlOwoKCS8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb24KCWlmICggdHlwZW9mIHRhcmdldCA9PT0gImJvb2xlYW4iICkgewoJCWRlZXAgPSB0YXJnZXQ7CgkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OwoJCS8vIHNraXAgdGhlIGJvb2xlYW4gYW5kIHRoZSB0YXJnZXQKCQlpID0gMjsKCX0KCgkvLyBIYW5kbGUgY2FzZSB3aGVuIHRhcmdldCBpcyBhIHN0cmluZyBvciBzb21ldGhpbmcgKHBvc3NpYmxlIGluIGRlZXAgY29weSkKCWlmICggdHlwZW9mIHRhcmdldCAhPT0gIm9iamVjdCIgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKHRhcmdldCkgKSB7CgkJdGFyZ2V0ID0ge307Cgl9CgoJLy8gZXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkCglpZiAoIGxlbmd0aCA9PT0gaSApIHsKCQl0YXJnZXQgPSB0aGlzOwoJCS0taTsKCX0KCglmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzCgkJaWYgKCAob3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkgewoJCQkvLyBFeHRlbmQgdGhlIGJhc2Ugb2JqZWN0CgkJCWZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHsKCQkJCXNyYyA9IHRhcmdldFsgbmFtZSBdOwoJCQkJY29weSA9IG9wdGlvbnNbIG5hbWUgXTsKCgkJCQkvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wCgkJCQlpZiAoIHRhcmdldCA9PT0gY29weSApIHsKCQkJCQljb250aW51ZTsKCQkJCX0KCgkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgcGxhaW4gb2JqZWN0cyBvciBhcnJheXMKCQkJCWlmICggZGVlcCAmJiBjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoY29weSkgfHwgKGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoY29weSkpICkgKSB7CgkJCQkJaWYgKCBjb3B5SXNBcnJheSApIHsKCQkJCQkJY29weUlzQXJyYXkgPSBmYWxzZTsKCQkJCQkJY2xvbmUgPSBzcmMgJiYgalF1ZXJ5LmlzQXJyYXkoc3JjKSA/IHNyYyA6IFtdOwoKCQkJCQl9IGVsc2UgewoJCQkJCQljbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdChzcmMpID8gc3JjIDoge307CgkJCQkJfQoKCQkJCQkvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW0KCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7CgoJCQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcwoJCQkJfSBlbHNlIGlmICggY29weSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXRhcmdldFsgbmFtZSBdID0gY29weTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdAoJcmV0dXJuIHRhcmdldDsKfTsKCmpRdWVyeS5leHRlbmQoewoJbm9Db25mbGljdDogZnVuY3Rpb24oIGRlZXAgKSB7CgkJaWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkgewoJCQl3aW5kb3cuJCA9IF8kOwoJCX0KCgkJaWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHsKCQkJd2luZG93LmpRdWVyeSA9IF9qUXVlcnk7CgkJfQoKCQlyZXR1cm4galF1ZXJ5OwoJfSwKCgkvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLgoJaXNSZWFkeTogZmFsc2UsCgoJLy8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZQoJLy8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODEKCXJlYWR5V2FpdDogMSwKCgkvLyBIb2xkIChvciByZWxlYXNlKSB0aGUgcmVhZHkgZXZlbnQKCWhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7CgkJaWYgKCBob2xkICkgewoJCQlqUXVlcnkucmVhZHlXYWl0Kys7CgkJfSBlbHNlIHsKCQkJalF1ZXJ5LnJlYWR5KCB0cnVlICk7CgkJfQoJfSwKCgkvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5CglyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7CgkJLy8gRWl0aGVyIGEgcmVsZWFzZWQgaG9sZCBvciBhbiBET01yZWFkeS9sb2FkIGV2ZW50IGFuZCBub3QgeWV0IHJlYWR5CgkJaWYgKCAod2FpdCA9PT0gdHJ1ZSAmJiAhLS1qUXVlcnkucmVhZHlXYWl0KSB8fCAod2FpdCAhPT0gdHJ1ZSAmJiAhalF1ZXJ5LmlzUmVhZHkpICkgewoJCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJCWlmICggIWRvY3VtZW50LmJvZHkgKSB7CgkJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJCX0KCgkJCS8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeQoJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CgoJCQkvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZQoJCQlpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZQoJCQlyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7CgoJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCByZWFkeSBldmVudHMKCQkJaWYgKCBqUXVlcnkuZm4udHJpZ2dlciApIHsKCQkJCWpRdWVyeSggZG9jdW1lbnQgKS50cmlnZ2VyKCAicmVhZHkiICkudW5iaW5kKCAicmVhZHkiICk7CgkJCX0KCQl9Cgl9LAoKCWJpbmRSZWFkeTogZnVuY3Rpb24oKSB7CgkJaWYgKCByZWFkeUxpc3QgKSB7CgkJCXJldHVybjsKCQl9CgoJCXJlYWR5TGlzdCA9IGpRdWVyeS5fRGVmZXJyZWQoKTsKCgkJLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWQgYWZ0ZXIgdGhlCgkJLy8gYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC4KCQlpZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIgKSB7CgkJCS8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeQoJCQlyZXR1cm4gc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5LCAxICk7CgkJfQoKCQkvLyBNb3ppbGxhLCBPcGVyYSBhbmQgd2Via2l0IG5pZ2h0bGllcyBjdXJyZW50bHkgc3VwcG9ydCB0aGlzIGV2ZW50CgkJaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJCQkvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrCgkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAibG9hZCIsIGpRdWVyeS5yZWFkeSwgZmFsc2UgKTsKCgkJLy8gSWYgSUUgZXZlbnQgbW9kZWwgaXMgdXNlZAoJCX0gZWxzZSBpZiAoIGRvY3VtZW50LmF0dGFjaEV2ZW50ICkgewoJCQkvLyBlbnN1cmUgZmlyaW5nIGJlZm9yZSBvbmxvYWQsCgkJCS8vIG1heWJlIGxhdGUgYnV0IHNhZmUgYWxzbyBmb3IgaWZyYW1lcwoJCQlkb2N1bWVudC5hdHRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCgkJCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrCgkJCXdpbmRvdy5hdHRhY2hFdmVudCggIm9ubG9hZCIsIGpRdWVyeS5yZWFkeSApOwoKCQkJLy8gSWYgSUUgYW5kIG5vdCBhIGZyYW1lCgkJCS8vIGNvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBpZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKCQkJdmFyIHRvcGxldmVsID0gZmFsc2U7CgoJCQl0cnkgewoJCQkJdG9wbGV2ZWwgPSB3aW5kb3cuZnJhbWVFbGVtZW50ID09IG51bGw7CgkJCX0gY2F0Y2goZSkge30KCgkJCWlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsICYmIHRvcGxldmVsICkgewoJCQkJZG9TY3JvbGxDaGVjaygpOwoJCQl9CgkJfQoJfSwKCgkvLyBTZWUgdGVzdC91bml0L2NvcmUuanMgZm9yIGRldGFpbHMgY29uY2VybmluZyBpc0Z1bmN0aW9uLgoJLy8gU2luY2UgdmVyc2lvbiAxLjMsIERPTSBtZXRob2RzIGFuZCBmdW5jdGlvbnMgbGlrZSBhbGVydAoJLy8gYXJlbid0IHN1cHBvcnRlZC4gVGhleSByZXR1cm4gZmFsc2Ugb24gSUUgKCMyOTY4KS4KCWlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIGpRdWVyeS50eXBlKG9iaikgPT09ICJmdW5jdGlvbiI7Cgl9LAoKCWlzQXJyYXk6IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4galF1ZXJ5LnR5cGUob2JqKSA9PT0gImFycmF5IjsKCX0sCgoJLy8gQSBjcnVkZSB3YXkgb2YgZGV0ZXJtaW5pbmcgaWYgYW4gb2JqZWN0IGlzIGEgd2luZG93Cglpc1dpbmRvdzogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICYmICJzZXRJbnRlcnZhbCIgaW4gb2JqOwoJfSwKCglpc05hTjogZnVuY3Rpb24oIG9iaiApIHsKCQlyZXR1cm4gb2JqID09IG51bGwgfHwgIXJkaWdpdC50ZXN0KCBvYmogKSB8fCBpc05hTiggb2JqICk7Cgl9LAoKCXR5cGU6IGZ1bmN0aW9uKCBvYmogKSB7CgkJcmV0dXJuIG9iaiA9PSBudWxsID8KCQkJU3RyaW5nKCBvYmogKSA6CgkJCWNsYXNzMnR5cGVbIHRvU3RyaW5nLmNhbGwob2JqKSBdIHx8ICJvYmplY3QiOwoJfSwKCglpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkgewoJCS8vIE11c3QgYmUgYW4gT2JqZWN0LgoJCS8vIEJlY2F1c2Ugb2YgSUUsIHdlIGFsc28gaGF2ZSB0byBjaGVjayB0aGUgcHJlc2VuY2Ugb2YgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5LgoJCS8vIE1ha2Ugc3VyZSB0aGF0IERPTSBub2RlcyBhbmQgd2luZG93IG9iamVjdHMgZG9uJ3QgcGFzcyB0aHJvdWdoLCBhcyB3ZWxsCgkJaWYgKCAhb2JqIHx8IGpRdWVyeS50eXBlKG9iaikgIT09ICJvYmplY3QiIHx8IG9iai5ub2RlVHlwZSB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQl0cnkgewoJCQkvLyBOb3Qgb3duIGNvbnN0cnVjdG9yIHByb3BlcnR5IG11c3QgYmUgT2JqZWN0CgkJCWlmICggb2JqLmNvbnN0cnVjdG9yICYmCgkJCQkhaGFzT3duLmNhbGwob2JqLCAiY29uc3RydWN0b3IiKSAmJgoJCQkJIWhhc093bi5jYWxsKG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUsICJpc1Byb3RvdHlwZU9mIikgKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9IGNhdGNoICggZSApIHsKCQkJLy8gSUU4LDkgV2lsbCB0aHJvdyBleGNlcHRpb25zIG9uIGNlcnRhaW4gaG9zdCBvYmplY3RzICM5ODk3CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIE93biBwcm9wZXJ0aWVzIGFyZSBlbnVtZXJhdGVkIGZpcnN0bHksIHNvIHRvIHNwZWVkIHVwLAoJCS8vIGlmIGxhc3Qgb25lIGlzIG93biwgdGhlbiBhbGwgcHJvcGVydGllcyBhcmUgb3duLgoKCQl2YXIga2V5OwoJCWZvciAoIGtleSBpbiBvYmogKSB7fQoKCQlyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgfHwgaGFzT3duLmNhbGwoIG9iaiwga2V5ICk7Cgl9LAoKCWlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7CgkJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCXJldHVybiB0cnVlOwoJfSwKCgllcnJvcjogZnVuY3Rpb24oIG1zZyApIHsKCQl0aHJvdyBtc2c7Cgl9LAoKCXBhcnNlSlNPTjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCB0eXBlb2YgZGF0YSAhPT0gInN0cmluZyIgfHwgIWRhdGEgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJLy8gTWFrZSBzdXJlIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyByZW1vdmVkIChJRSBjYW4ndCBoYW5kbGUgaXQpCgkJZGF0YSA9IGpRdWVyeS50cmltKCBkYXRhICk7CgoJCS8vIEF0dGVtcHQgdG8gcGFyc2UgdXNpbmcgdGhlIG5hdGl2ZSBKU09OIHBhcnNlciBmaXJzdAoJCWlmICggd2luZG93LkpTT04gJiYgd2luZG93LkpTT04ucGFyc2UgKSB7CgkJCXJldHVybiB3aW5kb3cuSlNPTi5wYXJzZSggZGF0YSApOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoZSBpbmNvbWluZyBkYXRhIGlzIGFjdHVhbCBKU09OCgkJLy8gTG9naWMgYm9ycm93ZWQgZnJvbSBodHRwOi8vanNvbi5vcmcvanNvbjIuanMKCQlpZiAoIHJ2YWxpZGNoYXJzLnRlc3QoIGRhdGEucmVwbGFjZSggcnZhbGlkZXNjYXBlLCAiQCIgKQoJCQkucmVwbGFjZSggcnZhbGlkdG9rZW5zLCAiXSIgKQoJCQkucmVwbGFjZSggcnZhbGlkYnJhY2VzLCAiIikpICkgewoKCQkJcmV0dXJuIChuZXcgRnVuY3Rpb24oICJyZXR1cm4gIiArIGRhdGEgKSkoKTsKCgkJfQoJCWpRdWVyeS5lcnJvciggIkludmFsaWQgSlNPTjogIiArIGRhdGEgKTsKCX0sCgoJLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZwoJcGFyc2VYTUw6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB4bWwsIHRtcDsKCQl0cnkgewoJCQlpZiAoIHdpbmRvdy5ET01QYXJzZXIgKSB7IC8vIFN0YW5kYXJkCgkJCQl0bXAgPSBuZXcgRE9NUGFyc2VyKCk7CgkJCQl4bWwgPSB0bXAucGFyc2VGcm9tU3RyaW5nKCBkYXRhICwgInRleHQveG1sIiApOwoJCQl9IGVsc2UgeyAvLyBJRQoJCQkJeG1sID0gbmV3IEFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MRE9NIiApOwoJCQkJeG1sLmFzeW5jID0gImZhbHNlIjsKCQkJCXhtbC5sb2FkWE1MKCBkYXRhICk7CgkJCX0KCQl9IGNhdGNoKCBlICkgewoJCQl4bWwgPSB1bmRlZmluZWQ7CgkJfQoJCWlmICggIXhtbCB8fCAheG1sLmRvY3VtZW50RWxlbWVudCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJwYXJzZXJlcnJvciIgKS5sZW5ndGggKSB7CgkJCWpRdWVyeS5lcnJvciggIkludmFsaWQgWE1MOiAiICsgZGF0YSApOwoJCX0KCQlyZXR1cm4geG1sOwoJfSwKCglub29wOiBmdW5jdGlvbigpIHt9LAoKCS8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0CgkvLyBXb3JrYXJvdW5kcyBiYXNlZCBvbiBmaW5kaW5ncyBieSBKaW0gRHJpc2NvbGwKCS8vIGh0dHA6Ly93ZWJsb2dzLmphdmEubmV0L2Jsb2cvZHJpc2NvbGwvYXJjaGl2ZS8yMDA5LzA5LzA4L2V2YWwtamF2YXNjcmlwdC1nbG9iYWwtY29udGV4dAoJZ2xvYmFsRXZhbDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJaWYgKCBkYXRhICYmIHJub3R3aGl0ZS50ZXN0KCBkYXRhICkgKSB7CgkJCS8vIFdlIHVzZSBleGVjU2NyaXB0IG9uIEludGVybmV0IEV4cGxvcmVyCgkJCS8vIFdlIHVzZSBhbiBhbm9ueW1vdXMgZnVuY3Rpb24gc28gdGhhdCBjb250ZXh0IGlzIHdpbmRvdwoJCQkvLyByYXRoZXIgdGhhbiBqUXVlcnkgaW4gRmlyZWZveAoJCQkoIHdpbmRvdy5leGVjU2NyaXB0IHx8IGZ1bmN0aW9uKCBkYXRhICkgewoJCQkJd2luZG93WyAiZXZhbCIgXS5jYWxsKCB3aW5kb3csIGRhdGEgKTsKCQkJfSApKCBkYXRhICk7CgkJfQoJfSwKCgkvLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzCgkvLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpCgljYW1lbENhc2U6IGZ1bmN0aW9uKCBzdHJpbmcgKSB7CgkJcmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsICJtcy0iICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApOwoJfSwKCglub2RlTmFtZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBuYW1lLnRvVXBwZXJDYXNlKCk7Cgl9LAoKCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKCWVhY2g6IGZ1bmN0aW9uKCBvYmplY3QsIGNhbGxiYWNrLCBhcmdzICkgewoJCXZhciBuYW1lLCBpID0gMCwKCQkJbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aCwKCQkJaXNPYmogPSBsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNGdW5jdGlvbiggb2JqZWN0ICk7CgoJCWlmICggYXJncyApIHsKCQkJaWYgKCBpc09iaiApIHsKCQkJCWZvciAoIG5hbWUgaW4gb2JqZWN0ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgbmFtZSBdLCBhcmdzICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsZW5ndGg7ICkgewoJCQkJCWlmICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKSB7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkvLyBBIHNwZWNpYWwsIGZhc3QsIGNhc2UgZm9yIHRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgZWFjaAoJCX0gZWxzZSB7CgkJCWlmICggaXNPYmogKSB7CgkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgbmFtZSBdLCBuYW1lLCBvYmplY3RbIG5hbWUgXSApID09PSBmYWxzZSApIHsKCQkJCQkJYnJlYWs7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApIHsKCQkJCQlpZiAoIGNhbGxiYWNrLmNhbGwoIG9iamVjdFsgaSBdLCBpLCBvYmplY3RbIGkrKyBdICkgPT09IGZhbHNlICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiBvYmplY3Q7Cgl9LAoKCS8vIFVzZSBuYXRpdmUgU3RyaW5nLnRyaW0gZnVuY3Rpb24gd2hlcmV2ZXIgcG9zc2libGUKCXRyaW06IHRyaW0gPwoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRyaW0uY2FsbCggdGV4dCApOwoJCX0gOgoKCQkvLyBPdGhlcndpc2UgdXNlIG91ciBvd24gdHJpbW1pbmcgZnVuY3Rpb25hbGl0eQoJCWZ1bmN0aW9uKCB0ZXh0ICkgewoJCQlyZXR1cm4gdGV4dCA9PSBudWxsID8KCQkJCSIiIDoKCQkJCXRleHQudG9TdHJpbmcoKS5yZXBsYWNlKCB0cmltTGVmdCwgIiIgKS5yZXBsYWNlKCB0cmltUmlnaHQsICIiICk7CgkJfSwKCgkvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5CgltYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCQl2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCBhcnJheSAhPSBudWxsICkgewoJCQkvLyBUaGUgd2luZG93LCBzdHJpbmdzIChhbmQgZnVuY3Rpb25zKSBhbHNvIGhhdmUgJ2xlbmd0aCcKCQkJLy8gVGhlIGV4dHJhIHR5cGVvZiBmdW5jdGlvbiBjaGVjayBpcyB0byBwcmV2ZW50IGNyYXNoZXMKCQkJLy8gaW4gU2FmYXJpIDIgKFNlZTogIzMwMzkpCgkJCS8vIFR3ZWFrZWQgbG9naWMgc2xpZ2h0bHkgdG8gaGFuZGxlIEJsYWNrYmVycnkgNC43IFJlZ0V4cCBpc3N1ZXMgIzY5MzAKCQkJdmFyIHR5cGUgPSBqUXVlcnkudHlwZSggYXJyYXkgKTsKCgkJCWlmICggYXJyYXkubGVuZ3RoID09IG51bGwgfHwgdHlwZSA9PT0gInN0cmluZyIgfHwgdHlwZSA9PT0gImZ1bmN0aW9uIiB8fCB0eXBlID09PSAicmVnZXhwIiB8fCBqUXVlcnkuaXNXaW5kb3coIGFycmF5ICkgKSB7CgkJCQlwdXNoLmNhbGwoIHJldCwgYXJyYXkgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5tZXJnZSggcmV0LCBhcnJheSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCglpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyYXkgKSB7CgkJaWYgKCAhYXJyYXkgKSB7CgkJCXJldHVybiAtMTsKCQl9CgoJCWlmICggaW5kZXhPZiApIHsKCQkJcmV0dXJuIGluZGV4T2YuY2FsbCggYXJyYXksIGVsZW0gKTsKCQl9CgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCWlmICggYXJyYXlbIGkgXSA9PT0gZWxlbSApIHsKCQkJCXJldHVybiBpOwoJCQl9CgkJfQoKCQlyZXR1cm4gLTE7Cgl9LAoKCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKCQl2YXIgaSA9IGZpcnN0Lmxlbmd0aCwKCQkJaiA9IDA7CgoJCWlmICggdHlwZW9mIHNlY29uZC5sZW5ndGggPT09ICJudW1iZXIiICkgewoJCQlmb3IgKCB2YXIgbCA9IHNlY29uZC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQlmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTsKCQkJfQoKCQl9IGVsc2UgewoJCQl3aGlsZSAoIHNlY29uZFtqXSAhPT0gdW5kZWZpbmVkICkgewoJCQkJZmlyc3RbIGkrKyBdID0gc2Vjb25kWyBqKysgXTsKCQkJfQoJCX0KCgkJZmlyc3QubGVuZ3RoID0gaTsKCgkJcmV0dXJuIGZpcnN0OwoJfSwKCglncmVwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBpbnYgKSB7CgkJdmFyIHJldCA9IFtdLCByZXRWYWw7CgkJaW52ID0gISFpbnY7CgoJCS8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXMKCQkvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvbgoJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gZWxlbXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCXJldFZhbCA9ICEhY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKCQkJaWYgKCBpbnYgIT09IHJldFZhbCApIHsKCQkJCXJldC5wdXNoKCBlbGVtc1sgaSBdICk7CgkJCX0KCQl9CgoJCXJldHVybiByZXQ7Cgl9LAoKCS8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seQoJbWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7CgkJdmFyIHZhbHVlLCBrZXksIHJldCA9IFtdLAoJCQlpID0gMCwKCQkJbGVuZ3RoID0gZWxlbXMubGVuZ3RoLAoJCQkvLyBqcXVlcnkgb2JqZWN0cyBhcmUgdHJlYXRlZCBhcyBhcnJheXMKCQkJaXNBcnJheSA9IGVsZW1zIGluc3RhbmNlb2YgalF1ZXJ5IHx8IGxlbmd0aCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsZW5ndGggPT09ICJudW1iZXIiICYmICggKCBsZW5ndGggPiAwICYmIGVsZW1zWyAwIF0gJiYgZWxlbXNbIGxlbmd0aCAtMSBdICkgfHwgbGVuZ3RoID09PSAwIHx8IGpRdWVyeS5pc0FycmF5KCBlbGVtcyApICkgOwoKCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIKCQlpZiAoIGlzQXJyYXkgKSB7CgkJCWZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJdmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCgkJLy8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCwKCQl9IGVsc2UgewoJCQlmb3IgKCBrZXkgaW4gZWxlbXMgKSB7CgkJCQl2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sga2V5IF0sIGtleSwgYXJnICk7CgoJCQkJaWYgKCB2YWx1ZSAhPSBudWxsICkgewoJCQkJCXJldFsgcmV0Lmxlbmd0aCBdID0gdmFsdWU7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXMKCQlyZXR1cm4gcmV0LmNvbmNhdC5hcHBseSggW10sIHJldCApOwoJfSwKCgkvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHMKCWd1aWQ6IDEsCgoJLy8gQmluZCBhIGZ1bmN0aW9uIHRvIGEgY29udGV4dCwgb3B0aW9uYWxseSBwYXJ0aWFsbHkgYXBwbHlpbmcgYW55CgkvLyBhcmd1bWVudHMuCglwcm94eTogZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkgewoJCWlmICggdHlwZW9mIGNvbnRleHQgPT09ICJzdHJpbmciICkgewoJCQl2YXIgdG1wID0gZm5bIGNvbnRleHQgXTsKCQkJY29udGV4dCA9IGZuOwoJCQlmbiA9IHRtcDsKCQl9CgoJCS8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjCgkJLy8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC4KCQlpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJcmV0dXJuIHVuZGVmaW5lZDsKCQl9CgoJCS8vIFNpbXVsYXRlZCBiaW5kCgkJdmFyIGFyZ3MgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMsIDIgKSwKCQkJcHJveHkgPSBmdW5jdGlvbigpIHsKCQkJCXJldHVybiBmbi5hcHBseSggY29udGV4dCwgYXJncy5jb25jYXQoIHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApICkgKTsKCQkJfTsKCgkJLy8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkCgkJcHJveHkuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IHByb3h5Lmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKzsKCgkJcmV0dXJuIHByb3h5OwoJfSwKCgkvLyBNdXRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIHRvIGEgY29sbGVjdGlvbgoJLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uCglhY2Nlc3M6IGZ1bmN0aW9uKCBlbGVtcywga2V5LCB2YWx1ZSwgZXhlYywgZm4sIHBhc3MgKSB7CgkJdmFyIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsKCgkJLy8gU2V0dGluZyBtYW55IGF0dHJpYnV0ZXMKCQlpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlmb3IgKCB2YXIgayBpbiBrZXkgKSB7CgkJCQlqUXVlcnkuYWNjZXNzKCBlbGVtcywgaywga2V5W2tdLCBleGVjLCBmbiwgdmFsdWUgKTsKCQkJfQoJCQlyZXR1cm4gZWxlbXM7CgkJfQoKCQkvLyBTZXR0aW5nIG9uZSBhdHRyaWJ1dGUKCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7CgkJCS8vIE9wdGlvbmFsbHksIGZ1bmN0aW9uIHZhbHVlcyBnZXQgZXhlY3V0ZWQgaWYgZXhlYyBpcyB0cnVlCgkJCWV4ZWMgPSAhcGFzcyAmJiBleGVjICYmIGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKTsKCgkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrICkgewoJCQkJZm4oIGVsZW1zW2ldLCBrZXksIGV4ZWMgPyB2YWx1ZS5jYWxsKCBlbGVtc1tpXSwgaSwgZm4oIGVsZW1zW2ldLCBrZXkgKSApIDogdmFsdWUsIHBhc3MgKTsKCQkJfQoKCQkJcmV0dXJuIGVsZW1zOwoJCX0KCgkJLy8gR2V0dGluZyBhbiBhdHRyaWJ1dGUKCQlyZXR1cm4gbGVuZ3RoID8gZm4oIGVsZW1zWzBdLCBrZXkgKSA6IHVuZGVmaW5lZDsKCX0sCgoJbm93OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCX0sCgoJLy8gVXNlIG9mIGpRdWVyeS5icm93c2VyIGlzIGZyb3duZWQgdXBvbi4KCS8vIE1vcmUgZGV0YWlsczogaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9VdGlsaXRpZXMvalF1ZXJ5LmJyb3dzZXIKCXVhTWF0Y2g6IGZ1bmN0aW9uKCB1YSApIHsKCQl1YSA9IHVhLnRvTG93ZXJDYXNlKCk7CgoJCXZhciBtYXRjaCA9IHJ3ZWJraXQuZXhlYyggdWEgKSB8fAoJCQlyb3BlcmEuZXhlYyggdWEgKSB8fAoJCQlybXNpZS5leGVjKCB1YSApIHx8CgkJCXVhLmluZGV4T2YoImNvbXBhdGlibGUiKSA8IDAgJiYgcm1vemlsbGEuZXhlYyggdWEgKSB8fAoJCQlbXTsKCgkJcmV0dXJuIHsgYnJvd3NlcjogbWF0Y2hbMV0gfHwgIiIsIHZlcnNpb246IG1hdGNoWzJdIHx8ICIwIiB9OwoJfSwKCglzdWI6IGZ1bmN0aW9uKCkgewoJCWZ1bmN0aW9uIGpRdWVyeVN1Yiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CgkJCXJldHVybiBuZXcgalF1ZXJ5U3ViLmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7CgkJfQoJCWpRdWVyeS5leHRlbmQoIHRydWUsIGpRdWVyeVN1YiwgdGhpcyApOwoJCWpRdWVyeVN1Yi5zdXBlcmNsYXNzID0gdGhpczsKCQlqUXVlcnlTdWIuZm4gPSBqUXVlcnlTdWIucHJvdG90eXBlID0gdGhpcygpOwoJCWpRdWVyeVN1Yi5mbi5jb25zdHJ1Y3RvciA9IGpRdWVyeVN1YjsKCQlqUXVlcnlTdWIuc3ViID0gdGhpcy5zdWI7CgkJalF1ZXJ5U3ViLmZuLmluaXQgPSBmdW5jdGlvbiBpbml0KCBzZWxlY3RvciwgY29udGV4dCApIHsKCQkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgJiYgIShjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5U3ViKSApIHsKCQkJCWNvbnRleHQgPSBqUXVlcnlTdWIoIGNvbnRleHQgKTsKCQkJfQoKCQkJcmV0dXJuIGpRdWVyeS5mbi5pbml0LmNhbGwoIHRoaXMsIHNlbGVjdG9yLCBjb250ZXh0LCByb290alF1ZXJ5U3ViICk7CgkJfTsKCQlqUXVlcnlTdWIuZm4uaW5pdC5wcm90b3R5cGUgPSBqUXVlcnlTdWIuZm47CgkJdmFyIHJvb3RqUXVlcnlTdWIgPSBqUXVlcnlTdWIoZG9jdW1lbnQpOwoJCXJldHVybiBqUXVlcnlTdWI7Cgl9LAoKCWJyb3dzZXI6IHt9Cn0pOwoKLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwCmpRdWVyeS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0Ii5zcGxpdCgiICIpLCBmdW5jdGlvbihpLCBuYW1lKSB7CgljbGFzczJ0eXBlWyAiW29iamVjdCAiICsgbmFtZSArICJdIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpOwp9KTsKCmJyb3dzZXJNYXRjaCA9IGpRdWVyeS51YU1hdGNoKCB1c2VyQWdlbnQgKTsKaWYgKCBicm93c2VyTWF0Y2guYnJvd3NlciApIHsKCWpRdWVyeS5icm93c2VyWyBicm93c2VyTWF0Y2guYnJvd3NlciBdID0gdHJ1ZTsKCWpRdWVyeS5icm93c2VyLnZlcnNpb24gPSBicm93c2VyTWF0Y2gudmVyc2lvbjsKfQoKLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5icm93c2VyLndlYmtpdCBpbnN0ZWFkCmlmICggalF1ZXJ5LmJyb3dzZXIud2Via2l0ICkgewoJalF1ZXJ5LmJyb3dzZXIuc2FmYXJpID0gdHJ1ZTsKfQoKLy8gSUUgZG9lc24ndCBtYXRjaCBub24tYnJlYWtpbmcgc3BhY2VzIHdpdGggXHMKaWYgKCBybm90d2hpdGUudGVzdCggIlx4QTAiICkgKSB7Cgl0cmltTGVmdCA9IC9eW1xzXHhBMF0rLzsKCXRyaW1SaWdodCA9IC9bXHNceEEwXSskLzsKfQoKLy8gQWxsIGpRdWVyeSBvYmplY3RzIHNob3VsZCBwb2ludCBiYWNrIHRvIHRoZXNlCnJvb3RqUXVlcnkgPSBqUXVlcnkoZG9jdW1lbnQpOwoKLy8gQ2xlYW51cCBmdW5jdGlvbnMgZm9yIHRoZSBkb2N1bWVudCByZWFkeSBtZXRob2QKaWYgKCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyICkgewoJRE9NQ29udGVudExvYWRlZCA9IGZ1bmN0aW9uKCkgewoJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgRE9NQ29udGVudExvYWRlZCwgZmFsc2UgKTsKCQlqUXVlcnkucmVhZHkoKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5hdHRhY2hFdmVudCApIHsKCURPTUNvbnRlbnRMb2FkZWQgPSBmdW5jdGlvbigpIHsKCQkvLyBNYWtlIHN1cmUgYm9keSBleGlzdHMsIGF0IGxlYXN0LCBpbiBjYXNlIElFIGdldHMgYSBsaXR0bGUgb3ZlcnplYWxvdXMgKHRpY2tldCAjNTQ0MykuCgkJaWYgKCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiICkgewoJCQlkb2N1bWVudC5kZXRhY2hFdmVudCggIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIERPTUNvbnRlbnRMb2FkZWQgKTsKCQkJalF1ZXJ5LnJlYWR5KCk7CgkJfQoJfTsKfQoKLy8gVGhlIERPTSByZWFkeSBjaGVjayBmb3IgSW50ZXJuZXQgRXhwbG9yZXIKZnVuY3Rpb24gZG9TY3JvbGxDaGVjaygpIHsKCWlmICggalF1ZXJ5LmlzUmVhZHkgKSB7CgkJcmV0dXJuOwoJfQoKCXRyeSB7CgkJLy8gSWYgSUUgaXMgdXNlZCwgdXNlIHRoZSB0cmljayBieSBEaWVnbyBQZXJpbmkKCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwoJCWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCgibGVmdCIpOwoJfSBjYXRjaChlKSB7CgkJc2V0VGltZW91dCggZG9TY3JvbGxDaGVjaywgMSApOwoJCXJldHVybjsKCX0KCgkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKCWpRdWVyeS5yZWFkeSgpOwp9CgpyZXR1cm4galF1ZXJ5OwoKfSkoKTsKCgp2YXIgLy8gUHJvbWlzZSBtZXRob2RzCglwcm9taXNlTWV0aG9kcyA9ICJkb25lIGZhaWwgaXNSZXNvbHZlZCBpc1JlamVjdGVkIHByb21pc2UgdGhlbiBhbHdheXMgcGlwZSIuc3BsaXQoICIgIiApLAoJLy8gU3RhdGljIHJlZmVyZW5jZSB0byBzbGljZQoJc2xpY2VEZWZlcnJlZCA9IFtdLnNsaWNlOwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBDcmVhdGUgYSBzaW1wbGUgZGVmZXJyZWQgKG9uZSBjYWxsYmFja3MgbGlzdCkKCV9EZWZlcnJlZDogZnVuY3Rpb24oKSB7CgkJdmFyIC8vIGNhbGxiYWNrcyBsaXN0CgkJCWNhbGxiYWNrcyA9IFtdLAoJCQkvLyBzdG9yZWQgWyBjb250ZXh0ICwgYXJncyBdCgkJCWZpcmVkLAoJCQkvLyB0byBhdm9pZCBmaXJpbmcgd2hlbiBhbHJlYWR5IGRvaW5nIHNvCgkJCWZpcmluZywKCQkJLy8gZmxhZyB0byBrbm93IGlmIHRoZSBkZWZlcnJlZCBoYXMgYmVlbiBjYW5jZWxsZWQKCQkJY2FuY2VsbGVkLAoJCQkvLyB0aGUgZGVmZXJyZWQgaXRzZWxmCgkJCWRlZmVycmVkICA9IHsKCgkJCQkvLyBkb25lKCBmMSwgZjIsIC4uLikKCQkJCWRvbmU6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggIWNhbmNlbGxlZCApIHsKCQkJCQkJdmFyIGFyZ3MgPSBhcmd1bWVudHMsCgkJCQkJCQlpLAoJCQkJCQkJbGVuZ3RoLAoJCQkJCQkJZWxlbSwKCQkJCQkJCXR5cGUsCgkJCQkJCQlfZmlyZWQ7CgkJCQkJCWlmICggZmlyZWQgKSB7CgkJCQkJCQlfZmlyZWQgPSBmaXJlZDsKCQkJCQkJCWZpcmVkID0gMDsKCQkJCQkJfQoJCQkJCQlmb3IgKCBpID0gMCwgbGVuZ3RoID0gYXJncy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCQkJCWVsZW0gPSBhcmdzWyBpIF07CgkJCQkJCQl0eXBlID0galF1ZXJ5LnR5cGUoIGVsZW0gKTsKCQkJCQkJCWlmICggdHlwZSA9PT0gImFycmF5IiApIHsKCQkJCQkJCQlkZWZlcnJlZC5kb25lLmFwcGx5KCBkZWZlcnJlZCwgZWxlbSApOwoJCQkJCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJCQkJCQljYWxsYmFja3MucHVzaCggZWxlbSApOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJCWlmICggX2ZpcmVkICkgewoJCQkJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIF9maXJlZFsgMCBdLCBfZmlyZWRbIDEgXSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyByZXNvbHZlIHdpdGggZ2l2ZW4gY29udGV4dCBhbmQgYXJncwoJCQkJcmVzb2x2ZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkgewoJCQkJCWlmICggIWNhbmNlbGxlZCAmJiAhZmlyZWQgJiYgIWZpcmluZyApIHsKCQkJCQkJLy8gbWFrZSBzdXJlIGFyZ3MgYXJlIGF2YWlsYWJsZSAoIzg0MjEpCgkJCQkJCWFyZ3MgPSBhcmdzIHx8IFtdOwoJCQkJCQlmaXJpbmcgPSAxOwoJCQkJCQl0cnkgewoJCQkJCQkJd2hpbGUoIGNhbGxiYWNrc1sgMCBdICkgewoJCQkJCQkJCWNhbGxiYWNrcy5zaGlmdCgpLmFwcGx5KCBjb250ZXh0LCBhcmdzICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQkJZmluYWxseSB7CgkJCQkJCQlmaXJlZCA9IFsgY29udGV4dCwgYXJncyBdOwoJCQkJCQkJZmlyaW5nID0gMDsKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0sCgoJCQkJLy8gcmVzb2x2ZSB3aXRoIHRoaXMgYXMgY29udGV4dCBhbmQgZ2l2ZW4gYXJndW1lbnRzCgkJCQlyZXNvbHZlOiBmdW5jdGlvbigpIHsKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIEhhcyB0aGlzIGRlZmVycmVkIGJlZW4gcmVzb2x2ZWQ/CgkJCQlpc1Jlc29sdmVkOiBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gISEoIGZpcmluZyB8fCBmaXJlZCApOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwKCQkJCWNhbmNlbDogZnVuY3Rpb24oKSB7CgkJCQkJY2FuY2VsbGVkID0gMTsKCQkJCQljYWxsYmFja3MgPSBbXTsKCQkJCQlyZXR1cm4gdGhpczsKCQkJCX0KCQkJfTsKCgkJcmV0dXJuIGRlZmVycmVkOwoJfSwKCgkvLyBGdWxsIGZsZWRnZWQgZGVmZXJyZWQgKHR3byBjYWxsYmFja3MgbGlzdCkKCURlZmVycmVkOiBmdW5jdGlvbiggZnVuYyApIHsKCQl2YXIgZGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCWZhaWxEZWZlcnJlZCA9IGpRdWVyeS5fRGVmZXJyZWQoKSwKCQkJcHJvbWlzZTsKCQkvLyBBZGQgZXJyb3JEZWZlcnJlZCBtZXRob2RzLCB0aGVuIGFuZCBwcm9taXNlCgkJalF1ZXJ5LmV4dGVuZCggZGVmZXJyZWQsIHsKCQkJdGhlbjogZnVuY3Rpb24oIGRvbmVDYWxsYmFja3MsIGZhaWxDYWxsYmFja3MgKSB7CgkJCQlkZWZlcnJlZC5kb25lKCBkb25lQ2FsbGJhY2tzICkuZmFpbCggZmFpbENhbGxiYWNrcyApOwoJCQkJcmV0dXJuIHRoaXM7CgkJCX0sCgkJCWFsd2F5czogZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gZGVmZXJyZWQuZG9uZS5hcHBseSggZGVmZXJyZWQsIGFyZ3VtZW50cyApLmZhaWwuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9LAoJCQlmYWlsOiBmYWlsRGVmZXJyZWQuZG9uZSwKCQkJcmVqZWN0V2l0aDogZmFpbERlZmVycmVkLnJlc29sdmVXaXRoLAoJCQlyZWplY3Q6IGZhaWxEZWZlcnJlZC5yZXNvbHZlLAoJCQlpc1JlamVjdGVkOiBmYWlsRGVmZXJyZWQuaXNSZXNvbHZlZCwKCQkJcGlwZTogZnVuY3Rpb24oIGZuRG9uZSwgZm5GYWlsICkgewoJCQkJcmV0dXJuIGpRdWVyeS5EZWZlcnJlZChmdW5jdGlvbiggbmV3RGVmZXIgKSB7CgkJCQkJalF1ZXJ5LmVhY2goIHsKCQkJCQkJZG9uZTogWyBmbkRvbmUsICJyZXNvbHZlIiBdLAoJCQkJCQlmYWlsOiBbIGZuRmFpbCwgInJlamVjdCIgXQoJCQkJCX0sIGZ1bmN0aW9uKCBoYW5kbGVyLCBkYXRhICkgewoJCQkJCQl2YXIgZm4gPSBkYXRhWyAwIF0sCgkJCQkJCQlhY3Rpb24gPSBkYXRhWyAxIF0sCgkJCQkJCQlyZXR1cm5lZDsKCQkJCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHsKCQkJCQkJCWRlZmVycmVkWyBoYW5kbGVyIF0oZnVuY3Rpb24oKSB7CgkJCQkJCQkJcmV0dXJuZWQgPSBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQkJCQkJaWYgKCByZXR1cm5lZCAmJiBqUXVlcnkuaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkgewoJCQkJCQkJCQlyZXR1cm5lZC5wcm9taXNlKCkudGhlbiggbmV3RGVmZXIucmVzb2x2ZSwgbmV3RGVmZXIucmVqZWN0ICk7CgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJbmV3RGVmZXJbIGFjdGlvbiArICJXaXRoIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IG5ld0RlZmVyIDogdGhpcywgWyByZXR1cm5lZCBdICk7CgkJCQkJCQkJfQoJCQkJCQkJfSk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlkZWZlcnJlZFsgaGFuZGxlciBdKCBuZXdEZWZlclsgYWN0aW9uIF0gKTsKCQkJCQkJfQoJCQkJCX0pOwoJCQkJfSkucHJvbWlzZSgpOwoJCQl9LAoJCQkvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkCgkJCS8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3QKCQkJcHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHsKCQkJCWlmICggb2JqID09IG51bGwgKSB7CgkJCQkJaWYgKCBwcm9taXNlICkgewoJCQkJCQlyZXR1cm4gcHJvbWlzZTsKCQkJCQl9CgkJCQkJcHJvbWlzZSA9IG9iaiA9IHt9OwoJCQkJfQoJCQkJdmFyIGkgPSBwcm9taXNlTWV0aG9kcy5sZW5ndGg7CgkJCQl3aGlsZSggaS0tICkgewoJCQkJCW9ialsgcHJvbWlzZU1ldGhvZHNbaV0gXSA9IGRlZmVycmVkWyBwcm9taXNlTWV0aG9kc1tpXSBdOwoJCQkJfQoJCQkJcmV0dXJuIG9iajsKCQkJfQoJCX0pOwoJCS8vIE1ha2Ugc3VyZSBvbmx5IG9uZSBjYWxsYmFjayBsaXN0IHdpbGwgYmUgdXNlZAoJCWRlZmVycmVkLmRvbmUoIGZhaWxEZWZlcnJlZC5jYW5jZWwgKS5mYWlsKCBkZWZlcnJlZC5jYW5jZWwgKTsKCQkvLyBVbmV4cG9zZSBjYW5jZWwKCQlkZWxldGUgZGVmZXJyZWQuY2FuY2VsOwoJCS8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnkKCQlpZiAoIGZ1bmMgKSB7CgkJCWZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZDsKCX0sCgoJLy8gRGVmZXJyZWQgaGVscGVyCgl3aGVuOiBmdW5jdGlvbiggZmlyc3RQYXJhbSApIHsKCQl2YXIgYXJncyA9IGFyZ3VtZW50cywKCQkJaSA9IDAsCgkJCWxlbmd0aCA9IGFyZ3MubGVuZ3RoLAoJCQljb3VudCA9IGxlbmd0aCwKCQkJZGVmZXJyZWQgPSBsZW5ndGggPD0gMSAmJiBmaXJzdFBhcmFtICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBmaXJzdFBhcmFtLnByb21pc2UgKSA/CgkJCQlmaXJzdFBhcmFtIDoKCQkJCWpRdWVyeS5EZWZlcnJlZCgpOwoJCWZ1bmN0aW9uIHJlc29sdmVGdW5jKCBpICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIHZhbHVlICkgewoJCQkJYXJnc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZURlZmVycmVkLmNhbGwoIGFyZ3VtZW50cywgMCApIDogdmFsdWU7CgkJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCQkvLyBTdHJhbmdlIGJ1ZyBpbiBGRjQ6CgkJCQkJLy8gVmFsdWVzIGNoYW5nZWQgb250byB0aGUgYXJndW1lbnRzIG9iamVjdCBzb21ldGltZXMgZW5kIHVwIGFzIHVuZGVmaW5lZCB2YWx1ZXMKCQkJCQkvLyBvdXRzaWRlIHRoZSAkLndoZW4gbWV0aG9kLiBDbG9uaW5nIHRoZSBvYmplY3QgaW50byBhIGZyZXNoIGFycmF5IHNvbHZlcyB0aGUgaXNzdWUKCQkJCQlkZWZlcnJlZC5yZXNvbHZlV2l0aCggZGVmZXJyZWQsIHNsaWNlRGVmZXJyZWQuY2FsbCggYXJncywgMCApICk7CgkJCQl9CgkJCX07CgkJfQoJCWlmICggbGVuZ3RoID4gMSApIHsKCQkJZm9yKCA7IGkgPCBsZW5ndGg7IGkrKyApIHsKCQkJCWlmICggYXJnc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBhcmdzWyBpIF0ucHJvbWlzZSApICkgewoJCQkJCWFyZ3NbIGkgXS5wcm9taXNlKCkudGhlbiggcmVzb2x2ZUZ1bmMoaSksIGRlZmVycmVkLnJlamVjdCApOwoJCQkJfSBlbHNlIHsKCQkJCQktLWNvdW50OwoJCQkJfQoJCQl9CgkJCWlmICggIWNvdW50ICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBhcmdzICk7CgkJCX0KCQl9IGVsc2UgaWYgKCBkZWZlcnJlZCAhPT0gZmlyc3RQYXJhbSApIHsKCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGRlZmVycmVkLCBsZW5ndGggPyBbIGZpcnN0UGFyYW0gXSA6IFtdICk7CgkJfQoJCXJldHVybiBkZWZlcnJlZC5wcm9taXNlKCk7Cgl9Cn0pOwoKCgpqUXVlcnkuc3VwcG9ydCA9IChmdW5jdGlvbigpIHsKCgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKSwKCQlkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJYWxsLAoJCWEsCgkJc2VsZWN0LAoJCW9wdCwKCQlpbnB1dCwKCQltYXJnaW5EaXYsCgkJc3VwcG9ydCwKCQlmcmFnbWVudCwKCQlib2R5LAoJCXRlc3RFbGVtZW50UGFyZW50LAoJCXRlc3RFbGVtZW50LAoJCXRlc3RFbGVtZW50U3R5bGUsCgkJdGRzLAoJCWV2ZW50cywKCQlldmVudE5hbWUsCgkJaSwKCQlpc1N1cHBvcnRlZDsKCgkvLyBQcmVsaW1pbmFyeSB0ZXN0cwoJZGl2LnNldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIiwgInQiKTsKCWRpdi5pbm5lckhUTUwgPSAiICAgPGxpbms+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnIHN0eWxlPSd0b3A6MXB4O2Zsb2F0OmxlZnQ7b3BhY2l0eTouNTU7Jz5hPC9hPjxpbnB1dCB0eXBlPWNoZWNrYm94PiI7CgoKCWFsbCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CglhID0gZGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCAiYSIgKVsgMCBdOwoKCS8vIENhbid0IGdldCBiYXNpYyB0ZXN0IHN1cHBvcnQKCWlmICggIWFsbCB8fCAhYWxsLmxlbmd0aCB8fCAhYSApIHsKCQlyZXR1cm4ge307Cgl9CgoJLy8gRmlyc3QgYmF0Y2ggb2Ygc3VwcG9ydHMgdGVzdHMKCXNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzZWxlY3QiICk7CglvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpICk7CglpbnB1dCA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImlucHV0IiApWyAwIF07CgoJc3VwcG9ydCA9IHsKCQkvLyBJRSBzdHJpcHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gLmlubmVySFRNTCBpcyB1c2VkCgkJbGVhZGluZ1doaXRlc3BhY2U6ICggZGl2LmZpcnN0Q2hpbGQubm9kZVR5cGUgPT09IDMgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGJvZHkgZWxlbWVudHMgYXJlbid0IGF1dG9tYXRpY2FsbHkgaW5zZXJ0ZWQKCQkvLyBJRSB3aWxsIGluc2VydCB0aGVtIGludG8gZW1wdHkgdGFibGVzCgkJdGJvZHk6ICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJ0Ym9keSIgKS5sZW5ndGgsCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGxpbmsgZWxlbWVudHMgZ2V0IHNlcmlhbGl6ZWQgY29ycmVjdGx5IGJ5IGlubmVySFRNTAoJCS8vIFRoaXMgcmVxdWlyZXMgYSB3cmFwcGVyIGVsZW1lbnQgaW4gSUUKCQlodG1sU2VyaWFsaXplOiAhIWRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggImxpbmsiICkubGVuZ3RoLAoKCQkvLyBHZXQgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGZyb20gZ2V0QXR0cmlidXRlCgkJLy8gKElFIHVzZXMgLmNzc1RleHQgaW5zdGVhZCkKCQlzdHlsZTogL3RvcC8udGVzdCggYS5nZXRBdHRyaWJ1dGUoInN0eWxlIikgKSwKCgkJLy8gTWFrZSBzdXJlIHRoYXQgVVJMcyBhcmVuJ3QgbWFuaXB1bGF0ZWQKCQkvLyAoSUUgbm9ybWFsaXplcyBpdCBieSBkZWZhdWx0KQoJCWhyZWZOb3JtYWxpemVkOiAoIGEuZ2V0QXR0cmlidXRlKCAiaHJlZiIgKSA9PT0gIi9hIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBlbGVtZW50IG9wYWNpdHkgZXhpc3RzCgkJLy8gKElFIHVzZXMgZmlsdGVyIGluc3RlYWQpCgkJLy8gVXNlIGEgcmVnZXggdG8gd29yayBhcm91bmQgYSBXZWJLaXQgaXNzdWUuIFNlZSAjNTE0NQoJCW9wYWNpdHk6IC9eMC41NSQvLnRlc3QoIGEuc3R5bGUub3BhY2l0eSApLAoKCQkvLyBWZXJpZnkgc3R5bGUgZmxvYXQgZXhpc3RlbmNlCgkJLy8gKElFIHVzZXMgc3R5bGVGbG9hdCBpbnN0ZWFkIG9mIGNzc0Zsb2F0KQoJCWNzc0Zsb2F0OiAhIWEuc3R5bGUuY3NzRmxvYXQsCgoJCS8vIE1ha2Ugc3VyZSB0aGF0IGlmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCBmb3IgYSBjaGVja2JveAoJCS8vIHRoYXQgaXQgZGVmYXVsdHMgdG8gIm9uIi4KCQkvLyAoV2ViS2l0IGRlZmF1bHRzIHRvICIiIGluc3RlYWQpCgkJY2hlY2tPbjogKCBpbnB1dC52YWx1ZSA9PT0gIm9uIiApLAoKCQkvLyBNYWtlIHN1cmUgdGhhdCBhIHNlbGVjdGVkLWJ5LWRlZmF1bHQgb3B0aW9uIGhhcyBhIHdvcmtpbmcgc2VsZWN0ZWQgcHJvcGVydHkuCgkJLy8gKFdlYktpdCBkZWZhdWx0cyB0byBmYWxzZSBpbnN0ZWFkIG9mIHRydWUsIElFIHRvbywgaWYgaXQncyBpbiBhbiBvcHRncm91cCkKCQlvcHRTZWxlY3RlZDogb3B0LnNlbGVjdGVkLAoKCQkvLyBUZXN0IHNldEF0dHJpYnV0ZSBvbiBjYW1lbENhc2UgY2xhc3MuIElmIGl0IHdvcmtzLCB3ZSBuZWVkIGF0dHJGaXhlcyB3aGVuIGRvaW5nIGdldC9zZXRBdHRyaWJ1dGUgKGllNi83KQoJCWdldFNldEF0dHJpYnV0ZTogZGl2LmNsYXNzTmFtZSAhPT0gInQiLAoKCQkvLyBXaWxsIGJlIGRlZmluZWQgbGF0ZXIKCQlzdWJtaXRCdWJibGVzOiB0cnVlLAoJCWNoYW5nZUJ1YmJsZXM6IHRydWUsCgkJZm9jdXNpbkJ1YmJsZXM6IGZhbHNlLAoJCWRlbGV0ZUV4cGFuZG86IHRydWUsCgkJbm9DbG9uZUV2ZW50OiB0cnVlLAoJCWlubGluZUJsb2NrTmVlZHNMYXlvdXQ6IGZhbHNlLAoJCXNocmlua1dyYXBCbG9ja3M6IGZhbHNlLAoJCXJlbGlhYmxlTWFyZ2luUmlnaHQ6IHRydWUKCX07CgoJLy8gTWFrZSBzdXJlIGNoZWNrZWQgc3RhdHVzIGlzIHByb3Blcmx5IGNsb25lZAoJaW5wdXQuY2hlY2tlZCA9IHRydWU7CglzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gaW5wdXQuY2xvbmVOb2RlKCB0cnVlICkuY2hlY2tlZDsKCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgb3B0aW9ucyBpbnNpZGUgZGlzYWJsZWQgc2VsZWN0cyBhcmVuJ3QgbWFya2VkIGFzIGRpc2FibGVkCgkvLyAoV2ViS2l0IG1hcmtzIHRoZW0gYXMgZGlzYWJsZWQpCglzZWxlY3QuZGlzYWJsZWQgPSB0cnVlOwoJc3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7CgoJLy8gVGVzdCB0byBzZWUgaWYgaXQncyBwb3NzaWJsZSB0byBkZWxldGUgYW4gZXhwYW5kbyBmcm9tIGFuIGVsZW1lbnQKCS8vIEZhaWxzIGluIEludGVybmV0IEV4cGxvcmVyCgl0cnkgewoJCWRlbGV0ZSBkaXYudGVzdDsKCX0gY2F0Y2goIGUgKSB7CgkJc3VwcG9ydC5kZWxldGVFeHBhbmRvID0gZmFsc2U7Cgl9CgoJaWYgKCAhZGl2LmFkZEV2ZW50TGlzdGVuZXIgJiYgZGl2LmF0dGFjaEV2ZW50ICYmIGRpdi5maXJlRXZlbnQgKSB7CgkJZGl2LmF0dGFjaEV2ZW50KCAib25jbGljayIsIGZ1bmN0aW9uKCkgewoJCQkvLyBDbG9uaW5nIGEgbm9kZSBzaG91bGRuJ3QgY29weSBvdmVyIGFueQoJCQkvLyBib3VuZCBldmVudCBoYW5kbGVycyAoSUUgZG9lcyB0aGlzKQoJCQlzdXBwb3J0Lm5vQ2xvbmVFdmVudCA9IGZhbHNlOwoJCX0pOwoJCWRpdi5jbG9uZU5vZGUoIHRydWUgKS5maXJlRXZlbnQoICJvbmNsaWNrIiApOwoJfQoKCS8vIENoZWNrIGlmIGEgcmFkaW8gbWFpbnRhaW5zIGl0J3MgdmFsdWUKCS8vIGFmdGVyIGJlaW5nIGFwcGVuZGVkIHRvIHRoZSBET00KCWlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKCWlucHV0LnZhbHVlID0gInQiOwoJaW5wdXQuc2V0QXR0cmlidXRlKCJ0eXBlIiwgInJhZGlvIik7CglzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gInQiOwoKCWlucHV0LnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsICJjaGVja2VkIik7CglkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7CglmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCWZyYWdtZW50LmFwcGVuZENoaWxkKCBkaXYuZmlyc3RDaGlsZCApOwoKCS8vIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50cwoJc3VwcG9ydC5jaGVja0Nsb25lID0gZnJhZ21lbnQuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7CgoJZGl2LmlubmVySFRNTCA9ICIiOwoKCS8vIEZpZ3VyZSBvdXQgaWYgdGhlIFczQyBib3ggbW9kZWwgd29ya3MgYXMgZXhwZWN0ZWQKCWRpdi5zdHlsZS53aWR0aCA9IGRpdi5zdHlsZS5wYWRkaW5nTGVmdCA9ICIxcHgiOwoKCWJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImJvZHkiIClbIDAgXTsKCS8vIFdlIHVzZSBvdXIgb3duLCBpbnZpc2libGUsIGJvZHkgdW5sZXNzIHRoZSBib2R5IGlzIGFscmVhZHkgcHJlc2VudAoJLy8gaW4gd2hpY2ggY2FzZSB3ZSB1c2UgYSBkaXYgKCM5MjM5KQoJdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBib2R5ID8gImRpdiIgOiAiYm9keSIgKTsKCXRlc3RFbGVtZW50U3R5bGUgPSB7CgkJdmlzaWJpbGl0eTogImhpZGRlbiIsCgkJd2lkdGg6IDAsCgkJaGVpZ2h0OiAwLAoJCWJvcmRlcjogMCwKCQltYXJnaW46IDAsCgkJYmFja2dyb3VuZDogIm5vbmUiCgl9OwoJaWYgKCBib2R5ICkgewoJCWpRdWVyeS5leHRlbmQoIHRlc3RFbGVtZW50U3R5bGUsIHsKCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsCgkJCWxlZnQ6ICItMTAwMHB4IiwKCQkJdG9wOiAiLTEwMDBweCIKCQl9KTsKCX0KCWZvciAoIGkgaW4gdGVzdEVsZW1lbnRTdHlsZSApIHsKCQl0ZXN0RWxlbWVudC5zdHlsZVsgaSBdID0gdGVzdEVsZW1lbnRTdHlsZVsgaSBdOwoJfQoJdGVzdEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOwoJdGVzdEVsZW1lbnRQYXJlbnQgPSBib2R5IHx8IGRvY3VtZW50RWxlbWVudDsKCXRlc3RFbGVtZW50UGFyZW50Lmluc2VydEJlZm9yZSggdGVzdEVsZW1lbnQsIHRlc3RFbGVtZW50UGFyZW50LmZpcnN0Q2hpbGQgKTsKCgkvLyBDaGVjayBpZiBhIGRpc2Nvbm5lY3RlZCBjaGVja2JveCB3aWxsIHJldGFpbiBpdHMgY2hlY2tlZAoJLy8gdmFsdWUgb2YgdHJ1ZSBhZnRlciBhcHBlbmRlZCB0byB0aGUgRE9NIChJRTYvNykKCXN1cHBvcnQuYXBwZW5kQ2hlY2tlZCA9IGlucHV0LmNoZWNrZWQ7CgoJc3VwcG9ydC5ib3hNb2RlbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMjsKCglpZiAoICJ6b29tIiBpbiBkaXYuc3R5bGUgKSB7CgkJLy8gQ2hlY2sgaWYgbmF0aXZlbHkgYmxvY2stbGV2ZWwgZWxlbWVudHMgYWN0IGxpa2UgaW5saW5lLWJsb2NrCgkJLy8gZWxlbWVudHMgd2hlbiBzZXR0aW5nIHRoZWlyIGRpc3BsYXkgdG8gJ2lubGluZScgYW5kIGdpdmluZwoJCS8vIHRoZW0gbGF5b3V0CgkJLy8gKElFIDwgOCBkb2VzIHRoaXMpCgkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lIjsKCQlkaXYuc3R5bGUuem9vbSA9IDE7CgkJc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ID0gKCBkaXYub2Zmc2V0V2lkdGggPT09IDIgKTsKCgkJLy8gQ2hlY2sgaWYgZWxlbWVudHMgd2l0aCBsYXlvdXQgc2hyaW5rLXdyYXAgdGhlaXIgY2hpbGRyZW4KCQkvLyAoSUUgNiBkb2VzIHRoaXMpCgkJZGl2LnN0eWxlLmRpc3BsYXkgPSAiIjsKCQlkaXYuaW5uZXJIVE1MID0gIjxkaXYgc3R5bGU9J3dpZHRoOjRweDsnPjwvZGl2PiI7CgkJc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzID0gKCBkaXYub2Zmc2V0V2lkdGggIT09IDIgKTsKCX0KCglkaXYuaW5uZXJIVE1MID0gIjx0YWJsZT48dHI+PHRkIHN0eWxlPSdwYWRkaW5nOjA7Ym9yZGVyOjA7ZGlzcGxheTpub25lJz48L3RkPjx0ZD50PC90ZD48L3RyPjwvdGFibGU+IjsKCXRkcyA9IGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSggInRkIiApOwoKCS8vIENoZWNrIGlmIHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0IHdoZW4gdGhleSBhcmUgc2V0CgkvLyB0byBkaXNwbGF5Om5vbmUgYW5kIHRoZXJlIGFyZSBzdGlsbCBvdGhlciB2aXNpYmxlIHRhYmxlIGNlbGxzIGluIGEKCS8vIHRhYmxlIHJvdzsgaWYgc28sIG9mZnNldFdpZHRoL0hlaWdodCBhcmUgbm90IHJlbGlhYmxlIGZvciB1c2Ugd2hlbgoJLy8gZGV0ZXJtaW5pbmcgaWYgYW4gZWxlbWVudCBoYXMgYmVlbiBoaWRkZW4gZGlyZWN0bHkgdXNpbmcKCS8vIGRpc3BsYXk6bm9uZSAoaXQgaXMgc3RpbGwgc2FmZSB0byB1c2Ugb2Zmc2V0cyBpZiBhIHBhcmVudCBlbGVtZW50IGlzCgkvLyBoaWRkZW47IGRvbiBzYWZldHkgZ29nZ2xlcyBhbmQgc2VlIGJ1ZyAjNDUxMiBmb3IgbW9yZSBpbmZvcm1hdGlvbikuCgkvLyAob25seSBJRSA4IGZhaWxzIHRoaXMgdGVzdCkKCWlzU3VwcG9ydGVkID0gKCB0ZHNbIDAgXS5vZmZzZXRIZWlnaHQgPT09IDAgKTsKCgl0ZHNbIDAgXS5zdHlsZS5kaXNwbGF5ID0gIiI7Cgl0ZHNbIDEgXS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKCS8vIENoZWNrIGlmIGVtcHR5IHRhYmxlIGNlbGxzIHN0aWxsIGhhdmUgb2Zmc2V0V2lkdGgvSGVpZ2h0CgkvLyAoSUUgPCA4IGZhaWwgdGhpcyB0ZXN0KQoJc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgPSBpc1N1cHBvcnRlZCAmJiAoIHRkc1sgMCBdLm9mZnNldEhlaWdodCA9PT0gMCApOwoJZGl2LmlubmVySFRNTCA9ICIiOwoKCS8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHkKCS8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gRm9yIG1vcmUKCS8vIGluZm8gc2VlIGJ1ZyAjMzMzMwoJLy8gRmFpbHMgaW4gV2ViS2l0IGJlZm9yZSBGZWIgMjAxMSBuaWdodGxpZXMKCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJaWYgKCBkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlICkgewoJCW1hcmdpbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICk7CgkJbWFyZ2luRGl2LnN0eWxlLndpZHRoID0gIjAiOwoJCW1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9ICIwIjsKCQlkaXYuYXBwZW5kQ2hpbGQoIG1hcmdpbkRpdiApOwoJCXN1cHBvcnQucmVsaWFibGVNYXJnaW5SaWdodCA9CgkJCSggcGFyc2VJbnQoICggZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2LCBudWxsICkgfHwgeyBtYXJnaW5SaWdodDogMCB9ICkubWFyZ2luUmlnaHQsIDEwICkgfHwgMCApID09PSAwOwoJfQoKCS8vIFJlbW92ZSB0aGUgYm9keSBlbGVtZW50IHdlIGFkZGVkCgl0ZXN0RWxlbWVudC5pbm5lckhUTUwgPSAiIjsKCXRlc3RFbGVtZW50UGFyZW50LnJlbW92ZUNoaWxkKCB0ZXN0RWxlbWVudCApOwoKCS8vIFRlY2huaXF1ZSBmcm9tIEp1cml5IFpheXRzZXYKCS8vIGh0dHA6Ly90aGlua3dlYjIuY29tL3Byb2plY3RzL3Byb3RvdHlwZS9kZXRlY3RpbmctZXZlbnQtc3VwcG9ydC13aXRob3V0LWJyb3dzZXItc25pZmZpbmcvCgkvLyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIGNhc2Ugd2hlcmUgbm9uLXN0YW5kYXJkIGV2ZW50IHN5c3RlbXMKCS8vIGFyZSB1c2VkLCBuYW1lbHkgaW4gSUUuIFNob3J0LWNpcmN1aXRpbmcgaGVyZSBoZWxwcyB1cyB0bwoJLy8gYXZvaWQgYW4gZXZhbCBjYWxsIChpbiBzZXRBdHRyaWJ1dGUpIHdoaWNoIGNhbiBjYXVzZSBDU1AKCS8vIHRvIGdvIGhheXdpcmUuIFNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vU2VjdXJpdHkvQ1NQCglpZiAoIGRpdi5hdHRhY2hFdmVudCApIHsKCQlmb3IoIGkgaW4gewoJCQlzdWJtaXQ6IDEsCgkJCWNoYW5nZTogMSwKCQkJZm9jdXNpbjogMQoJCX0gKSB7CgkJCWV2ZW50TmFtZSA9ICJvbiIgKyBpOwoJCQlpc1N1cHBvcnRlZCA9ICggZXZlbnROYW1lIGluIGRpdiApOwoJCQlpZiAoICFpc1N1cHBvcnRlZCApIHsKCQkJCWRpdi5zZXRBdHRyaWJ1dGUoIGV2ZW50TmFtZSwgInJldHVybjsiICk7CgkJCQlpc1N1cHBvcnRlZCA9ICggdHlwZW9mIGRpdlsgZXZlbnROYW1lIF0gPT09ICJmdW5jdGlvbiIgKTsKCQkJfQoJCQlzdXBwb3J0WyBpICsgIkJ1YmJsZXMiIF0gPSBpc1N1cHBvcnRlZDsKCQl9Cgl9CgoJLy8gTnVsbCBjb25uZWN0ZWQgZWxlbWVudHMgdG8gYXZvaWQgbGVha3MgaW4gSUUKCXRlc3RFbGVtZW50ID0gZnJhZ21lbnQgPSBzZWxlY3QgPSBvcHQgPSBib2R5ID0gbWFyZ2luRGl2ID0gZGl2ID0gaW5wdXQgPSBudWxsOwoKCXJldHVybiBzdXBwb3J0Owp9KSgpOwoKLy8gS2VlcCB0cmFjayBvZiBib3hNb2RlbApqUXVlcnkuYm94TW9kZWwgPSBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbDsKCgoKCnZhciByYnJhY2UgPSAvXig/Olx7LipcfXxcWy4qXF0pJC8sCglybXVsdGlEYXNoID0gLyhbYS16XSkoW0EtWl0pL2c7CgpqUXVlcnkuZXh0ZW5kKHsKCWNhY2hlOiB7fSwKCgkvLyBQbGVhc2UgdXNlIHdpdGggY2F1dGlvbgoJdXVpZDogMCwKCgkvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2UKCS8vIE5vbi1kaWdpdHMgcmVtb3ZlZCB0byBtYXRjaCByaW5saW5lalF1ZXJ5CglleHBhbmRvOiAialF1ZXJ5IiArICggalF1ZXJ5LmZuLmpxdWVyeSArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXEQvZywgIiIgKSwKCgkvLyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIHRocm93IHVuY2F0Y2hhYmxlIGV4Y2VwdGlvbnMgaWYgeW91CgkvLyBhdHRlbXB0IHRvIGFkZCBleHBhbmRvIHByb3BlcnRpZXMgdG8gdGhlbS4KCW5vRGF0YTogewoJCSJlbWJlZCI6IHRydWUsCgkJLy8gQmFuIGFsbCBvYmplY3RzIGV4Y2VwdCBmb3IgRmxhc2ggKHdoaWNoIGhhbmRsZSBleHBhbmRvcykKCQkib2JqZWN0IjogImNsc2lkOkQyN0NEQjZFLUFFNkQtMTFjZi05NkI4LTQ0NDU1MzU0MDAwMCIsCgkJImFwcGxldCI6IHRydWUKCX0sCgoJaGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJZWxlbSA9IGVsZW0ubm9kZVR5cGUgPyBqUXVlcnkuY2FjaGVbIGVsZW1balF1ZXJ5LmV4cGFuZG9dIF0gOiBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQlyZXR1cm4gISFlbGVtICYmICFpc0VtcHR5RGF0YU9iamVjdCggZWxlbSApOwoJfSwKCglkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSwgcHZ0IC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCWlmICggIWpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciB0aGlzQ2FjaGUsIHJldCwKCQkJaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJZ2V0QnlOYW1lID0gdHlwZW9mIG5hbWUgPT09ICJzdHJpbmciLAoKCQkJLy8gV2UgaGF2ZSB0byBoYW5kbGUgRE9NIG5vZGVzIGFuZCBKUyBvYmplY3RzIGRpZmZlcmVudGx5IGJlY2F1c2UgSUU2LTcKCQkJLy8gY2FuJ3QgR0Mgb2JqZWN0IHJlZmVyZW5jZXMgcHJvcGVybHkgYWNyb3NzIHRoZSBET00tSlMgYm91bmRhcnkKCQkJaXNOb2RlID0gZWxlbS5ub2RlVHlwZSwKCgkJCS8vIE9ubHkgRE9NIG5vZGVzIG5lZWQgdGhlIGdsb2JhbCBqUXVlcnkgY2FjaGU7IEpTIG9iamVjdCBkYXRhIGlzCgkJCS8vIGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBvYmplY3Qgc28gR0MgY2FuIG9jY3VyIGF1dG9tYXRpY2FsbHkKCQkJY2FjaGUgPSBpc05vZGUgPyBqUXVlcnkuY2FjaGUgOiBlbGVtLAoKCQkJLy8gT25seSBkZWZpbmluZyBhbiBJRCBmb3IgSlMgb2JqZWN0cyBpZiBpdHMgY2FjaGUgYWxyZWFkeSBleGlzdHMgYWxsb3dzCgkJCS8vIHRoZSBjb2RlIHRvIHNob3J0Y3V0IG9uIHRoZSBzYW1lIHBhdGggYXMgYSBET00gbm9kZSB3aXRoIG5vIGNhY2hlCgkJCWlkID0gaXNOb2RlID8gZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXSA6IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gJiYgalF1ZXJ5LmV4cGFuZG87CgoJCS8vIEF2b2lkIGRvaW5nIGFueSBtb3JlIHdvcmsgdGhhbiB3ZSBuZWVkIHRvIHdoZW4gdHJ5aW5nIHRvIGdldCBkYXRhIG9uIGFuCgkJLy8gb2JqZWN0IHRoYXQgaGFzIG5vIGRhdGEgYXQgYWxsCgkJaWYgKCAoIWlkIHx8IChwdnQgJiYgaWQgJiYgKGNhY2hlWyBpZCBdICYmICFjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSkpKSAmJiBnZXRCeU5hbWUgJiYgZGF0YSA9PT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoICFpZCApIHsKCQkJLy8gT25seSBET00gbm9kZXMgbmVlZCBhIG5ldyB1bmlxdWUgSUQgZm9yIGVhY2ggZWxlbWVudCBzaW5jZSB0aGVpciBkYXRhCgkJCS8vIGVuZHMgdXAgaW4gdGhlIGdsb2JhbCBjYWNoZQoJCQlpZiAoIGlzTm9kZSApIHsKCQkJCWVsZW1bIGpRdWVyeS5leHBhbmRvIF0gPSBpZCA9ICsralF1ZXJ5LnV1aWQ7CgkJCX0gZWxzZSB7CgkJCQlpZCA9IGpRdWVyeS5leHBhbmRvOwoJCQl9CgkJfQoKCQlpZiAoICFjYWNoZVsgaWQgXSApIHsKCQkJY2FjaGVbIGlkIF0gPSB7fTsKCgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgkJfQoKCQkvLyBBbiBvYmplY3QgY2FuIGJlIHBhc3NlZCB0byBqUXVlcnkuZGF0YSBpbnN0ZWFkIG9mIGEga2V5L3ZhbHVlIHBhaXI7IHRoaXMgZ2V0cwoJCS8vIHNoYWxsb3cgY29waWVkIG92ZXIgb250byB0aGUgZXhpc3RpbmcgY2FjaGUKCQlpZiAoIHR5cGVvZiBuYW1lID09PSAib2JqZWN0IiB8fCB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiApIHsKCQkJaWYgKCBwdnQgKSB7CgkJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoY2FjaGVbIGlkIF1bIGludGVybmFsS2V5IF0sIG5hbWUpOwoJCQl9IGVsc2UgewoJCQkJY2FjaGVbIGlkIF0gPSBqUXVlcnkuZXh0ZW5kKGNhY2hlWyBpZCBdLCBuYW1lKTsKCQkJfQoJCX0KCgkJdGhpc0NhY2hlID0gY2FjaGVbIGlkIF07CgoJCS8vIEludGVybmFsIGpRdWVyeSBkYXRhIGlzIHN0b3JlZCBpbiBhIHNlcGFyYXRlIG9iamVjdCBpbnNpZGUgdGhlIG9iamVjdCdzIGRhdGEKCQkvLyBjYWNoZSBpbiBvcmRlciB0byBhdm9pZCBrZXkgY29sbGlzaW9ucyBiZXR3ZWVuIGludGVybmFsIGRhdGEgYW5kIHVzZXItZGVmaW5lZAoJCS8vIGRhdGEKCQlpZiAoIHB2dCApIHsKCQkJaWYgKCAhdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICkgewoJCQkJdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdID0ge307CgkJCX0KCgkJCXRoaXNDYWNoZSA9IHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXTsKCQl9CgoJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkgewoJCQl0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdID0gZGF0YTsKCQl9CgoJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIDEuNi4gVXNlcnMgc2hvdWxkCgkJLy8gbm90IGF0dGVtcHQgdG8gaW5zcGVjdCB0aGUgaW50ZXJuYWwgZXZlbnRzIG9iamVjdCB1c2luZyBqUXVlcnkuZGF0YSwgYXMgdGhpcwoJCS8vIGludGVybmFsIGRhdGEgb2JqZWN0IGlzIHVuZG9jdW1lbnRlZCBhbmQgc3ViamVjdCB0byBjaGFuZ2UuCgkJaWYgKCBuYW1lID09PSAiZXZlbnRzIiAmJiAhdGhpc0NhY2hlW25hbWVdICkgewoJCQlyZXR1cm4gdGhpc0NhY2hlWyBpbnRlcm5hbEtleSBdICYmIHRoaXNDYWNoZVsgaW50ZXJuYWxLZXkgXS5ldmVudHM7CgkJfQoKCQkvLyBDaGVjayBmb3IgYm90aCBjb252ZXJ0ZWQtdG8tY2FtZWwgYW5kIG5vbi1jb252ZXJ0ZWQgZGF0YSBwcm9wZXJ0eSBuYW1lcwoJCS8vIElmIGEgZGF0YSBwcm9wZXJ0eSB3YXMgc3BlY2lmaWVkCgkJaWYgKCBnZXRCeU5hbWUgKSB7CgoJCQkvLyBGaXJzdCBUcnkgdG8gZmluZCBhcy1pcyBwcm9wZXJ0eSBkYXRhCgkJCXJldCA9IHRoaXNDYWNoZVsgbmFtZSBdOwoKCQkJLy8gVGVzdCBmb3IgbnVsbHx1bmRlZmluZWQgcHJvcGVydHkgZGF0YQoJCQlpZiAoIHJldCA9PSBudWxsICkgewoKCQkJCS8vIFRyeSB0byBmaW5kIHRoZSBjYW1lbENhc2VkIHByb3BlcnR5CgkJCQlyZXQgPSB0aGlzQ2FjaGVbIGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKSBdOwoJCQl9CgkJfSBlbHNlIHsKCQkJcmV0ID0gdGhpc0NhY2hlOwoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHB2dCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHsKCQlpZiAoICFqUXVlcnkuYWNjZXB0RGF0YSggZWxlbSApICkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgdGhpc0NhY2hlLAoKCQkJLy8gUmVmZXJlbmNlIHRvIGludGVybmFsIGRhdGEgY2FjaGUga2V5CgkJCWludGVybmFsS2V5ID0galF1ZXJ5LmV4cGFuZG8sCgoJCQlpc05vZGUgPSBlbGVtLm5vZGVUeXBlLAoKCQkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJCWNhY2hlID0gaXNOb2RlID8galF1ZXJ5LmNhY2hlIDogZWxlbSwKCgkJCS8vIFNlZSBqUXVlcnkuZGF0YSBmb3IgbW9yZSBpbmZvcm1hdGlvbgoJCQlpZCA9IGlzTm9kZSA/IGVsZW1bIGpRdWVyeS5leHBhbmRvIF0gOiBqUXVlcnkuZXhwYW5kbzsKCgkJLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBubyBjYWNoZSBlbnRyeSBmb3IgdGhpcyBvYmplY3QsIHRoZXJlIGlzIG5vCgkJLy8gcHVycG9zZSBpbiBjb250aW51aW5nCgkJaWYgKCAhY2FjaGVbIGlkIF0gKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggbmFtZSApIHsKCgkJCXRoaXNDYWNoZSA9IHB2dCA/IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdIDogY2FjaGVbIGlkIF07CgoJCQlpZiAoIHRoaXNDYWNoZSApIHsKCgkJCQkvLyBTdXBwb3J0IGludGVyb3BlcmFibGUgcmVtb3ZhbCBvZiBoeXBoZW5hdGVkIG9yIGNhbWVsY2FzZWQga2V5cwoJCQkJaWYgKCAhdGhpc0NhY2hlWyBuYW1lIF0gKSB7CgkJCQkJbmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTsKCQkJCX0KCgkJCQlkZWxldGUgdGhpc0NhY2hlWyBuYW1lIF07CgoJCQkJLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBsZWZ0IGluIHRoZSBjYWNoZSwgd2Ugd2FudCB0byBjb250aW51ZQoJCQkJLy8gYW5kIGxldCB0aGUgY2FjaGUgb2JqZWN0IGl0c2VsZiBnZXQgZGVzdHJveWVkCgkJCQlpZiAoICFpc0VtcHR5RGF0YU9iamVjdCh0aGlzQ2FjaGUpICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJfQoJCX0KCgkJLy8gU2VlIGpRdWVyeS5kYXRhIGZvciBtb3JlIGluZm9ybWF0aW9uCgkJaWYgKCBwdnQgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCS8vIERvbid0IGRlc3Ryb3kgdGhlIHBhcmVudCBjYWNoZSB1bmxlc3MgdGhlIGludGVybmFsIGRhdGEgb2JqZWN0CgkJCS8vIGhhZCBiZWVuIHRoZSBvbmx5IHRoaW5nIGxlZnQgaW4gaXQKCQkJaWYgKCAhaXNFbXB0eURhdGFPYmplY3QoY2FjaGVbIGlkIF0pICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJfQoKCQl2YXIgaW50ZXJuYWxDYWNoZSA9IGNhY2hlWyBpZCBdWyBpbnRlcm5hbEtleSBdOwoKCQkvLyBCcm93c2VycyB0aGF0IGZhaWwgZXhwYW5kbyBkZWxldGlvbiBhbHNvIHJlZnVzZSB0byBkZWxldGUgZXhwYW5kb3Mgb24KCQkvLyB0aGUgd2luZG93LCBidXQgaXQgd2lsbCBhbGxvdyBpdCBvbiBhbGwgb3RoZXIgSlMgb2JqZWN0czsgb3RoZXIgYnJvd3NlcnMKCQkvLyBkb24ndCBjYXJlCgkJLy8gRW5zdXJlIHRoYXQgYGNhY2hlYCBpcyBub3QgYSB3aW5kb3cgb2JqZWN0ICMxMDA4MAoJCWlmICggalF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbyB8fCAhY2FjaGUuc2V0SW50ZXJ2YWwgKSB7CgkJCWRlbGV0ZSBjYWNoZVsgaWQgXTsKCQl9IGVsc2UgewoJCQljYWNoZVsgaWQgXSA9IG51bGw7CgkJfQoKCQkvLyBXZSBkZXN0cm95ZWQgdGhlIGVudGlyZSB1c2VyIGNhY2hlIGF0IG9uY2UgYmVjYXVzZSBpdCdzIGZhc3RlciB0aGFuCgkJLy8gaXRlcmF0aW5nIHRocm91Z2ggZWFjaCBrZXksIGJ1dCB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRvIHBlcnNpc3QgaW50ZXJuYWwKCQkvLyBkYXRhIGlmIGl0IGV4aXN0ZWQKCQlpZiAoIGludGVybmFsQ2FjaGUgKSB7CgkJCWNhY2hlWyBpZCBdID0ge307CgkJCS8vIFRPRE86IFRoaXMgaXMgYSBoYWNrIGZvciAxLjUgT05MWS4gQXZvaWRzIGV4cG9zaW5nIGpRdWVyeQoJCQkvLyBtZXRhZGF0YSBvbiBwbGFpbiBKUyBvYmplY3RzIHdoZW4gdGhlIG9iamVjdCBpcyBzZXJpYWxpemVkIHVzaW5nCgkJCS8vIEpTT04uc3RyaW5naWZ5CgkJCWlmICggIWlzTm9kZSApIHsKCQkJCWNhY2hlWyBpZCBdLnRvSlNPTiA9IGpRdWVyeS5ub29wOwoJCQl9CgoJCQljYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXSA9IGludGVybmFsQ2FjaGU7CgoJCS8vIE90aGVyd2lzZSwgd2UgbmVlZCB0byBlbGltaW5hdGUgdGhlIGV4cGFuZG8gb24gdGhlIG5vZGUgdG8gYXZvaWQKCQkvLyBmYWxzZSBsb29rdXBzIGluIHRoZSBjYWNoZSBmb3IgZW50cmllcyB0aGF0IG5vIGxvbmdlciBleGlzdAoJCX0gZWxzZSBpZiAoIGlzTm9kZSApIHsKCQkJLy8gSUUgZG9lcyBub3QgYWxsb3cgdXMgdG8gZGVsZXRlIGV4cGFuZG8gcHJvcGVydGllcyBmcm9tIG5vZGVzLAoJCQkvLyBub3IgZG9lcyBpdCBoYXZlIGEgcmVtb3ZlQXR0cmlidXRlIGZ1bmN0aW9uIG9uIERvY3VtZW50IG5vZGVzOwoJCQkvLyB3ZSBtdXN0IGhhbmRsZSBhbGwgb2YgdGhlc2UgY2FzZXMKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5kZWxldGVFeHBhbmRvICkgewoJCQkJZGVsZXRlIGVsZW1bIGpRdWVyeS5leHBhbmRvIF07CgkJCX0gZWxzZSBpZiAoIGVsZW0ucmVtb3ZlQXR0cmlidXRlICkgewoJCQkJZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIGpRdWVyeS5leHBhbmRvICk7CgkJCX0gZWxzZSB7CgkJCQllbGVtWyBqUXVlcnkuZXhwYW5kbyBdID0gbnVsbDsKCQkJfQoJCX0KCX0sCgoJLy8gRm9yIGludGVybmFsIHVzZSBvbmx5LgoJX2RhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBkYXRhICkgewoJCXJldHVybiBqUXVlcnkuZGF0YSggZWxlbSwgbmFtZSwgZGF0YSwgdHJ1ZSApOwoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSBET00gbm9kZSBjYW4gaGFuZGxlIHRoZSBkYXRhIGV4cGFuZG8KCWFjY2VwdERhdGE6IGZ1bmN0aW9uKCBlbGVtICkgewoJCWlmICggZWxlbS5ub2RlTmFtZSApIHsKCQkJdmFyIG1hdGNoID0galF1ZXJ5Lm5vRGF0YVsgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07CgoJCQlpZiAoIG1hdGNoICkgewoJCQkJcmV0dXJuICEobWF0Y2ggPT09IHRydWUgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoImNsYXNzaWQiKSAhPT0gbWF0Y2gpOwoJCQl9CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfSk7CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBkYXRhID0gbnVsbDsKCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAidW5kZWZpbmVkIiApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSApOwoKCQkJCWlmICggdGhpc1swXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJICAgIHZhciBhdHRyID0gdGhpc1swXS5hdHRyaWJ1dGVzLCBuYW1lOwoJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGF0dHIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCQluYW1lID0gYXR0cltpXS5uYW1lOwoKCQkJCQkJaWYgKCBuYW1lLmluZGV4T2YoICJkYXRhLSIgKSA9PT0gMCApIHsKCQkJCQkJCW5hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lLnN1YnN0cmluZyg1KSApOwoKCQkJCQkJCWRhdGFBdHRyKCB0aGlzWzBdLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRhdGE7CgoJCX0gZWxzZSBpZiAoIHR5cGVvZiBrZXkgPT09ICJvYmplY3QiICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSApOwoJCQl9KTsKCQl9CgoJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOwoJCXBhcnRzWzFdID0gcGFydHNbMV0gPyAiLiIgKyBwYXJ0c1sxXSA6ICIiOwoKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCWRhdGEgPSB0aGlzLnRyaWdnZXJIYW5kbGVyKCJnZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBbcGFydHNbMF1dKTsKCgkJCS8vIFRyeSB0byBmZXRjaCBhbnkgaW50ZXJuYWxseSBzdG9yZWQgZGF0YSBmaXJzdAoJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiB0aGlzLmxlbmd0aCApIHsKCQkJCWRhdGEgPSBqUXVlcnkuZGF0YSggdGhpc1swXSwga2V5ICk7CgkJCQlkYXRhID0gZGF0YUF0dHIoIHRoaXNbMF0sIGtleSwgZGF0YSApOwoJCQl9CgoJCQlyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkICYmIHBhcnRzWzFdID8KCQkJCXRoaXMuZGF0YSggcGFydHNbMF0gKSA6CgkJCQlkYXRhOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyICR0aGlzID0galF1ZXJ5KCB0aGlzICksCgkJCQkJYXJncyA9IFsgcGFydHNbMF0sIHZhbHVlIF07CgoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJzZXREYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCQlqUXVlcnkuZGF0YSggdGhpcywga2V5LCB2YWx1ZSApOwoJCQkJJHRoaXMudHJpZ2dlckhhbmRsZXIoICJjaGFuZ2VEYXRhIiArIHBhcnRzWzFdICsgIiEiLCBhcmdzICk7CgkJCX0pOwoJCX0KCX0sCgoJcmVtb3ZlRGF0YTogZnVuY3Rpb24oIGtleSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlRGF0YSggdGhpcywga2V5ICk7CgkJfSk7Cgl9Cn0pOwoKZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHsKCS8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnkKCS8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZQoJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQl2YXIgbmFtZSA9ICJkYXRhLSIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgIiQxLSQyIiApLnRvTG93ZXJDYXNlKCk7CgoJCWRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQlpZiAoIHR5cGVvZiBkYXRhID09PSAic3RyaW5nIiApIHsKCQkJdHJ5IHsKCQkJCWRhdGEgPSBkYXRhID09PSAidHJ1ZSIgPyB0cnVlIDoKCQkJCWRhdGEgPT09ICJmYWxzZSIgPyBmYWxzZSA6CgkJCQlkYXRhID09PSAibnVsbCIgPyBudWxsIDoKCQkJCSFqUXVlcnkuaXNOYU4oIGRhdGEgKSA/IHBhcnNlRmxvYXQoIGRhdGEgKSA6CgkJCQkJcmJyYWNlLnRlc3QoIGRhdGEgKSA/IGpRdWVyeS5wYXJzZUpTT04oIGRhdGEgKSA6CgkJCQkJZGF0YTsKCQkJfSBjYXRjaCggZSApIHt9CgoJCQkvLyBNYWtlIHN1cmUgd2Ugc2V0IHRoZSBkYXRhIHNvIGl0IGlzbid0IGNoYW5nZWQgbGF0ZXIKCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgZGF0YSApOwoKCQl9IGVsc2UgewoJCQlkYXRhID0gdW5kZWZpbmVkOwoJCX0KCX0KCglyZXR1cm4gZGF0YTsKfQoKLy8gVE9ETzogVGhpcyBpcyBhIGhhY2sgZm9yIDEuNSBPTkxZIHRvIGFsbG93IG9iamVjdHMgd2l0aCBhIHNpbmdsZSB0b0pTT04KLy8gcHJvcGVydHkgdG8gYmUgY29uc2lkZXJlZCBlbXB0eSBvYmplY3RzOyB0aGlzIHByb3BlcnR5IGFsd2F5cyBleGlzdHMgaW4KLy8gb3JkZXIgdG8gbWFrZSBzdXJlIEpTT04uc3RyaW5naWZ5IGRvZXMgbm90IGV4cG9zZSBpbnRlcm5hbCBtZXRhZGF0YQpmdW5jdGlvbiBpc0VtcHR5RGF0YU9iamVjdCggb2JqICkgewoJZm9yICggdmFyIG5hbWUgaW4gb2JqICkgewoJCWlmICggbmFtZSAhPT0gInRvSlNPTiIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9Cgl9CgoJcmV0dXJuIHRydWU7Cn0KCgoKCmZ1bmN0aW9uIGhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCBzcmMgKSB7Cgl2YXIgZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCgkJcXVldWVEYXRhS2V5ID0gdHlwZSArICJxdWV1ZSIsCgkJbWFya0RhdGFLZXkgPSB0eXBlICsgIm1hcmsiLAoJCWRlZmVyID0galF1ZXJ5LmRhdGEoIGVsZW0sIGRlZmVyRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICk7CglpZiAoIGRlZmVyICYmCgkJKCBzcmMgPT09ICJxdWV1ZSIgfHwgIWpRdWVyeS5kYXRhKCBlbGVtLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICkgJiYKCQkoIHNyYyA9PT0gIm1hcmsiIHx8ICFqUXVlcnkuZGF0YSggZWxlbSwgbWFya0RhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApICkgKSB7CgkJLy8gR2l2ZSByb29tIGZvciBoYXJkLWNvZGVkIGNhbGxiYWNrcyB0byBmaXJlIGZpcnN0CgkJLy8gYW5kIGV2ZW50dWFsbHkgbWFyay9xdWV1ZSBzb21ldGhpbmcgZWxzZSBvbiB0aGUgZWxlbWVudAoJCXNldFRpbWVvdXQoIGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkuZGF0YSggZWxlbSwgcXVldWVEYXRhS2V5LCB1bmRlZmluZWQsIHRydWUgKSAmJgoJCQkJIWpRdWVyeS5kYXRhKCBlbGVtLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSB7CgkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSwgZGVmZXJEYXRhS2V5LCB0cnVlICk7CgkJCQlkZWZlci5yZXNvbHZlKCk7CgkJCX0KCQl9LCAwICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoKCV9tYXJrOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQlpZiAoIGVsZW0gKSB7CgkJCXR5cGUgPSAodHlwZSB8fCAiZngiKSArICJtYXJrIjsKCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIChqUXVlcnkuZGF0YShlbGVtLHR5cGUsdW5kZWZpbmVkLHRydWUpIHx8IDApICsgMSwgdHJ1ZSApOwoJCX0KCX0sCgoJX3VubWFyazogZnVuY3Rpb24oIGZvcmNlLCBlbGVtLCB0eXBlICkgewoJCWlmICggZm9yY2UgIT09IHRydWUgKSB7CgkJCXR5cGUgPSBlbGVtOwoJCQllbGVtID0gZm9yY2U7CgkJCWZvcmNlID0gZmFsc2U7CgkJfQoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgImZ4IjsKCQkJdmFyIGtleSA9IHR5cGUgKyAibWFyayIsCgkJCQljb3VudCA9IGZvcmNlID8gMCA6ICggKGpRdWVyeS5kYXRhKCBlbGVtLCBrZXksIHVuZGVmaW5lZCwgdHJ1ZSkgfHwgMSApIC0gMSApOwoJCQlpZiAoIGNvdW50ICkgewoJCQkJalF1ZXJ5LmRhdGEoIGVsZW0sIGtleSwgY291bnQsIHRydWUgKTsKCQkJfSBlbHNlIHsKCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCBrZXksIHRydWUgKTsKCQkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAibWFyayIgKTsKCQkJfQoJCX0KCX0sCgoJcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkgewoJCWlmICggZWxlbSApIHsKCQkJdHlwZSA9ICh0eXBlIHx8ICJmeCIpICsgInF1ZXVlIjsKCQkJdmFyIHEgPSBqUXVlcnkuZGF0YSggZWxlbSwgdHlwZSwgdW5kZWZpbmVkLCB0cnVlICk7CgkJCS8vIFNwZWVkIHVwIGRlcXVldWUgYnkgZ2V0dGluZyBvdXQgcXVpY2tseSBpZiB0aGlzIGlzIGp1c3QgYSBsb29rdXAKCQkJaWYgKCBkYXRhICkgewoJCQkJaWYgKCAhcSB8fCBqUXVlcnkuaXNBcnJheShkYXRhKSApIHsKCQkJCQlxID0galF1ZXJ5LmRhdGEoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoZGF0YSksIHRydWUgKTsKCQkJCX0gZWxzZSB7CgkJCQkJcS5wdXNoKCBkYXRhICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIHEgfHwgW107CgkJfQoJfSwKCglkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHsKCQl0eXBlID0gdHlwZSB8fCAiZngiOwoKCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSwKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpLAoJCQlkZWZlcjsKCgkJLy8gSWYgdGhlIGZ4IHF1ZXVlIGlzIGRlcXVldWVkLCBhbHdheXMgcmVtb3ZlIHRoZSBwcm9ncmVzcyBzZW50aW5lbAoJCWlmICggZm4gPT09ICJpbnByb2dyZXNzIiApIHsKCQkJZm4gPSBxdWV1ZS5zaGlmdCgpOwoJCX0KCgkJaWYgKCBmbiApIHsKCQkJLy8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZwoJCQkvLyBhdXRvbWF0aWNhbGx5IGRlcXVldWVkCgkJCWlmICggdHlwZSA9PT0gImZ4IiApIHsKCQkJCXF1ZXVlLnVuc2hpZnQoImlucHJvZ3Jlc3MiKTsKCQkJfQoKCQkJZm4uY2FsbChlbGVtLCBmdW5jdGlvbigpIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKGVsZW0sIHR5cGUpOwoJCQl9KTsKCQl9CgoJCWlmICggIXF1ZXVlLmxlbmd0aCApIHsKCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHR5cGUgKyAicXVldWUiLCB0cnVlICk7CgkJCWhhbmRsZVF1ZXVlTWFya0RlZmVyKCBlbGVtLCB0eXBlLCAicXVldWUiICk7CgkJfQoJfQp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJcXVldWU6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlkYXRhID0gdHlwZTsKCQkJdHlwZSA9ICJmeCI7CgkJfQoKCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1swXSwgdHlwZSApOwoJCX0KCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIGRhdGEgKTsKCgkJCWlmICggdHlwZSA9PT0gImZ4IiAmJiBxdWV1ZVswXSAhPT0gImlucHJvZ3Jlc3MiICkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTsKCQkJfQoJCX0pOwoJfSwKCWRlcXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7CgkJfSk7Cgl9LAoJLy8gQmFzZWQgb2ZmIG9mIHRoZSBwbHVnaW4gYnkgQ2xpbnQgSGVsZmVycywgd2l0aCBwZXJtaXNzaW9uLgoJLy8gaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5LwoJZGVsYXk6IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkgewoJCXRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzW3RpbWVdIHx8IHRpbWUgOiB0aW1lOwoJCXR5cGUgPSB0eXBlIHx8ICJmeCI7CgoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbigpIHsKCQkJdmFyIGVsZW0gPSB0aGlzOwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJalF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTsKCQkJfSwgdGltZSApOwoJCX0pOwoJfSwKCWNsZWFyUXVldWU6IGZ1bmN0aW9uKCB0eXBlICkgewoJCXJldHVybiB0aGlzLnF1ZXVlKCB0eXBlIHx8ICJmeCIsIFtdICk7Cgl9LAoJLy8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZQoJLy8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpCglwcm9taXNlOiBmdW5jdGlvbiggdHlwZSwgb2JqZWN0ICkgewoJCWlmICggdHlwZW9mIHR5cGUgIT09ICJzdHJpbmciICkgewoJCQlvYmplY3QgPSB0eXBlOwoJCQl0eXBlID0gdW5kZWZpbmVkOwoJCX0KCQl0eXBlID0gdHlwZSB8fCAiZngiOwoJCXZhciBkZWZlciA9IGpRdWVyeS5EZWZlcnJlZCgpLAoJCQllbGVtZW50cyA9IHRoaXMsCgkJCWkgPSBlbGVtZW50cy5sZW5ndGgsCgkJCWNvdW50ID0gMSwKCQkJZGVmZXJEYXRhS2V5ID0gdHlwZSArICJkZWZlciIsCgkJCXF1ZXVlRGF0YUtleSA9IHR5cGUgKyAicXVldWUiLAoJCQltYXJrRGF0YUtleSA9IHR5cGUgKyAibWFyayIsCgkJCXRtcDsKCQlmdW5jdGlvbiByZXNvbHZlKCkgewoJCQlpZiAoICEoIC0tY291bnQgKSApIHsKCQkJCWRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7CgkJCX0KCQl9CgkJd2hpbGUoIGktLSApIHsKCQkJaWYgKCggdG1wID0galF1ZXJ5LmRhdGEoIGVsZW1lbnRzWyBpIF0sIGRlZmVyRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgfHwKCQkJCQkoIGpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBxdWV1ZURhdGFLZXksIHVuZGVmaW5lZCwgdHJ1ZSApIHx8CgkJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBtYXJrRGF0YUtleSwgdW5kZWZpbmVkLCB0cnVlICkgKSAmJgoJCQkJCWpRdWVyeS5kYXRhKCBlbGVtZW50c1sgaSBdLCBkZWZlckRhdGFLZXksIGpRdWVyeS5fRGVmZXJyZWQoKSwgdHJ1ZSApICkpIHsKCQkJCWNvdW50Kys7CgkJCQl0bXAuZG9uZSggcmVzb2x2ZSApOwoJCQl9CgkJfQoJCXJlc29sdmUoKTsKCQlyZXR1cm4gZGVmZXIucHJvbWlzZSgpOwoJfQp9KTsKCgoKCnZhciByY2xhc3MgPSAvW1xuXHRccl0vZywKCXJzcGFjZSA9IC9ccysvLAoJcnJldHVybiA9IC9cci9nLAoJcnR5cGUgPSAvXig/OmJ1dHRvbnxpbnB1dCkkL2ksCglyZm9jdXNhYmxlID0gL14oPzpidXR0b258aW5wdXR8b2JqZWN0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksCglyY2xpY2thYmxlID0gL15hKD86cmVhKT8kL2ksCglyYm9vbGVhbiA9IC9eKD86YXV0b2ZvY3VzfGF1dG9wbGF5fGFzeW5jfGNoZWNrZWR8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWR8c2VsZWN0ZWQpJC9pLAoJbm9kZUhvb2ssIGJvb2xIb29rOwoKalF1ZXJ5LmZuLmV4dGVuZCh7CglhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJcmV0dXJuIGpRdWVyeS5hY2Nlc3MoIHRoaXMsIG5hbWUsIHZhbHVlLCB0cnVlLCBqUXVlcnkuYXR0ciApOwoJfSwKCglyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHsKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApOwoJCX0pOwoJfSwKCQoJcHJvcDogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJCXJldHVybiBqUXVlcnkuYWNjZXNzKCB0aGlzLCBuYW1lLCB2YWx1ZSwgdHJ1ZSwgalF1ZXJ5LnByb3AgKTsKCX0sCgkKCXJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkgewoJCW5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJLy8gdHJ5L2NhdGNoIGhhbmRsZXMgY2FzZXMgd2hlcmUgSUUgYmFsa3MgKHN1Y2ggYXMgcmVtb3ZpbmcgYSBwcm9wZXJ0eSBvbiB3aW5kb3cpCgkJCXRyeSB7CgkJCQl0aGlzWyBuYW1lIF0gPSB1bmRlZmluZWQ7CgkJCQlkZWxldGUgdGhpc1sgbmFtZSBdOwoJCQl9IGNhdGNoKCBlICkge30KCQl9KTsKCX0sCgoJYWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgY2xhc3NOYW1lcywgaSwgbCwgZWxlbSwKCQkJc2V0Q2xhc3MsIGMsIGNsOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBqICkgewoJCQkJalF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaiwgdGhpcy5jbGFzc05hbWUpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICkgewoJCQljbGFzc05hbWVzID0gdmFsdWUuc3BsaXQoIHJzcGFjZSApOwoKCQkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWVsZW0gPSB0aGlzWyBpIF07CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWVsZW0uY2xhc3NOYW1lICYmIGNsYXNzTmFtZXMubGVuZ3RoID09PSAxICkgewoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IHZhbHVlOwoKCQkJCQl9IGVsc2UgewoJCQkJCQlzZXRDbGFzcyA9ICIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiOwoKCQkJCQkJZm9yICggYyA9IDAsIGNsID0gY2xhc3NOYW1lcy5sZW5ndGg7IGMgPCBjbDsgYysrICkgewoJCQkJCQkJaWYgKCAhfnNldENsYXNzLmluZGV4T2YoICIgIiArIGNsYXNzTmFtZXNbIGMgXSArICIgIiApICkgewoJCQkJCQkJCXNldENsYXNzICs9IGNsYXNzTmFtZXNbIGMgXSArICIgIjsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQllbGVtLmNsYXNzTmFtZSA9IGpRdWVyeS50cmltKCBzZXRDbGFzcyApOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCXJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGNsYXNzTmFtZXMsIGksIGwsIGVsZW0sIGNsYXNzTmFtZSwgYywgY2w7CgoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGogKSB7CgkJCQlqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCh0aGlzLCBqLCB0aGlzLmNsYXNzTmFtZSkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciKSB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgewoJCQljbGFzc05hbWVzID0gKHZhbHVlIHx8ICIiKS5zcGxpdCggcnNwYWNlICk7CgoJCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbIGkgXTsKCgkJCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgZWxlbS5jbGFzc05hbWUgKSB7CgkJCQkJaWYgKCB2YWx1ZSApIHsKCQkJCQkJY2xhc3NOYW1lID0gKCIgIiArIGVsZW0uY2xhc3NOYW1lICsgIiAiKS5yZXBsYWNlKCByY2xhc3MsICIgIiApOwoJCQkJCQlmb3IgKCBjID0gMCwgY2wgPSBjbGFzc05hbWVzLmxlbmd0aDsgYyA8IGNsOyBjKysgKSB7CgkJCQkJCQljbGFzc05hbWUgPSBjbGFzc05hbWUucmVwbGFjZSgiICIgKyBjbGFzc05hbWVzWyBjIF0gKyAiICIsICIgIik7CgkJCQkJCX0KCQkJCQkJZWxlbS5jbGFzc05hbWUgPSBqUXVlcnkudHJpbSggY2xhc3NOYW1lICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWVsZW0uY2xhc3NOYW1lID0gIiI7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJdG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7CgkJdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWUsCgkJCWlzQm9vbCA9IHR5cGVvZiBzdGF0ZVZhbCA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoIHZhbHVlLmNhbGwodGhpcywgaSwgdGhpcy5jbGFzc05hbWUsIHN0YXRlVmFsKSwgc3RhdGVWYWwgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICkgewoJCQkJLy8gdG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXMKCQkJCXZhciBjbGFzc05hbWUsCgkJCQkJaSA9IDAsCgkJCQkJc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJCXN0YXRlID0gc3RhdGVWYWwsCgkJCQkJY2xhc3NOYW1lcyA9IHZhbHVlLnNwbGl0KCByc3BhY2UgKTsKCgkJCQl3aGlsZSAoIChjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSkgKSB7CgkJCQkJLy8gY2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGVyYXRlZCBsaXN0CgkJCQkJc3RhdGUgPSBpc0Jvb2wgPyBzdGF0ZSA6ICFzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKTsKCQkJCQlzZWxmWyBzdGF0ZSA/ICJhZGRDbGFzcyIgOiAicmVtb3ZlQ2xhc3MiIF0oIGNsYXNzTmFtZSApOwoJCQkJfQoKCQkJfSBlbHNlIGlmICggdHlwZSA9PT0gInVuZGVmaW5lZCIgfHwgdHlwZSA9PT0gImJvb2xlYW4iICkgewoJCQkJaWYgKCB0aGlzLmNsYXNzTmFtZSApIHsKCQkJCQkvLyBzdG9yZSBjbGFzc05hbWUgaWYgc2V0CgkJCQkJalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiX19jbGFzc05hbWVfXyIsIHRoaXMuY2xhc3NOYW1lICk7CgkJCQl9CgoJCQkJLy8gdG9nZ2xlIHdob2xlIGNsYXNzTmFtZQoJCQkJdGhpcy5jbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgPyAiIiA6IGpRdWVyeS5fZGF0YSggdGhpcywgIl9fY2xhc3NOYW1lX18iICkgfHwgIiI7CgkJCX0KCQl9KTsKCX0sCgoJaGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgY2xhc3NOYW1lID0gIiAiICsgc2VsZWN0b3IgKyAiICI7CgkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCWlmICggdGhpc1tpXS5ub2RlVHlwZSA9PT0gMSAmJiAoIiAiICsgdGhpc1tpXS5jbGFzc05hbWUgKyAiICIpLnJlcGxhY2UocmNsYXNzLCAiICIpLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfSwKCgl2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgaG9va3MsIHJldCwKCQkJZWxlbSA9IHRoaXNbMF07CgkJCgkJaWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCBlbGVtICkgewoJCQkJaG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBdIHx8IGpRdWVyeS52YWxIb29rc1sgZWxlbS50eXBlIF07CgoJCQkJaWYgKCBob29rcyAmJiAiZ2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3MuZ2V0KCBlbGVtLCAidmFsdWUiICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJcmV0dXJuIHJldDsKCQkJCX0KCgkJCQlyZXQgPSBlbGVtLnZhbHVlOwoKCQkJCXJldHVybiB0eXBlb2YgcmV0ID09PSAic3RyaW5nIiA/IAoJCQkJCS8vIGhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXMKCQkJCQlyZXQucmVwbGFjZShycmV0dXJuLCAiIikgOiAKCQkJCQkvLyBoYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXIKCQkJCQlyZXQgPT0gbnVsbCA/ICIiIDogcmV0OwoJCQl9CgoJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCX0KCgkJdmFyIGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTsKCgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIHZhbDsKCgkJCWlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCBpc0Z1bmN0aW9uICkgewoJCQkJdmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgc2VsZi52YWwoKSApOwoJCQl9IGVsc2UgewoJCQkJdmFsID0gdmFsdWU7CgkJCX0KCgkJCS8vIFRyZWF0IG51bGwvdW5kZWZpbmVkIGFzICIiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nCgkJCWlmICggdmFsID09IG51bGwgKSB7CgkJCQl2YWwgPSAiIjsKCQkJfSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gIm51bWJlciIgKSB7CgkJCQl2YWwgKz0gIiI7CgkJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWwgKSApIHsKCQkJCXZhbCA9IGpRdWVyeS5tYXAodmFsLCBmdW5jdGlvbiAoIHZhbHVlICkgewoJCQkJCXJldHVybiB2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiOwoJCQkJfSk7CgkJCX0KCgkJCWhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdOwoKCQkJLy8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmcKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsICJ2YWx1ZSIgKSA9PT0gdW5kZWZpbmVkICkgewoJCQkJdGhpcy52YWx1ZSA9IHZhbDsKCQkJfQoJCX0pOwoJfQp9KTsKCmpRdWVyeS5leHRlbmQoewoJdmFsSG9va3M6IHsKCQlvcHRpb246IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCS8vIGF0dHJpYnV0ZXMudmFsdWUgaXMgdW5kZWZpbmVkIGluIEJsYWNrYmVycnkgNC43IGJ1dAoJCQkJLy8gdXNlcyAudmFsdWUuIFNlZSAjNjkzMgoJCQkJdmFyIHZhbCA9IGVsZW0uYXR0cmlidXRlcy52YWx1ZTsKCQkJCXJldHVybiAhdmFsIHx8IHZhbC5zcGVjaWZpZWQgPyBlbGVtLnZhbHVlIDogZWxlbS50ZXh0OwoJCQl9CgkJfSwKCQlzZWxlY3Q6IHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciB2YWx1ZSwKCQkJCQlpbmRleCA9IGVsZW0uc2VsZWN0ZWRJbmRleCwKCQkJCQl2YWx1ZXMgPSBbXSwKCQkJCQlvcHRpb25zID0gZWxlbS5vcHRpb25zLAoJCQkJCW9uZSA9IGVsZW0udHlwZSA9PT0gInNlbGVjdC1vbmUiOwoKCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCgkJCQlpZiAoIGluZGV4IDwgMCApIHsKCQkJCQlyZXR1cm4gbnVsbDsKCQkJCX0KCgkJCQkvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zCgkJCQlmb3IgKCB2YXIgaSA9IG9uZSA/IGluZGV4IDogMCwgbWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7IGkgPCBtYXg7IGkrKyApIHsKCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOwoKCQkJCQkvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwCgkJCQkJaWYgKCBvcHRpb24uc2VsZWN0ZWQgJiYgKGpRdWVyeS5zdXBwb3J0Lm9wdERpc2FibGVkID8gIW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoImRpc2FibGVkIikgPT09IG51bGwpICYmCgkJCQkJCQkoIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8ICFqUXVlcnkubm9kZU5hbWUoIG9wdGlvbi5wYXJlbnROb2RlLCAib3B0Z3JvdXAiICkpICkgewoKCQkJCQkJLy8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgoJCQkJCQl2YWx1ZSA9IGpRdWVyeSggb3B0aW9uICkudmFsKCk7CgoJCQkJCQkvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0cwoJCQkJCQlpZiAoIG9uZSApIHsKCQkJCQkJCXJldHVybiB2YWx1ZTsKCQkJCQkJfQoKCQkJCQkJLy8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXkKCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIEZpeGVzIEJ1ZyAjMjU1MSAtLSBzZWxlY3QudmFsKCkgYnJva2VuIGluIElFIGFmdGVyIGZvcm0ucmVzZXQoKQoJCQkJaWYgKCBvbmUgJiYgIXZhbHVlcy5sZW5ndGggJiYgb3B0aW9ucy5sZW5ndGggKSB7CgkJCQkJcmV0dXJuIGpRdWVyeSggb3B0aW9uc1sgaW5kZXggXSApLnZhbCgpOwoJCQkJfQoKCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0sCgoJCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJCXZhciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KCB2YWx1ZSApOwoKCQkJCWpRdWVyeShlbGVtKS5maW5kKCJvcHRpb24iKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMuc2VsZWN0ZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KHRoaXMpLnZhbCgpLCB2YWx1ZXMgKSA+PSAwOwoJCQkJfSk7CgoJCQkJaWYgKCAhdmFsdWVzLmxlbmd0aCApIHsKCQkJCQllbGVtLnNlbGVjdGVkSW5kZXggPSAtMTsKCQkJCX0KCQkJCXJldHVybiB2YWx1ZXM7CgkJCX0KCQl9Cgl9LAoKCWF0dHJGbjogewoJCXZhbDogdHJ1ZSwKCQljc3M6IHRydWUsCgkJaHRtbDogdHJ1ZSwKCQl0ZXh0OiB0cnVlLAoJCWRhdGE6IHRydWUsCgkJd2lkdGg6IHRydWUsCgkJaGVpZ2h0OiB0cnVlLAoJCW9mZnNldDogdHJ1ZQoJfSwKCQoJYXR0ckZpeDogewoJCS8vIEFsd2F5cyBub3JtYWxpemUgdG8gZW5zdXJlIGhvb2sgdXNhZ2UKCQl0YWJpbmRleDogInRhYkluZGV4IgoJfSwKCQoJYXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBwYXNzICkgewoJCXZhciBuVHlwZSA9IGVsZW0ubm9kZVR5cGU7CgkJCgkJLy8gZG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIHBhc3MgJiYgbmFtZSBpbiBqUXVlcnkuYXR0ckZuICkgewoJCQlyZXR1cm4galF1ZXJ5KCBlbGVtIClbIG5hbWUgXSggdmFsdWUgKTsKCQl9CgoJCS8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkCgkJaWYgKCAhKCJnZXRBdHRyaWJ1dGUiIGluIGVsZW0pICkgewoJCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7CgkJfQoKCQl2YXIgcmV0LCBob29rcywKCQkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQkvLyBOb3JtYWxpemUgdGhlIG5hbWUgaWYgbmVlZGVkCgkJaWYgKCBub3R4bWwgKSB7CgkJCW5hbWUgPSBqUXVlcnkuYXR0ckZpeFsgbmFtZSBdIHx8IG5hbWU7CgoJCQlob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXTsKCgkJCWlmICggIWhvb2tzICkgewoJCQkJLy8gVXNlIGJvb2xIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKCQkJCWlmICggcmJvb2xlYW4udGVzdCggbmFtZSApICkgewoJCQkJCWhvb2tzID0gYm9vbEhvb2s7CgoJCQkJLy8gVXNlIG5vZGVIb29rIGlmIGF2YWlsYWJsZSggSUU2LzcgKQoJCQkJfSBlbHNlIGlmICggbm9kZUhvb2sgKSB7CgkJCQkJaG9va3MgPSBub2RlSG9vazsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKCQkJaWYgKCB2YWx1ZSA9PT0gbnVsbCApIHsKCQkJCWpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7CgkJCQlyZXR1cm4gdW5kZWZpbmVkOwoKCQkJfSBlbHNlIGlmICggaG9va3MgJiYgInNldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiIiArIHZhbHVlICk7CgkJCQlyZXR1cm4gdmFsdWU7CgkJCX0KCgkJfSBlbHNlIGlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgbm90eG1sICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCXJldHVybiByZXQ7CgoJCX0gZWxzZSB7CgoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gTm9uLWV4aXN0ZW50IGF0dHJpYnV0ZXMgcmV0dXJuIG51bGwsIHdlIG5vcm1hbGl6ZSB0byB1bmRlZmluZWQKCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/CgkJCQl1bmRlZmluZWQgOgoJCQkJcmV0OwoJCX0KCX0sCgoJcmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7CgkJdmFyIHByb3BOYW1lOwoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJbmFtZSA9IGpRdWVyeS5hdHRyRml4WyBuYW1lIF0gfHwgbmFtZTsKCgkJCWpRdWVyeS5hdHRyKCBlbGVtLCBuYW1lLCAiIiApOwoJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggbmFtZSApOwoKCQkJLy8gU2V0IGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdG8gZmFsc2UgZm9yIGJvb2xlYW4gYXR0cmlidXRlcwoJCQlpZiAoIHJib29sZWFuLnRlc3QoIG5hbWUgKSAmJiAocHJvcE5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWUpIGluIGVsZW0gKSB7CgkJCQllbGVtWyBwcm9wTmFtZSBdID0gZmFsc2U7CgkJCX0KCQl9Cgl9LAoKCWF0dHJIb29rczogewoJCXR5cGU6IHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQkvLyBXZSBjYW4ndCBhbGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJvYmxlbXMgaW4gSUUpCgkJCQlpZiAoIHJ0eXBlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJalF1ZXJ5LmVycm9yKCAidHlwZSBwcm9wZXJ0eSBjYW4ndCBiZSBjaGFuZ2VkIiApOwoJCQkJfSBlbHNlIGlmICggIWpRdWVyeS5zdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09ICJyYWRpbyIgJiYgalF1ZXJ5Lm5vZGVOYW1lKGVsZW0sICJpbnB1dCIpICkgewoJCQkJCS8vIFNldHRpbmcgdGhlIHR5cGUgb24gYSByYWRpbyBidXR0b24gYWZ0ZXIgdGhlIHZhbHVlIHJlc2V0cyB0aGUgdmFsdWUgaW4gSUU2LTkKCQkJCQkvLyBSZXNldCB2YWx1ZSB0byBpdCdzIGRlZmF1bHQgaW4gY2FzZSB0eXBlIGlzIHNldCBhZnRlciB2YWx1ZQoJCQkJCS8vIFRoaXMgaXMgZm9yIGVsZW1lbnQgY3JlYXRpb24KCQkJCQl2YXIgdmFsID0gZWxlbS52YWx1ZTsKCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggInR5cGUiLCB2YWx1ZSApOwoJCQkJCWlmICggdmFsICkgewoJCQkJCQllbGVtLnZhbHVlID0gdmFsOwoJCQkJCX0KCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQl9CgkJCX0KCQl9LAoJCS8vIFVzZSB0aGUgdmFsdWUgcHJvcGVydHkgZm9yIGJhY2sgY29tcGF0CgkJLy8gVXNlIHRoZSBub2RlSG9vayBmb3IgYnV0dG9uIGVsZW1lbnRzIGluIElFNi83ICgjMTk1NCkKCQl2YWx1ZTogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQkJaWYgKCBub2RlSG9vayAmJiBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJidXR0b24iICkgKSB7CgkJCQkJcmV0dXJuIG5vZGVIb29rLmdldCggZWxlbSwgbmFtZSApOwoJCQkJfQoJCQkJcmV0dXJuIG5hbWUgaW4gZWxlbSA/CgkJCQkJZWxlbS52YWx1ZSA6CgkJCQkJbnVsbDsKCQkJfSwKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIG5hbWUgKSB7CgkJCQlpZiAoIG5vZGVIb29rICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImJ1dHRvbiIgKSApIHsKCQkJCQlyZXR1cm4gbm9kZUhvb2suc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApOwoJCQkJfQoJCQkJLy8gRG9lcyBub3QgcmV0dXJuIHNvIHRoYXQgc2V0QXR0cmlidXRlIGlzIGFsc28gdXNlZAoJCQkJZWxlbS52YWx1ZSA9IHZhbHVlOwoJCQl9CgkJfQoJfSwKCglwcm9wRml4OiB7CgkJdGFiaW5kZXg6ICJ0YWJJbmRleCIsCgkJcmVhZG9ubHk6ICJyZWFkT25seSIsCgkJImZvciI6ICJodG1sRm9yIiwKCQkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKCQltYXhsZW5ndGg6ICJtYXhMZW5ndGgiLAoJCWNlbGxzcGFjaW5nOiAiY2VsbFNwYWNpbmciLAoJCWNlbGxwYWRkaW5nOiAiY2VsbFBhZGRpbmciLAoJCXJvd3NwYW46ICJyb3dTcGFuIiwKCQljb2xzcGFuOiAiY29sU3BhbiIsCgkJdXNlbWFwOiAidXNlTWFwIiwKCQlmcmFtZWJvcmRlcjogImZyYW1lQm9yZGVyIiwKCQljb250ZW50ZWRpdGFibGU6ICJjb250ZW50RWRpdGFibGUiCgl9LAoJCglwcm9wOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7CgkJdmFyIG5UeXBlID0gZWxlbS5ub2RlVHlwZTsKCgkJLy8gZG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2RlcwoJCWlmICggIWVsZW0gfHwgblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgcmV0LCBob29rcywKCQkJbm90eG1sID0gblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApOwoKCQlpZiAoIG5vdHhtbCApIHsKCQkJLy8gRml4IG5hbWUgYW5kIGF0dGFjaCBob29rcwoJCQluYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lOwoJCQlob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTsKCQl9CgoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJaWYgKCBob29rcyAmJiAic2V0IiBpbiBob29rcyAmJiAocmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJcmV0dXJuIHJldDsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gKGVsZW1bIG5hbWUgXSA9IHZhbHVlKTsKCQkJfQoKCQl9IGVsc2UgewoJCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSkgIT09IG51bGwgKSB7CgkJCQlyZXR1cm4gcmV0OwoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiBlbGVtWyBuYW1lIF07CgkJCX0KCQl9Cgl9LAoJCglwcm9wSG9va3M6IHsKCQl0YWJJbmRleDogewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJLy8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldAoJCQkJLy8gaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC8KCQkJCXZhciBhdHRyaWJ1dGVOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJ0YWJpbmRleCIpOwoKCQkJCXJldHVybiBhdHRyaWJ1dGVOb2RlICYmIGF0dHJpYnV0ZU5vZGUuc3BlY2lmaWVkID8KCQkJCQlwYXJzZUludCggYXR0cmlidXRlTm9kZS52YWx1ZSwgMTAgKSA6CgkJCQkJcmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHwgcmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiYgZWxlbS5ocmVmID8KCQkJCQkJMCA6CgkJCQkJCXVuZGVmaW5lZDsKCQkJfQoJCX0KCX0KfSk7CgovLyBBZGQgdGhlIHRhYmluZGV4IHByb3BIb29rIHRvIGF0dHJIb29rcyBmb3IgYmFjay1jb21wYXQKalF1ZXJ5LmF0dHJIb29rcy50YWJJbmRleCA9IGpRdWVyeS5wcm9wSG9va3MudGFiSW5kZXg7CgovLyBIb29rIGZvciBib29sZWFuIGF0dHJpYnV0ZXMKYm9vbEhvb2sgPSB7CglnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCS8vIEFsaWduIGJvb2xlYW4gYXR0cmlidXRlcyB3aXRoIGNvcnJlc3BvbmRpbmcgcHJvcGVydGllcwoJCS8vIEZhbGwgYmFjayB0byBhdHRyaWJ1dGUgcHJlc2VuY2Ugd2hlcmUgc29tZSBib29sZWFucyBhcmUgbm90IHN1cHBvcnRlZAoJCXZhciBhdHRyTm9kZTsKCQlyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUgKSA9PT0gdHJ1ZSB8fCAoIGF0dHJOb2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkgKSAmJiBhdHRyTm9kZS5ub2RlVmFsdWUgIT09IGZhbHNlID8KCQkJbmFtZS50b0xvd2VyQ2FzZSgpIDoKCQkJdW5kZWZpbmVkOwoJfSwKCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkgewoJCXZhciBwcm9wTmFtZTsKCQlpZiAoIHZhbHVlID09PSBmYWxzZSApIHsKCQkJLy8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZQoJCQlqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApOwoJCX0gZWxzZSB7CgkJCS8vIHZhbHVlIGlzIHRydWUgc2luY2Ugd2Uga25vdyBhdCB0aGlzIHBvaW50IGl0J3MgdHlwZSBib29sZWFuIGFuZCBub3QgZmFsc2UKCQkJLy8gU2V0IGJvb2xlYW4gYXR0cmlidXRlcyB0byB0aGUgc2FtZSBuYW1lIGFuZCBzZXQgdGhlIERPTSBwcm9wZXJ0eQoJCQlwcm9wTmFtZSA9IGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZTsKCQkJaWYgKCBwcm9wTmFtZSBpbiBlbGVtICkgewoJCQkJLy8gT25seSBzZXQgdGhlIElETCBzcGVjaWZpY2FsbHkgaWYgaXQgYWxyZWFkeSBleGlzdHMgb24gdGhlIGVsZW1lbnQKCQkJCWVsZW1bIHByb3BOYW1lIF0gPSB0cnVlOwoJCQl9CgoJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpICk7CgkJfQoJCXJldHVybiBuYW1lOwoJfQp9OwoKLy8gSUU2LzcgZG8gbm90IHN1cHBvcnQgZ2V0dGluZy9zZXR0aW5nIHNvbWUgYXR0cmlidXRlcyB3aXRoIGdldC9zZXRBdHRyaWJ1dGUKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuZ2V0U2V0QXR0cmlidXRlICkgewoJCgkvLyBVc2UgdGhpcyBmb3IgYW55IGF0dHJpYnV0ZSBpbiBJRTYvNwoJLy8gVGhpcyBmaXhlcyBhbG1vc3QgZXZlcnkgSUU2LzcgaXNzdWUKCW5vZGVIb29rID0galF1ZXJ5LnZhbEhvb2tzLmJ1dHRvbiA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCQl2YXIgcmV0OwoJCQlyZXQgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKTsKCQkJLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBub2RlVmFsdWUgaXMgZW1wdHkgc3RyaW5nCgkJCXJldHVybiByZXQgJiYgcmV0Lm5vZGVWYWx1ZSAhPT0gIiIgPwoJCQkJcmV0Lm5vZGVWYWx1ZSA6CgkJCQl1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHsKCQkJLy8gU2V0IHRoZSBleGlzdGluZyBvciBjcmVhdGUgYSBuZXcgYXR0cmlidXRlIG5vZGUKCQkJdmFyIHJldCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApOwoJCQlpZiAoICFyZXQgKSB7CgkJCQlyZXQgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoIG5hbWUgKTsKCQkJCWVsZW0uc2V0QXR0cmlidXRlTm9kZSggcmV0ICk7CgkJCX0KCQkJcmV0dXJuIChyZXQubm9kZVZhbHVlID0gdmFsdWUgKyAiIik7CgkJfQoJfTsKCgkvLyBTZXQgd2lkdGggYW5kIGhlaWdodCB0byBhdXRvIGluc3RlYWQgb2YgMCBvbiBlbXB0eSBzdHJpbmcoIEJ1ZyAjODE1MCApCgkvLyBUaGlzIGlzIGZvciByZW1vdmFscwoJalF1ZXJ5LmVhY2goWyAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCQlpZiAoIHZhbHVlID09PSAiIiApIHsKCQkJCQllbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgImF1dG8iICk7CgkJCQkJcmV0dXJuIHZhbHVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9KTsKfQoKCi8vIFNvbWUgYXR0cmlidXRlcyByZXF1aXJlIGEgc3BlY2lhbCBjYWxsIG9uIElFCmlmICggIWpRdWVyeS5zdXBwb3J0LmhyZWZOb3JtYWxpemVkICkgewoJalF1ZXJ5LmVhY2goWyAiaHJlZiIsICJzcmMiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCQlqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lIF0sIHsKCQkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXZhciByZXQgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgMiApOwoJCQkJcmV0dXJuIHJldCA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDsKCQkJfQoJCX0pOwoJfSk7Cn0KCmlmICggIWpRdWVyeS5zdXBwb3J0LnN0eWxlICkgewoJalF1ZXJ5LmF0dHJIb29rcy5zdHlsZSA9IHsKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQkvLyBSZXR1cm4gdW5kZWZpbmVkIGluIHRoZSBjYXNlIG9mIGVtcHR5IHN0cmluZwoJCQkvLyBOb3JtYWxpemUgdG8gbG93ZXJjYXNlIHNpbmNlIElFIHVwcGVyY2FzZXMgY3NzIHByb3BlcnR5IG5hbWVzCgkJCXJldHVybiBlbGVtLnN0eWxlLmNzc1RleHQudG9Mb3dlckNhc2UoKSB8fCB1bmRlZmluZWQ7CgkJfSwKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJcmV0dXJuIChlbGVtLnN0eWxlLmNzc1RleHQgPSAiIiArIHZhbHVlKTsKCQl9Cgl9Owp9CgovLyBTYWZhcmkgbWlzLXJlcG9ydHMgdGhlIGRlZmF1bHQgc2VsZWN0ZWQgcHJvcGVydHkgb2YgYW4gb3B0aW9uCi8vIEFjY2Vzc2luZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdAppZiAoICFqUXVlcnkuc3VwcG9ydC5vcHRTZWxlY3RlZCApIHsKCWpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkLCB7CgkJZ2V0OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCgkJCWlmICggcGFyZW50ICkgewoJCQkJcGFyZW50LnNlbGVjdGVkSW5kZXg7CgoJCQkJLy8gTWFrZSBzdXJlIHRoYXQgaXQgYWxzbyB3b3JrcyB3aXRoIG9wdGdyb3Vwcywgc2VlICM1NzAxCgkJCQlpZiAoIHBhcmVudC5wYXJlbnROb2RlICkgewoJCQkJCXBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7CgkJCQl9CgkJCX0KCQkJcmV0dXJuIG51bGw7CgkJfQoJfSk7Cn0KCi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoZWNrT24gKSB7CglqUXVlcnkuZWFjaChbICJyYWRpbyIsICJjaGVja2JveCIgXSwgZnVuY3Rpb24oKSB7CgkJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQkvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgaW4gV2Via2l0ICIiIGlzIHJldHVybmVkIGluc3RlYWQgb2YgIm9uIiBpZiBhIHZhbHVlIGlzbid0IHNwZWNpZmllZAoJCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpID09PSBudWxsID8gIm9uIiA6IGVsZW0udmFsdWU7CgkJCX0KCQl9OwoJfSk7Cn0KalF1ZXJ5LmVhY2goWyAicmFkaW8iLCAiY2hlY2tib3giIF0sIGZ1bmN0aW9uKCkgewoJalF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSBqUXVlcnkuZXh0ZW5kKCBqUXVlcnkudmFsSG9va3NbIHRoaXMgXSwgewoJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQlpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIChlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KGVsZW0pLnZhbCgpLCB2YWx1ZSApID49IDApOwoJCQl9CgkJfQoJfSk7Cn0pOwoKCgoKdmFyIHJuYW1lc3BhY2VzID0gL1wuKC4qKSQvLAoJcmZvcm1FbGVtcyA9IC9eKD86dGV4dGFyZWF8aW5wdXR8c2VsZWN0KSQvaSwKCXJwZXJpb2QgPSAvXC4vZywKCXJzcGFjZXMgPSAvIC9nLAoJcmVzY2FwZSA9IC9bXlx3XHMufGBdL2csCglmY2xlYW51cCA9IGZ1bmN0aW9uKCBubSApIHsKCQlyZXR1cm4gbm0ucmVwbGFjZShyZXNjYXBlLCAiXFwkJiIpOwoJfTsKCi8qCiAqIEEgbnVtYmVyIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCBmb3IgbWFuYWdpbmcgZXZlbnRzLgogKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWdpbmF0ZWQgZnJvbQogKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCiAqLwpqUXVlcnkuZXZlbnQgPSB7CgoJLy8gQmluZCBhbiBldmVudCB0byBhbiBlbGVtZW50CgkvLyBPcmlnaW5hbCBieSBEZWFuIEVkd2FyZHMKCWFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhICkgewoJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGhhbmRsZXIgPT09IGZhbHNlICkgewoJCQloYW5kbGVyID0gcmV0dXJuRmFsc2U7CgkJfSBlbHNlIGlmICggIWhhbmRsZXIgKSB7CgkJCS8vIEZpeGVzIGJ1ZyAjNzIyOS4gRml4IHJlY29tbWVuZGVkIGJ5IGpkYWx0b24KCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGhhbmRsZU9iakluLCBoYW5kbGVPYmo7CgoJCWlmICggaGFuZGxlci5oYW5kbGVyICkgewoJCQloYW5kbGVPYmpJbiA9IGhhbmRsZXI7CgkJCWhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGJlaW5nIGV4ZWN1dGVkIGhhcyBhIHVuaXF1ZSBJRAoJCWlmICggIWhhbmRsZXIuZ3VpZCApIHsKCQkJaGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKzsKCQl9CgoJCS8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUKCQl2YXIgZWxlbURhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0gKTsKCgkJLy8gSWYgbm8gZWxlbURhdGEgaXMgZm91bmQgdGhlbiB3ZSBtdXN0IGJlIHRyeWluZyB0byBiaW5kIHRvIG9uZSBvZiB0aGUKCQkvLyBiYW5uZWQgbm9EYXRhIGVsZW1lbnRzCgkJaWYgKCAhZWxlbURhdGEgKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMsCgkJCWV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlOwoKCQlpZiAoICFldmVudHMgKSB7CgkJCWVsZW1EYXRhLmV2ZW50cyA9IGV2ZW50cyA9IHt9OwoJCX0KCgkJaWYgKCAhZXZlbnRIYW5kbGUgKSB7CgkJCWVsZW1EYXRhLmhhbmRsZSA9IGV2ZW50SGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7CgkJCQkvLyBEaXNjYXJkIHRoZSBzZWNvbmQgZXZlbnQgb2YgYSBqUXVlcnkuZXZlbnQudHJpZ2dlcigpIGFuZAoJCQkJLy8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAoJCQkJcmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09ICJ1bmRlZmluZWQiICYmICghZSB8fCBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUpID8KCQkJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCBldmVudEhhbmRsZS5lbGVtLCBhcmd1bWVudHMgKSA6CgkJCQkJdW5kZWZpbmVkOwoJCQl9OwoJCX0KCgkJLy8gQWRkIGVsZW0gYXMgYSBwcm9wZXJ0eSBvZiB0aGUgaGFuZGxlIGZ1bmN0aW9uCgkJLy8gVGhpcyBpcyB0byBwcmV2ZW50IGEgbWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlIGV2ZW50cyBpbiBJRS4KCQlldmVudEhhbmRsZS5lbGVtID0gZWxlbTsKCgkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkgYSBzcGFjZQoJCS8vIGpRdWVyeSguLi4pLmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CgoJCXZhciB0eXBlLCBpID0gMCwgbmFtZXNwYWNlczsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgKSB7CgkJCWhhbmRsZU9iaiA9IGhhbmRsZU9iakluID8KCQkJCWpRdWVyeS5leHRlbmQoe30sIGhhbmRsZU9iakluKSA6CgkJCQl7IGhhbmRsZXI6IGhhbmRsZXIsIGRhdGE6IGRhdGEgfTsKCgkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKCQkJaWYgKCB0eXBlLmluZGV4T2YoIi4iKSA+IC0xICkgewoJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgkJCQloYW5kbGVPYmoubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5zbGljZSgwKS5zb3J0KCkuam9pbigiLiIpOwoKCQkJfSBlbHNlIHsKCQkJCW5hbWVzcGFjZXMgPSBbXTsKCQkJCWhhbmRsZU9iai5uYW1lc3BhY2UgPSAiIjsKCQkJfQoKCQkJaGFuZGxlT2JqLnR5cGUgPSB0eXBlOwoJCQlpZiAoICFoYW5kbGVPYmouZ3VpZCApIHsKCQkJCWhhbmRsZU9iai5ndWlkID0gaGFuZGxlci5ndWlkOwoJCQl9CgoJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8gdGhpcyBldmVudAoJCQl2YXIgaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSwKCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJLy8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZQoJCQlpZiAoICFoYW5kbGVycyApIHsKCQkJCWhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTsKCgkJCQkvLyBDaGVjayBmb3IgYSBzcGVjaWFsIGV2ZW50IGhhbmRsZXIKCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQgaWYgdGhlIHNwZWNpYWwKCQkJCS8vIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2UKCQkJCWlmICggIXNwZWNpYWwuc2V0dXAgfHwgc3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHsKCQkJCQkvLyBCaW5kIHRoZSBnbG9iYWwgZXZlbnQgaGFuZGxlciB0byB0aGUgZWxlbWVudAoJCQkJCWlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkgewoJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlLCBmYWxzZSApOwoKCQkJCQl9IGVsc2UgaWYgKCBlbGVtLmF0dGFjaEV2ZW50ICkgewoJCQkJCQllbGVtLmF0dGFjaEV2ZW50KCAib24iICsgdHlwZSwgZXZlbnRIYW5kbGUgKTsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggc3BlY2lhbC5hZGQgKSB7CgkJCQlzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTsKCgkJCQlpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkgewoJCQkJCWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7CgkJCQl9CgkJCX0KCgkJCS8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QKCQkJaGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7CgoJCQkvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvbgoJCQlqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlOwoJCX0KCgkJLy8gTnVsbGlmeSBlbGVtIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzIGluIElFCgkJZWxlbSA9IG51bGw7Cgl9LAoKCWdsb2JhbDoge30sCgoJLy8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50CglyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgcG9zICkgewoJCS8vIGRvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCgkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggaGFuZGxlciA9PT0gZmFsc2UgKSB7CgkJCWhhbmRsZXIgPSByZXR1cm5GYWxzZTsKCQl9CgoJCXZhciByZXQsIHR5cGUsIGZuLCBqLCBpID0gMCwgYWxsLCBuYW1lc3BhY2VzLCBuYW1lc3BhY2UsIHNwZWNpYWwsIGV2ZW50VHlwZSwgaGFuZGxlT2JqLCBvcmlnVHlwZSwKCQkJZWxlbURhdGEgPSBqUXVlcnkuaGFzRGF0YSggZWxlbSApICYmIGpRdWVyeS5fZGF0YSggZWxlbSApLAoJCQlldmVudHMgPSBlbGVtRGF0YSAmJiBlbGVtRGF0YS5ldmVudHM7CgoJCWlmICggIWVsZW1EYXRhIHx8ICFldmVudHMgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCgkJaWYgKCB0eXBlcyAmJiB0eXBlcy50eXBlICkgewoJCQloYW5kbGVyID0gdHlwZXMuaGFuZGxlcjsKCQkJdHlwZXMgPSB0eXBlcy50eXBlOwoJCX0KCgkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CgkJaWYgKCAhdHlwZXMgfHwgdHlwZW9mIHR5cGVzID09PSAic3RyaW5nIiAmJiB0eXBlcy5jaGFyQXQoMCkgPT09ICIuIiApIHsKCQkJdHlwZXMgPSB0eXBlcyB8fCAiIjsKCgkJCWZvciAoIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzICk7CgkJCX0KCgkJCXJldHVybjsKCQl9CgoJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UKCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNlb3ZlciBtb3VzZW91dCIsIGZuKTsKCQl0eXBlcyA9IHR5cGVzLnNwbGl0KCIgIik7CgoJCXdoaWxlICggKHR5cGUgPSB0eXBlc1sgaSsrIF0pICkgewoJCQlvcmlnVHlwZSA9IHR5cGU7CgkJCWhhbmRsZU9iaiA9IG51bGw7CgkJCWFsbCA9IHR5cGUuaW5kZXhPZigiLiIpIDwgMDsKCQkJbmFtZXNwYWNlcyA9IFtdOwoKCQkJaWYgKCAhYWxsICkgewoJCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVycwoJCQkJbmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIi4iKTsKCQkJCXR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7CgoJCQkJbmFtZXNwYWNlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKwoJCQkJCWpRdWVyeS5tYXAoIG5hbWVzcGFjZXMuc2xpY2UoMCkuc29ydCgpLCBmY2xlYW51cCApLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CgkJCX0KCgkJCWV2ZW50VHlwZSA9IGV2ZW50c1sgdHlwZSBdOwoKCQkJaWYgKCAhZXZlbnRUeXBlICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCWlmICggIWhhbmRsZXIgKSB7CgkJCQlmb3IgKCBqID0gMDsgaiA8IGV2ZW50VHlwZS5sZW5ndGg7IGorKyApIHsKCQkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKCgkJCQkJaWYgKCBhbGwgfHwgbmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHsKCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgb3JpZ1R5cGUsIGhhbmRsZU9iai5oYW5kbGVyLCBqICk7CgkJCQkJCWV2ZW50VHlwZS5zcGxpY2UoIGotLSwgMSApOwoJCQkJCX0KCQkJCX0KCgkJCQljb250aW51ZTsKCQkJfQoKCQkJc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307CgoJCQlmb3IgKCBqID0gcG9zIHx8IDA7IGogPCBldmVudFR5cGUubGVuZ3RoOyBqKysgKSB7CgkJCQloYW5kbGVPYmogPSBldmVudFR5cGVbIGogXTsKCgkJCQlpZiAoIGhhbmRsZXIuZ3VpZCA9PT0gaGFuZGxlT2JqLmd1aWQgKSB7CgkJCQkJLy8gcmVtb3ZlIHRoZSBnaXZlbiBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gdHlwZQoJCQkJCWlmICggYWxsIHx8IG5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7CgkJCQkJCWlmICggcG9zID09IG51bGwgKSB7CgkJCQkJCQlldmVudFR5cGUuc3BsaWNlKCBqLS0sIDEgKTsKCQkJCQkJfQoKCQkJCQkJaWYgKCBzcGVjaWFsLnJlbW92ZSApIHsKCQkJCQkJCXNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlpZiAoIHBvcyAhPSBudWxsICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCS8vIHJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgbm8gbW9yZSBoYW5kbGVycyBleGlzdAoJCQlpZiAoIGV2ZW50VHlwZS5sZW5ndGggPT09IDAgfHwgcG9zICE9IG51bGwgJiYgZXZlbnRUeXBlLmxlbmd0aCA9PT0gMSApIHsKCQkJCWlmICggIXNwZWNpYWwudGVhcmRvd24gfHwgc3BlY2lhbC50ZWFyZG93bi5jYWxsKCBlbGVtLCBuYW1lc3BhY2VzICkgPT09IGZhbHNlICkgewoJCQkJCWpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7CgkJCQl9CgoJCQkJcmV0ID0gbnVsbDsKCQkJCWRlbGV0ZSBldmVudHNbIHR5cGUgXTsKCQkJfQoJCX0KCgkJLy8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWQKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHsKCQkJdmFyIGhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZTsKCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQloYW5kbGUuZWxlbSA9IG51bGw7CgkJCX0KCgkJCWRlbGV0ZSBlbGVtRGF0YS5ldmVudHM7CgkJCWRlbGV0ZSBlbGVtRGF0YS5oYW5kbGU7CgoJCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBlbGVtRGF0YSApICkgewoJCQkJalF1ZXJ5LnJlbW92ZURhdGEoIGVsZW0sIHVuZGVmaW5lZCwgdHJ1ZSApOwoJCQl9CgkJfQoJfSwKCQoJLy8gRXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gc2hvcnQtY2lyY3VpdCBpZiBubyBoYW5kbGVycyBhcmUgYXR0YWNoZWQuCgkvLyBOYXRpdmUgRE9NIGV2ZW50cyBzaG91bGQgbm90IGJlIGFkZGVkLCB0aGV5IG1heSBoYXZlIGlubGluZSBoYW5kbGVycy4KCWN1c3RvbUV2ZW50OiB7CgkJImdldERhdGEiOiB0cnVlLAoJCSJzZXREYXRhIjogdHJ1ZSwKCQkiY2hhbmdlRGF0YSI6IHRydWUKCX0sCgoJdHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7CgkJLy8gRXZlbnQgb2JqZWN0IG9yIGV2ZW50IHR5cGUKCQl2YXIgdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQsCgkJCW5hbWVzcGFjZXMgPSBbXSwKCQkJZXhjbHVzaXZlOwoKCQlpZiAoIHR5cGUuaW5kZXhPZigiISIpID49IDAgKSB7CgkJCS8vIEV4Y2x1c2l2ZSBldmVudHMgdHJpZ2dlciBvbmx5IGZvciB0aGUgZXhhY3QgZXZlbnQgKG5vIG5hbWVzcGFjZXMpCgkJCXR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKCQkJZXhjbHVzaXZlID0gdHJ1ZTsKCQl9CgoJCWlmICggdHlwZS5pbmRleE9mKCIuIikgPj0gMCApIHsKCQkJLy8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKQoJCQluYW1lc3BhY2VzID0gdHlwZS5zcGxpdCgiLiIpOwoJCQl0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpOwoJCQluYW1lc3BhY2VzLnNvcnQoKTsKCQl9CgoJCWlmICggKCFlbGVtIHx8IGpRdWVyeS5ldmVudC5jdXN0b21FdmVudFsgdHlwZSBdKSAmJiAhalF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdICkgewoJCQkvLyBObyBqUXVlcnkgaGFuZGxlcnMgZm9yIHRoaXMgZXZlbnQgdHlwZSwgYW5kIGl0IGNhbid0IGhhdmUgaW5saW5lIGhhbmRsZXJzCgkJCXJldHVybjsKCQl9CgoJCS8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBFdmVudCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nCgkJZXZlbnQgPSB0eXBlb2YgZXZlbnQgPT09ICJvYmplY3QiID8KCQkJLy8galF1ZXJ5LkV2ZW50IG9iamVjdAoJCQlldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/IGV2ZW50IDoKCQkJLy8gT2JqZWN0IGxpdGVyYWwKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSwgZXZlbnQgKSA6CgkJCS8vIEp1c3QgdGhlIGV2ZW50IHR5cGUgKHN0cmluZykKCQkJbmV3IGpRdWVyeS5FdmVudCggdHlwZSApOwoKCQlldmVudC50eXBlID0gdHlwZTsKCQlldmVudC5leGNsdXNpdmUgPSBleGNsdXNpdmU7CgkJZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCIuIik7CgkJZXZlbnQubmFtZXNwYWNlX3JlID0gbmV3IFJlZ0V4cCgiKF58XFwuKSIgKyBuYW1lc3BhY2VzLmpvaW4oIlxcLig/Oi4qXFwuKT8iKSArICIoXFwufCQpIik7CgkJCgkJLy8gdHJpZ2dlckhhbmRsZXIoKSBhbmQgZ2xvYmFsIGV2ZW50cyBkb24ndCBidWJibGUgb3IgcnVuIHRoZSBkZWZhdWx0IGFjdGlvbgoJCWlmICggb25seUhhbmRsZXJzIHx8ICFlbGVtICkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgoJCS8vIEhhbmRsZSBhIGdsb2JhbCB0cmlnZ2VyCgkJaWYgKCAhZWxlbSApIHsKCQkJLy8gVE9ETzogU3RvcCB0YXVudGluZyB0aGUgZGF0YSBjYWNoZTsgcmVtb3ZlIGdsb2JhbCBldmVudHMgYW5kIGFsd2F5cyBhdHRhY2ggdG8gZG9jdW1lbnQKCQkJalF1ZXJ5LmVhY2goIGpRdWVyeS5jYWNoZSwgZnVuY3Rpb24oKSB7CgkJCQkvLyBpbnRlcm5hbEtleSB2YXJpYWJsZSBpcyBqdXN0IHVzZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZmluZAoJCQkJLy8gYW5kIHBvdGVudGlhbGx5IGNoYW5nZSB0aGlzIHN0dWZmIGxhdGVyOyBjdXJyZW50bHkgaXQganVzdAoJCQkJLy8gcG9pbnRzIHRvIGpRdWVyeS5leHBhbmRvCgkJCQl2YXIgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywKCQkJCQlpbnRlcm5hbENhY2hlID0gdGhpc1sgaW50ZXJuYWxLZXkgXTsKCQkJCWlmICggaW50ZXJuYWxDYWNoZSAmJiBpbnRlcm5hbENhY2hlLmV2ZW50cyAmJiBpbnRlcm5hbENhY2hlLmV2ZW50c1sgdHlwZSBdICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCBldmVudCwgZGF0YSwgaW50ZXJuYWxDYWNoZS5oYW5kbGUuZWxlbSApOwoJCQkJfQoJCQl9KTsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkCgkJZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkOwoJCWV2ZW50LnRhcmdldCA9IGVsZW07CgoJCS8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3QKCQlkYXRhID0gZGF0YSAhPSBudWxsID8galF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApIDogW107CgkJZGF0YS51bnNoaWZ0KCBldmVudCApOwoKCQl2YXIgY3VyID0gZWxlbSwKCQkJLy8gSUUgZG9lc24ndCBsaWtlIG1ldGhvZCBuYW1lcyB3aXRoIGEgY29sb24gKCMzNTMzLCAjODI3MikKCQkJb250eXBlID0gdHlwZS5pbmRleE9mKCI6IikgPCAwID8gIm9uIiArIHR5cGUgOiAiIjsKCgkJLy8gRmlyZSBldmVudCBvbiB0aGUgY3VycmVudCBlbGVtZW50LCB0aGVuIGJ1YmJsZSB1cCB0aGUgRE9NIHRyZWUKCQlkbyB7CgkJCXZhciBoYW5kbGUgPSBqUXVlcnkuX2RhdGEoIGN1ciwgImhhbmRsZSIgKTsKCgkJCWV2ZW50LmN1cnJlbnRUYXJnZXQgPSBjdXI7CgkJCWlmICggaGFuZGxlICkgewoJCQkJaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTsKCQkJfQoKCQkJLy8gVHJpZ2dlciBhbiBpbmxpbmUgYm91bmQgc2NyaXB0CgkJCWlmICggb250eXBlICYmIGpRdWVyeS5hY2NlcHREYXRhKCBjdXIgKSAmJiBjdXJbIG9udHlwZSBdICYmIGN1clsgb250eXBlIF0uYXBwbHkoIGN1ciwgZGF0YSApID09PSBmYWxzZSApIHsKCQkJCWV2ZW50LnJlc3VsdCA9IGZhbHNlOwoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoKCQkJLy8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdwoJCQljdXIgPSBjdXIucGFyZW50Tm9kZSB8fCBjdXIub3duZXJEb2N1bWVudCB8fCBjdXIgPT09IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50ICYmIHdpbmRvdzsKCQl9IHdoaWxlICggY3VyICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICk7CgoJCS8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3cKCQlpZiAoICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJdmFyIG9sZCwKCQkJCXNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9OwoKCQkJaWYgKCAoIXNwZWNpYWwuX2RlZmF1bHQgfHwgc3BlY2lhbC5fZGVmYXVsdC5jYWxsKCBlbGVtLm93bmVyRG9jdW1lbnQsIGV2ZW50ICkgPT09IGZhbHNlKSAmJgoJCQkJISh0eXBlID09PSAiY2xpY2siICYmIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImEiICkpICYmIGpRdWVyeS5hY2NlcHREYXRhKCBlbGVtICkgKSB7CgoJCQkJLy8gQ2FsbCBhIG5hdGl2ZSBET00gbWV0aG9kIG9uIHRoZSB0YXJnZXQgd2l0aCB0aGUgc2FtZSBuYW1lIG5hbWUgYXMgdGhlIGV2ZW50LgoJCQkJLy8gQ2FuJ3QgdXNlIGFuIC5pc0Z1bmN0aW9uKSgpIGNoZWNrIGhlcmUgYmVjYXVzZSBJRTYvNyBmYWlscyB0aGF0IHRlc3QuCgkJCQkvLyBJRTw5IGRpZXMgb24gZm9jdXMgdG8gaGlkZGVuIGVsZW1lbnQgKCMxNDg2KSwgbWF5IHdhbnQgdG8gcmV2aXNpdCBhIHRyeS9jYXRjaC4KCQkJCXRyeSB7CgkJCQkJaWYgKCBvbnR5cGUgJiYgZWxlbVsgdHlwZSBdICkgewoJCQkJCQkvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kCgkJCQkJCW9sZCA9IGVsZW1bIG9udHlwZSBdOwoKCQkJCQkJaWYgKCBvbGQgKSB7CgkJCQkJCQllbGVtWyBvbnR5cGUgXSA9IG51bGw7CgkJCQkJCX0KCgkJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlOwoJCQkJCQllbGVtWyB0eXBlIF0oKTsKCQkJCQl9CgkJCQl9IGNhdGNoICggaWVFcnJvciApIHt9CgoJCQkJaWYgKCBvbGQgKSB7CgkJCQkJZWxlbVsgb250eXBlIF0gPSBvbGQ7CgkJCQl9CgoJCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCgloYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIGV2ZW50IHx8IHdpbmRvdy5ldmVudCApOwoJCS8vIFNuYXBzaG90IHRoZSBoYW5kbGVycyBsaXN0IHNpbmNlIGEgY2FsbGVkIGhhbmRsZXIgbWF5IGFkZC9yZW1vdmUgZXZlbnRzLgoJCXZhciBoYW5kbGVycyA9ICgoalF1ZXJ5Ll9kYXRhKCB0aGlzLCAiZXZlbnRzIiApIHx8IHt9KVsgZXZlbnQudHlwZSBdIHx8IFtdKS5zbGljZSgwKSwKCQkJcnVuX2FsbCA9ICFldmVudC5leGNsdXNpdmUgJiYgIWV2ZW50Lm5hbWVzcGFjZSwKCQkJYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCBhcmd1bWVudHMsIDAgKTsKCgkJLy8gVXNlIHRoZSBmaXgtZWQgRXZlbnQgcmF0aGVyIHRoYW4gdGhlIChyZWFkLW9ubHkpIG5hdGl2ZSBldmVudAoJCWFyZ3NbMF0gPSBldmVudDsKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gdGhpczsKCgkJZm9yICggdmFyIGogPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQl2YXIgaGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTsKCgkJCS8vIFRyaWdnZXJlZCBldmVudCBtdXN0IDEpIGJlIG5vbi1leGNsdXNpdmUgYW5kIGhhdmUgbm8gbmFtZXNwYWNlLCBvcgoJCQkvLyAyKSBoYXZlIG5hbWVzcGFjZShzKSBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQuCgkJCWlmICggcnVuX2FsbCB8fCBldmVudC5uYW1lc3BhY2VfcmUudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkgewoJCQkJLy8gUGFzcyBpbiBhIHJlZmVyZW5jZSB0byB0aGUgaGFuZGxlciBmdW5jdGlvbiBpdHNlbGYKCQkJCS8vIFNvIHRoYXQgd2UgY2FuIGxhdGVyIHJlbW92ZSBpdAoJCQkJZXZlbnQuaGFuZGxlciA9IGhhbmRsZU9iai5oYW5kbGVyOwoJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhOwoJCQkJZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqOwoKCQkJCXZhciByZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJncyApOwoKCQkJCWlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7CgkJCQkJZXZlbnQucmVzdWx0ID0gcmV0OwoJCQkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gZXZlbnQucmVzdWx0OwoJfSwKCglwcm9wczogImFsdEtleSBhdHRyQ2hhbmdlIGF0dHJOYW1lIGJ1YmJsZXMgYnV0dG9uIGNhbmNlbGFibGUgY2hhckNvZGUgY2xpZW50WCBjbGllbnRZIGN0cmxLZXkgY3VycmVudFRhcmdldCBkYXRhIGRldGFpbCBldmVudFBoYXNlIGZyb21FbGVtZW50IGhhbmRsZXIga2V5Q29kZSBsYXllclggbGF5ZXJZIG1ldGFLZXkgbmV3VmFsdWUgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHByZXZWYWx1ZSByZWxhdGVkTm9kZSByZWxhdGVkVGFyZ2V0IHNjcmVlblggc2NyZWVuWSBzaGlmdEtleSBzcmNFbGVtZW50IHRhcmdldCB0b0VsZW1lbnQgdmlldyB3aGVlbERlbHRhIHdoaWNoIi5zcGxpdCgiICIpLAoKCWZpeDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gKSB7CgkJCXJldHVybiBldmVudDsKCQl9CgoJCS8vIHN0b3JlIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZXZlbnQgb2JqZWN0CgkJLy8gYW5kICJjbG9uZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCgkJdmFyIG9yaWdpbmFsRXZlbnQgPSBldmVudDsKCQlldmVudCA9IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMucHJvcHMubGVuZ3RoLCBwcm9wOyBpOyApIHsKCQkJcHJvcCA9IHRoaXMucHJvcHNbIC0taSBdOwoJCQlldmVudFsgcHJvcCBdID0gb3JpZ2luYWxFdmVudFsgcHJvcCBdOwoJCX0KCgkJLy8gRml4IHRhcmdldCBwcm9wZXJ0eSwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQudGFyZ2V0ICkgewoJCQkvLyBGaXhlcyAjMTkyNSB3aGVyZSBzcmNFbGVtZW50IG1pZ2h0IG5vdCBiZSBkZWZpbmVkIGVpdGhlcgoJCQlldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50OwoJCX0KCgkJLy8gY2hlY2sgaWYgdGFyZ2V0IGlzIGEgdGV4dG5vZGUgKHNhZmFyaSkKCQlpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHsKCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQudGFyZ2V0LnBhcmVudE5vZGU7CgkJfQoKCQkvLyBBZGQgcmVsYXRlZFRhcmdldCwgaWYgbmVjZXNzYXJ5CgkJaWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApIHsKCQkJZXZlbnQucmVsYXRlZFRhcmdldCA9IGV2ZW50LmZyb21FbGVtZW50ID09PSBldmVudC50YXJnZXQgPyBldmVudC50b0VsZW1lbnQgOiBldmVudC5mcm9tRWxlbWVudDsKCQl9CgoJCS8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGUKCQlpZiAoIGV2ZW50LnBhZ2VYID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgewoJCQl2YXIgZXZlbnREb2N1bWVudCA9IGV2ZW50LnRhcmdldC5vd25lckRvY3VtZW50IHx8IGRvY3VtZW50LAoJCQkJZG9jID0gZXZlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJCQlib2R5ID0gZXZlbnREb2N1bWVudC5ib2R5OwoKCQkJZXZlbnQucGFnZVggPSBldmVudC5jbGllbnRYICsgKGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwKSAtIChkb2MgJiYgZG9jLmNsaWVudExlZnQgfHwgYm9keSAmJiBib2R5LmNsaWVudExlZnQgfHwgMCk7CgkJCWV2ZW50LnBhZ2VZID0gZXZlbnQuY2xpZW50WSArIChkb2MgJiYgZG9jLnNjcm9sbFRvcCAgfHwgYm9keSAmJiBib2R5LnNjcm9sbFRvcCAgfHwgMCkgLSAoZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDApOwoJCX0KCgkJLy8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzCgkJaWYgKCBldmVudC53aGljaCA9PSBudWxsICYmIChldmVudC5jaGFyQ29kZSAhPSBudWxsIHx8IGV2ZW50LmtleUNvZGUgIT0gbnVsbCkgKSB7CgkJCWV2ZW50LndoaWNoID0gZXZlbnQuY2hhckNvZGUgIT0gbnVsbCA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZTsKCQl9CgoJCS8vIEFkZCBtZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZvciBQQydzIGFuZCBNZXRhIGZvciBNYWNzKQoJCWlmICggIWV2ZW50Lm1ldGFLZXkgJiYgZXZlbnQuY3RybEtleSApIHsKCQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CgkJfQoKCQkvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0CgkJLy8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXQKCQlpZiAoICFldmVudC53aGljaCAmJiBldmVudC5idXR0b24gIT09IHVuZGVmaW5lZCApIHsKCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQuYnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24gJiA0ID8gMiA6IDAgKSApKTsKCQl9CgoJCXJldHVybiBldmVudDsKCX0sCgoJLy8gRGVwcmVjYXRlZCwgdXNlIGpRdWVyeS5ndWlkIGluc3RlYWQKCWd1aWQ6IDFFOCwKCgkvLyBEZXByZWNhdGVkLCB1c2UgalF1ZXJ5LnByb3h5IGluc3RlYWQKCXByb3h5OiBqUXVlcnkucHJveHksCgoJc3BlY2lhbDogewoJCXJlYWR5OiB7CgkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKCQkJc2V0dXA6IGpRdWVyeS5iaW5kUmVhZHksCgkJCXRlYXJkb3duOiBqUXVlcnkubm9vcAoJCX0sCgoJCWxpdmU6IHsKCQkJYWRkOiBmdW5jdGlvbiggaGFuZGxlT2JqICkgewoJCQkJalF1ZXJ5LmV2ZW50LmFkZCggdGhpcywKCQkJCQlsaXZlQ29udmVydCggaGFuZGxlT2JqLm9yaWdUeXBlLCBoYW5kbGVPYmouc2VsZWN0b3IgKSwKCQkJCQlqUXVlcnkuZXh0ZW5kKHt9LCBoYW5kbGVPYmosIHtoYW5kbGVyOiBsaXZlSGFuZGxlciwgZ3VpZDogaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZH0pICk7CgkJCX0sCgoJCQlyZW1vdmU6IGZ1bmN0aW9uKCBoYW5kbGVPYmogKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCBsaXZlQ29udmVydCggaGFuZGxlT2JqLm9yaWdUeXBlLCBoYW5kbGVPYmouc2VsZWN0b3IgKSwgaGFuZGxlT2JqICk7CgkJCX0KCQl9LAoKCQliZWZvcmV1bmxvYWQ6IHsKCQkJc2V0dXA6IGZ1bmN0aW9uKCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApIHsKCQkJCS8vIFdlIG9ubHkgd2FudCB0byBkbyB0aGlzIHNwZWNpYWwgY2FzZSBvbiB3aW5kb3dzCgkJCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggdGhpcyApICkgewoJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBldmVudEhhbmRsZTsKCQkJCX0KCQkJfSwKCgkJCXRlYXJkb3duOiBmdW5jdGlvbiggbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSB7CgkJCQlpZiAoIHRoaXMub25iZWZvcmV1bmxvYWQgPT09IGV2ZW50SGFuZGxlICkgewoJCQkJCXRoaXMub25iZWZvcmV1bmxvYWQgPSBudWxsOwoJCQkJfQoJCQl9CgkJfQoJfQp9OwoKalF1ZXJ5LnJlbW92ZUV2ZW50ID0gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciA/CglmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkgewoJCWlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkgewoJCQllbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSwgZmFsc2UgKTsKCQl9Cgl9IDoKCWZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7CgkJaWYgKCBlbGVtLmRldGFjaEV2ZW50ICkgewoJCQllbGVtLmRldGFjaEV2ZW50KCAib24iICsgdHlwZSwgaGFuZGxlICk7CgkJfQoJfTsKCmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkgewoJLy8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkCglpZiAoICF0aGlzLnByZXZlbnREZWZhdWx0ICkgewoJCXJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7Cgl9CgoJLy8gRXZlbnQgb2JqZWN0CglpZiAoIHNyYyAmJiBzcmMudHlwZSApIHsKCQl0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7CgkJdGhpcy50eXBlID0gc3JjLnR5cGU7CgoJCS8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkCgkJLy8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuCgkJdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSAoc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHwgc3JjLnJldHVyblZhbHVlID09PSBmYWxzZSB8fAoJCQlzcmMuZ2V0UHJldmVudERlZmF1bHQgJiYgc3JjLmdldFByZXZlbnREZWZhdWx0KCkpID8gcmV0dXJuVHJ1ZSA6IHJldHVybkZhbHNlOwoKCS8vIEV2ZW50IHR5cGUKCX0gZWxzZSB7CgkJdGhpcy50eXBlID0gc3JjOwoJfQoKCS8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0CglpZiAoIHByb3BzICkgewoJCWpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7Cgl9CgoJLy8gdGltZVN0YW1wIGlzIGJ1Z2d5IGZvciBzb21lIGV2ZW50cyBvbiBGaXJlZm94KCMzODQzKQoJLy8gU28gd2Ugd29uJ3QgcmVseSBvbiB0aGUgbmF0aXZlIHZhbHVlCgl0aGlzLnRpbWVTdGFtcCA9IGpRdWVyeS5ub3coKTsKCgkvLyBNYXJrIGl0IGFzIGZpeGVkCgl0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTsKfTsKCmZ1bmN0aW9uIHJldHVybkZhbHNlKCkgewoJcmV0dXJuIGZhbHNlOwp9CmZ1bmN0aW9uIHJldHVyblRydWUoKSB7CglyZXR1cm4gdHJ1ZTsKfQoKLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nCi8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbApqUXVlcnkuRXZlbnQucHJvdG90eXBlID0gewoJcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTsKCgkJdmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCAhZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gaWYgcHJldmVudERlZmF1bHQgZXhpc3RzIHJ1biBpdCBvbiB0aGUgb3JpZ2luYWwgZXZlbnQKCQlpZiAoIGUucHJldmVudERlZmF1bHQgKSB7CgkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgcmV0dXJuVmFsdWUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIGZhbHNlIChJRSkKCQl9IGVsc2UgewoJCQllLnJldHVyblZhbHVlID0gZmFsc2U7CgkJfQoJfSwKCXN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7CgoJCXZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50OwoJCWlmICggIWUgKSB7CgkJCXJldHVybjsKCQl9CgkJLy8gaWYgc3RvcFByb3BhZ2F0aW9uIGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CgkJaWYgKCBlLnN0b3BQcm9wYWdhdGlvbiApIHsKCQkJZS5zdG9wUHJvcGFnYXRpb24oKTsKCQl9CgkJLy8gb3RoZXJ3aXNlIHNldCB0aGUgY2FuY2VsQnViYmxlIHByb3BlcnR5IG9mIHRoZSBvcmlnaW5hbCBldmVudCB0byB0cnVlIChJRSkKCQllLmNhbmNlbEJ1YmJsZSA9IHRydWU7Cgl9LAoJc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTsKCQl0aGlzLnN0b3BQcm9wYWdhdGlvbigpOwoJfSwKCWlzRGVmYXVsdFByZXZlbnRlZDogcmV0dXJuRmFsc2UsCglpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsCglpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UKfTsKCi8vIENoZWNrcyBpZiBhbiBldmVudCBoYXBwZW5lZCBvbiBhbiBlbGVtZW50IHdpdGhpbiBhbm90aGVyIGVsZW1lbnQKLy8gVXNlZCBpbiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCnZhciB3aXRoaW5FbGVtZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkgewoKCS8vIENoZWNrIGlmIG1vdXNlKG92ZXJ8b3V0KSBhcmUgc3RpbGwgd2l0aGluIHRoZSBzYW1lIHBhcmVudCBlbGVtZW50Cgl2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQsCgkJaW5zaWRlID0gZmFsc2UsCgkJZXZlbnRUeXBlID0gZXZlbnQudHlwZTsKCglldmVudC50eXBlID0gZXZlbnQuZGF0YTsKCglpZiAoIHJlbGF0ZWQgIT09IHRoaXMgKSB7CgoJCWlmICggcmVsYXRlZCApIHsKCQkJaW5zaWRlID0galF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCByZWxhdGVkICk7CgkJfQoKCQlpZiAoICFpbnNpZGUgKSB7CgoJCQlqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJCWV2ZW50LnR5cGUgPSBldmVudFR5cGU7CgkJfQoJfQp9LAoKLy8gSW4gY2FzZSBvZiBldmVudCBkZWxlZ2F0aW9uLCB3ZSBvbmx5IG5lZWQgdG8gcmVuYW1lIHRoZSBldmVudC50eXBlLAovLyBsaXZlSGFuZGxlciB3aWxsIHRha2UgY2FyZSBvZiB0aGUgcmVzdC4KZGVsZWdhdGUgPSBmdW5jdGlvbiggZXZlbnQgKSB7CglldmVudC50eXBlID0gZXZlbnQuZGF0YTsKCWpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwp9OwoKLy8gQ3JlYXRlIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzCmpRdWVyeS5lYWNoKHsKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHsKCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50LCBvcmlnICk7CgkJfSwKCQl0ZWFyZG93bjogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIGZpeCwgZGF0YSAmJiBkYXRhLnNlbGVjdG9yID8gZGVsZWdhdGUgOiB3aXRoaW5FbGVtZW50ICk7CgkJfQoJfTsKfSk7CgovLyBzdWJtaXQgZGVsZWdhdGlvbgppZiAoICFqUXVlcnkuc3VwcG9ydC5zdWJtaXRCdWJibGVzICkgewoKCWpRdWVyeS5ldmVudC5zcGVjaWFsLnN1Ym1pdCA9IHsKCQlzZXR1cDogZnVuY3Rpb24oIGRhdGEsIG5hbWVzcGFjZXMgKSB7CgkJCWlmICggIWpRdWVyeS5ub2RlTmFtZSggdGhpcywgImZvcm0iICkgKSB7CgkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJjbGljay5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQkJdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJzdWJtaXQiIHx8IHR5cGUgPT09ICJpbWFnZSIpICYmIGpRdWVyeSggZWxlbSApLmNsb3Nlc3QoImZvcm0iKS5sZW5ndGggKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCQlqUXVlcnkuZXZlbnQuYWRkKHRoaXMsICJrZXlwcmVzcy5zcGVjaWFsU3VibWl0IiwgZnVuY3Rpb24oIGUgKSB7CgkJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwKCQkJCQkJdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJCWlmICggKHR5cGUgPT09ICJ0ZXh0IiB8fCB0eXBlID09PSAicGFzc3dvcmQiKSAmJiBqUXVlcnkoIGVsZW0gKS5jbG9zZXN0KCJmb3JtIikubGVuZ3RoICYmIGUua2V5Q29kZSA9PT0gMTMgKSB7CgkJCQkJCXRyaWdnZXIoICJzdWJtaXQiLCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCQl9CgkJCQl9KTsKCgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbFN1Ym1pdCIgKTsKCQl9Cgl9OwoKfQoKLy8gY2hhbmdlIGRlbGVnYXRpb24sIGhhcHBlbnMgaGVyZSBzbyB3ZSBoYXZlIGJpbmQuCmlmICggIWpRdWVyeS5zdXBwb3J0LmNoYW5nZUJ1YmJsZXMgKSB7CgoJdmFyIGNoYW5nZUZpbHRlcnMsCgoJZ2V0VmFsID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiLAoJCQl2YWwgPSBlbGVtLnZhbHVlOwoKCQlpZiAoIHR5cGUgPT09ICJyYWRpbyIgfHwgdHlwZSA9PT0gImNoZWNrYm94IiApIHsKCQkJdmFsID0gZWxlbS5jaGVja2VkOwoKCQl9IGVsc2UgaWYgKCB0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJdmFsID0gZWxlbS5zZWxlY3RlZEluZGV4ID4gLTEgPwoJCQkJalF1ZXJ5Lm1hcCggZWxlbS5vcHRpb25zLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZDsKCQkJCX0pLmpvaW4oIi0iKSA6CgkJCQkiIjsKCgkJfSBlbHNlIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQl2YWwgPSBlbGVtLnNlbGVjdGVkSW5kZXg7CgkJfQoKCQlyZXR1cm4gdmFsOwoJfSwKCgl0ZXN0Q2hhbmdlID0gZnVuY3Rpb24gdGVzdENoYW5nZSggZSApIHsKCQl2YXIgZWxlbSA9IGUudGFyZ2V0LCBkYXRhLCB2YWw7CgoJCWlmICggIXJmb3JtRWxlbXMudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8IGVsZW0ucmVhZE9ubHkgKSB7CgkJCXJldHVybjsKCQl9CgoJCWRhdGEgPSBqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiICk7CgkJdmFsID0gZ2V0VmFsKGVsZW0pOwoKCQkvLyB0aGUgY3VycmVudCBkYXRhIHdpbGwgYmUgYWxzbyByZXRyaWV2ZWQgYnkgYmVmb3JlYWN0aXZhdGUKCQlpZiAoIGUudHlwZSAhPT0gImZvY3Vzb3V0IiB8fCBlbGVtLnR5cGUgIT09ICJyYWRpbyIgKSB7CgkJCWpRdWVyeS5fZGF0YSggZWxlbSwgIl9jaGFuZ2VfZGF0YSIsIHZhbCApOwoJCX0KCgkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgfHwgdmFsID09PSBkYXRhICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGRhdGEgIT0gbnVsbCB8fCB2YWwgKSB7CgkJCWUudHlwZSA9ICJjaGFuZ2UiOwoJCQllLmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIGFyZ3VtZW50c1sxXSwgZWxlbSApOwoJCX0KCX07CgoJalF1ZXJ5LmV2ZW50LnNwZWNpYWwuY2hhbmdlID0gewoJCWZpbHRlcnM6IHsKCQkJZm9jdXNvdXQ6IHRlc3RDaGFuZ2UsCgoJCQliZWZvcmVkZWFjdGl2YXRlOiB0ZXN0Q2hhbmdlLAoKCQkJY2xpY2s6IGZ1bmN0aW9uKCBlICkgewoJCQkJdmFyIGVsZW0gPSBlLnRhcmdldCwgdHlwZSA9IGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApID8gZWxlbS50eXBlIDogIiI7CgoJCQkJaWYgKCB0eXBlID09PSAicmFkaW8iIHx8IHR5cGUgPT09ICJjaGVja2JveCIgfHwgalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkgewoJCQkJCXRlc3RDaGFuZ2UuY2FsbCggdGhpcywgZSApOwoJCQkJfQoJCQl9LAoKCQkJLy8gQ2hhbmdlIGhhcyB0byBiZSBjYWxsZWQgYmVmb3JlIHN1Ym1pdAoJCQkvLyBLZXlkb3duIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBrZXlwcmVzcywgd2hpY2ggaXMgdXNlZCBpbiBzdWJtaXQtZXZlbnQgZGVsZWdhdGlvbgoJCQlrZXlkb3duOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQsIHR5cGUgPSBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJpbnB1dCIgKSA/IGVsZW0udHlwZSA6ICIiOwoKCQkJCWlmICggKGUua2V5Q29kZSA9PT0gMTMgJiYgIWpRdWVyeS5ub2RlTmFtZSggZWxlbSwgInRleHRhcmVhIiApICkgfHwKCQkJCQkoZS5rZXlDb2RlID09PSAzMiAmJiAodHlwZSA9PT0gImNoZWNrYm94IiB8fCB0eXBlID09PSAicmFkaW8iKSkgfHwKCQkJCQl0eXBlID09PSAic2VsZWN0LW11bHRpcGxlIiApIHsKCQkJCQl0ZXN0Q2hhbmdlLmNhbGwoIHRoaXMsIGUgKTsKCQkJCX0KCQkJfSwKCgkJCS8vIEJlZm9yZWFjdGl2YXRlIGhhcHBlbnMgYWxzbyBiZWZvcmUgdGhlIHByZXZpb3VzIGVsZW1lbnQgaXMgYmx1cnJlZAoJCQkvLyB3aXRoIHRoaXMgZXZlbnQgeW91IGNhbid0IHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQsIGJ1dCB5b3UgY2FuIHN0b3JlCgkJCS8vIGluZm9ybWF0aW9uCgkJCWJlZm9yZWFjdGl2YXRlOiBmdW5jdGlvbiggZSApIHsKCQkJCXZhciBlbGVtID0gZS50YXJnZXQ7CgkJCQlqUXVlcnkuX2RhdGEoIGVsZW0sICJfY2hhbmdlX2RhdGEiLCBnZXRWYWwoZWxlbSkgKTsKCQkJfQoJCX0sCgoJCXNldHVwOiBmdW5jdGlvbiggZGF0YSwgbmFtZXNwYWNlcyApIHsKCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJmaWxlIiApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJZm9yICggdmFyIHR5cGUgaW4gY2hhbmdlRmlsdGVycyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGUgKyAiLnNwZWNpYWxDaGFuZ2UiLCBjaGFuZ2VGaWx0ZXJzW3R5cGVdICk7CgkJCX0KCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9LAoKCQl0ZWFyZG93bjogZnVuY3Rpb24oIG5hbWVzcGFjZXMgKSB7CgkJCWpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsICIuc3BlY2lhbENoYW5nZSIgKTsKCgkJCXJldHVybiByZm9ybUVsZW1zLnRlc3QoIHRoaXMubm9kZU5hbWUgKTsKCQl9Cgl9OwoKCWNoYW5nZUZpbHRlcnMgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbC5jaGFuZ2UuZmlsdGVyczsKCgkvLyBIYW5kbGUgd2hlbiB0aGUgaW5wdXQgaXMgLmZvY3VzKCknZAoJY2hhbmdlRmlsdGVycy5mb2N1cyA9IGNoYW5nZUZpbHRlcnMuYmVmb3JlYWN0aXZhdGU7Cn0KCmZ1bmN0aW9uIHRyaWdnZXIoIHR5cGUsIGVsZW0sIGFyZ3MgKSB7CgkvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmUuCgkvLyBGYWtlIG9yaWdpbmFsRXZlbnQgdG8gYXZvaWQgZG9ub3IncyBzdG9wUHJvcGFnYXRpb24sIGJ1dCBpZiB0aGUKCS8vIHNpbXVsYXRlZCBldmVudCBwcmV2ZW50cyBkZWZhdWx0IHRoZW4gd2UgZG8gdGhlIHNhbWUgb24gdGhlIGRvbm9yLgoJLy8gRG9uJ3QgcGFzcyBhcmdzIG9yIHJlbWVtYmVyIGxpdmVGaXJlZDsgdGhleSBhcHBseSB0byB0aGUgZG9ub3IgZXZlbnQuCgl2YXIgZXZlbnQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgYXJnc1sgMCBdICk7CglldmVudC50eXBlID0gdHlwZTsKCWV2ZW50Lm9yaWdpbmFsRXZlbnQgPSB7fTsKCWV2ZW50LmxpdmVGaXJlZCA9IHVuZGVmaW5lZDsKCWpRdWVyeS5ldmVudC5oYW5kbGUuY2FsbCggZWxlbSwgZXZlbnQgKTsKCWlmICggZXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkgKSB7CgkJYXJnc1sgMCBdLnByZXZlbnREZWZhdWx0KCk7Cgl9Cn0KCi8vIENyZWF0ZSAiYnViYmxpbmciIGZvY3VzIGFuZCBibHVyIGV2ZW50cwppZiAoICFqUXVlcnkuc3VwcG9ydC5mb2N1c2luQnViYmxlcyApIHsKCWpRdWVyeS5lYWNoKHsgZm9jdXM6ICJmb2N1c2luIiwgYmx1cjogImZvY3Vzb3V0IiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkgewoKCQkvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgd2hpbGUgc29tZW9uZSB3YW50cyBmb2N1c2luL2ZvY3Vzb3V0CgkJdmFyIGF0dGFjaGVzID0gMDsKCgkJalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0gewoJCQlzZXR1cDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIGF0dGFjaGVzKysgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9LAoJCQl0ZWFyZG93bjogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIC0tYXR0YWNoZXMgPT09IDAgKSB7CgkJCQkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApOwoJCQkJfQoJCQl9CgkJfTsKCgkJZnVuY3Rpb24gaGFuZGxlciggZG9ub3IgKSB7CgkJCS8vIERvbm9yIGV2ZW50IGlzIGFsd2F5cyBhIG5hdGl2ZSBvbmU7IGZpeCBpdCBhbmQgc3dpdGNoIGl0cyB0eXBlLgoJCQkvLyBMZXQgZm9jdXNpbi9vdXQgaGFuZGxlciBjYW5jZWwgdGhlIGRvbm9yIGZvY3VzL2JsdXIgZXZlbnQuCgkJCXZhciBlID0galF1ZXJ5LmV2ZW50LmZpeCggZG9ub3IgKTsKCQkJZS50eXBlID0gZml4OwoJCQllLm9yaWdpbmFsRXZlbnQgPSB7fTsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGUudGFyZ2V0ICk7CgkJCWlmICggZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHsKCQkJCWRvbm9yLnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9Cgl9KTsKfQoKalF1ZXJ5LmVhY2goWyJiaW5kIiwgIm9uZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGUsIGRhdGEsIGZuICkgewoJCXZhciBoYW5kbGVyOwoKCQkvLyBIYW5kbGUgb2JqZWN0IGxpdGVyYWxzCgkJaWYgKCB0eXBlb2YgdHlwZSA9PT0gIm9iamVjdCIgKSB7CgkJCWZvciAoIHZhciBrZXkgaW4gdHlwZSApIHsKCQkJCXRoaXNbIG5hbWUgXShrZXksIGRhdGEsIHR5cGVba2V5XSwgZm4pOwoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAyIHx8IGRhdGEgPT09IGZhbHNlICkgewoJCQlmbiA9IGRhdGE7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIG5hbWUgPT09ICJvbmUiICkgewoJCQloYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJalF1ZXJ5KCB0aGlzICkudW5iaW5kKCBldmVudCwgaGFuZGxlciApOwoJCQkJcmV0dXJuIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfTsKCQkJaGFuZGxlci5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrOwoJCX0gZWxzZSB7CgkJCWhhbmRsZXIgPSBmbjsKCQl9CgoJCWlmICggdHlwZSA9PT0gInVubG9hZCIgJiYgbmFtZSAhPT0gIm9uZSIgKSB7CgkJCXRoaXMub25lKCB0eXBlLCBkYXRhLCBmbiApOwoKCQl9IGVsc2UgewoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCWpRdWVyeS5ldmVudC5hZGQoIHRoaXNbaV0sIHR5cGUsIGhhbmRsZXIsIGRhdGEgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Owp9KTsKCmpRdWVyeS5mbi5leHRlbmQoewoJdW5iaW5kOiBmdW5jdGlvbiggdHlwZSwgZm4gKSB7CgkJLy8gSGFuZGxlIG9iamVjdCBsaXRlcmFscwoJCWlmICggdHlwZW9mIHR5cGUgPT09ICJvYmplY3QiICYmICF0eXBlLnByZXZlbnREZWZhdWx0ICkgewoJCQlmb3IgKCB2YXIga2V5IGluIHR5cGUgKSB7CgkJCQl0aGlzLnVuYmluZChrZXksIHR5cGVba2V5XSk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzW2ldLCB0eXBlLCBmbiApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZGVsZWdhdGU6IGZ1bmN0aW9uKCBzZWxlY3RvciwgdHlwZXMsIGRhdGEsIGZuICkgewoJCXJldHVybiB0aGlzLmxpdmUoIHR5cGVzLCBkYXRhLCBmbiwgc2VsZWN0b3IgKTsKCX0sCgoJdW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7CgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy51bmJpbmQoICJsaXZlIiApOwoKCQl9IGVsc2UgewoJCQlyZXR1cm4gdGhpcy5kaWUoIHR5cGVzLCBudWxsLCBmbiwgc2VsZWN0b3IgKTsKCQl9Cgl9LAoKCXRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7CgkJfSk7Cgl9LAoKCXRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHsKCQlpZiAoIHRoaXNbMF0gKSB7CgkJCXJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpc1swXSwgdHJ1ZSApOwoJCX0KCX0sCgoJdG9nZ2xlOiBmdW5jdGlvbiggZm4gKSB7CgkJLy8gU2F2ZSByZWZlcmVuY2UgdG8gYXJndW1lbnRzIGZvciBhY2Nlc3MgaW4gY2xvc3VyZQoJCXZhciBhcmdzID0gYXJndW1lbnRzLAoJCQlndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrLAoJCQlpID0gMCwKCQkJdG9nZ2xlciA9IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggZnVuY3Rpb24gdG8gZXhlY3V0ZQoJCQkJdmFyIGxhc3RUb2dnbGUgPSAoIGpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkICkgfHwgMCApICUgaTsKCQkJCWpRdWVyeS5kYXRhKCB0aGlzLCAibGFzdFRvZ2dsZSIgKyBmbi5ndWlkLCBsYXN0VG9nZ2xlICsgMSApOwoKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IGNsaWNrcyBzdG9wCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCS8vIGFuZCBleGVjdXRlIHRoZSBmdW5jdGlvbgoJCQkJcmV0dXJuIGFyZ3NbIGxhc3RUb2dnbGUgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFsc2U7CgkJCX07CgoJCS8vIGxpbmsgYWxsIHRoZSBmdW5jdGlvbnMsIHNvIGFueSBvZiB0aGVtIGNhbiB1bmJpbmQgdGhpcyBjbGljayBoYW5kbGVyCgkJdG9nZ2xlci5ndWlkID0gZ3VpZDsKCQl3aGlsZSAoIGkgPCBhcmdzLmxlbmd0aCApIHsKCQkJYXJnc1sgaSsrIF0uZ3VpZCA9IGd1aWQ7CgkJfQoKCQlyZXR1cm4gdGhpcy5jbGljayggdG9nZ2xlciApOwoJfSwKCglob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7CgkJcmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7Cgl9Cn0pOwoKdmFyIGxpdmVNYXAgPSB7Cglmb2N1czogImZvY3VzaW4iLAoJYmx1cjogImZvY3Vzb3V0IiwKCW1vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLAoJbW91c2VsZWF2ZTogIm1vdXNlb3V0Igp9OwoKalF1ZXJ5LmVhY2goWyJsaXZlIiwgImRpZSJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiwgb3JpZ1NlbGVjdG9yIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkgewoJCXZhciB0eXBlLCBpID0gMCwgbWF0Y2gsIG5hbWVzcGFjZXMsIHByZVR5cGUsCgkJCXNlbGVjdG9yID0gb3JpZ1NlbGVjdG9yIHx8IHRoaXMuc2VsZWN0b3IsCgkJCWNvbnRleHQgPSBvcmlnU2VsZWN0b3IgPyB0aGlzIDogalF1ZXJ5KCB0aGlzLmNvbnRleHQgKTsKCgkJaWYgKCB0eXBlb2YgdHlwZXMgPT09ICJvYmplY3QiICYmICF0eXBlcy5wcmV2ZW50RGVmYXVsdCApIHsKCQkJZm9yICggdmFyIGtleSBpbiB0eXBlcyApIHsKCQkJCWNvbnRleHRbIG5hbWUgXSgga2V5LCBkYXRhLCB0eXBlc1trZXldLCBzZWxlY3RvciApOwoJCQl9CgoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICggbmFtZSA9PT0gImRpZSIgJiYgIXR5cGVzICYmCgkJCQkJb3JpZ1NlbGVjdG9yICYmIG9yaWdTZWxlY3Rvci5jaGFyQXQoMCkgPT09ICIuIiApIHsKCgkJCWNvbnRleHQudW5iaW5kKCBvcmlnU2VsZWN0b3IgKTsKCgkJCXJldHVybiB0aGlzOwoJCX0KCgkJaWYgKCBkYXRhID09PSBmYWxzZSB8fCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkgewoJCQlmbiA9IGRhdGEgfHwgcmV0dXJuRmFsc2U7CgkJCWRhdGEgPSB1bmRlZmluZWQ7CgkJfQoKCQl0eXBlcyA9ICh0eXBlcyB8fCAiIikuc3BsaXQoIiAiKTsKCgkJd2hpbGUgKCAodHlwZSA9IHR5cGVzWyBpKysgXSkgIT0gbnVsbCApIHsKCQkJbWF0Y2ggPSBybmFtZXNwYWNlcy5leGVjKCB0eXBlICk7CgkJCW5hbWVzcGFjZXMgPSAiIjsKCgkJCWlmICggbWF0Y2ggKSAgewoJCQkJbmFtZXNwYWNlcyA9IG1hdGNoWzBdOwoJCQkJdHlwZSA9IHR5cGUucmVwbGFjZSggcm5hbWVzcGFjZXMsICIiICk7CgkJCX0KCgkJCWlmICggdHlwZSA9PT0gImhvdmVyIiApIHsKCQkJCXR5cGVzLnB1c2goICJtb3VzZWVudGVyIiArIG5hbWVzcGFjZXMsICJtb3VzZWxlYXZlIiArIG5hbWVzcGFjZXMgKTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlwcmVUeXBlID0gdHlwZTsKCgkJCWlmICggbGl2ZU1hcFsgdHlwZSBdICkgewoJCQkJdHlwZXMucHVzaCggbGl2ZU1hcFsgdHlwZSBdICsgbmFtZXNwYWNlcyApOwoJCQkJdHlwZSA9IHR5cGUgKyBuYW1lc3BhY2VzOwoKCQkJfSBlbHNlIHsKCQkJCXR5cGUgPSAobGl2ZU1hcFsgdHlwZSBdIHx8IHR5cGUpICsgbmFtZXNwYWNlczsKCQkJfQoKCQkJaWYgKCBuYW1lID09PSAibGl2ZSIgKSB7CgkJCQkvLyBiaW5kIGxpdmUgaGFuZGxlcgoJCQkJZm9yICggdmFyIGogPSAwLCBsID0gY29udGV4dC5sZW5ndGg7IGogPCBsOyBqKysgKSB7CgkJCQkJalF1ZXJ5LmV2ZW50LmFkZCggY29udGV4dFtqXSwgImxpdmUuIiArIGxpdmVDb252ZXJ0KCB0eXBlLCBzZWxlY3RvciApLAoJCQkJCQl7IGRhdGE6IGRhdGEsIHNlbGVjdG9yOiBzZWxlY3RvciwgaGFuZGxlcjogZm4sIG9yaWdUeXBlOiB0eXBlLCBvcmlnSGFuZGxlcjogZm4sIHByZVR5cGU6IHByZVR5cGUgfSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCS8vIHVuYmluZCBsaXZlIGhhbmRsZXIKCQkJCWNvbnRleHQudW5iaW5kKCAibGl2ZS4iICsgbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICksIGZuICk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfTsKfSk7CgpmdW5jdGlvbiBsaXZlSGFuZGxlciggZXZlbnQgKSB7Cgl2YXIgc3RvcCwgbWF4TGV2ZWwsIHJlbGF0ZWQsIG1hdGNoLCBoYW5kbGVPYmosIGVsZW0sIGosIGksIGwsIGRhdGEsIGNsb3NlLCBuYW1lc3BhY2UsIHJldCwKCQllbGVtcyA9IFtdLAoJCXNlbGVjdG9ycyA9IFtdLAoJCWV2ZW50cyA9IGpRdWVyeS5fZGF0YSggdGhpcywgImV2ZW50cyIgKTsKCgkvLyBNYWtlIHN1cmUgd2UgYXZvaWQgbm9uLWxlZnQtY2xpY2sgYnViYmxpbmcgaW4gRmlyZWZveCAoIzM4NjEpIGFuZCBkaXNhYmxlZCBlbGVtZW50cyBpbiBJRSAoIzY5MTEpCglpZiAoIGV2ZW50LmxpdmVGaXJlZCA9PT0gdGhpcyB8fCAhZXZlbnRzIHx8ICFldmVudHMubGl2ZSB8fCBldmVudC50YXJnZXQuZGlzYWJsZWQgfHwgZXZlbnQuYnV0dG9uICYmIGV2ZW50LnR5cGUgPT09ICJjbGljayIgKSB7CgkJcmV0dXJuOwoJfQoKCWlmICggZXZlbnQubmFtZXNwYWNlICkgewoJCW5hbWVzcGFjZSA9IG5ldyBSZWdFeHAoIihefFxcLikiICsgZXZlbnQubmFtZXNwYWNlLnNwbGl0KCIuIikuam9pbigiXFwuKD86LipcXC4pPyIpICsgIihcXC58JCkiKTsKCX0KCglldmVudC5saXZlRmlyZWQgPSB0aGlzOwoKCXZhciBsaXZlID0gZXZlbnRzLmxpdmUuc2xpY2UoMCk7CgoJZm9yICggaiA9IDA7IGogPCBsaXZlLmxlbmd0aDsgaisrICkgewoJCWhhbmRsZU9iaiA9IGxpdmVbal07CgoJCWlmICggaGFuZGxlT2JqLm9yaWdUeXBlLnJlcGxhY2UoIHJuYW1lc3BhY2VzLCAiIiApID09PSBldmVudC50eXBlICkgewoJCQlzZWxlY3RvcnMucHVzaCggaGFuZGxlT2JqLnNlbGVjdG9yICk7CgoJCX0gZWxzZSB7CgkJCWxpdmUuc3BsaWNlKCBqLS0sIDEgKTsKCQl9Cgl9CgoJbWF0Y2ggPSBqUXVlcnkoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIHNlbGVjdG9ycywgZXZlbnQuY3VycmVudFRhcmdldCApOwoKCWZvciAoIGkgPSAwLCBsID0gbWF0Y2gubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCWNsb3NlID0gbWF0Y2hbaV07CgoJCWZvciAoIGogPSAwOyBqIDwgbGl2ZS5sZW5ndGg7IGorKyApIHsKCQkJaGFuZGxlT2JqID0gbGl2ZVtqXTsKCgkJCWlmICggY2xvc2Uuc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciAmJiAoIW5hbWVzcGFjZSB8fCBuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApKSAmJiAhY2xvc2UuZWxlbS5kaXNhYmxlZCApIHsKCQkJCWVsZW0gPSBjbG9zZS5lbGVtOwoJCQkJcmVsYXRlZCA9IG51bGw7CgoJCQkJLy8gVGhvc2UgdHdvIGV2ZW50cyByZXF1aXJlIGFkZGl0aW9uYWwgY2hlY2tpbmcKCQkJCWlmICggaGFuZGxlT2JqLnByZVR5cGUgPT09ICJtb3VzZWVudGVyIiB8fCBoYW5kbGVPYmoucHJlVHlwZSA9PT0gIm1vdXNlbGVhdmUiICkgewoJCQkJCWV2ZW50LnR5cGUgPSBoYW5kbGVPYmoucHJlVHlwZTsKCQkJCQlyZWxhdGVkID0galF1ZXJ5KCBldmVudC5yZWxhdGVkVGFyZ2V0ICkuY2xvc2VzdCggaGFuZGxlT2JqLnNlbGVjdG9yIClbMF07CgoJCQkJCS8vIE1ha2Ugc3VyZSBub3QgdG8gYWNjaWRlbnRhbGx5IG1hdGNoIGEgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIHNlbGVjdG9yCgkJCQkJaWYgKCByZWxhdGVkICYmIGpRdWVyeS5jb250YWlucyggZWxlbSwgcmVsYXRlZCApICkgewoJCQkJCQlyZWxhdGVkID0gZWxlbTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCAhcmVsYXRlZCB8fCByZWxhdGVkICE9PSBlbGVtICkgewoJCQkJCWVsZW1zLnB1c2goeyBlbGVtOiBlbGVtLCBoYW5kbGVPYmo6IGhhbmRsZU9iaiwgbGV2ZWw6IGNsb3NlLmxldmVsIH0pOwoJCQkJfQoJCQl9CgkJfQoJfQoKCWZvciAoIGkgPSAwLCBsID0gZWxlbXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCW1hdGNoID0gZWxlbXNbaV07CgoJCWlmICggbWF4TGV2ZWwgJiYgbWF0Y2gubGV2ZWwgPiBtYXhMZXZlbCApIHsKCQkJYnJlYWs7CgkJfQoKCQlldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2guZWxlbTsKCQlldmVudC5kYXRhID0gbWF0Y2guaGFuZGxlT2JqLmRhdGE7CgkJZXZlbnQuaGFuZGxlT2JqID0gbWF0Y2guaGFuZGxlT2JqOwoKCQlyZXQgPSBtYXRjaC5oYW5kbGVPYmoub3JpZ0hhbmRsZXIuYXBwbHkoIG1hdGNoLmVsZW0sIGFyZ3VtZW50cyApOwoKCQlpZiAoIHJldCA9PT0gZmFsc2UgfHwgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHsKCQkJbWF4TGV2ZWwgPSBtYXRjaC5sZXZlbDsKCgkJCWlmICggcmV0ID09PSBmYWxzZSApIHsKCQkJCXN0b3AgPSBmYWxzZTsKCQkJfQoJCQlpZiAoIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQlicmVhazsKCQkJfQoJCX0KCX0KCglyZXR1cm4gc3RvcDsKfQoKZnVuY3Rpb24gbGl2ZUNvbnZlcnQoIHR5cGUsIHNlbGVjdG9yICkgewoJcmV0dXJuICh0eXBlICYmIHR5cGUgIT09ICIqIiA/IHR5cGUgKyAiLiIgOiAiIikgKyBzZWxlY3Rvci5yZXBsYWNlKHJwZXJpb2QsICJgIikucmVwbGFjZShyc3BhY2VzLCAiJiIpOwp9CgpqUXVlcnkuZWFjaCggKCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgbG9hZCByZXNpemUgc2Nyb2xsIHVubG9hZCBjbGljayBkYmxjbGljayAiICsKCSJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSAiICsKCSJjaGFuZ2Ugc2VsZWN0IHN1Ym1pdCBrZXlkb3duIGtleXByZXNzIGtleXVwIGVycm9yIikuc3BsaXQoIiAiKSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CgoJLy8gSGFuZGxlIGV2ZW50IGJpbmRpbmcKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkgewoJCWlmICggZm4gPT0gbnVsbCApIHsKCQkJZm4gPSBkYXRhOwoJCQlkYXRhID0gbnVsbDsKCQl9CgoJCXJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/CgkJCXRoaXMuYmluZCggbmFtZSwgZGF0YSwgZm4gKSA6CgkJCXRoaXMudHJpZ2dlciggbmFtZSApOwoJfTsKCglpZiAoIGpRdWVyeS5hdHRyRm4gKSB7CgkJalF1ZXJ5LmF0dHJGblsgbmFtZSBdID0gdHJ1ZTsKCX0KfSk7CgoKCi8qIQogKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZQogKiAgQ29weXJpZ2h0IDIwMTEsIFRoZSBEb2pvIEZvdW5kYXRpb24KICogIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQsIEJTRCwgYW5kIEdQTCBMaWNlbnNlcy4KICogIE1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9zaXp6bGVqcy5jb20vCiAqLwooZnVuY3Rpb24oKXsKCnZhciBjaHVua2VyID0gLygoPzpcKCg/OlwoW14oKV0rXCl8W14oKV0rKStcKXxcWyg/OlxbW15cW1xdXSpcXXxbJyJdW14nIl0qWyciXXxbXlxbXF0nIl0rKStcXXxcXC58W14gPit+LChcW1xcXSspK3xbPit+XSkoXHMqLFxzKik/KCg/Oi58XHJ8XG4pKikvZywKCWRvbmUgPSAwLAoJdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLAoJaGFzRHVwbGljYXRlID0gZmFsc2UsCgliYXNlSGFzRHVwbGljYXRlID0gdHJ1ZSwKCXJCYWNrc2xhc2ggPSAvXFwvZywKCXJOb25Xb3JkID0gL1xXLzsKCi8vIEhlcmUgd2UgY2hlY2sgaWYgdGhlIEphdmFTY3JpcHQgZW5naW5lIGlzIHVzaW5nIHNvbWUgc29ydCBvZgovLyBvcHRpbWl6YXRpb24gd2hlcmUgaXQgZG9lcyBub3QgYWx3YXlzIGNhbGwgb3VyIGNvbXBhcmlzaW9uCi8vIGZ1bmN0aW9uLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBkaXNjYXJkIHRoZSBoYXNEdXBsaWNhdGUgdmFsdWUuCi8vICAgVGh1cyBmYXIgdGhhdCBpbmNsdWRlcyBHb29nbGUgQ2hyb21lLgpbMCwgMF0uc29ydChmdW5jdGlvbigpIHsKCWJhc2VIYXNEdXBsaWNhdGUgPSBmYWxzZTsKCXJldHVybiAwOwp9KTsKCnZhciBTaXp6bGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7CglyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTsKCWNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50OwoKCXZhciBvcmlnQ29udGV4dCA9IGNvbnRleHQ7CgoJaWYgKCBjb250ZXh0Lm5vZGVUeXBlICE9PSAxICYmIGNvbnRleHQubm9kZVR5cGUgIT09IDkgKSB7CgkJcmV0dXJuIFtdOwoJfQoJCglpZiAoICFzZWxlY3RvciB8fCB0eXBlb2Ygc2VsZWN0b3IgIT09ICJzdHJpbmciICkgewoJCXJldHVybiByZXN1bHRzOwoJfQoKCXZhciBtLCBzZXQsIGNoZWNrU2V0LCBleHRyYSwgcmV0LCBjdXIsIHBvcCwgaSwKCQlwcnVuZSA9IHRydWUsCgkJY29udGV4dFhNTCA9IFNpenpsZS5pc1hNTCggY29udGV4dCApLAoJCXBhcnRzID0gW10sCgkJc29GYXIgPSBzZWxlY3RvcjsKCQoJLy8gUmVzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaHVua2VyIHJlZ2V4cCAoc3RhcnQgZnJvbSBoZWFkKQoJZG8gewoJCWNodW5rZXIuZXhlYyggIiIgKTsKCQltID0gY2h1bmtlci5leGVjKCBzb0ZhciApOwoKCQlpZiAoIG0gKSB7CgkJCXNvRmFyID0gbVszXTsKCQkKCQkJcGFydHMucHVzaCggbVsxXSApOwoJCQoJCQlpZiAoIG1bMl0gKSB7CgkJCQlleHRyYSA9IG1bM107CgkJCQlicmVhazsKCQkJfQoJCX0KCX0gd2hpbGUgKCBtICk7CgoJaWYgKCBwYXJ0cy5sZW5ndGggPiAxICYmIG9yaWdQT1MuZXhlYyggc2VsZWN0b3IgKSApIHsKCgkJaWYgKCBwYXJ0cy5sZW5ndGggPT09IDIgJiYgRXhwci5yZWxhdGl2ZVsgcGFydHNbMF0gXSApIHsKCQkJc2V0ID0gcG9zUHJvY2VzcyggcGFydHNbMF0gKyBwYXJ0c1sxXSwgY29udGV4dCApOwoKCQl9IGVsc2UgewoJCQlzZXQgPSBFeHByLnJlbGF0aXZlWyBwYXJ0c1swXSBdID8KCQkJCVsgY29udGV4dCBdIDoKCQkJCVNpenpsZSggcGFydHMuc2hpZnQoKSwgY29udGV4dCApOwoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQlzZWxlY3RvciA9IHBhcnRzLnNoaWZ0KCk7CgoJCQkJaWYgKCBFeHByLnJlbGF0aXZlWyBzZWxlY3RvciBdICkgewoJCQkJCXNlbGVjdG9yICs9IHBhcnRzLnNoaWZ0KCk7CgkJCQl9CgkJCQkKCQkJCXNldCA9IHBvc1Byb2Nlc3MoIHNlbGVjdG9yLCBzZXQgKTsKCQkJfQoJCX0KCgl9IGVsc2UgewoJCS8vIFRha2UgYSBzaG9ydGN1dCBhbmQgc2V0IHRoZSBjb250ZXh0IGlmIHRoZSByb290IHNlbGVjdG9yIGlzIGFuIElECgkJLy8gKGJ1dCBub3QgaWYgaXQnbGwgYmUgZmFzdGVyIGlmIHRoZSBpbm5lciBzZWxlY3RvciBpcyBhbiBJRCkKCQlpZiAoICFzZWVkICYmIHBhcnRzLmxlbmd0aCA+IDEgJiYgY29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiAhY29udGV4dFhNTCAmJgoJCQkJRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzWzBdKSAmJiAhRXhwci5tYXRjaC5JRC50ZXN0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKSApIHsKCgkJCXJldCA9IFNpenpsZS5maW5kKCBwYXJ0cy5zaGlmdCgpLCBjb250ZXh0LCBjb250ZXh0WE1MICk7CgkJCWNvbnRleHQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApWzBdIDoKCQkJCXJldC5zZXRbMF07CgkJfQoKCQlpZiAoIGNvbnRleHQgKSB7CgkJCXJldCA9IHNlZWQgPwoJCQkJeyBleHByOiBwYXJ0cy5wb3AoKSwgc2V0OiBtYWtlQXJyYXkoc2VlZCkgfSA6CgkJCQlTaXp6bGUuZmluZCggcGFydHMucG9wKCksIHBhcnRzLmxlbmd0aCA9PT0gMSAmJiAocGFydHNbMF0gPT09ICJ+IiB8fCBwYXJ0c1swXSA9PT0gIisiKSAmJiBjb250ZXh0LnBhcmVudE5vZGUgPyBjb250ZXh0LnBhcmVudE5vZGUgOiBjb250ZXh0LCBjb250ZXh0WE1MICk7CgoJCQlzZXQgPSByZXQuZXhwciA/CgkJCQlTaXp6bGUuZmlsdGVyKCByZXQuZXhwciwgcmV0LnNldCApIDoKCQkJCXJldC5zZXQ7CgoJCQlpZiAoIHBhcnRzLmxlbmd0aCA+IDAgKSB7CgkJCQljaGVja1NldCA9IG1ha2VBcnJheSggc2V0ICk7CgoJCQl9IGVsc2UgewoJCQkJcHJ1bmUgPSBmYWxzZTsKCQkJfQoKCQkJd2hpbGUgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXIgPSBwYXJ0cy5wb3AoKTsKCQkJCXBvcCA9IGN1cjsKCgkJCQlpZiAoICFFeHByLnJlbGF0aXZlWyBjdXIgXSApIHsKCQkJCQljdXIgPSAiIjsKCQkJCX0gZWxzZSB7CgkJCQkJcG9wID0gcGFydHMucG9wKCk7CgkJCQl9CgoJCQkJaWYgKCBwb3AgPT0gbnVsbCApIHsKCQkJCQlwb3AgPSBjb250ZXh0OwoJCQkJfQoKCQkJCUV4cHIucmVsYXRpdmVbIGN1ciBdKCBjaGVja1NldCwgcG9wLCBjb250ZXh0WE1MICk7CgkJCX0KCgkJfSBlbHNlIHsKCQkJY2hlY2tTZXQgPSBwYXJ0cyA9IFtdOwoJCX0KCX0KCglpZiAoICFjaGVja1NldCApIHsKCQljaGVja1NldCA9IHNldDsKCX0KCglpZiAoICFjaGVja1NldCApIHsKCQlTaXp6bGUuZXJyb3IoIGN1ciB8fCBzZWxlY3RvciApOwoJfQoKCWlmICggdG9TdHJpbmcuY2FsbChjaGVja1NldCkgPT09ICJbb2JqZWN0IEFycmF5XSIgKSB7CgkJaWYgKCAhcHJ1bmUgKSB7CgkJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgY2hlY2tTZXQgKTsKCgkJfSBlbHNlIGlmICggY29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID09PSAxICkgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiAoY2hlY2tTZXRbaV0gPT09IHRydWUgfHwgY2hlY2tTZXRbaV0ubm9kZVR5cGUgPT09IDEgJiYgU2l6emxlLmNvbnRhaW5zKGNvbnRleHQsIGNoZWNrU2V0W2ldKSkgKSB7CgkJCQkJcmVzdWx0cy5wdXNoKCBzZXRbaV0gKTsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoJCQlmb3IgKCBpID0gMDsgY2hlY2tTZXRbaV0gIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBjaGVja1NldFtpXSAmJiBjaGVja1NldFtpXS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQlyZXN1bHRzLnB1c2goIHNldFtpXSApOwoJCQkJfQoJCQl9CgkJfQoKCX0gZWxzZSB7CgkJbWFrZUFycmF5KCBjaGVja1NldCwgcmVzdWx0cyApOwoJfQoKCWlmICggZXh0cmEgKSB7CgkJU2l6emxlKCBleHRyYSwgb3JpZ0NvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTsKCQlTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApOwoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHsKCWlmICggc29ydE9yZGVyICkgewoJCWhhc0R1cGxpY2F0ZSA9IGJhc2VIYXNEdXBsaWNhdGU7CgkJcmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTsKCgkJaWYgKCBoYXNEdXBsaWNhdGUgKSB7CgkJCWZvciAoIHZhciBpID0gMTsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKysgKSB7CgkJCQlpZiAoIHJlc3VsdHNbaV0gPT09IHJlc3VsdHNbIGkgLSAxIF0gKSB7CgkJCQkJcmVzdWx0cy5zcGxpY2UoIGktLSwgMSApOwoJCQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiByZXN1bHRzOwp9OwoKU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgc2V0ICkgewoJcmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgc2V0ICk7Cn07CgpTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CglyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBbbm9kZV0gKS5sZW5ndGggPiAwOwp9OwoKU2l6emxlLmZpbmQgPSBmdW5jdGlvbiggZXhwciwgY29udGV4dCwgaXNYTUwgKSB7Cgl2YXIgc2V0OwoKCWlmICggIWV4cHIgKSB7CgkJcmV0dXJuIFtdOwoJfQoKCWZvciAoIHZhciBpID0gMCwgbCA9IEV4cHIub3JkZXIubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCXZhciBtYXRjaCwKCQkJdHlwZSA9IEV4cHIub3JkZXJbaV07CgkJCgkJaWYgKCAobWF0Y2ggPSBFeHByLmxlZnRNYXRjaFsgdHlwZSBdLmV4ZWMoIGV4cHIgKSkgKSB7CgkJCXZhciBsZWZ0ID0gbWF0Y2hbMV07CgkJCW1hdGNoLnNwbGljZSggMSwgMSApOwoKCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgIT09ICJcXCIgKSB7CgkJCQltYXRjaFsxXSA9IChtYXRjaFsxXSB8fCAiIikucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCXNldCA9IEV4cHIuZmluZFsgdHlwZSBdKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKTsKCgkJCQlpZiAoIHNldCAhPSBudWxsICkgewoJCQkJCWV4cHIgPSBleHByLnJlcGxhY2UoIEV4cHIubWF0Y2hbIHR5cGUgXSwgIiIgKTsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCX0KCglpZiAoICFzZXQgKSB7CgkJc2V0ID0gdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiID8KCQkJY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICkgOgoJCQlbXTsKCX0KCglyZXR1cm4geyBzZXQ6IHNldCwgZXhwcjogZXhwciB9Owp9OwoKU2l6emxlLmZpbHRlciA9IGZ1bmN0aW9uKCBleHByLCBzZXQsIGlucGxhY2UsIG5vdCApIHsKCXZhciBtYXRjaCwgYW55Rm91bmQsCgkJb2xkID0gZXhwciwKCQlyZXN1bHQgPSBbXSwKCQljdXJMb29wID0gc2V0LAoJCWlzWE1MRmlsdGVyID0gc2V0ICYmIHNldFswXSAmJiBTaXp6bGUuaXNYTUwoIHNldFswXSApOwoKCXdoaWxlICggZXhwciAmJiBzZXQubGVuZ3RoICkgewoJCWZvciAoIHZhciB0eXBlIGluIEV4cHIuZmlsdGVyICkgewoJCQlpZiAoIChtYXRjaCA9IEV4cHIubGVmdE1hdGNoWyB0eXBlIF0uZXhlYyggZXhwciApKSAhPSBudWxsICYmIG1hdGNoWzJdICkgewoJCQkJdmFyIGZvdW5kLCBpdGVtLAoJCQkJCWZpbHRlciA9IEV4cHIuZmlsdGVyWyB0eXBlIF0sCgkJCQkJbGVmdCA9IG1hdGNoWzFdOwoKCQkJCWFueUZvdW5kID0gZmFsc2U7CgoJCQkJbWF0Y2guc3BsaWNlKDEsMSk7CgoJCQkJaWYgKCBsZWZ0LnN1YnN0ciggbGVmdC5sZW5ndGggLSAxICkgPT09ICJcXCIgKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJaWYgKCBjdXJMb29wID09PSByZXN1bHQgKSB7CgkJCQkJcmVzdWx0ID0gW107CgkJCQl9CgoJCQkJaWYgKCBFeHByLnByZUZpbHRlclsgdHlwZSBdICkgewoJCQkJCW1hdGNoID0gRXhwci5wcmVGaWx0ZXJbIHR5cGUgXSggbWF0Y2gsIGN1ckxvb3AsIGlucGxhY2UsIHJlc3VsdCwgbm90LCBpc1hNTEZpbHRlciApOwoKCQkJCQlpZiAoICFtYXRjaCApIHsKCQkJCQkJYW55Rm91bmQgPSBmb3VuZCA9IHRydWU7CgoJCQkJCX0gZWxzZSBpZiAoIG1hdGNoID09PSB0cnVlICkgewoJCQkJCQljb250aW51ZTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQlmb3IgKCB2YXIgaSA9IDA7IChpdGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJCQlpZiAoIGl0ZW0gKSB7CgkJCQkJCQlmb3VuZCA9IGZpbHRlciggaXRlbSwgbWF0Y2gsIGksIGN1ckxvb3AgKTsKCQkJCQkJCXZhciBwYXNzID0gbm90IF4gISFmb3VuZDsKCgkJCQkJCQlpZiAoIGlucGxhY2UgJiYgZm91bmQgIT0gbnVsbCApIHsKCQkJCQkJCQlpZiAoIHBhc3MgKSB7CgkJCQkJCQkJCWFueUZvdW5kID0gdHJ1ZTsKCgkJCQkJCQkJfSBlbHNlIHsKCQkJCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCQkJCX0KCgkJCQkJCQl9IGVsc2UgaWYgKCBwYXNzICkgewoJCQkJCQkJCXJlc3VsdC5wdXNoKCBpdGVtICk7CgkJCQkJCQkJYW55Rm91bmQgPSB0cnVlOwoJCQkJCQkJfQoJCQkJCQl9CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZm91bmQgIT09IHVuZGVmaW5lZCApIHsKCQkJCQlpZiAoICFpbnBsYWNlICkgewoJCQkJCQljdXJMb29wID0gcmVzdWx0OwoJCQkJCX0KCgkJCQkJZXhwciA9IGV4cHIucmVwbGFjZSggRXhwci5tYXRjaFsgdHlwZSBdLCAiIiApOwoKCQkJCQlpZiAoICFhbnlGb3VuZCApIHsKCQkJCQkJcmV0dXJuIFtdOwoJCQkJCX0KCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEltcHJvcGVyIGV4cHJlc3Npb24KCQlpZiAoIGV4cHIgPT09IG9sZCApIHsKCQkJaWYgKCBhbnlGb3VuZCA9PSBudWxsICkgewoJCQkJU2l6emxlLmVycm9yKCBleHByICk7CgoJCQl9IGVsc2UgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCW9sZCA9IGV4cHI7Cgl9CgoJcmV0dXJuIGN1ckxvb3A7Cn07CgpTaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkgewoJdGhyb3cgIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIgKyBtc2c7Cn07Cgp2YXIgRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7CglvcmRlcjogWyAiSUQiLCAiTkFNRSIsICJUQUciIF0sCgoJbWF0Y2g6IHsKCQlJRDogLyMoKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCUNMQVNTOiAvXC4oKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykvLAoJCU5BTUU6IC9cW25hbWU9WyciXSooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylbJyJdKlxdLywKCQlBVFRSOiAvXFtccyooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKylccyooPzooXFM/PSlccyooPzooWyciXSkoLio/KVwzfCgjPyg/Oltcd1x1MDBjMC1cdUZGRkZcLV18XFwuKSopfCl8KVxzKlxdLywKCQlUQUc6IC9eKCg/Oltcd1x1MDBjMC1cdUZGRkZcKlwtXXxcXC4pKykvLAoJCUNISUxEOiAvOihvbmx5fG50aHxsYXN0fGZpcnN0KS1jaGlsZCg/OlwoXHMqKGV2ZW58b2RkfCg/OlsrXC1dP1xkK3woPzpbK1wtXT9cZCopP25ccyooPzpbK1wtXVxzKlxkKyk/KSlccypcKSk/LywKCQlQT1M6IC86KG50aHxlcXxndHxsdHxmaXJzdHxsYXN0fGV2ZW58b2RkKSg/OlwoKFxkKilcKSk/KD89W15cLV18JCkvLAoJCVBTRVVETzogLzooKD86W1x3XHUwMGMwLVx1RkZGRlwtXXxcXC4pKykoPzpcKChbJyJdPykoKD86XChbXlwpXStcKXxbXlwoXCldKikrKVwyXCkpPy8KCX0sCgoJbGVmdE1hdGNoOiB7fSwKCglhdHRyTWFwOiB7CgkJImNsYXNzIjogImNsYXNzTmFtZSIsCgkJImZvciI6ICJodG1sRm9yIgoJfSwKCglhdHRySGFuZGxlOiB7CgkJaHJlZjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiICk7CgkJfSwKCQl0eXBlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKTsKCQl9Cgl9LAoKCXJlbGF0aXZlOiB7CgkJIisiOiBmdW5jdGlvbihjaGVja1NldCwgcGFydCl7CgkJCXZhciBpc1BhcnRTdHIgPSB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIsCgkJCQlpc1RhZyA9IGlzUGFydFN0ciAmJiAhck5vbldvcmQudGVzdCggcGFydCApLAoJCQkJaXNQYXJ0U3RyTm90VGFnID0gaXNQYXJ0U3RyICYmICFpc1RhZzsKCgkJCWlmICggaXNUYWcgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGgsIGVsZW07IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIChlbGVtID0gY2hlY2tTZXRbaV0pICkgewoJCQkJCXdoaWxlICggKGVsZW0gPSBlbGVtLnByZXZpb3VzU2libGluZykgJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSApIHt9CgoJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyTm90VGFnIHx8IGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJ0ID8KCQkJCQkJZWxlbSB8fCBmYWxzZSA6CgkJCQkJCWVsZW0gPT09IHBhcnQ7CgkJCQl9CgkJCX0KCgkJCWlmICggaXNQYXJ0U3RyTm90VGFnICkgewoJCQkJU2l6emxlLmZpbHRlciggcGFydCwgY2hlY2tTZXQsIHRydWUgKTsKCQkJfQoJCX0sCgoJCSI+IjogZnVuY3Rpb24oIGNoZWNrU2V0LCBwYXJ0ICkgewoJCQl2YXIgZWxlbSwKCQkJCWlzUGFydFN0ciA9IHR5cGVvZiBwYXJ0ID09PSAic3RyaW5nIiwKCQkJCWkgPSAwLAoJCQkJbCA9IGNoZWNrU2V0Lmxlbmd0aDsKCgkJCWlmICggaXNQYXJ0U3RyICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoKCQkJCWZvciAoIDsgaSA8IGw7IGkrKyApIHsKCQkJCQllbGVtID0gY2hlY2tTZXRbaV07CgoJCQkJCWlmICggZWxlbSApIHsKCQkJCQkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJY2hlY2tTZXRbaV0gPSBwYXJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFydCA/IHBhcmVudCA6IGZhbHNlOwoJCQkJCX0KCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQlmb3IgKCA7IGkgPCBsOyBpKysgKSB7CgkJCQkJZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQkJCQlpZiAoIGVsZW0gKSB7CgkJCQkJCWNoZWNrU2V0W2ldID0gaXNQYXJ0U3RyID8KCQkJCQkJCWVsZW0ucGFyZW50Tm9kZSA6CgkJCQkJCQllbGVtLnBhcmVudE5vZGUgPT09IHBhcnQ7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggaXNQYXJ0U3RyICkgewoJCQkJCVNpenpsZS5maWx0ZXIoIHBhcnQsIGNoZWNrU2V0LCB0cnVlICk7CgkJCQl9CgkJCX0KCQl9LAoKCQkiIjogZnVuY3Rpb24oY2hlY2tTZXQsIHBhcnQsIGlzWE1MKXsKCQkJdmFyIG5vZGVDaGVjaywKCQkJCWRvbmVOYW1lID0gZG9uZSsrLAoJCQkJY2hlY2tGbiA9IGRpckNoZWNrOwoKCQkJaWYgKCB0eXBlb2YgcGFydCA9PT0gInN0cmluZyIgJiYgIXJOb25Xb3JkLnRlc3QoIHBhcnQgKSApIHsKCQkJCXBhcnQgPSBwYXJ0LnRvTG93ZXJDYXNlKCk7CgkJCQlub2RlQ2hlY2sgPSBwYXJ0OwoJCQkJY2hlY2tGbiA9IGRpck5vZGVDaGVjazsKCQkJfQoKCQkJY2hlY2tGbiggInBhcmVudE5vZGUiLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9LAoKCQkifiI6IGZ1bmN0aW9uKCBjaGVja1NldCwgcGFydCwgaXNYTUwgKSB7CgkJCXZhciBub2RlQ2hlY2ssCgkJCQlkb25lTmFtZSA9IGRvbmUrKywKCQkJCWNoZWNrRm4gPSBkaXJDaGVjazsKCgkJCWlmICggdHlwZW9mIHBhcnQgPT09ICJzdHJpbmciICYmICFyTm9uV29yZC50ZXN0KCBwYXJ0ICkgKSB7CgkJCQlwYXJ0ID0gcGFydC50b0xvd2VyQ2FzZSgpOwoJCQkJbm9kZUNoZWNrID0gcGFydDsKCQkJCWNoZWNrRm4gPSBkaXJOb2RlQ2hlY2s7CgkJCX0KCgkJCWNoZWNrRm4oICJwcmV2aW91c1NpYmxpbmciLCBwYXJ0LCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKTsKCQl9Cgl9LAoKCWZpbmQ6IHsKCQlJRDogZnVuY3Rpb24oIG1hdGNoLCBjb250ZXh0LCBpc1hNTCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gInVuZGVmaW5lZCIgJiYgIWlzWE1MICkgewoJCQkJdmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKG1hdGNoWzFdKTsKCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkvLyBub2RlcyB0aGF0IGFyZSBubyBsb25nZXIgaW4gdGhlIGRvY3VtZW50ICM2OTYzCgkJCQlyZXR1cm4gbSAmJiBtLnBhcmVudE5vZGUgPyBbbV0gOiBbXTsKCQkJfQoJCX0sCgoJCU5BTUU6IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSAhPT0gInVuZGVmaW5lZCIgKSB7CgkJCQl2YXIgcmV0ID0gW10sCgkJCQkJcmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeU5hbWUoIG1hdGNoWzFdICk7CgoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcmVzdWx0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLmdldEF0dHJpYnV0ZSgibmFtZSIpID09PSBtYXRjaFsxXSApIHsKCQkJCQkJcmV0LnB1c2goIHJlc3VsdHNbaV0gKTsKCQkJCQl9CgkJCQl9CgoJCQkJcmV0dXJuIHJldC5sZW5ndGggPT09IDAgPyBudWxsIDogcmV0OwoJCQl9CgkJfSwKCgkJVEFHOiBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQgKSB7CgkJCWlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09ICJ1bmRlZmluZWQiICkgewoJCQkJcmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIG1hdGNoWzFdICk7CgkJCX0KCQl9Cgl9LAoJcHJlRmlsdGVyOiB7CgkJQ0xBU1M6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQltYXRjaCA9ICIgIiArIG1hdGNoWzFdLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICkgKyAiICI7CgoJCQlpZiAoIGlzWE1MICkgewoJCQkJcmV0dXJuIG1hdGNoOwoJCQl9CgoJCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gY3VyTG9vcFtpXSkgIT0gbnVsbDsgaSsrICkgewoJCQkJaWYgKCBlbGVtICkgewoJCQkJCWlmICggbm90IF4gKGVsZW0uY2xhc3NOYW1lICYmICgiICIgKyBlbGVtLmNsYXNzTmFtZSArICIgIikucmVwbGFjZSgvW1x0XG5ccl0vZywgIiAiKS5pbmRleE9mKG1hdGNoKSA+PSAwKSApIHsKCQkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJCXJlc3VsdC5wdXNoKCBlbGVtICk7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggaW5wbGFjZSApIHsKCQkJCQkJY3VyTG9vcFtpXSA9IGZhbHNlOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGZhbHNlOwoJCX0sCgoJCUlEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFsxXS5yZXBsYWNlKCByQmFja3NsYXNoLCAiIiApOwoJCX0sCgoJCVRBRzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wICkgewoJCQlyZXR1cm4gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKS50b0xvd2VyQ2FzZSgpOwoJCX0sCgoJCUNISUxEOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCWlmICggbWF0Y2hbMV0gPT09ICJudGgiICkgewoJCQkJaWYgKCAhbWF0Y2hbMl0gKSB7CgkJCQkJU2l6emxlLmVycm9yKCBtYXRjaFswXSApOwoJCQkJfQoKCQkJCW1hdGNoWzJdID0gbWF0Y2hbMl0ucmVwbGFjZSgvXlwrfFxzKi9nLCAnJyk7CgoJCQkJLy8gcGFyc2UgZXF1YXRpb25zIGxpa2UgJ2V2ZW4nLCAnb2RkJywgJzUnLCAnMm4nLCAnM24rMicsICc0bi0xJywgJy1uKzYnCgkJCQl2YXIgdGVzdCA9IC8oLT8pKFxkKikoPzpuKFsrXC1dP1xkKikpPy8uZXhlYygKCQkJCQltYXRjaFsyXSA9PT0gImV2ZW4iICYmICIybiIgfHwgbWF0Y2hbMl0gPT09ICJvZGQiICYmICIybisxIiB8fAoJCQkJCSEvXEQvLnRlc3QoIG1hdGNoWzJdICkgJiYgIjBuKyIgKyBtYXRjaFsyXSB8fCBtYXRjaFsyXSk7CgoJCQkJLy8gY2FsY3VsYXRlIHRoZSBudW1iZXJzIChmaXJzdCluKyhsYXN0KSBpbmNsdWRpbmcgaWYgdGhleSBhcmUgbmVnYXRpdmUKCQkJCW1hdGNoWzJdID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwOwoJCQkJbWF0Y2hbM10gPSB0ZXN0WzNdIC0gMDsKCQkJfQoJCQllbHNlIGlmICggbWF0Y2hbMl0gKSB7CgkJCQlTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7CgkJCX0KCgkJCS8vIFRPRE86IE1vdmUgdG8gbm9ybWFsIGNhY2hpbmcgc3lzdGVtCgkJCW1hdGNoWzBdID0gZG9uZSsrOwoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBtYXRjaCwgY3VyTG9vcCwgaW5wbGFjZSwgcmVzdWx0LCBub3QsIGlzWE1MICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggckJhY2tzbGFzaCwgIiIgKTsKCQkJCgkJCWlmICggIWlzWE1MICYmIEV4cHIuYXR0ck1hcFtuYW1lXSApIHsKCQkJCW1hdGNoWzFdID0gRXhwci5hdHRyTWFwW25hbWVdOwoJCQl9CgoJCQkvLyBIYW5kbGUgaWYgYW4gdW4tcXVvdGVkIHZhbHVlIHdhcyB1c2VkCgkJCW1hdGNoWzRdID0gKCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCAiIiApLnJlcGxhY2UoIHJCYWNrc2xhc2gsICIiICk7CgoJCQlpZiAoIG1hdGNoWzJdID09PSAifj0iICkgewoJCQkJbWF0Y2hbNF0gPSAiICIgKyBtYXRjaFs0XSArICIgIjsKCQkJfQoKCQkJcmV0dXJuIG1hdGNoOwoJCX0sCgoJCVBTRVVETzogZnVuY3Rpb24oIG1hdGNoLCBjdXJMb29wLCBpbnBsYWNlLCByZXN1bHQsIG5vdCApIHsKCQkJaWYgKCBtYXRjaFsxXSA9PT0gIm5vdCIgKSB7CgkJCQkvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBjb21wbGV4IGV4cHJlc3Npb24sIG9yIGEgc2ltcGxlIG9uZQoJCQkJaWYgKCAoIGNodW5rZXIuZXhlYyhtYXRjaFszXSkgfHwgIiIgKS5sZW5ndGggPiAxIHx8IC9eXHcvLnRlc3QobWF0Y2hbM10pICkgewoJCQkJCW1hdGNoWzNdID0gU2l6emxlKG1hdGNoWzNdLCBudWxsLCBudWxsLCBjdXJMb29wKTsKCgkJCQl9IGVsc2UgewoJCQkJCXZhciByZXQgPSBTaXp6bGUuZmlsdGVyKG1hdGNoWzNdLCBjdXJMb29wLCBpbnBsYWNlLCB0cnVlIF4gbm90KTsKCgkJCQkJaWYgKCAhaW5wbGFjZSApIHsKCQkJCQkJcmVzdWx0LnB1c2guYXBwbHkoIHJlc3VsdCwgcmV0ICk7CgkJCQkJfQoKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgoJCQl9IGVsc2UgaWYgKCBFeHByLm1hdGNoLlBPUy50ZXN0KCBtYXRjaFswXSApIHx8IEV4cHIubWF0Y2guQ0hJTEQudGVzdCggbWF0Y2hbMF0gKSApIHsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJCQoJCQlyZXR1cm4gbWF0Y2g7CgkJfSwKCgkJUE9TOiBmdW5jdGlvbiggbWF0Y2ggKSB7CgkJCW1hdGNoLnVuc2hpZnQoIHRydWUgKTsKCgkJCXJldHVybiBtYXRjaDsKCQl9Cgl9LAoJCglmaWx0ZXJzOiB7CgkJZW5hYmxlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSAmJiBlbGVtLnR5cGUgIT09ICJoaWRkZW4iOwoJCX0sCgoJCWRpc2FibGVkOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7CgkJfSwKCgkJY2hlY2tlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmNoZWNrZWQgPT09IHRydWU7CgkJfSwKCQkKCQlzZWxlY3RlZDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCS8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHQKCQkJLy8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseQoJCQlpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCWVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4OwoJCQl9CgkJCQoJCQlyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTsKCQl9LAoKCQlwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gISFlbGVtLmZpcnN0Q2hpbGQ7CgkJfSwKCgkJZW1wdHk6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gIWVsZW0uZmlyc3RDaGlsZDsKCQl9LAoKCQloYXM6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuICEhU2l6emxlKCBtYXRjaFszXSwgZWxlbSApLmxlbmd0aDsKCQl9LAoKCQloZWFkZXI6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9oXGQvaSkudGVzdCggZWxlbS5ub2RlTmFtZSApOwoJCX0sCgoJCXRleHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKCAidHlwZSIgKSwgdHlwZSA9IGVsZW0udHlwZTsKCQkJLy8gSUU2IGFuZCA3IHdpbGwgbWFwIGVsZW0udHlwZSB0byAndGV4dCcgZm9yIG5ldyBIVE1MNSB0eXBlcyAoc2VhcmNoLCBldGMpIAoJCQkvLyB1c2UgZ2V0QXR0cmlidXRlIGluc3RlYWQgdG8gdGVzdCB0aGlzIGNhc2UKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAidGV4dCIgPT09IHR5cGUgJiYgKCBhdHRyID09PSB0eXBlIHx8IGF0dHIgPT09IG51bGwgKTsKCQl9LAoKCQlyYWRpbzogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgInJhZGlvIiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWNoZWNrYm94OiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiY2hlY2tib3giID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJZmlsZTogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJpbnB1dCIgJiYgImZpbGUiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcGFzc3dvcmQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAiaW5wdXQiICYmICJwYXNzd29yZCIgPT09IGVsZW0udHlwZTsKCQl9LAoKCQlzdWJtaXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAic3VibWl0IiA9PT0gZWxlbS50eXBlOwoJCX0sCgoJCWltYWdlOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gImlucHV0IiAmJiAiaW1hZ2UiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJcmVzZXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQl2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCQkJcmV0dXJuIChuYW1lID09PSAiaW5wdXQiIHx8IG5hbWUgPT09ICJidXR0b24iKSAmJiAicmVzZXQiID09PSBlbGVtLnR5cGU7CgkJfSwKCgkJYnV0dG9uOiBmdW5jdGlvbiggZWxlbSApIHsKCQkJdmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJCXJldHVybiBuYW1lID09PSAiaW5wdXQiICYmICJidXR0b24iID09PSBlbGVtLnR5cGUgfHwgbmFtZSA9PT0gImJ1dHRvbiI7CgkJfSwKCgkJaW5wdXQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCQlyZXR1cm4gKC9pbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uL2kpLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTsKCQl9LAoKCQlmb2N1czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKCQl9Cgl9LAoJc2V0RmlsdGVyczogewoJCWZpcnN0OiBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIGkgPT09IDA7CgkJfSwKCgkJbGFzdDogZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoLCBhcnJheSApIHsKCQkJcmV0dXJuIGkgPT09IGFycmF5Lmxlbmd0aCAtIDE7CgkJfSwKCgkJZXZlbjogZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJCXJldHVybiBpICUgMiA9PT0gMDsKCQl9LAoKCQlvZGQ6IGZ1bmN0aW9uKCBlbGVtLCBpICkgewoJCQlyZXR1cm4gaSAlIDIgPT09IDE7CgkJfSwKCgkJbHQ6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPCBtYXRjaFszXSAtIDA7CgkJfSwKCgkJZ3Q6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIGkgPiBtYXRjaFszXSAtIDA7CgkJfSwKCgkJbnRoOiBmdW5jdGlvbiggZWxlbSwgaSwgbWF0Y2ggKSB7CgkJCXJldHVybiBtYXRjaFszXSAtIDAgPT09IGk7CgkJfSwKCgkJZXE6IGZ1bmN0aW9uKCBlbGVtLCBpLCBtYXRjaCApIHsKCQkJcmV0dXJuIG1hdGNoWzNdIC0gMCA9PT0gaTsKCQl9Cgl9LAoJZmlsdGVyOiB7CgkJUFNFVURPOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2gsIGksIGFycmF5ICkgewoJCQl2YXIgbmFtZSA9IG1hdGNoWzFdLAoJCQkJZmlsdGVyID0gRXhwci5maWx0ZXJzWyBuYW1lIF07CgoJCQlpZiAoIGZpbHRlciApIHsKCQkJCXJldHVybiBmaWx0ZXIoIGVsZW0sIGksIG1hdGNoLCBhcnJheSApOwoKCQkJfSBlbHNlIGlmICggbmFtZSA9PT0gImNvbnRhaW5zIiApIHsKCQkJCXJldHVybiAoZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBTaXp6bGUuZ2V0VGV4dChbIGVsZW0gXSkgfHwgIiIpLmluZGV4T2YobWF0Y2hbM10pID49IDA7CgoJCQl9IGVsc2UgaWYgKCBuYW1lID09PSAibm90IiApIHsKCQkJCXZhciBub3QgPSBtYXRjaFszXTsKCgkJCQlmb3IgKCB2YXIgaiA9IDAsIGwgPSBub3QubGVuZ3RoOyBqIDwgbDsgaisrICkgewoJCQkJCWlmICggbm90W2pdID09PSBlbGVtICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfQoKCQkJCXJldHVybiB0cnVlOwoKCQkJfSBlbHNlIHsKCQkJCVNpenpsZS5lcnJvciggbmFtZSApOwoJCQl9CgkJfSwKCgkJQ0hJTEQ6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIHR5cGUgPSBtYXRjaFsxXSwKCQkJCW5vZGUgPSBlbGVtOwoKCQkJc3dpdGNoICggdHlwZSApIHsKCQkJCWNhc2UgIm9ubHkiOgoJCQkJY2FzZSAiZmlyc3QiOgoJCQkJCXdoaWxlICggKG5vZGUgPSBub2RlLnByZXZpb3VzU2libGluZykgKQkgewoJCQkJCQlpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7IAoJCQkJCQkJcmV0dXJuIGZhbHNlOyAKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKCB0eXBlID09PSAiZmlyc3QiICkgeyAKCQkJCQkJcmV0dXJuIHRydWU7IAoJCQkJCX0KCgkJCQkJbm9kZSA9IGVsZW07CgoJCQkJY2FzZSAibGFzdCI6CgkJCQkJd2hpbGUgKCAobm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpICkJIHsKCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgeyAKCQkJCQkJCXJldHVybiBmYWxzZTsgCgkJCQkJCX0KCQkJCQl9CgoJCQkJCXJldHVybiB0cnVlOwoKCQkJCWNhc2UgIm50aCI6CgkJCQkJdmFyIGZpcnN0ID0gbWF0Y2hbMl0sCgkJCQkJCWxhc3QgPSBtYXRjaFszXTsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwICkgewoJCQkJCQlyZXR1cm4gdHJ1ZTsKCQkJCQl9CgkJCQkJCgkJCQkJdmFyIGRvbmVOYW1lID0gbWF0Y2hbMF0sCgkJCQkJCXBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQoJCQkJCWlmICggcGFyZW50ICYmIChwYXJlbnQuc2l6Y2FjaGUgIT09IGRvbmVOYW1lIHx8ICFlbGVtLm5vZGVJbmRleCkgKSB7CgkJCQkJCXZhciBjb3VudCA9IDA7CgkJCQkJCQoJCQkJCQlmb3IgKCBub2RlID0gcGFyZW50LmZpcnN0Q2hpbGQ7IG5vZGU7IG5vZGUgPSBub2RlLm5leHRTaWJsaW5nICkgewoJCQkJCQkJaWYgKCBub2RlLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQkJCW5vZGUubm9kZUluZGV4ID0gKytjb3VudDsKCQkJCQkJCX0KCQkJCQkJfSAKCgkJCQkJCXBhcmVudC5zaXpjYWNoZSA9IGRvbmVOYW1lOwoJCQkJCX0KCQkJCQkKCQkJCQl2YXIgZGlmZiA9IGVsZW0ubm9kZUluZGV4IC0gbGFzdDsKCgkJCQkJaWYgKCBmaXJzdCA9PT0gMCApIHsKCQkJCQkJcmV0dXJuIGRpZmYgPT09IDA7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCXJldHVybiAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApOwoJCQkJCX0KCQkJfQoJCX0sCgoJCUlEOiBmdW5jdGlvbiggZWxlbSwgbWF0Y2ggKSB7CgkJCXJldHVybiBlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0uZ2V0QXR0cmlidXRlKCJpZCIpID09PSBtYXRjaDsKCQl9LAoKCQlUQUc6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJcmV0dXJuIChtYXRjaCA9PT0gIioiICYmIGVsZW0ubm9kZVR5cGUgPT09IDEpIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbWF0Y2g7CgkJfSwKCQkKCQlDTEFTUzogZnVuY3Rpb24oIGVsZW0sIG1hdGNoICkgewoJCQlyZXR1cm4gKCIgIiArIChlbGVtLmNsYXNzTmFtZSB8fCBlbGVtLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSkgKyAiICIpCgkJCQkuaW5kZXhPZiggbWF0Y2ggKSA+IC0xOwoJCX0sCgoJCUFUVFI6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5hbWUgPSBtYXRjaFsxXSwKCQkJCXJlc3VsdCA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZSBdID8KCQkJCQlFeHByLmF0dHJIYW5kbGVbIG5hbWUgXSggZWxlbSApIDoKCQkJCQllbGVtWyBuYW1lIF0gIT0gbnVsbCA/CgkJCQkJCWVsZW1bIG5hbWUgXSA6CgkJCQkJCWVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICksCgkJCQl2YWx1ZSA9IHJlc3VsdCArICIiLAoJCQkJdHlwZSA9IG1hdGNoWzJdLAoJCQkJY2hlY2sgPSBtYXRjaFs0XTsKCgkJCXJldHVybiByZXN1bHQgPT0gbnVsbCA/CgkJCQl0eXBlID09PSAiIT0iIDoKCQkJCXR5cGUgPT09ICI9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gIio9IiA/CgkJCQl2YWx1ZS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCXR5cGUgPT09ICJ+PSIgPwoJCQkJKCIgIiArIHZhbHVlICsgIiAiKS5pbmRleE9mKGNoZWNrKSA+PSAwIDoKCQkJCSFjaGVjayA/CgkJCQl2YWx1ZSAmJiByZXN1bHQgIT09IGZhbHNlIDoKCQkJCXR5cGUgPT09ICIhPSIgPwoJCQkJdmFsdWUgIT09IGNoZWNrIDoKCQkJCXR5cGUgPT09ICJePSIgPwoJCQkJdmFsdWUuaW5kZXhPZihjaGVjaykgPT09IDAgOgoJCQkJdHlwZSA9PT0gIiQ9IiA/CgkJCQl2YWx1ZS5zdWJzdHIodmFsdWUubGVuZ3RoIC0gY2hlY2subGVuZ3RoKSA9PT0gY2hlY2sgOgoJCQkJdHlwZSA9PT0gInw9IiA/CgkJCQl2YWx1ZSA9PT0gY2hlY2sgfHwgdmFsdWUuc3Vic3RyKDAsIGNoZWNrLmxlbmd0aCArIDEpID09PSBjaGVjayArICItIiA6CgkJCQlmYWxzZTsKCQl9LAoKCQlQT1M6IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCwgaSwgYXJyYXkgKSB7CgkJCXZhciBuYW1lID0gbWF0Y2hbMl0sCgkJCQlmaWx0ZXIgPSBFeHByLnNldEZpbHRlcnNbIG5hbWUgXTsKCgkJCWlmICggZmlsdGVyICkgewoJCQkJcmV0dXJuIGZpbHRlciggZWxlbSwgaSwgbWF0Y2gsIGFycmF5ICk7CgkJCX0KCQl9Cgl9Cn07Cgp2YXIgb3JpZ1BPUyA9IEV4cHIubWF0Y2guUE9TLAoJZmVzY2FwZSA9IGZ1bmN0aW9uKGFsbCwgbnVtKXsKCQlyZXR1cm4gIlxcIiArIChudW0gLSAwICsgMSk7Cgl9OwoKZm9yICggdmFyIHR5cGUgaW4gRXhwci5tYXRjaCApIHsKCUV4cHIubWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIEV4cHIubWF0Y2hbIHR5cGUgXS5zb3VyY2UgKyAoLyg/IVteXFtdKlxdKSg/IVteXChdKlwpKS8uc291cmNlKSApOwoJRXhwci5sZWZ0TWF0Y2hbIHR5cGUgXSA9IG5ldyBSZWdFeHAoIC8oXig/Oi58XHJ8XG4pKj8pLy5zb3VyY2UgKyBFeHByLm1hdGNoWyB0eXBlIF0uc291cmNlLnJlcGxhY2UoL1xcKFxkKykvZywgZmVzY2FwZSkgKTsKfQoKdmFyIG1ha2VBcnJheSA9IGZ1bmN0aW9uKCBhcnJheSwgcmVzdWx0cyApIHsKCWFycmF5ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5LCAwICk7CgoJaWYgKCByZXN1bHRzICkgewoJCXJlc3VsdHMucHVzaC5hcHBseSggcmVzdWx0cywgYXJyYXkgKTsKCQlyZXR1cm4gcmVzdWx0czsKCX0KCQoJcmV0dXJuIGFycmF5Owp9OwoKLy8gUGVyZm9ybSBhIHNpbXBsZSBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGhlIGJyb3dzZXIgaXMgY2FwYWJsZSBvZgovLyBjb252ZXJ0aW5nIGEgTm9kZUxpc3QgdG8gYW4gYXJyYXkgdXNpbmcgYnVpbHRpbiBtZXRob2RzLgovLyBBbHNvIHZlcmlmaWVzIHRoYXQgdGhlIHJldHVybmVkIGFycmF5IGhvbGRzIERPTSBub2RlcwovLyAod2hpY2ggaXMgbm90IHRoZSBjYXNlIGluIHRoZSBCbGFja2JlcnJ5IGJyb3dzZXIpCnRyeSB7CglBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMsIDAgKVswXS5ub2RlVHlwZTsKCi8vIFByb3ZpZGUgYSBmYWxsYmFjayBtZXRob2QgaWYgaXQgZG9lcyBub3Qgd29yawp9IGNhdGNoKCBlICkgewoJbWFrZUFycmF5ID0gZnVuY3Rpb24oIGFycmF5LCByZXN1bHRzICkgewoJCXZhciBpID0gMCwKCQkJcmV0ID0gcmVzdWx0cyB8fCBbXTsKCgkJaWYgKCB0b1N0cmluZy5jYWxsKGFycmF5KSA9PT0gIltvYmplY3QgQXJyYXldIiApIHsKCQkJQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoIHJldCwgYXJyYXkgKTsKCgkJfSBlbHNlIHsKCQkJaWYgKCB0eXBlb2YgYXJyYXkubGVuZ3RoID09PSAibnVtYmVyIiApIHsKCQkJCWZvciAoIHZhciBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCXJldC5wdXNoKCBhcnJheVtpXSApOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCWZvciAoIDsgYXJyYXlbaV07IGkrKyApIHsKCQkJCQlyZXQucHVzaCggYXJyYXlbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCnZhciBzb3J0T3JkZXIsIHNpYmxpbmdDaGVjazsKCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICkgewoJc29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7CgkJaWYgKCBhID09PSBiICkgewoJCQloYXNEdXBsaWNhdGUgPSB0cnVlOwoJCQlyZXR1cm4gMDsKCQl9CgoJCWlmICggIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gfHwgIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CgkJCXJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uID8gLTEgOiAxOwoJCX0KCgkJcmV0dXJuIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYikgJiA0ID8gLTEgOiAxOwoJfTsKCn0gZWxzZSB7Cglzb3J0T3JkZXIgPSBmdW5jdGlvbiggYSwgYiApIHsKCQkvLyBUaGUgbm9kZXMgYXJlIGlkZW50aWNhbCwgd2UgY2FuIGV4aXQgZWFybHkKCQlpZiAoIGEgPT09IGIgKSB7CgkJCWhhc0R1cGxpY2F0ZSA9IHRydWU7CgkJCXJldHVybiAwOwoKCQkvLyBGYWxsYmFjayB0byB1c2luZyBzb3VyY2VJbmRleCAoaW4gSUUpIGlmIGl0J3MgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXMKCQl9IGVsc2UgaWYgKCBhLnNvdXJjZUluZGV4ICYmIGIuc291cmNlSW5kZXggKSB7CgkJCXJldHVybiBhLnNvdXJjZUluZGV4IC0gYi5zb3VyY2VJbmRleDsKCQl9CgoJCXZhciBhbCwgYmwsCgkJCWFwID0gW10sCgkJCWJwID0gW10sCgkJCWF1cCA9IGEucGFyZW50Tm9kZSwKCQkJYnVwID0gYi5wYXJlbnROb2RlLAoJCQljdXIgPSBhdXA7CgoJCS8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MgKG9yIGlkZW50aWNhbCkgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2sKCQlpZiAoIGF1cCA9PT0gYnVwICkgewoJCQlyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7CgoJCS8vIElmIG5vIHBhcmVudHMgd2VyZSBmb3VuZCB0aGVuIHRoZSBub2RlcyBhcmUgZGlzY29ubmVjdGVkCgkJfSBlbHNlIGlmICggIWF1cCApIHsKCQkJcmV0dXJuIC0xOwoKCQl9IGVsc2UgaWYgKCAhYnVwICkgewoJCQlyZXR1cm4gMTsKCQl9CgoJCS8vIE90aGVyd2lzZSB0aGV5J3JlIHNvbWV3aGVyZSBlbHNlIGluIHRoZSB0cmVlIHNvIHdlIG5lZWQKCQkvLyB0byBidWlsZCB1cCBhIGZ1bGwgbGlzdCBvZiB0aGUgcGFyZW50Tm9kZXMgZm9yIGNvbXBhcmlzb24KCQl3aGlsZSAoIGN1ciApIHsKCQkJYXAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJY3VyID0gYnVwOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJYnAudW5zaGlmdCggY3VyICk7CgkJCWN1ciA9IGN1ci5wYXJlbnROb2RlOwoJCX0KCgkJYWwgPSBhcC5sZW5ndGg7CgkJYmwgPSBicC5sZW5ndGg7CgoJCS8vIFN0YXJ0IHdhbGtpbmcgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5CgkJZm9yICggdmFyIGkgPSAwOyBpIDwgYWwgJiYgaSA8IGJsOyBpKysgKSB7CgkJCWlmICggYXBbaV0gIT09IGJwW2ldICkgewoJCQkJcmV0dXJuIHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICk7CgkJCX0KCQl9CgoJCS8vIFdlIGVuZGVkIHNvbWVwbGFjZSB1cCB0aGUgdHJlZSBzbyBkbyBhIHNpYmxpbmcgY2hlY2sKCQlyZXR1cm4gaSA9PT0gYWwgPwoJCQlzaWJsaW5nQ2hlY2soIGEsIGJwW2ldLCAtMSApIDoKCQkJc2libGluZ0NoZWNrKCBhcFtpXSwgYiwgMSApOwoJfTsKCglzaWJsaW5nQ2hlY2sgPSBmdW5jdGlvbiggYSwgYiwgcmV0ICkgewoJCWlmICggYSA9PT0gYiApIHsKCQkJcmV0dXJuIHJldDsKCQl9CgoJCXZhciBjdXIgPSBhLm5leHRTaWJsaW5nOwoKCQl3aGlsZSAoIGN1ciApIHsKCQkJaWYgKCBjdXIgPT09IGIgKSB7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCgkJCWN1ciA9IGN1ci5uZXh0U2libGluZzsKCQl9CgoJCXJldHVybiAxOwoJfTsKfQoKLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmVpdmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXMKU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbXMgKSB7Cgl2YXIgcmV0ID0gIiIsIGVsZW07CgoJZm9yICggdmFyIGkgPSAwOyBlbGVtc1tpXTsgaSsrICkgewoJCWVsZW0gPSBlbGVtc1tpXTsKCgkJLy8gR2V0IHRoZSB0ZXh0IGZyb20gdGV4dCBub2RlcyBhbmQgQ0RBVEEgbm9kZXMKCQlpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gNCApIHsKCQkJcmV0ICs9IGVsZW0ubm9kZVZhbHVlOwoKCQkvLyBUcmF2ZXJzZSBldmVyeXRoaW5nIGVsc2UsIGV4Y2VwdCBjb21tZW50IG5vZGVzCgkJfSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSAhPT0gOCApIHsKCQkJcmV0ICs9IFNpenpsZS5nZXRUZXh0KCBlbGVtLmNoaWxkTm9kZXMgKTsKCQl9Cgl9CgoJcmV0dXJuIHJldDsKfTsKCi8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYnJvd3NlciByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWUgd2hlbgovLyBxdWVyeWluZyBieSBnZXRFbGVtZW50QnlJZCAoYW5kIHByb3ZpZGUgYSB3b3JrYXJvdW5kKQooZnVuY3Rpb24oKXsKCS8vIFdlJ3JlIGdvaW5nIHRvIGluamVjdCBhIGZha2UgaW5wdXQgZWxlbWVudCB3aXRoIGEgc3BlY2lmaWVkIG5hbWUKCXZhciBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksCgkJaWQgPSAic2NyaXB0IiArIChuZXcgRGF0ZSgpKS5nZXRUaW1lKCksCgkJcm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCglmb3JtLmlubmVySFRNTCA9ICI8YSBuYW1lPSciICsgaWQgKyAiJy8+IjsKCgkvLyBJbmplY3QgaXQgaW50byB0aGUgcm9vdCBlbGVtZW50LCBjaGVjayBpdHMgc3RhdHVzLCBhbmQgcmVtb3ZlIGl0IHF1aWNrbHkKCXJvb3QuaW5zZXJ0QmVmb3JlKCBmb3JtLCByb290LmZpcnN0Q2hpbGQgKTsKCgkvLyBUaGUgd29ya2Fyb3VuZCBoYXMgdG8gZG8gYWRkaXRpb25hbCBjaGVja3MgYWZ0ZXIgYSBnZXRFbGVtZW50QnlJZAoJLy8gV2hpY2ggc2xvd3MgdGhpbmdzIGRvd24gZm9yIG90aGVyIGJyb3dzZXJzIChoZW5jZSB0aGUgYnJhbmNoaW5nKQoJaWYgKCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggaWQgKSApIHsKCQlFeHByLmZpbmQuSUQgPSBmdW5jdGlvbiggbWF0Y2gsIGNvbnRleHQsIGlzWE1MICkgewoJCQlpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCQl2YXIgbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQobWF0Y2hbMV0pOwoKCQkJCXJldHVybiBtID8KCQkJCQltLmlkID09PSBtYXRjaFsxXSB8fCB0eXBlb2YgbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBtLmdldEF0dHJpYnV0ZU5vZGUoImlkIikubm9kZVZhbHVlID09PSBtYXRjaFsxXSA/CgkJCQkJCVttXSA6CgkJCQkJCXVuZGVmaW5lZCA6CgkJCQkJW107CgkJCX0KCQl9OwoKCQlFeHByLmZpbHRlci5JRCA9IGZ1bmN0aW9uKCBlbGVtLCBtYXRjaCApIHsKCQkJdmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSAidW5kZWZpbmVkIiAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7CgoJCQlyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlICYmIG5vZGUubm9kZVZhbHVlID09PSBtYXRjaDsKCQl9OwoJfQoKCXJvb3QucmVtb3ZlQ2hpbGQoIGZvcm0gKTsKCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJcm9vdCA9IGZvcm0gPSBudWxsOwp9KSgpOwoKKGZ1bmN0aW9uKCl7CgkvLyBDaGVjayB0byBzZWUgaWYgdGhlIGJyb3dzZXIgcmV0dXJucyBvbmx5IGVsZW1lbnRzCgkvLyB3aGVuIGRvaW5nIGdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikKCgkvLyBDcmVhdGUgYSBmYWtlIGVsZW1lbnQKCXZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKCWRpdi5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgiIikgKTsKCgkvLyBNYWtlIHN1cmUgbm8gY29tbWVudHMgYXJlIGZvdW5kCglpZiAoIGRpdi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aCA+IDAgKSB7CgkJRXhwci5maW5kLlRBRyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCApIHsKCQkJdmFyIHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBtYXRjaFsxXSApOwoKCQkJLy8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50cwoJCQlpZiAoIG1hdGNoWzFdID09PSAiKiIgKSB7CgkJCQl2YXIgdG1wID0gW107CgoJCQkJZm9yICggdmFyIGkgPSAwOyByZXN1bHRzW2ldOyBpKysgKSB7CgkJCQkJaWYgKCByZXN1bHRzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQl0bXAucHVzaCggcmVzdWx0c1tpXSApOwoJCQkJCX0KCQkJCX0KCgkJCQlyZXN1bHRzID0gdG1wOwoJCQl9CgoJCQlyZXR1cm4gcmVzdWx0czsKCQl9OwoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiBhbiBhdHRyaWJ1dGUgcmV0dXJucyBub3JtYWxpemVkIGhyZWYgYXR0cmlidXRlcwoJZGl2LmlubmVySFRNTCA9ICI8YSBocmVmPScjJz48L2E+IjsKCglpZiAoIGRpdi5maXJzdENoaWxkICYmIHR5cGVvZiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUgIT09ICJ1bmRlZmluZWQiICYmCgkJCWRpdi5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpICE9PSAiIyIgKSB7CgoJCUV4cHIuYXR0ckhhbmRsZS5ocmVmID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCXJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggImhyZWYiLCAyICk7CgkJfTsKCX0KCgkvLyByZWxlYXNlIG1lbW9yeSBpbiBJRQoJZGl2ID0gbnVsbDsKfSkoKTsKCmlmICggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApIHsKCShmdW5jdGlvbigpewoJCXZhciBvbGRTaXp6bGUgPSBTaXp6bGUsCgkJCWRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLAoJCQlpZCA9ICJfX3NpenpsZV9fIjsKCgkJZGl2LmlubmVySFRNTCA9ICI8cCBjbGFzcz0nVEVTVCc+PC9wPiI7CgoJCS8vIFNhZmFyaSBjYW4ndCBoYW5kbGUgdXBwZXJjYXNlIG9yIHVuaWNvZGUgY2hhcmFjdGVycyB3aGVuCgkJLy8gaW4gcXVpcmtzIG1vZGUuCgkJaWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbCAmJiBkaXYucXVlcnlTZWxlY3RvckFsbCgiLlRFU1QiKS5sZW5ndGggPT09IDAgKSB7CgkJCXJldHVybjsKCQl9CgkKCQlTaXp6bGUgPSBmdW5jdGlvbiggcXVlcnksIGNvbnRleHQsIGV4dHJhLCBzZWVkICkgewoJCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJCS8vIE9ubHkgdXNlIHF1ZXJ5U2VsZWN0b3JBbGwgb24gbm9uLVhNTCBkb2N1bWVudHMKCQkJLy8gKElEIHNlbGVjdG9ycyBkb24ndCB3b3JrIGluIG5vbi1IVE1MIGRvY3VtZW50cykKCQkJaWYgKCAhc2VlZCAmJiAhU2l6emxlLmlzWE1MKGNvbnRleHQpICkgewoJCQkJLy8gU2VlIGlmIHdlIGZpbmQgYSBzZWxlY3RvciB0byBzcGVlZCB1cAoJCQkJdmFyIG1hdGNoID0gL14oXHcrJCl8XlwuKFtcd1wtXSskKXxeIyhbXHdcLV0rJCkvLmV4ZWMoIHF1ZXJ5ICk7CgkJCQkKCQkJCWlmICggbWF0Y2ggJiYgKGNvbnRleHQubm9kZVR5cGUgPT09IDEgfHwgY29udGV4dC5ub2RlVHlwZSA9PT0gOSkgKSB7CgkJCQkJLy8gU3BlZWQtdXA6IFNpenpsZSgiVEFHIikKCQkJCQlpZiAoIG1hdGNoWzFdICkgewoJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCBxdWVyeSApLCBleHRyYSApOwoJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIi5DTEFTUyIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2hbMl0gJiYgRXhwci5maW5kLkNMQVNTICYmIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHsKCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBtYXRjaFsyXSApLCBleHRyYSApOwoJCQkJCX0KCQkJCX0KCQkJCQoJCQkJaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSA5ICkgewoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoImJvZHkiKQoJCQkJCS8vIFRoZSBib2R5IGVsZW1lbnQgb25seSBleGlzdHMgb25jZSwgb3B0aW1pemUgZmluZGluZyBpdAoJCQkJCWlmICggcXVlcnkgPT09ICJib2R5IiAmJiBjb250ZXh0LmJvZHkgKSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFsgY29udGV4dC5ib2R5IF0sIGV4dHJhICk7CgkJCQkJCQoJCQkJCS8vIFNwZWVkLXVwOiBTaXp6bGUoIiNJRCIpCgkJCQkJfSBlbHNlIGlmICggbWF0Y2ggJiYgbWF0Y2hbM10gKSB7CgkJCQkJCXZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbM10gKTsKCgkJCQkJCS8vIENoZWNrIHBhcmVudE5vZGUgdG8gY2F0Y2ggd2hlbiBCbGFja2JlcnJ5IDQuNiByZXR1cm5zCgkJCQkJCS8vIG5vZGVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgIzY5NjMKCQkJCQkJaWYgKCBlbGVtICYmIGVsZW0ucGFyZW50Tm9kZSApIHsKCQkJCQkJCS8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSBJRSBhbmQgT3BlcmEgcmV0dXJuIGl0ZW1zCgkJCQkJCQkvLyBieSBuYW1lIGluc3RlYWQgb2YgSUQKCQkJCQkJCWlmICggZWxlbS5pZCA9PT0gbWF0Y2hbM10gKSB7CgkJCQkJCQkJcmV0dXJuIG1ha2VBcnJheSggWyBlbGVtIF0sIGV4dHJhICk7CgkJCQkJCQl9CgkJCQkJCQkKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXJldHVybiBtYWtlQXJyYXkoIFtdLCBleHRyYSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCQoJCQkJCXRyeSB7CgkJCQkJCXJldHVybiBtYWtlQXJyYXkoIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbChxdWVyeSksIGV4dHJhICk7CgkJCQkJfSBjYXRjaChxc2FFcnJvcikge30KCgkJCQkvLyBxU0Egd29ya3Mgc3RyYW5nZWx5IG9uIEVsZW1lbnQtcm9vdGVkIHF1ZXJpZXMKCQkJCS8vIFdlIGNhbiB3b3JrIGFyb3VuZCB0aGlzIGJ5IHNwZWNpZnlpbmcgYW4gZXh0cmEgSUQgb24gdGhlIHJvb3QKCQkJCS8vIGFuZCB3b3JraW5nIHVwIGZyb20gdGhlcmUgKFRoYW5rcyB0byBBbmRyZXcgRHVwb250IGZvciB0aGUgdGVjaG5pcXVlKQoJCQkJLy8gSUUgOCBkb2Vzbid0IHdvcmsgb24gb2JqZWN0IGVsZW1lbnRzCgkJCQl9IGVsc2UgaWYgKCBjb250ZXh0Lm5vZGVUeXBlID09PSAxICYmIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm9iamVjdCIgKSB7CgkJCQkJdmFyIG9sZENvbnRleHQgPSBjb250ZXh0LAoJCQkJCQlvbGQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggImlkIiApLAoJCQkJCQluaWQgPSBvbGQgfHwgaWQsCgkJCQkJCWhhc1BhcmVudCA9IGNvbnRleHQucGFyZW50Tm9kZSwKCQkJCQkJcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciA9IC9eXHMqWyt+XS8udGVzdCggcXVlcnkgKTsKCgkJCQkJaWYgKCAhb2xkICkgewoJCQkJCQljb250ZXh0LnNldEF0dHJpYnV0ZSggImlkIiwgbmlkICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJbmlkID0gbmlkLnJlcGxhY2UoIC8nL2csICJcXCQmIiApOwoJCQkJCX0KCQkJCQlpZiAoIHJlbGF0aXZlSGllcmFyY2h5U2VsZWN0b3IgJiYgaGFzUGFyZW50ICkgewoJCQkJCQljb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlOwoJCQkJCX0KCgkJCQkJdHJ5IHsKCQkJCQkJaWYgKCAhcmVsYXRpdmVIaWVyYXJjaHlTZWxlY3RvciB8fCBoYXNQYXJlbnQgKSB7CgkJCQkJCQlyZXR1cm4gbWFrZUFycmF5KCBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoICJbaWQ9JyIgKyBuaWQgKyAiJ10gIiArIHF1ZXJ5ICksIGV4dHJhICk7CgkJCQkJCX0KCgkJCQkJfSBjYXRjaChwc2V1ZG9FcnJvcikgewoJCQkJCX0gZmluYWxseSB7CgkJCQkJCWlmICggIW9sZCApIHsKCQkJCQkJCW9sZENvbnRleHQucmVtb3ZlQXR0cmlidXRlKCAiaWQiICk7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCQkKCQkJcmV0dXJuIG9sZFNpenpsZShxdWVyeSwgY29udGV4dCwgZXh0cmEsIHNlZWQpOwoJCX07CgoJCWZvciAoIHZhciBwcm9wIGluIG9sZFNpenpsZSApIHsKCQkJU2l6emxlWyBwcm9wIF0gPSBvbGRTaXp6bGVbIHByb3AgXTsKCQl9CgoJCS8vIHJlbGVhc2UgbWVtb3J5IGluIElFCgkJZGl2ID0gbnVsbDsKCX0pKCk7Cn0KCihmdW5jdGlvbigpewoJdmFyIGh0bWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCgkJbWF0Y2hlcyA9IGh0bWwubWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubW96TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGh0bWwubXNNYXRjaGVzU2VsZWN0b3I7CgoJaWYgKCBtYXRjaGVzICkgewoJCS8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvcgoJCS8vIG9uIGEgZGlzY29ubmVjdGVkIG5vZGUgKElFIDkgZmFpbHMgdGhpcykKCQl2YXIgZGlzY29ubmVjdGVkTWF0Y2ggPSAhbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAiZGl2IiApLCAiZGl2IiApLAoJCQlwc2V1ZG9Xb3JrcyA9IGZhbHNlOwoKCQl0cnkgewoJCQkvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uCgkJCS8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWQKCQkJbWF0Y2hlcy5jYWxsKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICJbdGVzdCE9JyddOnNpenpsZSIgKTsKCQoJCX0gY2F0Y2goIHBzZXVkb0Vycm9yICkgewoJCQlwc2V1ZG9Xb3JrcyA9IHRydWU7CgkJfQoKCQlTaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIG5vZGUsIGV4cHIgKSB7CgkJCS8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZAoJCQlleHByID0gZXhwci5yZXBsYWNlKC9cPVxzKihbXiciXF1dKilccypcXS9nLCAiPSckMSddIik7CgoJCQlpZiAoICFTaXp6bGUuaXNYTUwoIG5vZGUgKSApIHsKCQkJCXRyeSB7IAoJCQkJCWlmICggcHNldWRvV29ya3MgfHwgIUV4cHIubWF0Y2guUFNFVURPLnRlc3QoIGV4cHIgKSAmJiAhLyE9Ly50ZXN0KCBleHByICkgKSB7CgkJCQkJCXZhciByZXQgPSBtYXRjaGVzLmNhbGwoIG5vZGUsIGV4cHIgKTsKCgkJCQkJCS8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXMKCQkJCQkJaWYgKCByZXQgfHwgIWRpc2Nvbm5lY3RlZE1hdGNoIHx8CgkJCQkJCQkJLy8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnQKCQkJCQkJCQkvLyBmcmFnbWVudCBpbiBJRSA5LCBzbyBjaGVjayBmb3IgdGhhdAoJCQkJCQkJCW5vZGUuZG9jdW1lbnQgJiYgbm9kZS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7CgkJCQkJCQlyZXR1cm4gcmV0OwoJCQkJCQl9CgkJCQkJfQoJCQkJfSBjYXRjaChlKSB7fQoJCQl9CgoJCQlyZXR1cm4gU2l6emxlKGV4cHIsIG51bGwsIG51bGwsIFtub2RlXSkubGVuZ3RoID4gMDsKCQl9OwoJfQp9KSgpOwoKKGZ1bmN0aW9uKCl7Cgl2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgoJZGl2LmlubmVySFRNTCA9ICI8ZGl2IGNsYXNzPSd0ZXN0IGUnPjwvZGl2PjxkaXYgY2xhc3M9J3Rlc3QnPjwvZGl2PiI7CgoJLy8gT3BlcmEgY2FuJ3QgZmluZCBhIHNlY29uZCBjbGFzc25hbWUgKGluIDkuNikKCS8vIEFsc28sIG1ha2Ugc3VyZSB0aGF0IGdldEVsZW1lbnRzQnlDbGFzc05hbWUgYWN0dWFsbHkgZXhpc3RzCglpZiAoICFkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSB8fCBkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiZSIpLmxlbmd0aCA9PT0gMCApIHsKCQlyZXR1cm47Cgl9CgoJLy8gU2FmYXJpIGNhY2hlcyBjbGFzcyBhdHRyaWJ1dGVzLCBkb2Vzbid0IGNhdGNoIGNoYW5nZXMgKGluIDMuMikKCWRpdi5sYXN0Q2hpbGQuY2xhc3NOYW1lID0gImUiOwoKCWlmICggZGl2LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoImUiKS5sZW5ndGggPT09IDEgKSB7CgkJcmV0dXJuOwoJfQoJCglFeHByLm9yZGVyLnNwbGljZSgxLCAwLCAiQ0xBU1MiKTsKCUV4cHIuZmluZC5DTEFTUyA9IGZ1bmN0aW9uKCBtYXRjaCwgY29udGV4dCwgaXNYTUwgKSB7CgkJaWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSAidW5kZWZpbmVkIiAmJiAhaXNYTUwgKSB7CgkJCXJldHVybiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUobWF0Y2hbMV0pOwoJCX0KCX07CgoJLy8gcmVsZWFzZSBtZW1vcnkgaW4gSUUKCWRpdiA9IG51bGw7Cn0pKCk7CgpmdW5jdGlvbiBkaXJOb2RlQ2hlY2soIGRpciwgY3VyLCBkb25lTmFtZSwgY2hlY2tTZXQsIG5vZGVDaGVjaywgaXNYTUwgKSB7Cglmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGVja1NldC5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJdmFyIGVsZW0gPSBjaGVja1NldFtpXTsKCgkJaWYgKCBlbGVtICkgewoJCQl2YXIgbWF0Y2ggPSBmYWxzZTsKCgkJCWVsZW0gPSBlbGVtW2Rpcl07CgoJCQl3aGlsZSAoIGVsZW0gKSB7CgkJCQlpZiAoIGVsZW0uc2l6Y2FjaGUgPT09IGRvbmVOYW1lICkgewoJCQkJCW1hdGNoID0gY2hlY2tTZXRbZWxlbS5zaXpzZXRdOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhaXNYTUwgKXsKCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJZWxlbS5zaXpzZXQgPSBpOwoJCQkJfQoKCQkJCWlmICggZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBjdXIgKSB7CgkJCQkJbWF0Y2ggPSBlbGVtOwoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCWVsZW0gPSBlbGVtW2Rpcl07CgkJCX0KCgkJCWNoZWNrU2V0W2ldID0gbWF0Y2g7CgkJfQoJfQp9CgpmdW5jdGlvbiBkaXJDaGVjayggZGlyLCBjdXIsIGRvbmVOYW1lLCBjaGVja1NldCwgbm9kZUNoZWNrLCBpc1hNTCApIHsKCWZvciAoIHZhciBpID0gMCwgbCA9IGNoZWNrU2V0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQl2YXIgZWxlbSA9IGNoZWNrU2V0W2ldOwoKCQlpZiAoIGVsZW0gKSB7CgkJCXZhciBtYXRjaCA9IGZhbHNlOwoJCQkKCQkJZWxlbSA9IGVsZW1bZGlyXTsKCgkJCXdoaWxlICggZWxlbSApIHsKCQkJCWlmICggZWxlbS5zaXpjYWNoZSA9PT0gZG9uZU5hbWUgKSB7CgkJCQkJbWF0Y2ggPSBjaGVja1NldFtlbGVtLnNpenNldF07CgkJCQkJYnJlYWs7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWlmICggIWlzWE1MICkgewoJCQkJCQllbGVtLnNpemNhY2hlID0gZG9uZU5hbWU7CgkJCQkJCWVsZW0uc2l6c2V0ID0gaTsKCQkJCQl9CgoJCQkJCWlmICggdHlwZW9mIGN1ciAhPT0gInN0cmluZyIgKSB7CgkJCQkJCWlmICggZWxlbSA9PT0gY3VyICkgewoJCQkJCQkJbWF0Y2ggPSB0cnVlOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIGlmICggU2l6emxlLmZpbHRlciggY3VyLCBbZWxlbV0gKS5sZW5ndGggPiAwICkgewoJCQkJCQltYXRjaCA9IGVsZW07CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCgkJCQllbGVtID0gZWxlbVtkaXJdOwoJCQl9CgoJCQljaGVja1NldFtpXSA9IG1hdGNoOwoJCX0KCX0KfQoKaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMgKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gYSAhPT0gYiAmJiAoYS5jb250YWlucyA/IGEuY29udGFpbnMoYikgOiB0cnVlKTsKCX07Cgp9IGVsc2UgaWYgKCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24gKSB7CglTaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggYSwgYiApIHsKCQlyZXR1cm4gISEoYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDE2KTsKCX07Cgp9IGVsc2UgewoJU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfTsKfQoKU2l6emxlLmlzWE1MID0gZnVuY3Rpb24oIGVsZW0gKSB7CgkvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0CgkvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMykgCgl2YXIgZG9jdW1lbnRFbGVtZW50ID0gKGVsZW0gPyBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSA6IDApLmRvY3VtZW50RWxlbWVudDsKCglyZXR1cm4gZG9jdW1lbnRFbGVtZW50ID8gZG9jdW1lbnRFbGVtZW50Lm5vZGVOYW1lICE9PSAiSFRNTCIgOiBmYWxzZTsKfTsKCnZhciBwb3NQcm9jZXNzID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJdmFyIG1hdGNoLAoJCXRtcFNldCA9IFtdLAoJCWxhdGVyID0gIiIsCgkJcm9vdCA9IGNvbnRleHQubm9kZVR5cGUgPyBbY29udGV4dF0gOiBjb250ZXh0OwoKCS8vIFBvc2l0aW9uIHNlbGVjdG9ycyBtdXN0IGJlIGRvbmUgYWZ0ZXIgdGhlIGZpbHRlcgoJLy8gQW5kIHNvIG11c3QgOm5vdChwb3NpdGlvbmFsKSBzbyB3ZSBtb3ZlIGFsbCBQU0VVRE9zIHRvIHRoZSBlbmQKCXdoaWxlICggKG1hdGNoID0gRXhwci5tYXRjaC5QU0VVRE8uZXhlYyggc2VsZWN0b3IgKSkgKSB7CgkJbGF0ZXIgKz0gbWF0Y2hbMF07CgkJc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKCBFeHByLm1hdGNoLlBTRVVETywgIiIgKTsKCX0KCglzZWxlY3RvciA9IEV4cHIucmVsYXRpdmVbc2VsZWN0b3JdID8gc2VsZWN0b3IgKyAiKiIgOiBzZWxlY3RvcjsKCglmb3IgKCB2YXIgaSA9IDAsIGwgPSByb290Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQlTaXp6bGUoIHNlbGVjdG9yLCByb290W2ldLCB0bXBTZXQgKTsKCX0KCglyZXR1cm4gU2l6emxlLmZpbHRlciggbGF0ZXIsIHRtcFNldCApOwp9OwoKLy8gRVhQT1NFCmpRdWVyeS5maW5kID0gU2l6emxlOwpqUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7CmpRdWVyeS5leHByWyI6Il0gPSBqUXVlcnkuZXhwci5maWx0ZXJzOwpqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7CmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7CmpRdWVyeS5pc1hNTERvYyA9IFNpenpsZS5pc1hNTDsKalF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zOwoKCn0pKCk7CgoKdmFyIHJ1bnRpbCA9IC9VbnRpbCQvLAoJcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXZVbnRpbHxwcmV2QWxsKS8sCgkvLyBOb3RlOiBUaGlzIFJlZ0V4cCBzaG91bGQgYmUgaW1wcm92ZWQsIG9yIGxpa2VseSBwdWxsZWQgZnJvbSBTaXp6bGUKCXJtdWx0aXNlbGVjdG9yID0gLywvLAoJaXNTaW1wbGUgPSAvXi5bXjojXFtcLixdKiQvLAoJc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UsCglQT1MgPSBqUXVlcnkuZXhwci5tYXRjaC5QT1MsCgkvLyBtZXRob2RzIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBhIHVuaXF1ZSBzZXQgd2hlbiBzdGFydGluZyBmcm9tIGEgdW5pcXVlIHNldAoJZ3VhcmFudGVlZFVuaXF1ZSA9IHsKCQljaGlsZHJlbjogdHJ1ZSwKCQljb250ZW50czogdHJ1ZSwKCQluZXh0OiB0cnVlLAoJCXByZXY6IHRydWUKCX07CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWksIGw7CgoJCWlmICggdHlwZW9mIHNlbGVjdG9yICE9PSAic3RyaW5nIiApIHsKCQkJcmV0dXJuIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlmb3IgKCBpID0gMCwgbCA9IHNlbGYubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHsKCQkJCQkJcmV0dXJuIHRydWU7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQl9CgoJCXZhciByZXQgPSB0aGlzLnB1c2hTdGFjayggIiIsICJmaW5kIiwgc2VsZWN0b3IgKSwKCQkJbGVuZ3RoLCBuLCByOwoKCQlmb3IgKCBpID0gMCwgbCA9IHRoaXMubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQlsZW5ndGggPSByZXQubGVuZ3RoOwoJCQlqUXVlcnkuZmluZCggc2VsZWN0b3IsIHRoaXNbaV0sIHJldCApOwoKCQkJaWYgKCBpID4gMCApIHsKCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHRzIGFyZSB1bmlxdWUKCQkJCWZvciAoIG4gPSBsZW5ndGg7IG4gPCByZXQubGVuZ3RoOyBuKysgKSB7CgkJCQkJZm9yICggciA9IDA7IHIgPCBsZW5ndGg7IHIrKyApIHsKCQkJCQkJaWYgKCByZXRbcl0gPT09IHJldFtuXSApIHsKCQkJCQkJCXJldC5zcGxpY2Uobi0tLCAxKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0OwoJfSwKCgloYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCApOwoJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGFyZ2V0cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQlpZiAoIGpRdWVyeS5jb250YWlucyggdGhpcywgdGFyZ2V0c1tpXSApICkgewoJCQkJCXJldHVybiB0cnVlOwoJCQkJfQoJCQl9CgkJfSk7Cgl9LAoKCW5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCBmYWxzZSksICJub3QiLCBzZWxlY3Rvcik7Cgl9LAoKCWZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KHRoaXMsIHNlbGVjdG9yLCB0cnVlKSwgImZpbHRlciIsIHNlbGVjdG9yICk7Cgl9LAoKCWlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuICEhc2VsZWN0b3IgJiYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJalF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIHRoaXMgKS5sZW5ndGggPiAwIDoKCQkJdGhpcy5maWx0ZXIoIHNlbGVjdG9yICkubGVuZ3RoID4gMCApOwoJfSwKCgljbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkgewoJCXZhciByZXQgPSBbXSwgaSwgbCwgY3VyID0gdGhpc1swXTsKCQkKCQkvLyBBcnJheQoJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHNlbGVjdG9ycyApICkgewoJCQl2YXIgbWF0Y2gsIHNlbGVjdG9yLAoJCQkJbWF0Y2hlcyA9IHt9LAoJCQkJbGV2ZWwgPSAxOwoKCQkJaWYgKCBjdXIgJiYgc2VsZWN0b3JzLmxlbmd0aCApIHsKCQkJCWZvciAoIGkgPSAwLCBsID0gc2VsZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCQlzZWxlY3RvciA9IHNlbGVjdG9yc1tpXTsKCgkJCQkJaWYgKCAhbWF0Y2hlc1sgc2VsZWN0b3IgXSApIHsKCQkJCQkJbWF0Y2hlc1sgc2VsZWN0b3IgXSA9IFBPUy50ZXN0KCBzZWxlY3RvciApID8KCQkJCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJCQkJc2VsZWN0b3I7CgkJCQkJfQoJCQkJfQoKCQkJCXdoaWxlICggY3VyICYmIGN1ci5vd25lckRvY3VtZW50ICYmIGN1ciAhPT0gY29udGV4dCApIHsKCQkJCQlmb3IgKCBzZWxlY3RvciBpbiBtYXRjaGVzICkgewoJCQkJCQltYXRjaCA9IG1hdGNoZXNbIHNlbGVjdG9yIF07CgoJCQkJCQlpZiAoIG1hdGNoLmpxdWVyeSA/IG1hdGNoLmluZGV4KCBjdXIgKSA+IC0xIDogalF1ZXJ5KCBjdXIgKS5pcyggbWF0Y2ggKSApIHsKCQkJCQkJCXJldC5wdXNoKHsgc2VsZWN0b3I6IHNlbGVjdG9yLCBlbGVtOiBjdXIsIGxldmVsOiBsZXZlbCB9KTsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJY3VyID0gY3VyLnBhcmVudE5vZGU7CgkJCQkJbGV2ZWwrKzsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIHJldDsKCQl9CgoJCS8vIFN0cmluZwoJCXZhciBwb3MgPSBQT1MudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gInN0cmluZyIgPwoJCQkJalF1ZXJ5KCBzZWxlY3RvcnMsIGNvbnRleHQgfHwgdGhpcy5jb250ZXh0ICkgOgoJCQkJMDsKCgkJZm9yICggaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJY3VyID0gdGhpc1tpXTsKCgkJCXdoaWxlICggY3VyICkgewoJCQkJaWYgKCBwb3MgPyBwb3MuaW5kZXgoY3VyKSA+IC0xIDogalF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKGN1ciwgc2VsZWN0b3JzKSApIHsKCQkJCQlyZXQucHVzaCggY3VyICk7CgkJCQkJYnJlYWs7CgoJCQkJfSBlbHNlIHsKCQkJCQljdXIgPSBjdXIucGFyZW50Tm9kZTsKCQkJCQlpZiAoICFjdXIgfHwgIWN1ci5vd25lckRvY3VtZW50IHx8IGN1ciA9PT0gY29udGV4dCB8fCBjdXIubm9kZVR5cGUgPT09IDExICkgewoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXJldCA9IHJldC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0LCAiY2xvc2VzdCIsIHNlbGVjdG9ycyApOwoJfSwKCgkvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCgkvLyB0aGUgbWF0Y2hlZCBzZXQgb2YgZWxlbWVudHMKCWluZGV4OiBmdW5jdGlvbiggZWxlbSApIHsKCgkJLy8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnQKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApID8gdGhpcy5wcmV2QWxsKCkubGVuZ3RoIDogLTE7CgkJfQoKCQkvLyBpbmRleCBpbiBzZWxlY3RvcgoJCWlmICggdHlwZW9mIGVsZW0gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoIHRoaXNbMF0sIGpRdWVyeSggZWxlbSApICk7CgkJfQoKCQkvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnQKCQlyZXR1cm4galF1ZXJ5LmluQXJyYXkoCgkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAoJCQllbGVtLmpxdWVyeSA/IGVsZW1bMF0gOiBlbGVtLCB0aGlzICk7Cgl9LAoKCWFkZDogZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgewoJCXZhciBzZXQgPSB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciID8KCQkJCWpRdWVyeSggc2VsZWN0b3IsIGNvbnRleHQgKSA6CgkJCQlqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciAmJiBzZWxlY3Rvci5ub2RlVHlwZSA/IFsgc2VsZWN0b3IgXSA6IHNlbGVjdG9yICksCgkJCWFsbCA9IGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgc2V0ICk7CgoJCXJldHVybiB0aGlzLnB1c2hTdGFjayggaXNEaXNjb25uZWN0ZWQoIHNldFswXSApIHx8IGlzRGlzY29ubmVjdGVkKCBhbGxbMF0gKSA/CgkJCWFsbCA6CgkJCWpRdWVyeS51bmlxdWUoIGFsbCApICk7Cgl9LAoKCWFuZFNlbGY6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7Cgl9Cn0pOwoKLy8gQSBwYWluZnVsbHkgc2ltcGxlIGNoZWNrIHRvIHNlZSBpZiBhbiBlbGVtZW50IGlzIGRpc2Nvbm5lY3RlZAovLyBmcm9tIGEgZG9jdW1lbnQgKHNob3VsZCBiZSBpbXByb3ZlZCwgd2hlcmUgZmVhc2libGUpLgpmdW5jdGlvbiBpc0Rpc2Nvbm5lY3RlZCggbm9kZSApIHsKCXJldHVybiAhbm9kZSB8fCAhbm9kZS5wYXJlbnROb2RlIHx8IG5vZGUucGFyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMTE7Cn0KCmpRdWVyeS5lYWNoKHsKCXBhcmVudDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJdmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTsKCQlyZXR1cm4gcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSAhPT0gMTEgPyBwYXJlbnQgOiBudWxsOwoJfSwKCXBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZGlyKCBlbGVtLCAicGFyZW50Tm9kZSIgKTsKCX0sCglwYXJlbnRzVW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInBhcmVudE5vZGUiLCB1bnRpbCApOwoJfSwKCW5leHQ6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkubnRoKCBlbGVtLCAyLCAibmV4dFNpYmxpbmciICk7Cgl9LAoJcHJldjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5udGgoIGVsZW0sIDIsICJwcmV2aW91c1NpYmxpbmciICk7Cgl9LAoJbmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5kaXIoIGVsZW0sICJuZXh0U2libGluZyIgKTsKCX0sCglwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIgKTsKCX0sCgluZXh0VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgIm5leHRTaWJsaW5nIiwgdW50aWwgKTsKCX0sCglwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHsKCQlyZXR1cm4galF1ZXJ5LmRpciggZWxlbSwgInByZXZpb3VzU2libGluZyIsIHVudGlsICk7Cgl9LAoJc2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuc2libGluZyggZWxlbS5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsIGVsZW0gKTsKCX0sCgljaGlsZHJlbjogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5zaWJsaW5nKCBlbGVtLmZpcnN0Q2hpbGQgKTsKCX0sCgljb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7CgkJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlmcmFtZSIgKSA/CgkJCWVsZW0uY29udGVudERvY3VtZW50IHx8IGVsZW0uY29udGVudFdpbmRvdy5kb2N1bWVudCA6CgkJCWpRdWVyeS5tYWtlQXJyYXkoIGVsZW0uY2hpbGROb2RlcyApOwoJfQp9LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7CglqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7CgkJdmFyIHJldCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApLAoJCQkvLyBUaGUgdmFyaWFibGUgJ2FyZ3MnIHdhcyBpbnRyb2R1Y2VkIGluCgkJCS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L2NvbW1pdC81MmEwMjM4CgkJCS8vIHRvIHdvcmsgYXJvdW5kIGEgYnVnIGluIENocm9tZSAxMCAoRGV2KSBhbmQgc2hvdWxkIGJlIHJlbW92ZWQgd2hlbiB0aGUgYnVnIGlzIGZpeGVkLgoJCQkvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0xMDUwCgkJCWFyZ3MgPSBzbGljZS5jYWxsKGFyZ3VtZW50cyk7CgoJCWlmICggIXJ1bnRpbC50ZXN0KCBuYW1lICkgKSB7CgkJCXNlbGVjdG9yID0gdW50aWw7CgkJfQoKCQlpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIgKSB7CgkJCXJldCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCByZXQgKTsKCQl9CgoJCXJldCA9IHRoaXMubGVuZ3RoID4gMSAmJiAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdID8galF1ZXJ5LnVuaXF1ZSggcmV0ICkgOiByZXQ7CgoJCWlmICggKHRoaXMubGVuZ3RoID4gMSB8fCBybXVsdGlzZWxlY3Rvci50ZXN0KCBzZWxlY3RvciApKSAmJiBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkgewoJCQlyZXQgPSByZXQucmV2ZXJzZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQsIG5hbWUsIGFyZ3Muam9pbigiLCIpICk7Cgl9Owp9KTsKCmpRdWVyeS5leHRlbmQoewoJZmlsdGVyOiBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHsKCQlpZiAoIG5vdCApIHsKCQkJZXhwciA9ICI6bm90KCIgKyBleHByICsgIikiOwoJCX0KCgkJcmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSA/CgkJCWpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvcihlbGVtc1swXSwgZXhwcikgPyBbIGVsZW1zWzBdIF0gOiBbXSA6CgkJCWpRdWVyeS5maW5kLm1hdGNoZXMoZXhwciwgZWxlbXMpOwoJfSwKCglkaXI6IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkgewoJCXZhciBtYXRjaGVkID0gW10sCgkJCWN1ciA9IGVsZW1bIGRpciBdOwoKCQl3aGlsZSAoIGN1ciAmJiBjdXIubm9kZVR5cGUgIT09IDkgJiYgKHVudGlsID09PSB1bmRlZmluZWQgfHwgY3VyLm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkoIGN1ciApLmlzKCB1bnRpbCApKSApIHsKCQkJaWYgKCBjdXIubm9kZVR5cGUgPT09IDEgKSB7CgkJCQltYXRjaGVkLnB1c2goIGN1ciApOwoJCQl9CgkJCWN1ciA9IGN1cltkaXJdOwoJCX0KCQlyZXR1cm4gbWF0Y2hlZDsKCX0sCgoJbnRoOiBmdW5jdGlvbiggY3VyLCByZXN1bHQsIGRpciwgZWxlbSApIHsKCQlyZXN1bHQgPSByZXN1bHQgfHwgMTsKCQl2YXIgbnVtID0gMDsKCgkJZm9yICggOyBjdXI7IGN1ciA9IGN1cltkaXJdICkgewoJCQlpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiArK251bSA9PT0gcmVzdWx0ICkgewoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCXJldHVybiBjdXI7Cgl9LAoKCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgewoJCXZhciByID0gW107CgoJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CgkJCWlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkgewoJCQkJci5wdXNoKCBuICk7CgkJCX0KCQl9CgoJCXJldHVybiByOwoJfQp9KTsKCi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90CmZ1bmN0aW9uIHdpbm5vdyggZWxlbWVudHMsIHF1YWxpZmllciwga2VlcCApIHsKCgkvLyBDYW4ndCBwYXNzIG51bGwgb3IgdW5kZWZpbmVkIHRvIGluZGV4T2YgaW4gRmlyZWZveCA0CgkvLyBTZXQgdG8gMCB0byBza2lwIHN0cmluZyBjaGVjawoJcXVhbGlmaWVyID0gcXVhbGlmaWVyIHx8IDA7CgoJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJdmFyIHJldFZhbCA9ICEhcXVhbGlmaWVyLmNhbGwoIGVsZW0sIGksIGVsZW0gKTsKCQkJcmV0dXJuIHJldFZhbCA9PT0ga2VlcDsKCQl9KTsKCgl9IGVsc2UgaWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7CgkJcmV0dXJuIGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHsKCQkJcmV0dXJuIChlbGVtID09PSBxdWFsaWZpZXIpID09PSBrZWVwOwoJCX0pOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09ICJzdHJpbmciICkgewoJCXZhciBmaWx0ZXJlZCA9IGpRdWVyeS5ncmVwKGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJcmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7CgkJfSk7CgoJCWlmICggaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7CgkJCXJldHVybiBqUXVlcnkuZmlsdGVyKHF1YWxpZmllciwgZmlsdGVyZWQsICFrZWVwKTsKCQl9IGVsc2UgewoJCQlxdWFsaWZpZXIgPSBqUXVlcnkuZmlsdGVyKCBxdWFsaWZpZXIsIGZpbHRlcmVkICk7CgkJfQoJfQoKCXJldHVybiBqUXVlcnkuZ3JlcChlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7CgkJcmV0dXJuIChqUXVlcnkuaW5BcnJheSggZWxlbSwgcXVhbGlmaWVyICkgPj0gMCkgPT09IGtlZXA7Cgl9KTsKfQoKCgoKdmFyIHJpbmxpbmVqUXVlcnkgPSAvIGpRdWVyeVxkKz0iKD86XGQrfG51bGwpIi9nLAoJcmxlYWRpbmdXaGl0ZXNwYWNlID0gL15ccysvLAoJcnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1x3Ol0rKVtePl0qKVwvPi9pZywKCXJ0YWdOYW1lID0gLzwoW1x3Ol0rKS8sCglydGJvZHkgPSAvPHRib2R5L2ksCglyaHRtbCA9IC88fCYjP1x3KzsvLAoJcm5vY2FjaGUgPSAvPCg/OnNjcmlwdHxvYmplY3R8ZW1iZWR8b3B0aW9ufHN0eWxlKS9pLAoJLy8gY2hlY2tlZD0iY2hlY2tlZCIgb3IgY2hlY2tlZAoJcmNoZWNrZWQgPSAvY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSwKCXJzY3JpcHRUeXBlID0gL1wvKGphdmF8ZWNtYSlzY3JpcHQvaSwKCXJjbGVhblNjcmlwdCA9IC9eXHMqPCEoPzpcW0NEQVRBXFt8XC1cLSkvLAoJd3JhcE1hcCA9IHsKCQlvcHRpb246IFsgMSwgIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCAiPC9zZWxlY3Q+IiBdLAoJCWxlZ2VuZDogWyAxLCAiPGZpZWxkc2V0PiIsICI8L2ZpZWxkc2V0PiIgXSwKCQl0aGVhZDogWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSwKCQl0cjogWyAyLCAiPHRhYmxlPjx0Ym9keT4iLCAiPC90Ym9keT48L3RhYmxlPiIgXSwKCQl0ZDogWyAzLCAiPHRhYmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSwKCQljb2w6IFsgMiwgIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwgIjwvY29sZ3JvdXA+PC90YWJsZT4iIF0sCgkJYXJlYTogWyAxLCAiPG1hcD4iLCAiPC9tYXA+IiBdLAoJCV9kZWZhdWx0OiBbIDAsICIiLCAiIiBdCgl9OwoKd3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uOwp3cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkOwp3cmFwTWFwLnRoID0gd3JhcE1hcC50ZDsKCi8vIElFIGNhbid0IHNlcmlhbGl6ZSA8bGluaz4gYW5kIDxzY3JpcHQ+IHRhZ3Mgbm9ybWFsbHkKaWYgKCAhalF1ZXJ5LnN1cHBvcnQuaHRtbFNlcmlhbGl6ZSApIHsKCXdyYXBNYXAuX2RlZmF1bHQgPSBbIDEsICJkaXY8ZGl2PiIsICI8L2Rpdj4iIF07Cn0KCmpRdWVyeS5mbi5leHRlbmQoewoJdGV4dDogZnVuY3Rpb24oIHRleHQgKSB7CgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih0ZXh0KSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYudGV4dCggdGV4dC5jYWxsKHRoaXMsIGksIHNlbGYudGV4dCgpKSApOwoJCQl9KTsKCQl9CgoJCWlmICggdHlwZW9mIHRleHQgIT09ICJvYmplY3QiICYmIHRleHQgIT09IHVuZGVmaW5lZCApIHsKCQkJcmV0dXJuIHRoaXMuZW1wdHkoKS5hcHBlbmQoICh0aGlzWzBdICYmIHRoaXNbMF0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUoIHRleHQgKSApOwoJCX0KCgkJcmV0dXJuIGpRdWVyeS50ZXh0KCB0aGlzICk7Cgl9LAoKCXdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcEFsbCggaHRtbC5jYWxsKHRoaXMsIGkpICk7CgkJCX0pOwoJCX0KCgkJaWYgKCB0aGlzWzBdICkgewoJCQkvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZAoJCQl2YXIgd3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1swXS5vd25lckRvY3VtZW50ICkuZXEoMCkuY2xvbmUodHJ1ZSk7CgoJCQlpZiAoIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJCXdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICk7CgkJCX0KCgkJCXdyYXAubWFwKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gPSB0aGlzOwoKCQkJCXdoaWxlICggZWxlbS5maXJzdENoaWxkICYmIGVsZW0uZmlyc3RDaGlsZC5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCQllbGVtID0gZWxlbS5maXJzdENoaWxkOwoJCQkJfQoKCQkJCXJldHVybiBlbGVtOwoJCQl9KS5hcHBlbmQoIHRoaXMgKTsKCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgl3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkgewoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQlqUXVlcnkodGhpcykud3JhcElubmVyKCBodG1sLmNhbGwodGhpcywgaSkgKTsKCQkJfSk7CgkJfQoKCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLAoJCQkJY29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7CgoJCQlpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHsKCQkJCWNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTsKCgkJCX0gZWxzZSB7CgkJCQlzZWxmLmFwcGVuZCggaHRtbCApOwoJCQl9CgkJfSk7Cgl9LAoKCXdyYXA6IGZ1bmN0aW9uKCBodG1sICkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWwgKTsKCQl9KTsKCX0sCgoJdW53cmFwOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoICFqUXVlcnkubm9kZU5hbWUoIHRoaXMsICJib2R5IiApICkgewoJCQkJalF1ZXJ5KCB0aGlzICkucmVwbGFjZVdpdGgoIHRoaXMuY2hpbGROb2RlcyApOwoJCQl9CgkJfSkuZW5kKCk7Cgl9LAoKCWFwcGVuZDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmdW5jdGlvbiggZWxlbSApIHsKCQkJaWYgKCB0aGlzLm5vZGVUeXBlID09PSAxICkgewoJCQkJdGhpcy5hcHBlbmRDaGlsZCggZWxlbSApOwoJCQl9CgkJfSk7Cgl9LAoKCXByZXBlbmQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgdHJ1ZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCWlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCXRoaXMuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLmZpcnN0Q2hpbGQgKTsKCQkJfQoJCX0pOwoJfSwKCgliZWZvcmU6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpc1swXSAmJiB0aGlzWzBdLnBhcmVudE5vZGUgKSB7CgkJCXJldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIGZ1bmN0aW9uKCBlbGVtICkgewoJCQkJdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApOwoJCQl9KTsKCQl9IGVsc2UgaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YXIgc2V0ID0galF1ZXJ5KGFyZ3VtZW50c1swXSk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIHRoaXMudG9BcnJheSgpICk7CgkJCXJldHVybiB0aGlzLnB1c2hTdGFjayggc2V0LCAiYmVmb3JlIiwgYXJndW1lbnRzICk7CgkJfQoJfSwKCglhZnRlcjogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzWzBdICYmIHRoaXNbMF0ucGFyZW50Tm9kZSApIHsKCQkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCBmYWxzZSwgZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7CgkJCX0pOwoJCX0gZWxzZSBpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXZhciBzZXQgPSB0aGlzLnB1c2hTdGFjayggdGhpcywgImFmdGVyIiwgYXJndW1lbnRzICk7CgkJCXNldC5wdXNoLmFwcGx5KCBzZXQsIGpRdWVyeShhcmd1bWVudHNbMF0pLnRvQXJyYXkoKSApOwoJCQlyZXR1cm4gc2V0OwoJCX0KCX0sCgoJLy8ga2VlcERhdGEgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5LS1kbyBub3QgZG9jdW1lbnQKCXJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCBrZWVwRGF0YSApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gdGhpc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoICFzZWxlY3RvciB8fCBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgWyBlbGVtIF0gKS5sZW5ndGggKSB7CgkJCQlpZiAoICFrZWVwRGF0YSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkgewoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQkJCWpRdWVyeS5jbGVhbkRhdGEoIFsgZWxlbSBdICk7CgkJCQl9CgoJCQkJaWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7CgkJCQkJZWxlbS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7CgkJCQl9CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgllbXB0eTogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IHRoaXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCWlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHsKCQkJCWpRdWVyeS5jbGVhbkRhdGEoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSApOwoJCQl9CgoJCQkvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2RlcwoJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApIHsKCQkJCWVsZW0ucmVtb3ZlQ2hpbGQoIGVsZW0uZmlyc3RDaGlsZCApOwoJCQl9CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJY2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQlkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzOwoJCWRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50czsKCgkJcmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbiAoKSB7CgkJCXJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7CgkJfSk7Cgl9LAoKCWh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzWzBdICYmIHRoaXNbMF0ubm9kZVR5cGUgPT09IDEgPwoJCQkJdGhpc1swXS5pbm5lckhUTUwucmVwbGFjZShyaW5saW5lalF1ZXJ5LCAiIikgOgoJCQkJbnVsbDsKCgkJLy8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTAoJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgIXJub2NhY2hlLnRlc3QoIHZhbHVlICkgJiYKCQkJKGpRdWVyeS5zdXBwb3J0LmxlYWRpbmdXaGl0ZXNwYWNlIHx8ICFybGVhZGluZ1doaXRlc3BhY2UudGVzdCggdmFsdWUgKSkgJiYKCQkJIXdyYXBNYXBbIChydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpIF0gKSB7CgoJCQl2YWx1ZSA9IHZhbHVlLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQl0cnkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7CgkJCQkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCgkJCQkJaWYgKCB0aGlzW2ldLm5vZGVUeXBlID09PSAxICkgewoJCQkJCQlqUXVlcnkuY2xlYW5EYXRhKCB0aGlzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikgKTsKCQkJCQkJdGhpc1tpXS5pbm5lckhUTUwgPSB2YWx1ZTsKCQkJCQl9CgkJCQl9CgoJCQkvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2QKCQkJfSBjYXRjaChlKSB7CgkJCQl0aGlzLmVtcHR5KCkuYXBwZW5kKCB2YWx1ZSApOwoJCQl9CgoJCX0gZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQl0aGlzLmVhY2goZnVuY3Rpb24oaSl7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoKCQkJCXNlbGYuaHRtbCggdmFsdWUuY2FsbCh0aGlzLCBpLCBzZWxmLmh0bWwoKSkgKTsKCQkJfSk7CgoJCX0gZWxzZSB7CgkJCXRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJcmVwbGFjZVdpdGg6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlpZiAoIHRoaXNbMF0gJiYgdGhpc1swXS5wYXJlbnROb2RlICkgewoJCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZWxlbWVudHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgRE9NIGJlZm9yZSB0aGV5IGFyZSBpbnNlcnRlZAoJCQkvLyB0aGlzIGNhbiBoZWxwIGZpeCByZXBsYWNpbmcgYSBwYXJlbnQgd2l0aCBjaGlsZCBlbGVtZW50cwoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKSB7CgkJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyksIG9sZCA9IHNlbGYuaHRtbCgpOwoJCQkJCXNlbGYucmVwbGFjZVdpdGgoIHZhbHVlLmNhbGwoIHRoaXMsIGksIG9sZCApICk7CgkJCQl9KTsKCQkJfQoKCQkJaWYgKCB0eXBlb2YgdmFsdWUgIT09ICJzdHJpbmciICkgewoJCQkJdmFsdWUgPSBqUXVlcnkoIHZhbHVlICkuZGV0YWNoKCk7CgkJCX0KCgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbmV4dCA9IHRoaXMubmV4dFNpYmxpbmcsCgkJCQkJcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwoKCQkJCWpRdWVyeSggdGhpcyApLnJlbW92ZSgpOwoKCQkJCWlmICggbmV4dCApIHsKCQkJCQlqUXVlcnkobmV4dCkuYmVmb3JlKCB2YWx1ZSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkocGFyZW50KS5hcHBlbmQoIHZhbHVlICk7CgkJCQl9CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLmxlbmd0aCA/CgkJCQl0aGlzLnB1c2hTdGFjayggalF1ZXJ5KGpRdWVyeS5pc0Z1bmN0aW9uKHZhbHVlKSA/IHZhbHVlKCkgOiB2YWx1ZSksICJyZXBsYWNlV2l0aCIsIHZhbHVlICkgOgoJCQkJdGhpczsKCQl9Cgl9LAoKCWRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLnJlbW92ZSggc2VsZWN0b3IsIHRydWUgKTsKCX0sCgoJZG9tTWFuaXA6IGZ1bmN0aW9uKCBhcmdzLCB0YWJsZSwgY2FsbGJhY2sgKSB7CgkJdmFyIHJlc3VsdHMsIGZpcnN0LCBmcmFnbWVudCwgcGFyZW50LAoJCQl2YWx1ZSA9IGFyZ3NbMF0sCgkJCXNjcmlwdHMgPSBbXTsKCgkJLy8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0CgkJaWYgKCAhalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSAmJiBhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiB2YWx1ZSA9PT0gInN0cmluZyIgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCWpRdWVyeSh0aGlzKS5kb21NYW5pcCggYXJncywgdGFibGUsIGNhbGxiYWNrLCB0cnVlICk7CgkJCX0pOwoJCX0KCgkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbih2YWx1ZSkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oaSkgewoJCQkJdmFyIHNlbGYgPSBqUXVlcnkodGhpcyk7CgkJCQlhcmdzWzBdID0gdmFsdWUuY2FsbCh0aGlzLCBpLCB0YWJsZSA/IHNlbGYuaHRtbCgpIDogdW5kZWZpbmVkKTsKCQkJCXNlbGYuZG9tTWFuaXAoIGFyZ3MsIHRhYmxlLCBjYWxsYmFjayApOwoJCQl9KTsKCQl9CgoJCWlmICggdGhpc1swXSApIHsKCQkJcGFyZW50ID0gdmFsdWUgJiYgdmFsdWUucGFyZW50Tm9kZTsKCgkJCS8vIElmIHdlJ3JlIGluIGEgZnJhZ21lbnQsIGp1c3QgdXNlIHRoYXQgaW5zdGVhZCBvZiBidWlsZGluZyBhIG5ldyBvbmUKCQkJaWYgKCBqUXVlcnkuc3VwcG9ydC5wYXJlbnROb2RlICYmIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT09IDExICYmIHBhcmVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gdGhpcy5sZW5ndGggKSB7CgkJCQlyZXN1bHRzID0geyBmcmFnbWVudDogcGFyZW50IH07CgoJCQl9IGVsc2UgewoJCQkJcmVzdWx0cyA9IGpRdWVyeS5idWlsZEZyYWdtZW50KCBhcmdzLCB0aGlzLCBzY3JpcHRzICk7CgkJCX0KCgkJCWZyYWdtZW50ID0gcmVzdWx0cy5mcmFnbWVudDsKCgkJCWlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7CgkJCQlmaXJzdCA9IGZyYWdtZW50ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfSBlbHNlIHsKCQkJCWZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDsKCQkJfQoKCQkJaWYgKCBmaXJzdCApIHsKCQkJCXRhYmxlID0gdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBmaXJzdCwgInRyIiApOwoKCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubGVuZ3RoLCBsYXN0SW5kZXggPSBsIC0gMTsgaSA8IGw7IGkrKyApIHsKCQkJCQljYWxsYmFjay5jYWxsKAoJCQkJCQl0YWJsZSA/CgkJCQkJCQlyb290KHRoaXNbaV0sIGZpcnN0KSA6CgkJCQkJCQl0aGlzW2ldLAoJCQkJCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3QgbGVhayBtZW1vcnkgYnkgaW5hZHZlcnRlbnRseSBkaXNjYXJkaW5nCgkJCQkJCS8vIHRoZSBvcmlnaW5hbCBmcmFnbWVudCAod2hpY2ggbWlnaHQgaGF2ZSBhdHRhY2hlZCBkYXRhKSBpbnN0ZWFkIG9mCgkJCQkJCS8vIHVzaW5nIGl0OyBpbiBhZGRpdGlvbiwgdXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBvYmplY3QgZm9yIHRoZSBsYXN0CgkJCQkJCS8vIGl0ZW0gaW5zdGVhZCBvZiBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXAgYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseQoJCQkJCQkvLyBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKEJ1ZyAjODA3MCkuCgkJCQkJCS8vIEZyYWdtZW50cyBmcm9tIHRoZSBmcmFnbWVudCBjYWNoZSBtdXN0IGFsd2F5cyBiZSBjbG9uZWQgYW5kIG5ldmVyIHVzZWQKCQkJCQkJLy8gaW4gcGxhY2UuCgkJCQkJCXJlc3VsdHMuY2FjaGVhYmxlIHx8IChsID4gMSAmJiBpIDwgbGFzdEluZGV4KSA/CgkJCQkJCQlqUXVlcnkuY2xvbmUoIGZyYWdtZW50LCB0cnVlLCB0cnVlICkgOgoJCQkJCQkJZnJhZ21lbnQKCQkJCQkpOwoJCQkJfQoJCQl9CgoJCQlpZiAoIHNjcmlwdHMubGVuZ3RoICkgewoJCQkJalF1ZXJ5LmVhY2goIHNjcmlwdHMsIGV2YWxTY3JpcHQgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cn0pOwoKZnVuY3Rpb24gcm9vdCggZWxlbSwgY3VyICkgewoJcmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCAidGFibGUiKSA/CgkJKGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInRib2R5IilbMF0gfHwKCQllbGVtLmFwcGVuZENoaWxkKGVsZW0ub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpKSkgOgoJCWVsZW07Cn0KCmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7CgoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxIHx8ICFqUXVlcnkuaGFzRGF0YSggc3JjICkgKSB7CgkJcmV0dXJuOwoJfQoKCXZhciBpbnRlcm5hbEtleSA9IGpRdWVyeS5leHBhbmRvLAoJCW9sZERhdGEgPSBqUXVlcnkuZGF0YSggc3JjICksCgkJY3VyRGF0YSA9IGpRdWVyeS5kYXRhKCBkZXN0LCBvbGREYXRhICk7CgoJLy8gU3dpdGNoIHRvIHVzZSB0aGUgaW50ZXJuYWwgZGF0YSBvYmplY3QsIGlmIGl0IGV4aXN0cywgZm9yIHRoZSBuZXh0CgkvLyBzdGFnZSBvZiBkYXRhIGNvcHlpbmcKCWlmICggKG9sZERhdGEgPSBvbGREYXRhWyBpbnRlcm5hbEtleSBdKSApIHsKCQl2YXIgZXZlbnRzID0gb2xkRGF0YS5ldmVudHM7CgkJCQljdXJEYXRhID0gY3VyRGF0YVsgaW50ZXJuYWxLZXkgXSA9IGpRdWVyeS5leHRlbmQoe30sIG9sZERhdGEpOwoKCQlpZiAoIGV2ZW50cyApIHsKCQkJZGVsZXRlIGN1ckRhdGEuaGFuZGxlOwoJCQljdXJEYXRhLmV2ZW50cyA9IHt9OwoKCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkgewoJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkgewoJCQkJCWpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUgKyAoIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlID8gIi4iIDogIiIgKSArIGV2ZW50c1sgdHlwZSBdWyBpIF0ubmFtZXNwYWNlLCBldmVudHNbIHR5cGUgXVsgaSBdLCBldmVudHNbIHR5cGUgXVsgaSBdLmRhdGEgKTsKCQkJCX0KCQkJfQoJCX0KCX0KfQoKZnVuY3Rpb24gY2xvbmVGaXhBdHRyaWJ1dGVzKCBzcmMsIGRlc3QgKSB7Cgl2YXIgbm9kZU5hbWU7CgoJLy8gV2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcgZm9yIG5vbi1FbGVtZW50cwoJaWYgKCBkZXN0Lm5vZGVUeXBlICE9PSAxICkgewoJCXJldHVybjsKCX0KCgkvLyBjbGVhckF0dHJpYnV0ZXMgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcywgd2hpY2ggd2UgZG9uJ3Qgd2FudCwKCS8vIGJ1dCBhbHNvIHJlbW92ZXMgdGhlIGF0dGFjaEV2ZW50IGV2ZW50cywgd2hpY2ggd2UgKmRvKiB3YW50CglpZiAoIGRlc3QuY2xlYXJBdHRyaWJ1dGVzICkgewoJCWRlc3QuY2xlYXJBdHRyaWJ1dGVzKCk7Cgl9CgoJLy8gbWVyZ2VBdHRyaWJ1dGVzLCBpbiBjb250cmFzdCwgb25seSBtZXJnZXMgYmFjayBvbiB0aGUKCS8vIG9yaWdpbmFsIGF0dHJpYnV0ZXMsIG5vdCB0aGUgZXZlbnRzCglpZiAoIGRlc3QubWVyZ2VBdHRyaWJ1dGVzICkgewoJCWRlc3QubWVyZ2VBdHRyaWJ1dGVzKCBzcmMgKTsKCX0KCglub2RlTmFtZSA9IGRlc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCgkvLyBJRTYtOCBmYWlsIHRvIGNsb25lIGNoaWxkcmVuIGluc2lkZSBvYmplY3QgZWxlbWVudHMgdGhhdCB1c2UKCS8vIHRoZSBwcm9wcmlldGFyeSBjbGFzc2lkIGF0dHJpYnV0ZSB2YWx1ZSAocmF0aGVyIHRoYW4gdGhlIHR5cGUKCS8vIGF0dHJpYnV0ZSkgdG8gaWRlbnRpZnkgdGhlIHR5cGUgb2YgY29udGVudCB0byBkaXNwbGF5CglpZiAoIG5vZGVOYW1lID09PSAib2JqZWN0IiApIHsKCQlkZXN0Lm91dGVySFRNTCA9IHNyYy5vdXRlckhUTUw7CgoJfSBlbHNlIGlmICggbm9kZU5hbWUgPT09ICJpbnB1dCIgJiYgKHNyYy50eXBlID09PSAiY2hlY2tib3giIHx8IHNyYy50eXBlID09PSAicmFkaW8iKSApIHsKCQkvLyBJRTYtOCBmYWlscyB0byBwZXJzaXN0IHRoZSBjaGVja2VkIHN0YXRlIG9mIGEgY2xvbmVkIGNoZWNrYm94CgkJLy8gb3IgcmFkaW8gYnV0dG9uLiBXb3JzZSwgSUU2LTcgZmFpbCB0byBnaXZlIHRoZSBjbG9uZWQgZWxlbWVudAoJCS8vIGEgY2hlY2tlZCBhcHBlYXJhbmNlIGlmIHRoZSBkZWZhdWx0Q2hlY2tlZCB2YWx1ZSBpc24ndCBhbHNvIHNldAoJCWlmICggc3JjLmNoZWNrZWQgKSB7CgkJCWRlc3QuZGVmYXVsdENoZWNrZWQgPSBkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDsKCQl9CgoJCS8vIElFNi03IGdldCBjb25mdXNlZCBhbmQgZW5kIHVwIHNldHRpbmcgdGhlIHZhbHVlIG9mIGEgY2xvbmVkCgkJLy8gY2hlY2tib3gvcmFkaW8gYnV0dG9uIHRvIGFuIGVtcHR5IHN0cmluZyBpbnN0ZWFkIG9mICJvbiIKCQlpZiAoIGRlc3QudmFsdWUgIT09IHNyYy52YWx1ZSApIHsKCQkJZGVzdC52YWx1ZSA9IHNyYy52YWx1ZTsKCQl9CgoJLy8gSUU2LTggZmFpbHMgdG8gcmV0dXJuIHRoZSBzZWxlY3RlZCBvcHRpb24gdG8gdGhlIGRlZmF1bHQgc2VsZWN0ZWQKCS8vIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zCgl9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gIm9wdGlvbiIgKSB7CgkJZGVzdC5zZWxlY3RlZCA9IHNyYy5kZWZhdWx0U2VsZWN0ZWQ7CgoJLy8gSUU2LTggZmFpbHMgdG8gc2V0IHRoZSBkZWZhdWx0VmFsdWUgdG8gdGhlIGNvcnJlY3QgdmFsdWUgd2hlbgoJLy8gY2xvbmluZyBvdGhlciB0eXBlcyBvZiBpbnB1dCBmaWVsZHMKCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW5wdXQiIHx8IG5vZGVOYW1lID09PSAidGV4dGFyZWEiICkgewoJCWRlc3QuZGVmYXVsdFZhbHVlID0gc3JjLmRlZmF1bHRWYWx1ZTsKCX0KCgkvLyBFdmVudCBkYXRhIGdldHMgcmVmZXJlbmNlZCBpbnN0ZWFkIG9mIGNvcGllZCBpZiB0aGUgZXhwYW5kbwoJLy8gZ2V0cyBjb3BpZWQgdG9vCglkZXN0LnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKfQoKalF1ZXJ5LmJ1aWxkRnJhZ21lbnQgPSBmdW5jdGlvbiggYXJncywgbm9kZXMsIHNjcmlwdHMgKSB7Cgl2YXIgZnJhZ21lbnQsIGNhY2hlYWJsZSwgY2FjaGVyZXN1bHRzLCBkb2M7CgogIC8vIG5vZGVzIG1heSBjb250YWluIGVpdGhlciBhbiBleHBsaWNpdCBkb2N1bWVudCBvYmplY3QsCiAgLy8gYSBqUXVlcnkgY29sbGVjdGlvbiBvciBjb250ZXh0IG9iamVjdC4KICAvLyBJZiBub2Rlc1swXSBjb250YWlucyBhIHZhbGlkIG9iamVjdCB0byBhc3NpZ24gdG8gZG9jCiAgaWYgKCBub2RlcyAmJiBub2Rlc1swXSApIHsKICAgIGRvYyA9IG5vZGVzWzBdLm93bmVyRG9jdW1lbnQgfHwgbm9kZXNbMF07CiAgfQoKICAvLyBFbnN1cmUgdGhhdCBhbiBhdHRyIG9iamVjdCBkb2Vzbid0IGluY29ycmVjdGx5IHN0YW5kIGluIGFzIGEgZG9jdW1lbnQgb2JqZWN0CgkvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc2VlbSB0byBhbGxvdyB0aGlzIHRvIG9jY3VyIGFuZCB3aWxsIHRocm93IGV4Y2VwdGlvbgoJLy8gRml4ZXMgIzg5NTAKCWlmICggIWRvYy5jcmVhdGVEb2N1bWVudEZyYWdtZW50ICkgewoJCWRvYyA9IGRvY3VtZW50OwoJfQoKCS8vIE9ubHkgY2FjaGUgInNtYWxsIiAoMS8yIEtCKSBIVE1MIHN0cmluZ3MgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIGRvY3VtZW50CgkvLyBDbG9uaW5nIG9wdGlvbnMgbG9zZXMgdGhlIHNlbGVjdGVkIHN0YXRlLCBzbyBkb24ndCBjYWNoZSB0aGVtCgkvLyBJRSA2IGRvZXNuJ3QgbGlrZSBpdCB3aGVuIHlvdSBwdXQgPG9iamVjdD4gb3IgPGVtYmVkPiBlbGVtZW50cyBpbiBhIGZyYWdtZW50CgkvLyBBbHNvLCBXZWJLaXQgZG9lcyBub3QgY2xvbmUgJ2NoZWNrZWQnIGF0dHJpYnV0ZXMgb24gY2xvbmVOb2RlLCBzbyBkb24ndCBjYWNoZQoJaWYgKCBhcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgYXJnc1swXSA9PT0gInN0cmluZyIgJiYgYXJnc1swXS5sZW5ndGggPCA1MTIgJiYgZG9jID09PSBkb2N1bWVudCAmJgoJCWFyZ3NbMF0uY2hhckF0KDApID09PSAiPCIgJiYgIXJub2NhY2hlLnRlc3QoIGFyZ3NbMF0gKSAmJiAoalF1ZXJ5LnN1cHBvcnQuY2hlY2tDbG9uZSB8fCAhcmNoZWNrZWQudGVzdCggYXJnc1swXSApKSApIHsKCgkJY2FjaGVhYmxlID0gdHJ1ZTsKCgkJY2FjaGVyZXN1bHRzID0galF1ZXJ5LmZyYWdtZW50c1sgYXJnc1swXSBdOwoJCWlmICggY2FjaGVyZXN1bHRzICYmIGNhY2hlcmVzdWx0cyAhPT0gMSApIHsKCQkJZnJhZ21lbnQgPSBjYWNoZXJlc3VsdHM7CgkJfQoJfQoKCWlmICggIWZyYWdtZW50ICkgewoJCWZyYWdtZW50ID0gZG9jLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKCQlqUXVlcnkuY2xlYW4oIGFyZ3MsIGRvYywgZnJhZ21lbnQsIHNjcmlwdHMgKTsKCX0KCglpZiAoIGNhY2hlYWJsZSApIHsKCQlqUXVlcnkuZnJhZ21lbnRzWyBhcmdzWzBdIF0gPSBjYWNoZXJlc3VsdHMgPyBmcmFnbWVudCA6IDE7Cgl9CgoJcmV0dXJuIHsgZnJhZ21lbnQ6IGZyYWdtZW50LCBjYWNoZWFibGU6IGNhY2hlYWJsZSB9Owp9OwoKalF1ZXJ5LmZyYWdtZW50cyA9IHt9OwoKalF1ZXJ5LmVhY2goewoJYXBwZW5kVG86ICJhcHBlbmQiLAoJcHJlcGVuZFRvOiAicHJlcGVuZCIsCglpbnNlcnRCZWZvcmU6ICJiZWZvcmUiLAoJaW5zZXJ0QWZ0ZXI6ICJhZnRlciIsCglyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXZhciByZXQgPSBbXSwKCQkJaW5zZXJ0ID0galF1ZXJ5KCBzZWxlY3RvciApLAoJCQlwYXJlbnQgPSB0aGlzLmxlbmd0aCA9PT0gMSAmJiB0aGlzWzBdLnBhcmVudE5vZGU7CgoJCWlmICggcGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gMTEgJiYgcGFyZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICYmIGluc2VydC5sZW5ndGggPT09IDEgKSB7CgkJCWluc2VydFsgb3JpZ2luYWwgXSggdGhpc1swXSApOwoJCQlyZXR1cm4gdGhpczsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5zZXJ0Lmxlbmd0aDsgaSA8IGw7IGkrKyApIHsKCQkJCXZhciBlbGVtcyA9IChpID4gMCA/IHRoaXMuY2xvbmUodHJ1ZSkgOiB0aGlzKS5nZXQoKTsKCQkJCWpRdWVyeSggaW5zZXJ0W2ldIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7CgkJCQlyZXQgPSByZXQuY29uY2F0KCBlbGVtcyApOwoJCQl9CgoJCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCwgbmFtZSwgaW5zZXJ0LnNlbGVjdG9yICk7CgkJfQoJfTsKfSk7CgpmdW5jdGlvbiBnZXRBbGwoIGVsZW0gKSB7CglpZiAoICJnZXRFbGVtZW50c0J5VGFnTmFtZSIgaW4gZWxlbSApIHsKCQlyZXR1cm4gZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggIioiICk7CgoJfSBlbHNlIGlmICggInF1ZXJ5U2VsZWN0b3JBbGwiIGluIGVsZW0gKSB7CgkJcmV0dXJuIGVsZW0ucXVlcnlTZWxlY3RvckFsbCggIioiICk7CgoJfSBlbHNlIHsKCQlyZXR1cm4gW107Cgl9Cn0KCi8vIFVzZWQgaW4gY2xlYW4sIGZpeGVzIHRoZSBkZWZhdWx0Q2hlY2tlZCBwcm9wZXJ0eQpmdW5jdGlvbiBmaXhEZWZhdWx0Q2hlY2tlZCggZWxlbSApIHsKCWlmICggZWxlbS50eXBlID09PSAiY2hlY2tib3giIHx8IGVsZW0udHlwZSA9PT0gInJhZGlvIiApIHsKCQllbGVtLmRlZmF1bHRDaGVja2VkID0gZWxlbS5jaGVja2VkOwoJfQp9Ci8vIEZpbmRzIGFsbCBpbnB1dHMgYW5kIHBhc3NlcyB0aGVtIHRvIGZpeERlZmF1bHRDaGVja2VkCmZ1bmN0aW9uIGZpbmRJbnB1dHMoIGVsZW0gKSB7CglpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImlucHV0IiApICkgewoJCWZpeERlZmF1bHRDaGVja2VkKCBlbGVtICk7Cgl9IGVsc2UgaWYgKCAiZ2V0RWxlbWVudHNCeVRhZ05hbWUiIGluIGVsZW0gKSB7CgkJalF1ZXJ5LmdyZXAoIGVsZW0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoImlucHV0IiksIGZpeERlZmF1bHRDaGVja2VkICk7Cgl9Cn0KCmpRdWVyeS5leHRlbmQoewoJY2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHsKCQl2YXIgY2xvbmUgPSBlbGVtLmNsb25lTm9kZSh0cnVlKSwKCQkJCXNyY0VsZW1lbnRzLAoJCQkJZGVzdEVsZW1lbnRzLAoJCQkJaTsKCgkJaWYgKCAoIWpRdWVyeS5zdXBwb3J0Lm5vQ2xvbmVFdmVudCB8fCAhalF1ZXJ5LnN1cHBvcnQubm9DbG9uZUNoZWNrZWQpICYmCgkJCQkoZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSkgJiYgIWpRdWVyeS5pc1hNTERvYyhlbGVtKSApIHsKCQkJLy8gSUUgY29waWVzIGV2ZW50cyBib3VuZCB2aWEgYXR0YWNoRXZlbnQgd2hlbiB1c2luZyBjbG9uZU5vZGUuCgkJCS8vIENhbGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlIGNsb25lIHdpbGwgYWxzbyByZW1vdmUgdGhlIGV2ZW50cwoJCQkvLyBmcm9tIHRoZSBvcmlnaW5hbC4gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSB1c2Ugc29tZQoJCQkvLyBwcm9wcmlldGFyeSBtZXRob2RzIHRvIGNsZWFyIHRoZSBldmVudHMuIFRoYW5rcyB0byBNb29Ub29scwoJCQkvLyBndXlzIGZvciB0aGlzIGhvdG5lc3MuCgoJCQljbG9uZUZpeEF0dHJpYnV0ZXMoIGVsZW0sIGNsb25lICk7CgoJCQkvLyBVc2luZyBTaXp6bGUgaGVyZSBpcyBjcmF6eSBzbG93LCBzbyB3ZSB1c2UgZ2V0RWxlbWVudHNCeVRhZ05hbWUKCQkJLy8gaW5zdGVhZAoJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQlkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7CgoJCQkvLyBXZWlyZCBpdGVyYXRpb24gYmVjYXVzZSBJRSB3aWxsIHJlcGxhY2UgdGhlIGxlbmd0aCBwcm9wZXJ0eQoJCQkvLyB3aXRoIGFuIGVsZW1lbnQgaWYgeW91IGFyZSBjbG9uaW5nIHRoZSBib2R5IGFuZCBvbmUgb2YgdGhlCgkJCS8vIGVsZW1lbnRzIG9uIHRoZSBwYWdlIGhhcyBhIG5hbWUgb3IgaWQgb2YgImxlbmd0aCIKCQkJZm9yICggaSA9IDA7IHNyY0VsZW1lbnRzW2ldOyArK2kgKSB7CgkJCQkvLyBFbnN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gbm9kZSBpcyBub3QgbnVsbDsgRml4ZXMgIzk1ODcKCQkJCWlmICggZGVzdEVsZW1lbnRzW2ldICkgewoJCQkJCWNsb25lRml4QXR0cmlidXRlcyggc3JjRWxlbWVudHNbaV0sIGRlc3RFbGVtZW50c1tpXSApOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lCgkJaWYgKCBkYXRhQW5kRXZlbnRzICkgewoJCQljbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTsKCgkJCWlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7CgkJCQlzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApOwoJCQkJZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApOwoKCQkJCWZvciAoIGkgPSAwOyBzcmNFbGVtZW50c1tpXTsgKytpICkgewoJCQkJCWNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1tpXSwgZGVzdEVsZW1lbnRzW2ldICk7CgkJCQl9CgkJCX0KCQl9CgoJCXNyY0VsZW1lbnRzID0gZGVzdEVsZW1lbnRzID0gbnVsbDsKCgkJLy8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0CgkJcmV0dXJuIGNsb25lOwoJfSwKCgljbGVhbjogZnVuY3Rpb24oIGVsZW1zLCBjb250ZXh0LCBmcmFnbWVudCwgc2NyaXB0cyApIHsKCQl2YXIgY2hlY2tTY3JpcHRUeXBlOwoKCQljb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKCgkJLy8gIWNvbnRleHQuY3JlYXRlRWxlbWVudCBmYWlscyBpbiBJRSB3aXRoIGFuIGVycm9yIGJ1dCByZXR1cm5zIHR5cGVvZiAnb2JqZWN0JwoJCWlmICggdHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudCA9PT0gInVuZGVmaW5lZCIgKSB7CgkJCWNvbnRleHQgPSBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dFswXSAmJiBjb250ZXh0WzBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7CgkJfQoKCQl2YXIgcmV0ID0gW10sIGo7CgoJCWZvciAoIHZhciBpID0gMCwgZWxlbTsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAibnVtYmVyIiApIHsKCQkJCWVsZW0gKz0gIiI7CgkJCX0KCgkJCWlmICggIWVsZW0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gQ29udmVydCBodG1sIHN0cmluZyBpbnRvIERPTSBub2RlcwoJCQlpZiAoIHR5cGVvZiBlbGVtID09PSAic3RyaW5nIiApIHsKCQkJCWlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHsKCQkJCQllbGVtID0gY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycwoJCQkJCWVsZW0gPSBlbGVtLnJlcGxhY2UocnhodG1sVGFnLCAiPCQxPjwvJDI+Iik7CgoJCQkJCS8vIFRyaW0gd2hpdGVzcGFjZSwgb3RoZXJ3aXNlIGluZGV4T2Ygd29uJ3Qgd29yayBhcyBleHBlY3RlZAoJCQkJCXZhciB0YWcgPSAocnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsiIiwgIiJdKVsxXS50b0xvd2VyQ2FzZSgpLAoJCQkJCQl3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdCwKCQkJCQkJZGVwdGggPSB3cmFwWzBdLAoJCQkJCQlkaXYgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwoKCQkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVuIHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCgkJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBlbGVtICsgd3JhcFsyXTsKCgkJCQkJLy8gTW92ZSB0byB0aGUgcmlnaHQgZGVwdGgKCQkJCQl3aGlsZSAoIGRlcHRoLS0gKSB7CgkJCQkJCWRpdiA9IGRpdi5sYXN0Q2hpbGQ7CgkJCQkJfQoKCQkJCQkvLyBSZW1vdmUgSUUncyBhdXRvaW5zZXJ0ZWQgPHRib2R5PiBmcm9tIHRhYmxlIGZyYWdtZW50cwoJCQkJCWlmICggIWpRdWVyeS5zdXBwb3J0LnRib2R5ICkgewoKCQkJCQkJLy8gU3RyaW5nIHdhcyBhIDx0YWJsZT4sICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PgoJCQkJCQl2YXIgaGFzQm9keSA9IHJ0Ym9keS50ZXN0KGVsZW0pLAoJCQkJCQkJdGJvZHkgPSB0YWcgPT09ICJ0YWJsZSIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCWRpdi5maXJzdENoaWxkICYmIGRpdi5maXJzdENoaWxkLmNoaWxkTm9kZXMgOgoKCQkJCQkJCQkvLyBTdHJpbmcgd2FzIGEgYmFyZSA8dGhlYWQ+IG9yIDx0Zm9vdD4KCQkJCQkJCQl3cmFwWzFdID09PSAiPHRhYmxlPiIgJiYgIWhhc0JvZHkgPwoJCQkJCQkJCQlkaXYuY2hpbGROb2RlcyA6CgkJCQkJCQkJCVtdOwoKCQkJCQkJZm9yICggaiA9IHRib2R5Lmxlbmd0aCAtIDE7IGogPj0gMCA7IC0taiApIHsKCQkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBdLCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKSB7CgkJCQkJCQkJdGJvZHlbIGogXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0Ym9keVsgaiBdICk7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlzIHVzZWQKCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5sZWFkaW5nV2hpdGVzcGFjZSAmJiBybGVhZGluZ1doaXRlc3BhY2UudGVzdCggZWxlbSApICkgewoJCQkJCQlkaXYuaW5zZXJ0QmVmb3JlKCBjb250ZXh0LmNyZWF0ZVRleHROb2RlKCBybGVhZGluZ1doaXRlc3BhY2UuZXhlYyhlbGVtKVswXSApLCBkaXYuZmlyc3RDaGlsZCApOwoJCQkJCX0KCgkJCQkJZWxlbSA9IGRpdi5jaGlsZE5vZGVzOwoJCQkJfQoJCQl9CgoJCQkvLyBSZXNldHMgZGVmYXVsdENoZWNrZWQgZm9yIGFueSByYWRpb3MgYW5kIGNoZWNrYm94ZXMKCQkJLy8gYWJvdXQgdG8gYmUgYXBwZW5kZWQgdG8gdGhlIERPTSBpbiBJRSA2LzcgKCM4MDYwKQoJCQl2YXIgbGVuOwoJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5hcHBlbmRDaGVja2VkICkgewoJCQkJaWYgKCBlbGVtWzBdICYmIHR5cGVvZiAobGVuID0gZWxlbS5sZW5ndGgpID09PSAibnVtYmVyIiApIHsKCQkJCQlmb3IgKCBqID0gMDsgaiA8IGxlbjsgaisrICkgewoJCQkJCQlmaW5kSW5wdXRzKCBlbGVtW2pdICk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQlmaW5kSW5wdXRzKCBlbGVtICk7CgkJCQl9CgkJCX0KCgkJCWlmICggZWxlbS5ub2RlVHlwZSApIHsKCQkJCXJldC5wdXNoKCBlbGVtICk7CgkJCX0gZWxzZSB7CgkJCQlyZXQgPSBqUXVlcnkubWVyZ2UoIHJldCwgZWxlbSApOwoJCQl9CgkJfQoKCQlpZiAoIGZyYWdtZW50ICkgewoJCQljaGVja1NjcmlwdFR5cGUgPSBmdW5jdGlvbiggZWxlbSApIHsKCQkJCXJldHVybiAhZWxlbS50eXBlIHx8IHJzY3JpcHRUeXBlLnRlc3QoIGVsZW0udHlwZSApOwoJCQl9OwoJCQlmb3IgKCBpID0gMDsgcmV0W2ldOyBpKysgKSB7CgkJCQlpZiAoIHNjcmlwdHMgJiYgalF1ZXJ5Lm5vZGVOYW1lKCByZXRbaV0sICJzY3JpcHQiICkgJiYgKCFyZXRbaV0udHlwZSB8fCByZXRbaV0udHlwZS50b0xvd2VyQ2FzZSgpID09PSAidGV4dC9qYXZhc2NyaXB0IikgKSB7CgkJCQkJc2NyaXB0cy5wdXNoKCByZXRbaV0ucGFyZW50Tm9kZSA/IHJldFtpXS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCByZXRbaV0gKSA6IHJldFtpXSApOwoKCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCByZXRbaV0ubm9kZVR5cGUgPT09IDEgKSB7CgkJCQkJCXZhciBqc1RhZ3MgPSBqUXVlcnkuZ3JlcCggcmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCAic2NyaXB0IiApLCBjaGVja1NjcmlwdFR5cGUgKTsKCgkJCQkJCXJldC5zcGxpY2UuYXBwbHkoIHJldCwgW2kgKyAxLCAwXS5jb25jYXQoIGpzVGFncyApICk7CgkJCQkJfQoJCQkJCWZyYWdtZW50LmFwcGVuZENoaWxkKCByZXRbaV0gKTsKCQkJCX0KCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX0sCgoJY2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGRhdGEsIGlkLCBjYWNoZSA9IGpRdWVyeS5jYWNoZSwgaW50ZXJuYWxLZXkgPSBqUXVlcnkuZXhwYW5kbywgc3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLAoJCQlkZWxldGVFeHBhbmRvID0galF1ZXJ5LnN1cHBvcnQuZGVsZXRlRXhwYW5kbzsKCgkJZm9yICggdmFyIGkgPSAwLCBlbGVtOyAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7CgkJCWlmICggZWxlbS5ub2RlTmFtZSAmJiBqUXVlcnkubm9EYXRhW2VsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0gKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWQgPSBlbGVtWyBqUXVlcnkuZXhwYW5kbyBdOwoKCQkJaWYgKCBpZCApIHsKCQkJCWRhdGEgPSBjYWNoZVsgaWQgXSAmJiBjYWNoZVsgaWQgXVsgaW50ZXJuYWxLZXkgXTsKCgkJCQlpZiAoIGRhdGEgJiYgZGF0YS5ldmVudHMgKSB7CgkJCQkJZm9yICggdmFyIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7CgkJCQkJCWlmICggc3BlY2lhbFsgdHlwZSBdICkgewoJCQkJCQkJalF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApOwoKCQkJCQkJLy8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZAoJCQkJCQl9IGVsc2UgewoJCQkJCQkJalF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBOdWxsIHRoZSBET00gcmVmZXJlbmNlIHRvIGF2b2lkIElFNi83LzggbGVhayAoIzcwNTQpCgkJCQkJaWYgKCBkYXRhLmhhbmRsZSApIHsKCQkJCQkJZGF0YS5oYW5kbGUuZWxlbSA9IG51bGw7CgkJCQkJfQoJCQkJfQoKCQkJCWlmICggZGVsZXRlRXhwYW5kbyApIHsKCQkJCQlkZWxldGUgZWxlbVsgalF1ZXJ5LmV4cGFuZG8gXTsKCgkJCQl9IGVsc2UgaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApIHsKCQkJCQllbGVtLnJlbW92ZUF0dHJpYnV0ZSggalF1ZXJ5LmV4cGFuZG8gKTsKCQkJCX0KCgkJCQlkZWxldGUgY2FjaGVbIGlkIF07CgkJCX0KCQl9Cgl9Cn0pOwoKZnVuY3Rpb24gZXZhbFNjcmlwdCggaSwgZWxlbSApIHsKCWlmICggZWxlbS5zcmMgKSB7CgkJalF1ZXJ5LmFqYXgoewoJCQl1cmw6IGVsZW0uc3JjLAoJCQlhc3luYzogZmFsc2UsCgkJCWRhdGFUeXBlOiAic2NyaXB0IgoJCX0pOwoJfSBlbHNlIHsKCQlqUXVlcnkuZ2xvYmFsRXZhbCggKCBlbGVtLnRleHQgfHwgZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVySFRNTCB8fCAiIiApLnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgIi8qJDAqLyIgKSApOwoJfQoKCWlmICggZWxlbS5wYXJlbnROb2RlICkgewoJCWVsZW0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZWxlbSApOwoJfQp9CgoKCgp2YXIgcmFscGhhID0gL2FscGhhXChbXildKlwpL2ksCglyb3BhY2l0eSA9IC9vcGFjaXR5PShbXildKikvLAoJLy8gZml4ZWQgZm9yIElFOSwgc2VlICM4MzQ2CglydXBwZXIgPSAvKFtBLVpdfF5tcykvZywKCXJudW1weCA9IC9eLT9cZCsoPzpweCk/JC9pLAoJcm51bSA9IC9eLT9cZC8sCglycmVsTnVtID0gL14oW1wtK10pPShbXC0rLlxkZV0rKS8sCgoJY3NzU2hvdyA9IHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIHZpc2liaWxpdHk6ICJoaWRkZW4iLCBkaXNwbGF5OiAiYmxvY2siIH0sCgljc3NXaWR0aCA9IFsgIkxlZnQiLCAiUmlnaHQiIF0sCgljc3NIZWlnaHQgPSBbICJUb3AiLCAiQm90dG9tIiBdLAoJY3VyQ1NTLAoKCWdldENvbXB1dGVkU3R5bGUsCgljdXJyZW50U3R5bGU7CgpqUXVlcnkuZm4uY3NzID0gZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkgewoJLy8gU2V0dGluZyAndW5kZWZpbmVkJyBpcyBhIG5vLW9wCglpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQlyZXR1cm4gdGhpczsKCX0KCglyZXR1cm4galF1ZXJ5LmFjY2VzcyggdGhpcywgbmFtZSwgdmFsdWUsIHRydWUsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHsKCQlyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/CgkJCWpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6CgkJCWpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTsKCX0pOwp9OwoKalF1ZXJ5LmV4dGVuZCh7CgkvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQKCS8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eQoJY3NzSG9va3M6IHsKCQlvcGFjaXR5OiB7CgkJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkJaWYgKCBjb21wdXRlZCApIHsKCQkJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eQoJCQkJCXZhciByZXQgPSBjdXJDU1MoIGVsZW0sICJvcGFjaXR5IiwgIm9wYWNpdHkiICk7CgkJCQkJcmV0dXJuIHJldCA9PT0gIiIgPyAiMSIgOiByZXQ7CgoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gZWxlbS5zdHlsZS5vcGFjaXR5OwoJCQkJfQoJCQl9CgkJfQoJfSwKCgkvLyBFeGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4Cgljc3NOdW1iZXI6IHsKCQkiZmlsbE9wYWNpdHkiOiB0cnVlLAoJCSJmb250V2VpZ2h0IjogdHJ1ZSwKCQkibGluZUhlaWdodCI6IHRydWUsCgkJIm9wYWNpdHkiOiB0cnVlLAoJCSJvcnBoYW5zIjogdHJ1ZSwKCQkid2lkb3dzIjogdHJ1ZSwKCQkiekluZGV4IjogdHJ1ZSwKCQkiem9vbSI6IHRydWUKCX0sCgoJLy8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZQoJLy8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZQoJY3NzUHJvcHM6IHsKCQkvLyBub3JtYWxpemUgZmxvYXQgY3NzIHByb3BlcnR5CgkJImZsb2F0IjogalF1ZXJ5LnN1cHBvcnQuY3NzRmxvYXQgPyAiY3NzRmxvYXQiIDogInN0eWxlRmxvYXQiCgl9LAoKCS8vIEdldCBhbmQgc2V0IHRoZSBzdHlsZSBwcm9wZXJ0eSBvbiBhIERPTSBOb2RlCglzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHsKCQkvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKCQlpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lCgkJdmFyIHJldCwgdHlwZSwgb3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksCgkJCXN0eWxlID0gZWxlbS5zdHlsZSwgaG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07CgoJCW5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHwgb3JpZ05hbWU7CgoJCS8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZQoJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJdHlwZSA9IHR5cGVvZiB2YWx1ZTsKCgkJCS8vIGNvbnZlcnQgcmVsYXRpdmUgbnVtYmVyIHN0cmluZ3MgKCs9IG9yIC09KSB0byByZWxhdGl2ZSBudW1iZXJzLiAjNzM0NQoJCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICYmIChyZXQgPSBycmVsTnVtLmV4ZWMoIHZhbHVlICkpICkgewoJCQkJdmFsdWUgPSAoICsoIHJldFsxXSArIDEpICogK3JldFsyXSApICsgcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApICk7CgkJCQkvLyBGaXhlcyBidWcgIzkyMzcKCQkJCXR5cGUgPSAibnVtYmVyIjsKCQkJfQoKCQkJLy8gTWFrZSBzdXJlIHRoYXQgTmFOIGFuZCBudWxsIHZhbHVlcyBhcmVuJ3Qgc2V0LiBTZWU6ICM3MTE2CgkJCWlmICggdmFsdWUgPT0gbnVsbCB8fCB0eXBlID09PSAibnVtYmVyIiAmJiBpc05hTiggdmFsdWUgKSApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJLy8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkICdweCcgdG8gdGhlIChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpCgkJCWlmICggdHlwZSA9PT0gIm51bWJlciIgJiYgIWpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gKSB7CgkJCQl2YWx1ZSArPSAicHgiOwoJCQl9CgoJCQkvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWUKCQkJaWYgKCAhaG9va3MgfHwgISgic2V0IiBpbiBob29rcykgfHwgKHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSApKSAhPT0gdW5kZWZpbmVkICkgewoJCQkJLy8gV3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIHdoZW4gJ2ludmFsaWQnIHZhbHVlcyBhcmUgcHJvdmlkZWQKCQkJCS8vIEZpeGVzIGJ1ZyAjNTUwOQoJCQkJdHJ5IHsKCQkJCQlzdHlsZVsgbmFtZSBdID0gdmFsdWU7CgkJCQl9IGNhdGNoKGUpIHt9CgkJCX0KCgkJfSBlbHNlIHsKCQkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIG5vbi1jb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlCgkJCWlmICggaG9va3MgJiYgImdldCIgaW4gaG9va3MgJiYgKHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCQlyZXR1cm4gcmV0OwoJCQl9CgoJCQkvLyBPdGhlcndpc2UganVzdCBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIHN0eWxlIG9iamVjdAoJCQlyZXR1cm4gc3R5bGVbIG5hbWUgXTsKCQl9Cgl9LAoKCWNzczogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGV4dHJhICkgewoJCXZhciByZXQsIGhvb2tzOwoKCQkvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUKCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggbmFtZSApOwoJCWhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07CgkJbmFtZSA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdIHx8IG5hbWU7CgoJCS8vIGNzc0Zsb2F0IG5lZWRzIGEgc3BlY2lhbCB0cmVhdG1lbnQKCQlpZiAoIG5hbWUgPT09ICJjc3NGbG9hdCIgKSB7CgkJCW5hbWUgPSAiZmxvYXQiOwoJCX0KCgkJLy8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmUKCQlpZiAoIGhvb2tzICYmICJnZXQiIGluIGhvb2tzICYmIChyZXQgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICkpICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiByZXQ7CgoJCS8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0CgkJfSBlbHNlIGlmICggY3VyQ1NTICkgewoJCQlyZXR1cm4gY3VyQ1NTKCBlbGVtLCBuYW1lICk7CgkJfQoJfSwKCgkvLyBBIG1ldGhvZCBmb3IgcXVpY2tseSBzd2FwcGluZyBpbi9vdXQgQ1NTIHByb3BlcnRpZXMgdG8gZ2V0IGNvcnJlY3QgY2FsY3VsYXRpb25zCglzd2FwOiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CgkJdmFyIG9sZCA9IHt9OwoKCQkvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKCQlmb3IgKCB2YXIgbmFtZSBpbiBvcHRpb25zICkgewoJCQlvbGRbIG5hbWUgXSA9IGVsZW0uc3R5bGVbIG5hbWUgXTsKCQkJZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOwoJCX0KCgkJY2FsbGJhY2suY2FsbCggZWxlbSApOwoKCQkvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXMKCQlmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7CgkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOwoJCX0KCX0KfSk7CgovLyBERVBSRUNBVEVELCBVc2UgalF1ZXJ5LmNzcygpIGluc3RlYWQKalF1ZXJ5LmN1ckNTUyA9IGpRdWVyeS5jc3M7CgpqUXVlcnkuZWFjaChbImhlaWdodCIsICJ3aWR0aCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWpRdWVyeS5jc3NIb29rc1sgbmFtZSBdID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHsKCQkJdmFyIHZhbDsKCgkJCWlmICggY29tcHV0ZWQgKSB7CgkJCQlpZiAoIGVsZW0ub2Zmc2V0V2lkdGggIT09IDAgKSB7CgkJCQkJcmV0dXJuIGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJfSBlbHNlIHsKCQkJCQlqUXVlcnkuc3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7CgkJCQkJCXZhbCA9IGdldFdIKCBlbGVtLCBuYW1lLCBleHRyYSApOwoJCQkJCX0pOwoJCQkJfQoKCQkJCXJldHVybiB2YWw7CgkJCX0KCQl9LAoKCQlzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHsKCQkJaWYgKCBybnVtcHgudGVzdCggdmFsdWUgKSApIHsKCQkJCS8vIGlnbm9yZSBuZWdhdGl2ZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyAjMTU5OQoJCQkJdmFsdWUgPSBwYXJzZUZsb2F0KCB2YWx1ZSApOwoKCQkJCWlmICggdmFsdWUgPj0gMCApIHsKCQkJCQlyZXR1cm4gdmFsdWUgKyAicHgiOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB2YWx1ZTsKCQkJfQoJCX0KCX07Cn0pOwoKaWYgKCAhalF1ZXJ5LnN1cHBvcnQub3BhY2l0eSApIHsKCWpRdWVyeS5jc3NIb29rcy5vcGFjaXR5ID0gewoJCWdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkgewoJCQkvLyBJRSB1c2VzIGZpbHRlcnMgZm9yIG9wYWNpdHkKCQkJcmV0dXJuIHJvcGFjaXR5LnRlc3QoIChjb21wdXRlZCAmJiBlbGVtLmN1cnJlbnRTdHlsZSA/IGVsZW0uY3VycmVudFN0eWxlLmZpbHRlciA6IGVsZW0uc3R5bGUuZmlsdGVyKSB8fCAiIiApID8KCQkJCSggcGFyc2VGbG9hdCggUmVnRXhwLiQxICkgLyAxMDAgKSArICIiIDoKCQkJCWNvbXB1dGVkID8gIjEiIDogIiI7CgkJfSwKCgkJc2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7CgkJCXZhciBzdHlsZSA9IGVsZW0uc3R5bGUsCgkJCQljdXJyZW50U3R5bGUgPSBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJCW9wYWNpdHkgPSBqUXVlcnkuaXNOYU4oIHZhbHVlICkgPyAiIiA6ICJhbHBoYShvcGFjaXR5PSIgKyB2YWx1ZSAqIDEwMCArICIpIiwKCQkJCWZpbHRlciA9IGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUuZmlsdGVyIHx8IHN0eWxlLmZpbHRlciB8fCAiIjsKCgkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAoJCQkvLyBGb3JjZSBpdCBieSBzZXR0aW5nIHRoZSB6b29tIGxldmVsCgkJCXN0eWxlLnpvb20gPSAxOwoKCQkJLy8gaWYgc2V0dGluZyBvcGFjaXR5IHRvIDEsIGFuZCBubyBvdGhlciBmaWx0ZXJzIGV4aXN0IC0gYXR0ZW1wdCB0byByZW1vdmUgZmlsdGVyIGF0dHJpYnV0ZSAjNjY1MgoJCQlpZiAoIHZhbHVlID49IDEgJiYgalF1ZXJ5LnRyaW0oIGZpbHRlci5yZXBsYWNlKCByYWxwaGEsICIiICkgKSA9PT0gIiIgKSB7CgoJCQkJLy8gU2V0dGluZyBzdHlsZS5maWx0ZXIgdG8gbnVsbCwgIiIgJiAiICIgc3RpbGwgbGVhdmUgImZpbHRlcjoiIGluIHRoZSBjc3NUZXh0CgkJCQkvLyBpZiAiZmlsdGVyOiIgaXMgcHJlc2VudCBhdCBhbGwsIGNsZWFyVHlwZSBpcyBkaXNhYmxlZCwgd2Ugd2FudCB0byBhdm9pZCB0aGlzCgkJCQkvLyBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUgaXMgSUUgT25seSwgYnV0IHNvIGFwcGFyZW50bHkgaXMgdGhpcyBjb2RlIHBhdGguLi4KCQkJCXN0eWxlLnJlbW92ZUF0dHJpYnV0ZSggImZpbHRlciIgKTsKCgkJCQkvLyBpZiB0aGVyZSB0aGVyZSBpcyBubyBmaWx0ZXIgc3R5bGUgYXBwbGllZCBpbiBhIGNzcyBydWxlLCB3ZSBhcmUgZG9uZQoJCQkJaWYgKCBjdXJyZW50U3R5bGUgJiYgIWN1cnJlbnRTdHlsZS5maWx0ZXIgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQl9CgoJCQkvLyBvdGhlcndpc2UsIHNldCBuZXcgZmlsdGVyIHZhbHVlcwoJCQlzdHlsZS5maWx0ZXIgPSByYWxwaGEudGVzdCggZmlsdGVyICkgPwoJCQkJZmlsdGVyLnJlcGxhY2UoIHJhbHBoYSwgb3BhY2l0eSApIDoKCQkJCWZpbHRlciArICIgIiArIG9wYWNpdHk7CgkJfQoJfTsKfQoKalF1ZXJ5KGZ1bmN0aW9uKCkgewoJLy8gVGhpcyBob29rIGNhbm5vdCBiZSBhZGRlZCB1bnRpbCBET00gcmVhZHkgYmVjYXVzZSB0aGUgc3VwcG9ydCB0ZXN0CgkvLyBmb3IgaXQgaXMgbm90IHJ1biB1bnRpbCBhZnRlciBET00gcmVhZHkKCWlmICggIWpRdWVyeS5zdXBwb3J0LnJlbGlhYmxlTWFyZ2luUmlnaHQgKSB7CgkJalF1ZXJ5LmNzc0hvb2tzLm1hcmdpblJpZ2h0ID0gewoJCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHsKCQkJCS8vIFdlYktpdCBCdWcgMTMzNDMgLSBnZXRDb21wdXRlZFN0eWxlIHJldHVybnMgd3JvbmcgdmFsdWUgZm9yIG1hcmdpbi1yaWdodAoJCQkJLy8gV29yayBhcm91bmQgYnkgdGVtcG9yYXJpbHkgc2V0dGluZyBlbGVtZW50IGRpc3BsYXkgdG8gaW5saW5lLWJsb2NrCgkJCQl2YXIgcmV0OwoJCQkJalF1ZXJ5LnN3YXAoIGVsZW0sIHsgImRpc3BsYXkiOiAiaW5saW5lLWJsb2NrIiB9LCBmdW5jdGlvbigpIHsKCQkJCQlpZiAoIGNvbXB1dGVkICkgewoJCQkJCQlyZXQgPSBjdXJDU1MoIGVsZW0sICJtYXJnaW4tcmlnaHQiLCAibWFyZ2luUmlnaHQiICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJcmV0ID0gZWxlbS5zdHlsZS5tYXJnaW5SaWdodDsKCQkJCQl9CgkJCQl9KTsKCQkJCXJldHVybiByZXQ7CgkJCX0KCQl9OwoJfQp9KTsKCmlmICggZG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSApIHsKCWdldENvbXB1dGVkU3R5bGUgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKCQl2YXIgcmV0LCBkZWZhdWx0VmlldywgY29tcHV0ZWRTdHlsZTsKCgkJbmFtZSA9IG5hbWUucmVwbGFjZSggcnVwcGVyLCAiLSQxIiApLnRvTG93ZXJDYXNlKCk7CgoJCWlmICggIShkZWZhdWx0VmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgKSB7CgkJCXJldHVybiB1bmRlZmluZWQ7CgkJfQoKCQlpZiAoIChjb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApKSApIHsKCQkJcmV0ID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICk7CgkJCWlmICggcmV0ID09PSAiIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBlbGVtICkgKSB7CgkJCQlyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHJldDsKCX07Cn0KCmlmICggZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmN1cnJlbnRTdHlsZSApIHsKCWN1cnJlbnRTdHlsZSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkgewoJCXZhciBsZWZ0LAoJCQlyZXQgPSBlbGVtLmN1cnJlbnRTdHlsZSAmJiBlbGVtLmN1cnJlbnRTdHlsZVsgbmFtZSBdLAoJCQlyc0xlZnQgPSBlbGVtLnJ1bnRpbWVTdHlsZSAmJiBlbGVtLnJ1bnRpbWVTdHlsZVsgbmFtZSBdLAoJCQlzdHlsZSA9IGVsZW0uc3R5bGU7CgoJCS8vIEZyb20gdGhlIGF3ZXNvbWUgaGFjayBieSBEZWFuIEVkd2FyZHMKCQkvLyBodHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQtMTAyMjkxCgoJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVsIG51bWJlcgoJCS8vIGJ1dCBhIG51bWJlciB0aGF0IGhhcyBhIHdlaXJkIGVuZGluZywgd2UgbmVlZCB0byBjb252ZXJ0IGl0IHRvIHBpeGVscwoJCWlmICggIXJudW1weC50ZXN0KCByZXQgKSAmJiBybnVtLnRlc3QoIHJldCApICkgewoJCQkvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzCgkJCWxlZnQgPSBzdHlsZS5sZWZ0OwoKCQkJLy8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dAoJCQlpZiAoIHJzTGVmdCApIHsKCQkJCWVsZW0ucnVudGltZVN0eWxlLmxlZnQgPSBlbGVtLmN1cnJlbnRTdHlsZS5sZWZ0OwoJCQl9CgkJCXN0eWxlLmxlZnQgPSBuYW1lID09PSAiZm9udFNpemUiID8gIjFlbSIgOiAocmV0IHx8IDApOwoJCQlyZXQgPSBzdHlsZS5waXhlbExlZnQgKyAicHgiOwoKCQkJLy8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlcwoJCQlzdHlsZS5sZWZ0ID0gbGVmdDsKCQkJaWYgKCByc0xlZnQgKSB7CgkJCQllbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0ID0gcnNMZWZ0OwoJCQl9CgkJfQoKCQlyZXR1cm4gcmV0ID09PSAiIiA/ICJhdXRvIiA6IHJldDsKCX07Cn0KCmN1ckNTUyA9IGdldENvbXB1dGVkU3R5bGUgfHwgY3VycmVudFN0eWxlOwoKZnVuY3Rpb24gZ2V0V0goIGVsZW0sIG5hbWUsIGV4dHJhICkgewoKCS8vIFN0YXJ0IHdpdGggb2Zmc2V0IHByb3BlcnR5Cgl2YXIgdmFsID0gbmFtZSA9PT0gIndpZHRoIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCwKCQl3aGljaCA9IG5hbWUgPT09ICJ3aWR0aCIgPyBjc3NXaWR0aCA6IGNzc0hlaWdodDsKCglpZiAoIHZhbCA+IDAgKSB7CgkJaWYgKCBleHRyYSAhPT0gImJvcmRlciIgKSB7CgkJCWpRdWVyeS5lYWNoKCB3aGljaCwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoICFleHRyYSApIHsKCQkJCQl2YWwgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyggZWxlbSwgInBhZGRpbmciICsgdGhpcyApICkgfHwgMDsKCQkJCX0KCQkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIHRoaXMgKSApIHx8IDA7CgkJCQl9IGVsc2UgewoJCQkJCXZhbCAtPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQkJfQoJCQl9KTsKCQl9CgoJCXJldHVybiB2YWwgKyAicHgiOwoJfQoKCS8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeQoJdmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBuYW1lICk7CglpZiAoIHZhbCA8IDAgfHwgdmFsID09IG51bGwgKSB7CgkJdmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdIHx8IDA7Cgl9CgkvLyBOb3JtYWxpemUgIiIsIGF1dG8sIGFuZCBwcmVwYXJlIGZvciBleHRyYQoJdmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDsKCgkvLyBBZGQgcGFkZGluZywgYm9yZGVyLCBtYXJnaW4KCWlmICggZXh0cmEgKSB7CgkJalF1ZXJ5LmVhY2goIHdoaWNoLCBmdW5jdGlvbigpIHsKCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sICJwYWRkaW5nIiArIHRoaXMgKSApIHx8IDA7CgkJCWlmICggZXh0cmEgIT09ICJwYWRkaW5nIiApIHsKCQkJCXZhbCArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKCBlbGVtLCAiYm9yZGVyIiArIHRoaXMgKyAiV2lkdGgiICkgKSB8fCAwOwoJCQl9CgkJCWlmICggZXh0cmEgPT09ICJtYXJnaW4iICkgewoJCQkJdmFsICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIGV4dHJhICsgdGhpcyApICkgfHwgMDsKCQkJfQoJCX0pOwoJfQoKCXJldHVybiB2YWwgKyAicHgiOwp9CgppZiAoIGpRdWVyeS5leHByICYmIGpRdWVyeS5leHByLmZpbHRlcnMgKSB7CglqUXVlcnkuZXhwci5maWx0ZXJzLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXZhciB3aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGgsCgkJCWhlaWdodCA9IGVsZW0ub2Zmc2V0SGVpZ2h0OwoKCQlyZXR1cm4gKHdpZHRoID09PSAwICYmIGhlaWdodCA9PT0gMCkgfHwgKCFqUXVlcnkuc3VwcG9ydC5yZWxpYWJsZUhpZGRlbk9mZnNldHMgJiYgKGVsZW0uc3R5bGUuZGlzcGxheSB8fCBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSkgPT09ICJub25lIik7Cgl9OwoKCWpRdWVyeS5leHByLmZpbHRlcnMudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhalF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4oIGVsZW0gKTsKCX07Cn0KCgoKCnZhciByMjAgPSAvJTIwL2csCglyYnJhY2tldCA9IC9cW1xdJC8sCglyQ1JMRiA9IC9ccj9cbi9nLAoJcmhhc2ggPSAvIy4qJC8sCglyaGVhZGVycyA9IC9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKVxyPyQvbWcsIC8vIElFIGxlYXZlcyBhbiBcciBjaGFyYWN0ZXIgYXQgRU9MCglyaW5wdXQgPSAvXig/OmNvbG9yfGRhdGV8ZGF0ZXRpbWV8ZGF0ZXRpbWUtbG9jYWx8ZW1haWx8aGlkZGVufG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2ksCgkvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb24KCXJsb2NhbFByb3RvY29sID0gL14oPzphYm91dHxhcHB8YXBwXC1zdG9yYWdlfC4rXC1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLywKCXJub0NvbnRlbnQgPSAvXig/OkdFVHxIRUFEKSQvLAoJcnByb3RvY29sID0gL15cL1wvLywKCXJxdWVyeSA9IC9cPy8sCglyc2NyaXB0ID0gLzxzY3JpcHRcYltePF0qKD86KD8hPFwvc2NyaXB0Pik8W148XSopKjxcL3NjcmlwdD4vZ2ksCglyc2VsZWN0VGV4dGFyZWEgPSAvXig/OnNlbGVjdHx0ZXh0YXJlYSkvaSwKCXJzcGFjZXNBamF4ID0gL1xzKy8sCglydHMgPSAvKFs/Jl0pXz1bXiZdKi8sCglydXJsID0gL14oW1x3XCtcLlwtXSs6KSg/OlwvXC8oW15cLz8jOl0qKSg/OjooXGQrKSk/KT8vLAoKCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZCBtZXRob2QKCV9sb2FkID0galF1ZXJ5LmZuLmxvYWQsCgoJLyogUHJlZmlsdGVycwoJICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSkKCSAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6CgkgKiAgICAtIEJFRk9SRSBhc2tpbmcgZm9yIGEgdHJhbnNwb3J0CgkgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpCgkgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiA0KSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byAiKiIgaWYgbmVlZGVkCgkgKi8KCXByZWZpbHRlcnMgPSB7fSwKCgkvKiBUcmFuc3BvcnRzIGJpbmRpbmdzCgkgKiAxKSBrZXkgaXMgdGhlIGRhdGFUeXBlCgkgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZAoJICogMykgc2VsZWN0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gZ28gdG8gIioiIGlmIG5lZWRlZAoJICovCgl0cmFuc3BvcnRzID0ge30sCgoJLy8gRG9jdW1lbnQgbG9jYXRpb24KCWFqYXhMb2NhdGlvbiwKCgkvLyBEb2N1bWVudCBsb2NhdGlvbiBzZWdtZW50cwoJYWpheExvY1BhcnRzLAoJCgkvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb24KCWFsbFR5cGVzID0gWyIqLyJdICsgWyIqIl07CgovLyAjODEzOCwgSUUgbWF5IHRocm93IGFuIGV4Y2VwdGlvbiB3aGVuIGFjY2Vzc2luZwovLyBhIGZpZWxkIGZyb20gd2luZG93LmxvY2F0aW9uIGlmIGRvY3VtZW50LmRvbWFpbiBoYXMgYmVlbiBzZXQKdHJ5IHsKCWFqYXhMb2NhdGlvbiA9IGxvY2F0aW9uLmhyZWY7Cn0gY2F0Y2goIGUgKSB7CgkvLyBVc2UgdGhlIGhyZWYgYXR0cmlidXRlIG9mIGFuIEEgZWxlbWVudAoJLy8gc2luY2UgSUUgd2lsbCBtb2RpZnkgaXQgZ2l2ZW4gZG9jdW1lbnQubG9jYXRpb24KCWFqYXhMb2NhdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJhIiApOwoJYWpheExvY2F0aW9uLmhyZWYgPSAiIjsKCWFqYXhMb2NhdGlvbiA9IGFqYXhMb2NhdGlvbi5ocmVmOwp9CgovLyBTZWdtZW50IGxvY2F0aW9uIGludG8gcGFydHMKYWpheExvY1BhcnRzID0gcnVybC5leGVjKCBhamF4TG9jYXRpb24udG9Mb3dlckNhc2UoKSApIHx8IFtdOwoKLy8gQmFzZSAiY29uc3RydWN0b3IiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnQKZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7CgoJLy8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byAiKiIKCXJldHVybiBmdW5jdGlvbiggZGF0YVR5cGVFeHByZXNzaW9uLCBmdW5jICkgewoKCQlpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09ICJzdHJpbmciICkgewoJCQlmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uOwoJCQlkYXRhVHlwZUV4cHJlc3Npb24gPSAiKiI7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBmdW5jICkgKSB7CgkJCXZhciBkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5zcGxpdCggcnNwYWNlc0FqYXggKSwKCQkJCWkgPSAwLAoJCQkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQkJCWRhdGFUeXBlLAoJCQkJbGlzdCwKCQkJCXBsYWNlQmVmb3JlOwoKCQkJLy8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvbgoJCQlmb3IoOyBpIDwgbGVuZ3RoOyBpKysgKSB7CgkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSBdOwoJCQkJLy8gV2UgY29udHJvbCBpZiB3ZSdyZSBhc2tlZCB0byBhZGQgYmVmb3JlCgkJCQkvLyBhbnkgZXhpc3RpbmcgZWxlbWVudAoJCQkJcGxhY2VCZWZvcmUgPSAvXlwrLy50ZXN0KCBkYXRhVHlwZSApOwoJCQkJaWYgKCBwbGFjZUJlZm9yZSApIHsKCQkJCQlkYXRhVHlwZSA9IGRhdGFUeXBlLnN1YnN0ciggMSApIHx8ICIqIjsKCQkJCX0KCQkJCWxpc3QgPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW107CgkJCQkvLyB0aGVuIHdlIGFkZCB0byB0aGUgc3RydWN0dXJlIGFjY29yZGluZ2x5CgkJCQlsaXN0WyBwbGFjZUJlZm9yZSA/ICJ1bnNoaWZ0IiA6ICJwdXNoIiBdKCBmdW5jICk7CgkJCX0KCQl9Cgl9Owp9CgovLyBCYXNlIGluc3BlY3Rpb24gZnVuY3Rpb24gZm9yIHByZWZpbHRlcnMgYW5kIHRyYW5zcG9ydHMKZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiwKCQlkYXRhVHlwZSAvKiBpbnRlcm5hbCAqLywgaW5zcGVjdGVkIC8qIGludGVybmFsICovICkgewoKCWRhdGFUeXBlID0gZGF0YVR5cGUgfHwgb3B0aW9ucy5kYXRhVHlwZXNbIDAgXTsKCWluc3BlY3RlZCA9IGluc3BlY3RlZCB8fCB7fTsKCglpbnNwZWN0ZWRbIGRhdGFUeXBlIF0gPSB0cnVlOwoKCXZhciBsaXN0ID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdLAoJCWkgPSAwLAoJCWxlbmd0aCA9IGxpc3QgPyBsaXN0Lmxlbmd0aCA6IDAsCgkJZXhlY3V0ZU9ubHkgPSAoIHN0cnVjdHVyZSA9PT0gcHJlZmlsdGVycyApLAoJCXNlbGVjdGlvbjsKCglmb3IoOyBpIDwgbGVuZ3RoICYmICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApOyBpKysgKSB7CgkJc2VsZWN0aW9uID0gbGlzdFsgaSBdKCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7CgkJLy8gSWYgd2UgZ290IHJlZGlyZWN0ZWQgdG8gYW5vdGhlciBkYXRhVHlwZQoJCS8vIHdlIHRyeSB0aGVyZSBpZiBleGVjdXRpbmcgb25seSBhbmQgbm90IGRvbmUgYWxyZWFkeQoJCWlmICggdHlwZW9mIHNlbGVjdGlvbiA9PT0gInN0cmluZyIgKSB7CgkJCWlmICggIWV4ZWN1dGVPbmx5IHx8IGluc3BlY3RlZFsgc2VsZWN0aW9uIF0gKSB7CgkJCQlzZWxlY3Rpb24gPSB1bmRlZmluZWQ7CgkJCX0gZWxzZSB7CgkJCQlvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBzZWxlY3Rpb24gKTsKCQkJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJCQlzdHJ1Y3R1cmUsIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIsIHNlbGVjdGlvbiwgaW5zcGVjdGVkICk7CgkJCX0KCQl9Cgl9CgkvLyBJZiB3ZSdyZSBvbmx5IGV4ZWN1dGluZyBvciBub3RoaW5nIHdhcyBzZWxlY3RlZAoJLy8gd2UgdHJ5IHRoZSBjYXRjaGFsbCBkYXRhVHlwZSBpZiBub3QgZG9uZSBhbHJlYWR5CglpZiAoICggZXhlY3V0ZU9ubHkgfHwgIXNlbGVjdGlvbiApICYmICFpbnNwZWN0ZWRbICIqIiBdICkgewoJCXNlbGVjdGlvbiA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKAoJCQkJc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSLCAiKiIsIGluc3BlY3RlZCApOwoJfQoJLy8gdW5uZWNlc3Nhcnkgd2hlbiBvbmx5IGV4ZWN1dGluZyAocHJlZmlsdGVycykKCS8vIGJ1dCBpdCdsbCBiZSBpZ25vcmVkIGJ5IHRoZSBjYWxsZXIgaW4gdGhhdCBjYXNlCglyZXR1cm4gc2VsZWN0aW9uOwp9CgovLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnMKLy8gdGhhdCB0YWtlcyAiZmxhdCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpCi8vIEZpeGVzICM5ODg3CmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkgewoJdmFyIGtleSwgZGVlcCwKCQlmbGF0T3B0aW9ucyA9IGpRdWVyeS5hamF4U2V0dGluZ3MuZmxhdE9wdGlvbnMgfHwge307Cglmb3IoIGtleSBpbiBzcmMgKSB7CgkJaWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7CgkJCSggZmxhdE9wdGlvbnNbIGtleSBdID8gdGFyZ2V0IDogKCBkZWVwIHx8ICggZGVlcCA9IHt9ICkgKSApWyBrZXkgXSA9IHNyY1sga2V5IF07CgkJfQoJfQoJaWYgKCBkZWVwICkgewoJCWpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApOwoJfQp9CgpqUXVlcnkuZm4uZXh0ZW5kKHsKCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2YgdXJsICE9PSAic3RyaW5nIiAmJiBfbG9hZCApIHsKCQkJcmV0dXJuIF9sb2FkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCgkJLy8gRG9uJ3QgZG8gYSByZXF1ZXN0IGlmIG5vIGVsZW1lbnRzIGFyZSBiZWluZyByZXF1ZXN0ZWQKCQl9IGVsc2UgaWYgKCAhdGhpcy5sZW5ndGggKSB7CgkJCXJldHVybiB0aGlzOwoJCX0KCgkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCAiICIgKTsKCQlpZiAoIG9mZiA+PSAwICkgewoJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2UoIG9mZiwgdXJsLmxlbmd0aCApOwoJCQl1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApOwoJCX0KCgkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CgkJdmFyIHR5cGUgPSAiR0VUIjsKCgkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCgkJaWYgKCBwYXJhbXMgKSB7CgkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgoJCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHsKCQkJCS8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrCgkJCQljYWxsYmFjayA9IHBhcmFtczsKCQkJCXBhcmFtcyA9IHVuZGVmaW5lZDsKCgkJCS8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmcKCQkJfSBlbHNlIGlmICggdHlwZW9mIHBhcmFtcyA9PT0gIm9iamVjdCIgKSB7CgkJCQlwYXJhbXMgPSBqUXVlcnkucGFyYW0oIHBhcmFtcywgalF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCApOwoJCQkJdHlwZSA9ICJQT1NUIjsKCQkJfQoJCX0KCgkJdmFyIHNlbGYgPSB0aGlzOwoKCQkvLyBSZXF1ZXN0IHRoZSByZW1vdGUgZG9jdW1lbnQKCQlqUXVlcnkuYWpheCh7CgkJCXVybDogdXJsLAoJCQl0eXBlOiB0eXBlLAoJCQlkYXRhVHlwZTogImh0bWwiLAoJCQlkYXRhOiBwYXJhbXMsCgkJCS8vIENvbXBsZXRlIGNhbGxiYWNrIChyZXNwb25zZVRleHQgaXMgdXNlZCBpbnRlcm5hbGx5KQoJCQljb21wbGV0ZTogZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMsIHJlc3BvbnNlVGV4dCApIHsKCQkJCS8vIFN0b3JlIHRoZSByZXNwb25zZSBhcyBzcGVjaWZpZWQgYnkgdGhlIGpxWEhSIG9iamVjdAoJCQkJcmVzcG9uc2VUZXh0ID0ganFYSFIucmVzcG9uc2VUZXh0OwoJCQkJLy8gSWYgc3VjY2Vzc2Z1bCwgaW5qZWN0IHRoZSBIVE1MIGludG8gYWxsIHRoZSBtYXRjaGVkIGVsZW1lbnRzCgkJCQlpZiAoIGpxWEhSLmlzUmVzb2x2ZWQoKSApIHsKCQkJCQkvLyAjNDgyNTogR2V0IHRoZSBhY3R1YWwgcmVzcG9uc2UgaW4gY2FzZQoJCQkJCS8vIGEgZGF0YUZpbHRlciBpcyBwcmVzZW50IGluIGFqYXhTZXR0aW5ncwoJCQkJCWpxWEhSLmRvbmUoZnVuY3Rpb24oIHIgKSB7CgkJCQkJCXJlc3BvbnNlVGV4dCA9IHI7CgkJCQkJfSk7CgkJCQkJLy8gU2VlIGlmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZAoJCQkJCXNlbGYuaHRtbCggc2VsZWN0b3IgPwoJCQkJCQkvLyBDcmVhdGUgYSBkdW1teSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cwoJCQkJCQlqUXVlcnkoIjxkaXY+IikKCQkJCQkJCS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUgc2NyaXB0cwoJCQkJCQkJLy8gdG8gYXZvaWQgYW55ICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzIGluIElFCgkJCQkJCQkuYXBwZW5kKHJlc3BvbnNlVGV4dC5yZXBsYWNlKHJzY3JpcHQsICIiKSkKCgkJCQkJCQkvLyBMb2NhdGUgdGhlIHNwZWNpZmllZCBlbGVtZW50cwoJCQkJCQkJLmZpbmQoc2VsZWN0b3IpIDoKCgkJCQkJCS8vIElmIG5vdCwganVzdCBpbmplY3QgdGhlIGZ1bGwgcmVzdWx0CgkJCQkJCXJlc3BvbnNlVGV4dCApOwoJCQkJfQoKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgWyByZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApOwoJCQkJfQoJCQl9CgkJfSk7CgoJCXJldHVybiB0aGlzOwoJfSwKCglzZXJpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApOwoJfSwKCglzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7CgkJCXJldHVybiB0aGlzLmVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggdGhpcy5lbGVtZW50cyApIDogdGhpczsKCQl9KQoJCS5maWx0ZXIoZnVuY3Rpb24oKXsKCQkJcmV0dXJuIHRoaXMubmFtZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgoJCQkJKCB0aGlzLmNoZWNrZWQgfHwgcnNlbGVjdFRleHRhcmVhLnRlc3QoIHRoaXMubm9kZU5hbWUgKSB8fAoJCQkJCXJpbnB1dC50ZXN0KCB0aGlzLnR5cGUgKSApOwoJCX0pCgkJLm1hcChmdW5jdGlvbiggaSwgZWxlbSApewoJCQl2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7CgoJCQlyZXR1cm4gdmFsID09IG51bGwgPwoJCQkJbnVsbCA6CgkJCQlqUXVlcnkuaXNBcnJheSggdmFsICkgPwoJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCwgaSApewoJCQkJCQlyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsICJcclxuIiApIH07CgkJCQkJfSkgOgoJCQkJCXsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCAiXHJcbiIgKSB9OwoJCX0pLmdldCgpOwoJfQp9KTsKCi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzCmpRdWVyeS5lYWNoKCAiYWpheFN0YXJ0IGFqYXhTdG9wIGFqYXhDb21wbGV0ZSBhamF4RXJyb3IgYWpheFN1Y2Nlc3MgYWpheFNlbmQiLnNwbGl0KCAiICIgKSwgZnVuY3Rpb24oIGksIG8gKXsKCWpRdWVyeS5mblsgbyBdID0gZnVuY3Rpb24oIGYgKXsKCQlyZXR1cm4gdGhpcy5iaW5kKCBvLCBmICk7Cgl9Owp9KTsKCmpRdWVyeS5lYWNoKCBbICJnZXQiLCAicG9zdCIgXSwgZnVuY3Rpb24oIGksIG1ldGhvZCApIHsKCWpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHsKCQkvLyBzaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZAoJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGRhdGEgKSApIHsKCQkJdHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7CgkJCWNhbGxiYWNrID0gZGF0YTsKCQkJZGF0YSA9IHVuZGVmaW5lZDsKCQl9CgoJCXJldHVybiBqUXVlcnkuYWpheCh7CgkJCXR5cGU6IG1ldGhvZCwKCQkJdXJsOiB1cmwsCgkJCWRhdGE6IGRhdGEsCgkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAoJCQlkYXRhVHlwZTogdHlwZQoJCX0pOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCglnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssICJzY3JpcHQiICk7Cgl9LAoKCWdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkgewoJCXJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCAianNvbiIgKTsKCX0sCgoJLy8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXQKCS8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy4KCS8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuCglhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkgewoJCWlmICggc2V0dGluZ3MgKSB7CgkJCS8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0CgkJCWFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApOwoJCX0gZWxzZSB7CgkJCS8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3MKCQkJc2V0dGluZ3MgPSB0YXJnZXQ7CgkJCXRhcmdldCA9IGpRdWVyeS5hamF4U2V0dGluZ3M7CgkJfQoJCWFqYXhFeHRlbmQoIHRhcmdldCwgc2V0dGluZ3MgKTsKCQlyZXR1cm4gdGFyZ2V0OwoJfSwKCglhamF4U2V0dGluZ3M6IHsKCQl1cmw6IGFqYXhMb2NhdGlvbiwKCQlpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBhamF4TG9jUGFydHNbIDEgXSApLAoJCWdsb2JhbDogdHJ1ZSwKCQl0eXBlOiAiR0VUIiwKCQljb250ZW50VHlwZTogImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsCgkJcHJvY2Vzc0RhdGE6IHRydWUsCgkJYXN5bmM6IHRydWUsCgkJLyoKCQl0aW1lb3V0OiAwLAoJCWRhdGE6IG51bGwsCgkJZGF0YVR5cGU6IG51bGwsCgkJdXNlcm5hbWU6IG51bGwsCgkJcGFzc3dvcmQ6IG51bGwsCgkJY2FjaGU6IG51bGwsCgkJdHJhZGl0aW9uYWw6IGZhbHNlLAoJCWhlYWRlcnM6IHt9LAoJCSovCgoJCWFjY2VwdHM6IHsKCQkJeG1sOiAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCIsCgkJCWh0bWw6ICJ0ZXh0L2h0bWwiLAoJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCgkJCWpzb246ICJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQiLAoJCQkiKiI6IGFsbFR5cGVzCgkJfSwKCgkJY29udGVudHM6IHsKCQkJeG1sOiAveG1sLywKCQkJaHRtbDogL2h0bWwvLAoJCQlqc29uOiAvanNvbi8KCQl9LAoKCQlyZXNwb25zZUZpZWxkczogewoJCQl4bWw6ICJyZXNwb25zZVhNTCIsCgkJCXRleHQ6ICJyZXNwb25zZVRleHQiCgkJfSwKCgkJLy8gTGlzdCBvZiBkYXRhIGNvbnZlcnRlcnMKCQkvLyAxKSBrZXkgZm9ybWF0IGlzICJzb3VyY2VfdHlwZSBkZXN0aW5hdGlvbl90eXBlIiAoYSBzaW5nbGUgc3BhY2UgaW4tYmV0d2VlbikKCQkvLyAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sICIqIiBjYW4gYmUgdXNlZCBmb3Igc291cmNlX3R5cGUKCQljb252ZXJ0ZXJzOiB7CgoJCQkvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHQKCQkJIiogdGV4dCI6IHdpbmRvdy5TdHJpbmcsCgoJCQkvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbikKCQkJInRleHQgaHRtbCI6IHRydWUsCgoJCQkvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uCgkJCSJ0ZXh0IGpzb24iOiBqUXVlcnkucGFyc2VKU09OLAoKCQkJLy8gUGFyc2UgdGV4dCBhcyB4bWwKCQkJInRleHQgeG1sIjogalF1ZXJ5LnBhcnNlWE1MCgkJfSwKCgkJLy8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDoKCQkvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmCgkJLy8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmUKCQkvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZCkKCQlmbGF0T3B0aW9uczogewoJCQljb250ZXh0OiB0cnVlLAoJCQl1cmw6IHRydWUKCQl9Cgl9LAoKCWFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLAoJYWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksCgoJLy8gTWFpbiBtZXRob2QKCWFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7CgoJCS8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlCgkJaWYgKCB0eXBlb2YgdXJsID09PSAib2JqZWN0IiApIHsKCQkJb3B0aW9ucyA9IHVybDsKCQkJdXJsID0gdW5kZWZpbmVkOwoJCX0KCgkJLy8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3QKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCgkJdmFyIC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3QKCQkJcyA9IGpRdWVyeS5hamF4U2V0dXAoIHt9LCBvcHRpb25zICksCgkJCS8vIENhbGxiYWNrcyBjb250ZXh0CgkJCWNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLAoJCQkvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzCgkJCS8vIEl0J3MgdGhlIGNhbGxiYWNrQ29udGV4dCBpZiBvbmUgd2FzIHByb3ZpZGVkIGluIHRoZSBvcHRpb25zCgkJCS8vIGFuZCBpZiBpdCdzIGEgRE9NIG5vZGUgb3IgYSBqUXVlcnkgY29sbGVjdGlvbgoJCQlnbG9iYWxFdmVudENvbnRleHQgPSBjYWxsYmFja0NvbnRleHQgIT09IHMgJiYKCQkJCSggY2FsbGJhY2tDb250ZXh0Lm5vZGVUeXBlIHx8IGNhbGxiYWNrQ29udGV4dCBpbnN0YW5jZW9mIGpRdWVyeSApID8KCQkJCQkJalF1ZXJ5KCBjYWxsYmFja0NvbnRleHQgKSA6IGpRdWVyeS5ldmVudCwKCQkJLy8gRGVmZXJyZWRzCgkJCWRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCksCgkJCWNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuX0RlZmVycmVkKCksCgkJCS8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzCgkJCXN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sCgkJCS8vIGlmTW9kaWZpZWQga2V5CgkJCWlmTW9kaWZpZWRLZXksCgkJCS8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpCgkJCXJlcXVlc3RIZWFkZXJzID0ge30sCgkJCXJlcXVlc3RIZWFkZXJzTmFtZXMgPSB7fSwKCQkJLy8gUmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcsCgkJCXJlc3BvbnNlSGVhZGVycywKCQkJLy8gdHJhbnNwb3J0CgkJCXRyYW5zcG9ydCwKCQkJLy8gdGltZW91dCBoYW5kbGUKCQkJdGltZW91dFRpbWVyLAoJCQkvLyBDcm9zcy1kb21haW4gZGV0ZWN0aW9uIHZhcnMKCQkJcGFydHMsCgkJCS8vIFRoZSBqcVhIUiBzdGF0ZQoJCQlzdGF0ZSA9IDAsCgkJCS8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZAoJCQlmaXJlR2xvYmFscywKCQkJLy8gTG9vcCB2YXJpYWJsZQoJCQlpLAoJCQkvLyBGYWtlIHhocgoJCQlqcVhIUiA9IHsKCgkJCQlyZWFkeVN0YXRlOiAwLAoKCQkJCS8vIENhY2hlcyB0aGUgaGVhZGVyCgkJCQlzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7CgkJCQkJaWYgKCAhc3RhdGUgKSB7CgkJCQkJCXZhciBsbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKCQkJCQkJbmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7CgkJCQkJCXJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCQl9CgkJCQkJcmV0dXJuIHRoaXM7CgkJCQl9LAoKCQkJCS8vIFJhdyBzdHJpbmcKCQkJCWdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7CgkJCQkJcmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDsKCQkJCX0sCgoJCQkJLy8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZAoJCQkJZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCBrZXkgKSB7CgkJCQkJdmFyIG1hdGNoOwoJCQkJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCQkJCWlmICggIXJlc3BvbnNlSGVhZGVycyApIHsKCQkJCQkJCXJlc3BvbnNlSGVhZGVycyA9IHt9OwoJCQkJCQkJd2hpbGUoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkgewoJCQkJCQkJCXJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbMV0udG9Mb3dlckNhc2UoKSBdID0gbWF0Y2hbIDIgXTsKCQkJCQkJCX0KCQkJCQkJfQoJCQkJCQltYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTsKCQkJCQl9CgkJCQkJcmV0dXJuIG1hdGNoID09PSB1bmRlZmluZWQgPyBudWxsIDogbWF0Y2g7CgkJCQl9LAoKCQkJCS8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyCgkJCQlvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHsKCQkJCQlpZiAoICFzdGF0ZSApIHsKCQkJCQkJcy5taW1lVHlwZSA9IHR5cGU7CgkJCQkJfQoJCQkJCXJldHVybiB0aGlzOwoJCQkJfSwKCgkJCQkvLyBDYW5jZWwgdGhlIHJlcXVlc3QKCQkJCWFib3J0OiBmdW5jdGlvbiggc3RhdHVzVGV4dCApIHsKCQkJCQlzdGF0dXNUZXh0ID0gc3RhdHVzVGV4dCB8fCAiYWJvcnQiOwoJCQkJCWlmICggdHJhbnNwb3J0ICkgewoJCQkJCQl0cmFuc3BvcnQuYWJvcnQoIHN0YXR1c1RleHQgKTsKCQkJCQl9CgkJCQkJZG9uZSggMCwgc3RhdHVzVGV4dCApOwoJCQkJCXJldHVybiB0aGlzOwoJCQkJfQoJCQl9OwoKCQkvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmUKCQkvLyBJdCBpcyBkZWZpbmVkIGhlcmUgYmVjYXVzZSBqc2xpbnQgY29tcGxhaW5zIGlmIGl0IGlzIGRlY2xhcmVkCgkJLy8gYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKHdoaWNoIHdvdWxkIGJlIG1vcmUgbG9naWNhbCBhbmQgcmVhZGFibGUpCgkJZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7CgoJCQkvLyBDYWxsZWQgb25jZQoJCQlpZiAoIHN0YXRlID09PSAyICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBTdGF0ZSBpcyAiZG9uZSIgbm93CgkJCXN0YXRlID0gMjsKCgkJCS8vIENsZWFyIHRpbWVvdXQgaWYgaXQgZXhpc3RzCgkJCWlmICggdGltZW91dFRpbWVyICkgewoJCQkJY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTsKCQkJfQoKCQkJLy8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24KCQkJLy8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZCkKCQkJdHJhbnNwb3J0ID0gdW5kZWZpbmVkOwoKCQkJLy8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVycwoJCQlyZXNwb25zZUhlYWRlcnNTdHJpbmcgPSBoZWFkZXJzIHx8ICIiOwoKCQkJLy8gU2V0IHJlYWR5U3RhdGUKCQkJanFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDsKCgkJCXZhciBpc1N1Y2Nlc3MsCgkJCQlzdWNjZXNzLAoJCQkJZXJyb3IsCgkJCQlzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dCwKCQkJCXJlc3BvbnNlID0gcmVzcG9uc2VzID8gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApIDogdW5kZWZpbmVkLAoJCQkJbGFzdE1vZGlmaWVkLAoJCQkJZXRhZzsKCgkJCS8vIElmIHN1Y2Nlc3NmdWwsIGhhbmRsZSB0eXBlIGNoYWluaW5nCgkJCWlmICggc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDAgfHwgc3RhdHVzID09PSAzMDQgKSB7CgoJCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS4KCQkJCWlmICggcy5pZk1vZGlmaWVkICkgewoKCQkJCQlpZiAoICggbGFzdE1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJMYXN0LU1vZGlmaWVkIiApICkgKSB7CgkJCQkJCWpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSA9IGxhc3RNb2RpZmllZDsKCQkJCQl9CgkJCQkJaWYgKCAoIGV0YWcgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggIkV0YWciICkgKSApIHsKCQkJCQkJalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSA9IGV0YWc7CgkJCQkJfQoJCQkJfQoKCQkJCS8vIElmIG5vdCBtb2RpZmllZAoJCQkJaWYgKCBzdGF0dXMgPT09IDMwNCApIHsKCgkJCQkJc3RhdHVzVGV4dCA9ICJub3Rtb2RpZmllZCI7CgkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCgkJCQkvLyBJZiB3ZSBoYXZlIGRhdGEKCQkJCX0gZWxzZSB7CgoJCQkJCXRyeSB7CgkJCQkJCXN1Y2Nlc3MgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKTsKCQkJCQkJc3RhdHVzVGV4dCA9ICJzdWNjZXNzIjsKCQkJCQkJaXNTdWNjZXNzID0gdHJ1ZTsKCQkJCQl9IGNhdGNoKGUpIHsKCQkJCQkJLy8gV2UgaGF2ZSBhIHBhcnNlcmVycm9yCgkJCQkJCXN0YXR1c1RleHQgPSAicGFyc2VyZXJyb3IiOwoJCQkJCQllcnJvciA9IGU7CgkJCQkJfQoJCQkJfQoJCQl9IGVsc2UgewoJCQkJLy8gV2UgZXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQKCQkJCS8vIHRoZW4gbm9ybWFsaXplIHN0YXR1c1RleHQgYW5kIHN0YXR1cyBmb3Igbm9uLWFib3J0cwoJCQkJZXJyb3IgPSBzdGF0dXNUZXh0OwoJCQkJaWYoICFzdGF0dXNUZXh0IHx8IHN0YXR1cyApIHsKCQkJCQlzdGF0dXNUZXh0ID0gImVycm9yIjsKCQkJCQlpZiAoIHN0YXR1cyA8IDAgKSB7CgkJCQkJCXN0YXR1cyA9IDA7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdAoJCQlqcVhIUi5zdGF0dXMgPSBzdGF0dXM7CgkJCWpxWEhSLnN0YXR1c1RleHQgPSAiIiArICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICk7CgoJCQkvLyBTdWNjZXNzL0Vycm9yCgkJCWlmICggaXNTdWNjZXNzICkgewoJCQkJZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7CgkJCX0gZWxzZSB7CgkJCQlkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQkJanFYSFIuc3RhdHVzQ29kZSggc3RhdHVzQ29kZSApOwoJCQlzdGF0dXNDb2RlID0gdW5kZWZpbmVkOwoKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheCIgKyAoIGlzU3VjY2VzcyA/ICJTdWNjZXNzIiA6ICJFcnJvciIgKSwKCQkJCQkJWyBqcVhIUiwgcywgaXNTdWNjZXNzID8gc3VjY2VzcyA6IGVycm9yIF0gKTsKCQkJfQoKCQkJLy8gQ29tcGxldGUKCQkJY29tcGxldGVEZWZlcnJlZC5yZXNvbHZlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTsKCgkJCWlmICggZmlyZUdsb2JhbHMgKSB7CgkJCQlnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggImFqYXhDb21wbGV0ZSIsIFsganFYSFIsIHMgXSApOwoJCQkJLy8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyCgkJCQlpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkgewoJCQkJCWpRdWVyeS5ldmVudC50cmlnZ2VyKCAiYWpheFN0b3AiICk7CgkJCQl9CgkJCX0KCQl9CgoJCS8vIEF0dGFjaCBkZWZlcnJlZHMKCQlkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApOwoJCWpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lOwoJCWpxWEhSLmVycm9yID0ganFYSFIuZmFpbDsKCQlqcVhIUi5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuZG9uZTsKCgkJLy8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3MKCQlqcVhIUi5zdGF0dXNDb2RlID0gZnVuY3Rpb24oIG1hcCApIHsKCQkJaWYgKCBtYXAgKSB7CgkJCQl2YXIgdG1wOwoJCQkJaWYgKCBzdGF0ZSA8IDIgKSB7CgkJCQkJZm9yKCB0bXAgaW4gbWFwICkgewoJCQkJCQlzdGF0dXNDb2RlWyB0bXAgXSA9IFsgc3RhdHVzQ29kZVt0bXBdLCBtYXBbdG1wXSBdOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJdG1wID0gbWFwWyBqcVhIUi5zdGF0dXMgXTsKCQkJCQlqcVhIUi50aGVuKCB0bXAsIHRtcCApOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0aGlzOwoJCX07CgoJCS8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKQoJCS8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKCM1ODY2OiBJRTcgaXNzdWUgd2l0aCBwcm90b2NvbC1sZXNzIHVybHMpCgkJLy8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlCgkJcy51cmwgPSAoICggdXJsIHx8IHMudXJsICkgKyAiIiApLnJlcGxhY2UoIHJoYXNoLCAiIiApLnJlcGxhY2UoIHJwcm90b2NvbCwgYWpheExvY1BhcnRzWyAxIF0gKyAiLy8iICk7CgoJCS8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3QKCQlzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8ICIqIiApLnRvTG93ZXJDYXNlKCkuc3BsaXQoIHJzcGFjZXNBamF4ICk7CgoJCS8vIERldGVybWluZSBpZiBhIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyCgkJaWYgKCBzLmNyb3NzRG9tYWluID09IG51bGwgKSB7CgkJCXBhcnRzID0gcnVybC5leGVjKCBzLnVybC50b0xvd2VyQ2FzZSgpICk7CgkJCXMuY3Jvc3NEb21haW4gPSAhISggcGFydHMgJiYKCQkJCSggcGFydHNbIDEgXSAhPSBhamF4TG9jUGFydHNbIDEgXSB8fCBwYXJ0c1sgMiBdICE9IGFqYXhMb2NQYXJ0c1sgMiBdIHx8CgkJCQkJKCBwYXJ0c1sgMyBdIHx8ICggcGFydHNbIDEgXSA9PT0gImh0dHA6IiA/IDgwIDogNDQzICkgKSAhPQoJCQkJCQkoIGFqYXhMb2NQYXJ0c1sgMyBdIHx8ICggYWpheExvY1BhcnRzWyAxIF0gPT09ICJodHRwOiIgPyA4MCA6IDQ0MyApICkgKQoJCQkpOwoJCX0KCgkJLy8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nCgkJaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSAic3RyaW5nIiApIHsKCQkJcy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTsKCQl9CgoJCS8vIEFwcGx5IHByZWZpbHRlcnMKCQlpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWxlciwgc3RvcCB0aGVyZQoJCWlmICggc3RhdGUgPT09IDIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvCgkJZmlyZUdsb2JhbHMgPSBzLmdsb2JhbDsKCgkJLy8gVXBwZXJjYXNlIHRoZSB0eXBlCgkJcy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7CgoJCS8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50CgkJcy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7CgoJCS8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHMKCQlpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHsKCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CgkJfQoKCQkvLyBNb3JlIG9wdGlvbnMgaGFuZGxpbmcgZm9yIHJlcXVlc3RzIHdpdGggbm8gY29udGVudAoJCWlmICggIXMuaGFzQ29udGVudCApIHsKCgkJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0YSB0byB1cmwKCQkJaWYgKCBzLmRhdGEgKSB7CgkJCQlzLnVybCArPSAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyBzLmRhdGE7CgkJCQkvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5CgkJCQlkZWxldGUgcy5kYXRhOwoJCQl9CgoJCQkvLyBHZXQgaWZNb2RpZmllZEtleSBiZWZvcmUgYWRkaW5nIHRoZSBhbnRpLWNhY2hlIHBhcmFtZXRlcgoJCQlpZk1vZGlmaWVkS2V5ID0gcy51cmw7CgoJCQkvLyBBZGQgYW50aS1jYWNoZSBpbiB1cmwgaWYgbmVlZGVkCgkJCWlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7CgoJCQkJdmFyIHRzID0galF1ZXJ5Lm5vdygpLAoJCQkJCS8vIHRyeSByZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKCQkJCQlyZXQgPSBzLnVybC5yZXBsYWNlKCBydHMsICIkMV89IiArIHRzICk7CgoJCQkJLy8gaWYgbm90aGluZyB3YXMgcmVwbGFjZWQsIGFkZCB0aW1lc3RhbXAgdG8gdGhlIGVuZAoJCQkJcy51cmwgPSByZXQgKyAoIChyZXQgPT09IHMudXJsICkgPyAoIHJxdWVyeS50ZXN0KCBzLnVybCApID8gIiYiIDogIj8iICkgKyAiXz0iICsgdHMgOiAiIiApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIGNvcnJlY3QgaGVhZGVyLCBpZiBkYXRhIGlzIGJlaW5nIHNlbnQKCQlpZiAoIHMuZGF0YSAmJiBzLmhhc0NvbnRlbnQgJiYgcy5jb250ZW50VHlwZSAhPT0gZmFsc2UgfHwgb3B0aW9ucy5jb250ZW50VHlwZSApIHsKCQkJanFYSFIuc2V0UmVxdWVzdEhlYWRlciggIkNvbnRlbnQtVHlwZSIsIHMuY29udGVudFR5cGUgKTsKCQl9CgoJCS8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuCgkJaWYgKCBzLmlmTW9kaWZpZWQgKSB7CgkJCWlmTW9kaWZpZWRLZXkgPSBpZk1vZGlmaWVkS2V5IHx8IHMudXJsOwoJCQlpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Nb2RpZmllZC1TaW5jZSIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJCWlmICggalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApIHsKCQkJCWpxWEhSLnNldFJlcXVlc3RIZWFkZXIoICJJZi1Ob25lLU1hdGNoIiwgalF1ZXJ5LmV0YWdbIGlmTW9kaWZpZWRLZXkgXSApOwoJCQl9CgkJfQoKCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVhZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCgkJanFYSFIuc2V0UmVxdWVzdEhlYWRlcigKCQkJIkFjY2VwdCIsCgkJCXMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1swXSBdID8KCQkJCXMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbMF0gXSArICggcy5kYXRhVHlwZXNbIDAgXSAhPT0gIioiID8gIiwgIiArIGFsbFR5cGVzICsgIjsgcT0wLjAxIiA6ICIiICkgOgoJCQkJcy5hY2NlcHRzWyAiKiIgXQoJCSk7CgoJCS8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvbgoJCWZvciAoIGkgaW4gcy5oZWFkZXJzICkgewoJCQlqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApOwoJCX0KCgkJLy8gQWxsb3cgY3VzdG9tIGhlYWRlcnMvbWltZXR5cGVzIGFuZCBlYXJseSBhYm9ydAoJCWlmICggcy5iZWZvcmVTZW5kICYmICggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgc3RhdGUgPT09IDIgKSApIHsKCQkJCS8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkKCQkJCWpxWEhSLmFib3J0KCk7CgkJCQlyZXR1cm4gZmFsc2U7CgoJCX0KCgkJLy8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzCgkJZm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkgewoJCQlqcVhIUlsgaSBdKCBzWyBpIF0gKTsKCQl9CgoJCS8vIEdldCB0cmFuc3BvcnQKCQl0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTsKCgkJLy8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0CgkJaWYgKCAhdHJhbnNwb3J0ICkgewoJCQlkb25lKCAtMSwgIk5vIFRyYW5zcG9ydCIgKTsKCQl9IGVsc2UgewoJCQlqcVhIUi5yZWFkeVN0YXRlID0gMTsKCQkJLy8gU2VuZCBnbG9iYWwgZXZlbnQKCQkJaWYgKCBmaXJlR2xvYmFscyApIHsKCQkJCWdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCAiYWpheFNlbmQiLCBbIGpxWEhSLCBzIF0gKTsKCQkJfQoJCQkvLyBUaW1lb3V0CgkJCWlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkgewoJCQkJdGltZW91dFRpbWVyID0gc2V0VGltZW91dCggZnVuY3Rpb24oKXsKCQkJCQlqcVhIUi5hYm9ydCggInRpbWVvdXQiICk7CgkJCQl9LCBzLnRpbWVvdXQgKTsKCQkJfQoKCQkJdHJ5IHsKCQkJCXN0YXRlID0gMTsKCQkJCXRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApOwoJCQl9IGNhdGNoIChlKSB7CgkJCQkvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lCgkJCQlpZiAoIHN0YXRlIDwgMiApIHsKCQkJCQlkb25lKCAtMSwgZSApOwoJCQkJLy8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlCgkJCQl9IGVsc2UgewoJCQkJCWpRdWVyeS5lcnJvciggZSApOwoJCQkJfQoJCQl9CgkJfQoKCQlyZXR1cm4ganFYSFI7Cgl9LAoKCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCgkvLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmcKCXBhcmFtOiBmdW5jdGlvbiggYSwgdHJhZGl0aW9uYWwgKSB7CgkJdmFyIHMgPSBbXSwKCQkJYWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJCQkvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUKCQkJCXZhbHVlID0galF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgPyB2YWx1ZSgpIDogdmFsdWU7CgkJCQlzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdmFsdWUgKTsKCQkJfTsKCgkJLy8gU2V0IHRyYWRpdGlvbmFsIHRvIHRydWUgZm9yIGpRdWVyeSA8PSAxLjMuMiBiZWhhdmlvci4KCQlpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7CgkJCXRyYWRpdGlvbmFsID0galF1ZXJ5LmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbDsKCQl9CgoJCS8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuCgkJaWYgKCBqUXVlcnkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHsKCQkJLy8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzCgkJCWpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHsKCQkJCWFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQkvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSAib2xkIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXIKCQkJLy8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuCgkJCWZvciAoIHZhciBwcmVmaXggaW4gYSApIHsKCQkJCWJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7CgkJCX0KCQl9CgoJCS8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb24KCQlyZXR1cm4gcy5qb2luKCAiJiIgKS5yZXBsYWNlKCByMjAsICIrIiApOwoJfQp9KTsKCmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHsKCWlmICggalF1ZXJ5LmlzQXJyYXkoIG9iaiApICkgewoJCS8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLgoJCWpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkgewoJCQlpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkgewoJCQkJLy8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLgoJCQkJYWRkKCBwcmVmaXgsIHYgKTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBJZiBhcnJheSBpdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMKCQkJCS8vIG51bWVyaWMgaW5kZXggdG8gcmVzb2x2ZSBkZXNlcmlhbGl6YXRpb24gYW1iaWd1aXR5IGlzc3Vlcy4KCQkJCS8vIE5vdGUgdGhhdCByYWNrIChhcyBvZiAxLjAuMCkgY2FuJ3QgY3VycmVudGx5IGRlc2VyaWFsaXplCgkJCQkvLyBuZXN0ZWQgYXJyYXlzIHByb3Blcmx5LCBhbmQgYXR0ZW1wdGluZyB0byBkbyBzbyBtYXkgY2F1c2UKCQkJCS8vIGEgc2VydmVyIGVycm9yLiBQb3NzaWJsZSBmaXhlcyBhcmUgdG8gbW9kaWZ5IHJhY2sncwoJCQkJLy8gZGVzZXJpYWxpemF0aW9uIGFsZ29yaXRobSBvciB0byBwcm92aWRlIGFuIG9wdGlvbiBvciBmbGFnCgkJCQkvLyB0byBmb3JjZSBhcnJheSBzZXJpYWxpemF0aW9uIHRvIGJlIHNoYWxsb3cuCgkJCQlidWlsZFBhcmFtcyggcHJlZml4ICsgIlsiICsgKCB0eXBlb2YgdiA9PT0gIm9iamVjdCIgfHwgalF1ZXJ5LmlzQXJyYXkodikgPyBpIDogIiIgKSArICJdIiwgdiwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCQl9CgkJfSk7CgoJfSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiICkgewoJCS8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS4KCQlmb3IgKCB2YXIgbmFtZSBpbiBvYmogKSB7CgkJCWJ1aWxkUGFyYW1zKCBwcmVmaXggKyAiWyIgKyBuYW1lICsgIl0iLCBvYmpbIG5hbWUgXSwgdHJhZGl0aW9uYWwsIGFkZCApOwoJCX0KCgl9IGVsc2UgewoJCS8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS4KCQlhZGQoIHByZWZpeCwgb2JqICk7Cgl9Cn0KCi8vIFRoaXMgaXMgc3RpbGwgb24gdGhlIGpRdWVyeSBvYmplY3QuLi4gZm9yIG5vdwovLyBXYW50IHRvIG1vdmUgdGhpcyB0byBqUXVlcnkuYWpheCBzb21lIGRheQpqUXVlcnkuZXh0ZW5kKHsKCgkvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKCWFjdGl2ZTogMCwKCgkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0CglsYXN0TW9kaWZpZWQ6IHt9LAoJZXRhZzoge30KCn0pOwoKLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OgogKiAtIHNldHMgYWxsIHJlc3BvbnNlWFhYIGZpZWxkcyBhY2NvcmRpbmdseQogKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKQogKiAtIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2UKICovCmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7CgoJdmFyIGNvbnRlbnRzID0gcy5jb250ZW50cywKCQlkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQlyZXNwb25zZUZpZWxkcyA9IHMucmVzcG9uc2VGaWVsZHMsCgkJY3QsCgkJdHlwZSwKCQlmaW5hbERhdGFUeXBlLAoJCWZpcnN0RGF0YVR5cGU7CgoJLy8gRmlsbCByZXNwb25zZVhYWCBmaWVsZHMKCWZvciggdHlwZSBpbiByZXNwb25zZUZpZWxkcyApIHsKCQlpZiAoIHR5cGUgaW4gcmVzcG9uc2VzICkgewoJCQlqcVhIUlsgcmVzcG9uc2VGaWVsZHNbdHlwZV0gXSA9IHJlc3BvbnNlc1sgdHlwZSBdOwoJCX0KCX0KCgkvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2VzcwoJd2hpbGUoIGRhdGFUeXBlc1sgMCBdID09PSAiKiIgKSB7CgkJZGF0YVR5cGVzLnNoaWZ0KCk7CgkJaWYgKCBjdCA9PT0gdW5kZWZpbmVkICkgewoJCQljdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoICJjb250ZW50LXR5cGUiICk7CgkJfQoJfQoKCS8vIENoZWNrIGlmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGtub3duIGNvbnRlbnQtdHlwZQoJaWYgKCBjdCApIHsKCQlmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkgewoJCQlpZiAoIGNvbnRlbnRzWyB0eXBlIF0gJiYgY29udGVudHNbIHR5cGUgXS50ZXN0KCBjdCApICkgewoJCQkJZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCS8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZQoJaWYgKCBkYXRhVHlwZXNbIDAgXSBpbiByZXNwb25zZXMgKSB7CgkJZmluYWxEYXRhVHlwZSA9IGRhdGFUeXBlc1sgMCBdOwoJfSBlbHNlIHsKCQkvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzCgkJZm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7CgkJCWlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArICIgIiArIGRhdGFUeXBlc1swXSBdICkgewoJCQkJZmluYWxEYXRhVHlwZSA9IHR5cGU7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoICFmaXJzdERhdGFUeXBlICkgewoJCQkJZmlyc3REYXRhVHlwZSA9IHR5cGU7CgkJCX0KCQl9CgkJLy8gT3IganVzdCB1c2UgZmlyc3Qgb25lCgkJZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTsKCX0KCgkvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlCgkvLyBXZSBhZGQgdGhlIGRhdGFUeXBlIHRvIHRoZSBsaXN0IGlmIG5lZWRlZAoJLy8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZQoJaWYgKCBmaW5hbERhdGFUeXBlICkgewoJCWlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7CgkJCWRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7CgkJfQoJCXJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTsKCX0KfQoKLy8gQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZQpmdW5jdGlvbiBhamF4Q29udmVydCggcywgcmVzcG9uc2UgKSB7CgoJLy8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWQKCWlmICggcy5kYXRhRmlsdGVyICkgewoJCXJlc3BvbnNlID0gcy5kYXRhRmlsdGVyKCByZXNwb25zZSwgcy5kYXRhVHlwZSApOwoJfQoKCXZhciBkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcywKCQljb252ZXJ0ZXJzID0ge30sCgkJaSwKCQlrZXksCgkJbGVuZ3RoID0gZGF0YVR5cGVzLmxlbmd0aCwKCQl0bXAsCgkJLy8gQ3VycmVudCBhbmQgcHJldmlvdXMgZGF0YVR5cGVzCgkJY3VycmVudCA9IGRhdGFUeXBlc1sgMCBdLAoJCXByZXYsCgkJLy8gQ29udmVyc2lvbiBleHByZXNzaW9uCgkJY29udmVyc2lvbiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9uCgkJY29udiwKCQkvLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyAodHJhbnNpdGl2ZSBjb252ZXJzaW9uKQoJCWNvbnYxLAoJCWNvbnYyOwoKCS8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBjaGFpbgoJZm9yKCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrICkgewoKCQkvLyBDcmVhdGUgY29udmVydGVycyBtYXAKCQkvLyB3aXRoIGxvd2VyY2FzZWQga2V5cwoJCWlmICggaSA9PT0gMSApIHsKCQkJZm9yKCBrZXkgaW4gcy5jb252ZXJ0ZXJzICkgewoJCQkJaWYoIHR5cGVvZiBrZXkgPT09ICJzdHJpbmciICkgewoJCQkJCWNvbnZlcnRlcnNbIGtleS50b0xvd2VyQ2FzZSgpIF0gPSBzLmNvbnZlcnRlcnNbIGtleSBdOwoJCQkJfQoJCQl9CgkJfQoKCQkvLyBHZXQgdGhlIGRhdGFUeXBlcwoJCXByZXYgPSBjdXJyZW50OwoJCWN1cnJlbnQgPSBkYXRhVHlwZXNbIGkgXTsKCgkJLy8gSWYgY3VycmVudCBpcyBhdXRvIGRhdGFUeXBlLCB1cGRhdGUgaXQgdG8gcHJldgoJCWlmKCBjdXJyZW50ID09PSAiKiIgKSB7CgkJCWN1cnJlbnQgPSBwcmV2OwoJCS8vIElmIG5vIGF1dG8gYW5kIGRhdGFUeXBlcyBhcmUgYWN0dWFsbHkgZGlmZmVyZW50CgkJfSBlbHNlIGlmICggcHJldiAhPT0gIioiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7CgoJCQkvLyBHZXQgdGhlIGNvbnZlcnRlcgoJCQljb252ZXJzaW9uID0gcHJldiArICIgIiArIGN1cnJlbnQ7CgkJCWNvbnYgPSBjb252ZXJ0ZXJzWyBjb252ZXJzaW9uIF0gfHwgY29udmVydGVyc1sgIiogIiArIGN1cnJlbnQgXTsKCgkJCS8vIElmIHRoZXJlIGlzIG5vIGRpcmVjdCBjb252ZXJ0ZXIsIHNlYXJjaCB0cmFuc2l0aXZlbHkKCQkJaWYgKCAhY29udiApIHsKCQkJCWNvbnYyID0gdW5kZWZpbmVkOwoJCQkJZm9yKCBjb252MSBpbiBjb252ZXJ0ZXJzICkgewoJCQkJCXRtcCA9IGNvbnYxLnNwbGl0KCAiICIgKTsKCQkJCQlpZiAoIHRtcFsgMCBdID09PSBwcmV2IHx8IHRtcFsgMCBdID09PSAiKiIgKSB7CgkJCQkJCWNvbnYyID0gY29udmVydGVyc1sgdG1wWzFdICsgIiAiICsgY3VycmVudCBdOwoJCQkJCQlpZiAoIGNvbnYyICkgewoJCQkJCQkJY29udjEgPSBjb252ZXJ0ZXJzWyBjb252MSBdOwoJCQkJCQkJaWYgKCBjb252MSA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjI7CgkJCQkJCQl9IGVsc2UgaWYgKCBjb252MiA9PT0gdHJ1ZSApIHsKCQkJCQkJCQljb252ID0gY29udjE7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCQkJCX0KCQkJfQoJCQkvLyBJZiB3ZSBmb3VuZCBubyBjb252ZXJ0ZXIsIGRpc3BhdGNoIGFuIGVycm9yCgkJCWlmICggISggY29udiB8fCBjb252MiApICkgewoJCQkJalF1ZXJ5LmVycm9yKCAiTm8gY29udmVyc2lvbiBmcm9tICIgKyBjb252ZXJzaW9uLnJlcGxhY2UoIiAiLCIgdG8gIikgKTsKCQkJfQoJCQkvLyBJZiBmb3VuZCBjb252ZXJ0ZXIgaXMgbm90IGFuIGVxdWl2YWxlbmNlCgkJCWlmICggY29udiAhPT0gdHJ1ZSApIHsKCQkJCS8vIENvbnZlcnQgd2l0aCAxIG9yIDIgY29udmVydGVycyBhY2NvcmRpbmdseQoJCQkJcmVzcG9uc2UgPSBjb252ID8gY29udiggcmVzcG9uc2UgKSA6IGNvbnYyKCBjb252MShyZXNwb25zZSkgKTsKCQkJfQoJCX0KCX0KCXJldHVybiByZXNwb25zZTsKfQoKCgoKdmFyIGpzYyA9IGpRdWVyeS5ub3coKSwKCWpzcmUgPSAvKFw9KVw/KCZ8JCl8XD9cPy9pOwoKLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5ncwpqUXVlcnkuYWpheFNldHVwKHsKCWpzb25wOiAiY2FsbGJhY2siLAoJanNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIGpRdWVyeS5leHBhbmRvICsgIl8iICsgKCBqc2MrKyApOwoJfQp9KTsKCi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0cwpqUXVlcnkuYWpheFByZWZpbHRlciggImpzb24ganNvbnAiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7CgoJdmFyIGluc3BlY3REYXRhID0gcy5jb250ZW50VHlwZSA9PT0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgJiYKCQkoIHR5cGVvZiBzLmRhdGEgPT09ICJzdHJpbmciICk7CgoJaWYgKCBzLmRhdGFUeXBlc1sgMCBdID09PSAianNvbnAiIHx8CgkJcy5qc29ucCAhPT0gZmFsc2UgJiYgKCBqc3JlLnRlc3QoIHMudXJsICkgfHwKCQkJCWluc3BlY3REYXRhICYmIGpzcmUudGVzdCggcy5kYXRhICkgKSApIHsKCgkJdmFyIHJlc3BvbnNlQ29udGFpbmVyLAoJCQlqc29ucENhbGxiYWNrID0gcy5qc29ucENhbGxiYWNrID0KCQkJCWpRdWVyeS5pc0Z1bmN0aW9uKCBzLmpzb25wQ2FsbGJhY2sgKSA/IHMuanNvbnBDYWxsYmFjaygpIDogcy5qc29ucENhbGxiYWNrLAoJCQlwcmV2aW91cyA9IHdpbmRvd1sganNvbnBDYWxsYmFjayBdLAoJCQl1cmwgPSBzLnVybCwKCQkJZGF0YSA9IHMuZGF0YSwKCQkJcmVwbGFjZSA9ICIkMSIgKyBqc29ucENhbGxiYWNrICsgIiQyIjsKCgkJaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHsKCQkJdXJsID0gdXJsLnJlcGxhY2UoIGpzcmUsIHJlcGxhY2UgKTsKCQkJaWYgKCBzLnVybCA9PT0gdXJsICkgewoJCQkJaWYgKCBpbnNwZWN0RGF0YSApIHsKCQkJCQlkYXRhID0gZGF0YS5yZXBsYWNlKCBqc3JlLCByZXBsYWNlICk7CgkJCQl9CgkJCQlpZiAoIHMuZGF0YSA9PT0gZGF0YSApIHsKCQkJCQkvLyBBZGQgY2FsbGJhY2sgbWFudWFsbHkKCQkJCQl1cmwgKz0gKC9cPy8udGVzdCggdXJsICkgPyAiJiIgOiAiPyIpICsgcy5qc29ucCArICI9IiArIGpzb25wQ2FsbGJhY2s7CgkJCQl9CgkJCX0KCQl9CgoJCXMudXJsID0gdXJsOwoJCXMuZGF0YSA9IGRhdGE7CgoJCS8vIEluc3RhbGwgY2FsbGJhY2sKCQl3aW5kb3dbIGpzb25wQ2FsbGJhY2sgXSA9IGZ1bmN0aW9uKCByZXNwb25zZSApIHsKCQkJcmVzcG9uc2VDb250YWluZXIgPSBbIHJlc3BvbnNlIF07CgkJfTsKCgkJLy8gQ2xlYW4tdXAgZnVuY3Rpb24KCQlqcVhIUi5hbHdheXMoZnVuY3Rpb24oKSB7CgkJCS8vIFNldCBjYWxsYmFjayBiYWNrIHRvIHByZXZpb3VzIHZhbHVlCgkJCXdpbmRvd1sganNvbnBDYWxsYmFjayBdID0gcHJldmlvdXM7CgkJCS8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZQoJCQlpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBwcmV2aW91cyApICkgewoJCQkJd2luZG93WyBqc29ucENhbGxiYWNrIF0oIHJlc3BvbnNlQ29udGFpbmVyWyAwIF0gKTsKCQkJfQoJCX0pOwoKCQkvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uCgkJcy5jb252ZXJ0ZXJzWyJzY3JpcHQganNvbiJdID0gZnVuY3Rpb24oKSB7CgkJCWlmICggIXJlc3BvbnNlQ29udGFpbmVyICkgewoJCQkJalF1ZXJ5LmVycm9yKCBqc29ucENhbGxiYWNrICsgIiB3YXMgbm90IGNhbGxlZCIgKTsKCQkJfQoJCQlyZXR1cm4gcmVzcG9uc2VDb250YWluZXJbIDAgXTsKCQl9OwoKCQkvLyBmb3JjZSBqc29uIGRhdGFUeXBlCgkJcy5kYXRhVHlwZXNbIDAgXSA9ICJqc29uIjsKCgkJLy8gRGVsZWdhdGUgdG8gc2NyaXB0CgkJcmV0dXJuICJzY3JpcHQiOwoJfQp9KTsKCgoKCi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlCmpRdWVyeS5hamF4U2V0dXAoewoJYWNjZXB0czogewoJCXNjcmlwdDogInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0IgoJfSwKCWNvbnRlbnRzOiB7CgkJc2NyaXB0OiAvamF2YXNjcmlwdHxlY21hc2NyaXB0LwoJfSwKCWNvbnZlcnRlcnM6IHsKCQkidGV4dCBzY3JpcHQiOiBmdW5jdGlvbiggdGV4dCApIHsKCQkJalF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTsKCQkJcmV0dXJuIHRleHQ7CgkJfQoJfQp9KTsKCi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgZ2xvYmFsCmpRdWVyeS5hamF4UHJlZmlsdGVyKCAic2NyaXB0IiwgZnVuY3Rpb24oIHMgKSB7CglpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHsKCQlzLmNhY2hlID0gZmFsc2U7Cgl9CglpZiAoIHMuY3Jvc3NEb21haW4gKSB7CgkJcy50eXBlID0gIkdFVCI7CgkJcy5nbG9iYWwgPSBmYWxzZTsKCX0KfSk7CgovLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnQKalF1ZXJ5LmFqYXhUcmFuc3BvcnQoICJzY3JpcHQiLCBmdW5jdGlvbihzKSB7CgoJLy8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1ZXN0cwoJaWYgKCBzLmNyb3NzRG9tYWluICkgewoKCQl2YXIgc2NyaXB0LAoJCQloZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggImhlYWQiIClbMF0gfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwoKCQlyZXR1cm4gewoKCQkJc2VuZDogZnVuY3Rpb24oIF8sIGNhbGxiYWNrICkgewoKCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJzY3JpcHQiICk7CgoJCQkJc2NyaXB0LmFzeW5jID0gImFzeW5jIjsKCgkJCQlpZiAoIHMuc2NyaXB0Q2hhcnNldCApIHsKCQkJCQlzY3JpcHQuY2hhcnNldCA9IHMuc2NyaXB0Q2hhcnNldDsKCQkJCX0KCgkJCQlzY3JpcHQuc3JjID0gcy51cmw7CgoJCQkJLy8gQXR0YWNoIGhhbmRsZXJzIGZvciBhbGwgYnJvd3NlcnMKCQkJCXNjcmlwdC5vbmxvYWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oIF8sIGlzQWJvcnQgKSB7CgoJCQkJCWlmICggaXNBYm9ydCB8fCAhc2NyaXB0LnJlYWR5U3RhdGUgfHwgL2xvYWRlZHxjb21wbGV0ZS8udGVzdCggc2NyaXB0LnJlYWR5U3RhdGUgKSApIHsKCgkJCQkJCS8vIEhhbmRsZSBtZW1vcnkgbGVhayBpbiBJRQoJCQkJCQlzY3JpcHQub25sb2FkID0gc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7CgoJCQkJCQkvLyBSZW1vdmUgdGhlIHNjcmlwdAoJCQkJCQlpZiAoIGhlYWQgJiYgc2NyaXB0LnBhcmVudE5vZGUgKSB7CgkJCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKCQkJCQkJfQoKCQkJCQkJLy8gRGVyZWZlcmVuY2UgdGhlIHNjcmlwdAoJCQkJCQlzY3JpcHQgPSB1bmRlZmluZWQ7CgoJCQkJCQkvLyBDYWxsYmFjayBpZiBub3QgYWJvcnQKCQkJCQkJaWYgKCAhaXNBYm9ydCApIHsKCQkJCQkJCWNhbGxiYWNrKCAyMDAsICJzdWNjZXNzIiApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfTsKCQkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGlsZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgoJCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJhc2Ugbm9kZSBpcyB1c2VkICgjMjcwOSBhbmQgIzQzNzgpLgoJCQkJaGVhZC5pbnNlcnRCZWZvcmUoIHNjcmlwdCwgaGVhZC5maXJzdENoaWxkICk7CgkJCX0sCgoJCQlhYm9ydDogZnVuY3Rpb24oKSB7CgkJCQlpZiAoIHNjcmlwdCApIHsKCQkJCQlzY3JpcHQub25sb2FkKCAwLCAxICk7CgkJCQl9CgkJCX0KCQl9OwoJfQp9KTsKCgoKCnZhciAvLyAjNTI4MDogSW50ZXJuZXQgRXhwbG9yZXIgd2lsbCBrZWVwIGNvbm5lY3Rpb25zIGFsaXZlIGlmIHdlIGRvbid0IGFib3J0IG9uIHVubG9hZAoJeGhyT25VbmxvYWRBYm9ydCA9IHdpbmRvdy5BY3RpdmVYT2JqZWN0ID8gZnVuY3Rpb24oKSB7CgkJLy8gQWJvcnQgYWxsIHBlbmRpbmcgcmVxdWVzdHMKCQlmb3IgKCB2YXIga2V5IGluIHhockNhbGxiYWNrcyApIHsKCQkJeGhyQ2FsbGJhY2tzWyBrZXkgXSggMCwgMSApOwoJCX0KCX0gOiBmYWxzZSwKCXhocklkID0gMCwKCXhockNhbGxiYWNrczsKCi8vIEZ1bmN0aW9ucyB0byBjcmVhdGUgeGhycwpmdW5jdGlvbiBjcmVhdGVTdGFuZGFyZFhIUigpIHsKCXRyeSB7CgkJcmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgpmdW5jdGlvbiBjcmVhdGVBY3RpdmVYSFIoKSB7Cgl0cnkgewoJCXJldHVybiBuZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoICJNaWNyb3NvZnQuWE1MSFRUUCIgKTsKCX0gY2F0Y2goIGUgKSB7fQp9CgovLyBDcmVhdGUgdGhlIHJlcXVlc3Qgb2JqZWN0Ci8vIChUaGlzIGlzIHN0aWxsIGF0dGFjaGVkIHRvIGFqYXhTZXR0aW5ncyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkKalF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSB3aW5kb3cuQWN0aXZlWE9iamVjdCA/CgkvKiBNaWNyb3NvZnQgZmFpbGVkIHRvIHByb3Blcmx5CgkgKiBpbXBsZW1lbnQgdGhlIFhNTEh0dHBSZXF1ZXN0IGluIElFNyAoY2FuJ3QgcmVxdWVzdCBsb2NhbCBmaWxlcyksCgkgKiBzbyB3ZSB1c2UgdGhlIEFjdGl2ZVhPYmplY3Qgd2hlbiBpdCBpcyBhdmFpbGFibGUKCSAqIEFkZGl0aW9uYWxseSBYTUxIdHRwUmVxdWVzdCBjYW4gYmUgZGlzYWJsZWQgaW4gSUU3L0lFOCBzbwoJICogd2UgbmVlZCBhIGZhbGxiYWNrLgoJICovCglmdW5jdGlvbigpIHsKCQlyZXR1cm4gIXRoaXMuaXNMb2NhbCAmJiBjcmVhdGVTdGFuZGFyZFhIUigpIHx8IGNyZWF0ZUFjdGl2ZVhIUigpOwoJfSA6CgkvLyBGb3IgYWxsIG90aGVyIGJyb3dzZXJzLCB1c2UgdGhlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IG9iamVjdAoJY3JlYXRlU3RhbmRhcmRYSFI7CgovLyBEZXRlcm1pbmUgc3VwcG9ydCBwcm9wZXJ0aWVzCihmdW5jdGlvbiggeGhyICkgewoJalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LnN1cHBvcnQsIHsKCQlhamF4OiAhIXhociwKCQljb3JzOiAhIXhociAmJiAoICJ3aXRoQ3JlZGVudGlhbHMiIGluIHhociApCgl9KTsKfSkoIGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCkgKTsKCi8vIENyZWF0ZSB0cmFuc3BvcnQgaWYgdGhlIGJyb3dzZXIgY2FuIHByb3ZpZGUgYW4geGhyCmlmICggalF1ZXJ5LnN1cHBvcnQuYWpheCApIHsKCglqUXVlcnkuYWpheFRyYW5zcG9ydChmdW5jdGlvbiggcyApIHsKCQkvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0CgkJaWYgKCAhcy5jcm9zc0RvbWFpbiB8fCBqUXVlcnkuc3VwcG9ydC5jb3JzICkgewoKCQkJdmFyIGNhbGxiYWNrOwoKCQkJcmV0dXJuIHsKCQkJCXNlbmQ6IGZ1bmN0aW9uKCBoZWFkZXJzLCBjb21wbGV0ZSApIHsKCgkJCQkJLy8gR2V0IGEgbmV3IHhocgoJCQkJCXZhciB4aHIgPSBzLnhocigpLAoJCQkJCQloYW5kbGUsCgkJCQkJCWk7CgoJCQkJCS8vIE9wZW4gdGhlIHNvY2tldAoJCQkJCS8vIFBhc3NpbmcgbnVsbCB1c2VybmFtZSwgZ2VuZXJhdGVzIGEgbG9naW4gcG9wdXAgb24gT3BlcmEgKCMyODY1KQoJCQkJCWlmICggcy51c2VybmFtZSApIHsKCQkJCQkJeGhyLm9wZW4oIHMudHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl4aHIub3Blbiggcy50eXBlLCBzLnVybCwgcy5hc3luYyApOwoJCQkJCX0KCgkJCQkJLy8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZAoJCQkJCWlmICggcy54aHJGaWVsZHMgKSB7CgkJCQkJCWZvciAoIGkgaW4gcy54aHJGaWVsZHMgKSB7CgkJCQkJCQl4aHJbIGkgXSA9IHMueGhyRmllbGRzWyBpIF07CgkJCQkJCX0KCQkJCQl9CgoJCQkJCS8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWQKCQkJCQlpZiAoIHMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7CgkJCQkJCXhoci5vdmVycmlkZU1pbWVUeXBlKCBzLm1pbWVUeXBlICk7CgkJCQkJfQoKCQkJCQkvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlcgoJCQkJCS8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmUKCQkJCQkvLyBha2luIHRvIGEgamlnc2F3IHB1enpsZSwgd2Ugc2ltcGx5IG5ldmVyIHNldCBpdCB0byBiZSBzdXJlLgoJCQkJCS8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKQoJCQkJCS8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLgoJCQkJCWlmICggIXMuY3Jvc3NEb21haW4gJiYgIWhlYWRlcnNbIlgtUmVxdWVzdGVkLVdpdGgiXSApIHsKCQkJCQkJaGVhZGVyc1sgIlgtUmVxdWVzdGVkLVdpdGgiIF0gPSAiWE1MSHR0cFJlcXVlc3QiOwoJCQkJCX0KCgkJCQkJLy8gTmVlZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94IDMKCQkJCQl0cnkgewoJCQkJCQlmb3IgKCBpIGluIGhlYWRlcnMgKSB7CgkJCQkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlciggaSwgaGVhZGVyc1sgaSBdICk7CgkJCQkJCX0KCQkJCQl9IGNhdGNoKCBfICkge30KCgkJCQkJLy8gRG8gc2VuZCB0aGUgcmVxdWVzdAoJCQkJCS8vIFRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGljaCBpcyBhY3R1YWxseQoJCQkJCS8vIGhhbmRsZWQgaW4galF1ZXJ5LmFqYXggKHNvIG5vIHRyeS9jYXRjaCBoZXJlKQoJCQkJCXhoci5zZW5kKCAoIHMuaGFzQ29udGVudCAmJiBzLmRhdGEgKSB8fCBudWxsICk7CgoJCQkJCS8vIExpc3RlbmVyCgkJCQkJY2FsbGJhY2sgPSBmdW5jdGlvbiggXywgaXNBYm9ydCApIHsKCgkJCQkJCXZhciBzdGF0dXMsCgkJCQkJCQlzdGF0dXNUZXh0LAoJCQkJCQkJcmVzcG9uc2VIZWFkZXJzLAoJCQkJCQkJcmVzcG9uc2VzLAoJCQkJCQkJeG1sOwoKCQkJCQkJLy8gRmlyZWZveCB0aHJvd3MgZXhjZXB0aW9ucyB3aGVuIGFjY2Vzc2luZyBwcm9wZXJ0aWVzCgkJCQkJCS8vIG9mIGFuIHhociB3aGVuIGEgbmV0d29yayBlcnJvciBvY2N1cmVkCgkJCQkJCS8vIGh0dHA6Ly9oZWxwZnVsLmtub2JzLWRpYWxzLmNvbS9pbmRleC5waHAvQ29tcG9uZW50X3JldHVybmVkX2ZhaWx1cmVfY29kZTpfMHg4MDA0MDExMV8oTlNfRVJST1JfTk9UX0FWQUlMQUJMRSkKCQkJCQkJdHJ5IHsKCgkJCQkJCQkvLyBXYXMgbmV2ZXIgY2FsbGVkIGFuZCBpcyBhYm9ydGVkIG9yIGNvbXBsZXRlCgkJCQkJCQlpZiAoIGNhbGxiYWNrICYmICggaXNBYm9ydCB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApICkgewoKCQkJCQkJCQkvLyBPbmx5IGNhbGxlZCBvbmNlCgkJCQkJCQkJY2FsbGJhY2sgPSB1bmRlZmluZWQ7CgoJCQkJCQkJCS8vIERvIG5vdCBrZWVwIGFzIGFjdGl2ZSBhbnltb3JlCgkJCQkJCQkJaWYgKCBoYW5kbGUgKSB7CgkJCQkJCQkJCXhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBqUXVlcnkubm9vcDsKCQkJCQkJCQkJaWYgKCB4aHJPblVubG9hZEFib3J0ICkgewoJCQkJCQkJCQkJZGVsZXRlIHhockNhbGxiYWNrc1sgaGFuZGxlIF07CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgoJCQkJCQkJCS8vIElmIGl0J3MgYW4gYWJvcnQKCQkJCQkJCQlpZiAoIGlzQWJvcnQgKSB7CgkJCQkJCQkJCS8vIEFib3J0IGl0IG1hbnVhbGx5IGlmIG5lZWRlZAoJCQkJCQkJCQlpZiAoIHhoci5yZWFkeVN0YXRlICE9PSA0ICkgewoJCQkJCQkJCQkJeGhyLmFib3J0KCk7CgkJCQkJCQkJCX0KCQkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCQlzdGF0dXMgPSB4aHIuc3RhdHVzOwoJCQkJCQkJCQlyZXNwb25zZUhlYWRlcnMgPSB4aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CgkJCQkJCQkJCXJlc3BvbnNlcyA9IHt9OwoJCQkJCQkJCQl4bWwgPSB4aHIucmVzcG9uc2VYTUw7CgoJCQkJCQkJCQkvLyBDb25zdHJ1Y3QgcmVzcG9uc2UgbGlzdAoJCQkJCQkJCQlpZiAoIHhtbCAmJiB4bWwuZG9jdW1lbnRFbGVtZW50IC8qICM0OTU4ICovICkgewoJCQkJCQkJCQkJcmVzcG9uc2VzLnhtbCA9IHhtbDsKCQkJCQkJCQkJfQoJCQkJCQkJCQlyZXNwb25zZXMudGV4dCA9IHhoci5yZXNwb25zZVRleHQ7CgoJCQkJCQkJCQkvLyBGaXJlZm94IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhY2Nlc3NpbmcKCQkJCQkJCQkJLy8gc3RhdHVzVGV4dCBmb3IgZmF1bHR5IGNyb3NzLWRvbWFpbiByZXF1ZXN0cwoJCQkJCQkJCQl0cnkgewoJCQkJCQkJCQkJc3RhdHVzVGV4dCA9IHhoci5zdGF0dXNUZXh0OwoJCQkJCQkJCQl9IGNhdGNoKCBlICkgewoJCQkJCQkJCQkJLy8gV2Ugbm9ybWFsaXplIHdpdGggV2Via2l0IGdpdmluZyBhbiBlbXB0eSBzdGF0dXNUZXh0CgkJCQkJCQkJCQlzdGF0dXNUZXh0ID0gIiI7CgkJCQkJCQkJCX0KCgkJCQkJCQkJCS8vIEZpbHRlciBzdGF0dXMgZm9yIG5vbiBzdGFuZGFyZCBiZWhhdmlvcnMKCgkJCQkJCQkJCS8vIElmIHRoZSByZXF1ZXN0IGlzIGxvY2FsIGFuZCB3ZSBoYXZlIGRhdGE6IGFzc3VtZSBhIHN1Y2Nlc3MKCQkJCQkJCQkJLy8gKHN1Y2Nlc3Mgd2l0aCBubyBkYXRhIHdvbid0IGdldCBub3RpZmllZCwgdGhhdCdzIHRoZSBiZXN0IHdlCgkJCQkJCQkJCS8vIGNhbiBkbyBnaXZlbiBjdXJyZW50IGltcGxlbWVudGF0aW9ucykKCQkJCQkJCQkJaWYgKCAhc3RhdHVzICYmIHMuaXNMb2NhbCAmJiAhcy5jcm9zc0RvbWFpbiApIHsKCQkJCQkJCQkJCXN0YXR1cyA9IHJlc3BvbnNlcy50ZXh0ID8gMjAwIDogNDA0OwoJCQkJCQkJCQkvLyBJRSAtICMxNDUwOiBzb21ldGltZXMgcmV0dXJucyAxMjIzIHdoZW4gaXQgc2hvdWxkIGJlIDIwNAoJCQkJCQkJCQl9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDEyMjMgKSB7CgkJCQkJCQkJCQlzdGF0dXMgPSAyMDQ7CgkJCQkJCQkJCX0KCQkJCQkJCQl9CgkJCQkJCQl9CgkJCQkJCX0gY2F0Y2goIGZpcmVmb3hBY2Nlc3NFeGNlcHRpb24gKSB7CgkJCQkJCQlpZiAoICFpc0Fib3J0ICkgewoJCQkJCQkJCWNvbXBsZXRlKCAtMSwgZmlyZWZveEFjY2Vzc0V4Y2VwdGlvbiApOwoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQkvLyBDYWxsIGNvbXBsZXRlIGlmIG5lZWRlZAoJCQkJCQlpZiAoIHJlc3BvbnNlcyApIHsKCQkJCQkJCWNvbXBsZXRlKCBzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzICk7CgkJCQkJCX0KCQkJCQl9OwoKCQkJCQkvLyBpZiB3ZSdyZSBpbiBzeW5jIG1vZGUgb3IgaXQncyBpbiBjYWNoZQoJCQkJCS8vIGFuZCBoYXMgYmVlbiByZXRyaWV2ZWQgZGlyZWN0bHkgKElFNiAmIElFNykKCQkJCQkvLyB3ZSBuZWVkIHRvIG1hbnVhbGx5IGZpcmUgdGhlIGNhbGxiYWNrCgkJCQkJaWYgKCAhcy5hc3luYyB8fCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHsKCQkJCQkJY2FsbGJhY2soKTsKCQkJCQl9IGVsc2UgewoJCQkJCQloYW5kbGUgPSArK3hocklkOwoJCQkJCQlpZiAoIHhock9uVW5sb2FkQWJvcnQgKSB7CgkJCQkJCQkvLyBDcmVhdGUgdGhlIGFjdGl2ZSB4aHJzIGNhbGxiYWNrcyBsaXN0IGlmIG5lZWRlZAoJCQkJCQkJLy8gYW5kIGF0dGFjaCB0aGUgdW5sb2FkIGhhbmRsZXIKCQkJCQkJCWlmICggIXhockNhbGxiYWNrcyApIHsKCQkJCQkJCQl4aHJDYWxsYmFja3MgPSB7fTsKCQkJCQkJCQlqUXVlcnkoIHdpbmRvdyApLnVubG9hZCggeGhyT25VbmxvYWRBYm9ydCApOwoJCQkJCQkJfQoJCQkJCQkJLy8gQWRkIHRvIGxpc3Qgb2YgYWN0aXZlIHhocnMgY2FsbGJhY2tzCgkJCQkJCQl4aHJDYWxsYmFja3NbIGhhbmRsZSBdID0gY2FsbGJhY2s7CgkJCQkJCX0KCQkJCQkJeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGNhbGxiYWNrOwoJCQkJCX0KCQkJCX0sCgoJCQkJYWJvcnQ6IGZ1bmN0aW9uKCkgewoJCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJCWNhbGxiYWNrKDAsMSk7CgkJCQkJfQoJCQkJfQoJCQl9OwoJCX0KCX0pOwp9CgoKCgp2YXIgZWxlbWRpc3BsYXkgPSB7fSwKCWlmcmFtZSwgaWZyYW1lRG9jLAoJcmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sCglyZnhudW0gPSAvXihbK1wtXT0pPyhbXGQrLlwtXSspKFthLXolXSopJC9pLAoJdGltZXJJZCwKCWZ4QXR0cnMgPSBbCgkJLy8gaGVpZ2h0IGFuaW1hdGlvbnMKCQlbICJoZWlnaHQiLCAibWFyZ2luVG9wIiwgIm1hcmdpbkJvdHRvbSIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJLy8gd2lkdGggYW5pbWF0aW9ucwoJCVsgIndpZHRoIiwgIm1hcmdpbkxlZnQiLCAibWFyZ2luUmlnaHQiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoJCS8vIG9wYWNpdHkgYW5pbWF0aW9ucwoJCVsgIm9wYWNpdHkiIF0KCV0sCglmeE5vdzsKCmpRdWVyeS5mbi5leHRlbmQoewoJc2hvdzogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBlbGVtLCBkaXNwbGF5OwoKCQlpZiAoIHNwZWVkIHx8IHNwZWVkID09PSAwICkgewoJCQlyZXR1cm4gdGhpcy5hbmltYXRlKCBnZW5GeCgic2hvdyIsIDMpLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayk7CgoJCX0gZWxzZSB7CgkJCWZvciAoIHZhciBpID0gMCwgaiA9IHRoaXMubGVuZ3RoOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCS8vIFJlc2V0IHRoZSBpbmxpbmUgZGlzcGxheSBvZiB0aGlzIGVsZW1lbnQgdG8gbGVhcm4gaWYgaXQgaXMKCQkJCQkvLyBiZWluZyBoaWRkZW4gYnkgY2FzY2FkZWQgcnVsZXMgb3Igbm90CgkJCQkJaWYgKCAhalF1ZXJ5Ll9kYXRhKGVsZW0sICJvbGRkaXNwbGF5IikgJiYgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQlkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5ID0gIiI7CgkJCQkJfQoKCQkJCQkvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lCgkJCQkJLy8gaW4gYSBzdHlsZXNoZWV0IHRvIHdoYXRldmVyIHRoZSBkZWZhdWx0IGJyb3dzZXIgc3R5bGUgaXMKCQkJCQkvLyBmb3Igc3VjaCBhbiBlbGVtZW50CgkJCQkJaWYgKCBkaXNwbGF5ID09PSAiIiAmJiBqUXVlcnkuY3NzKCBlbGVtLCAiZGlzcGxheSIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiLCBkZWZhdWx0RGlzcGxheShlbGVtLm5vZGVOYW1lKSk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgbW9zdCBvZiB0aGUgZWxlbWVudHMgaW4gYSBzZWNvbmQgbG9vcAoJCQkvLyB0byBhdm9pZCB0aGUgY29uc3RhbnQgcmVmbG93CgkJCWZvciAoIGkgPSAwOyBpIDwgajsgaSsrICkgewoJCQkJZWxlbSA9IHRoaXNbaV07CgoJCQkJaWYgKCBlbGVtLnN0eWxlICkgewoJCQkJCWRpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXk7CgoJCQkJCWlmICggZGlzcGxheSA9PT0gIiIgfHwgZGlzcGxheSA9PT0gIm5vbmUiICkgewoJCQkJCQllbGVtLnN0eWxlLmRpc3BsYXkgPSBqUXVlcnkuX2RhdGEoZWxlbSwgIm9sZGRpc3BsYXkiKSB8fCAiIjsKCQkJCQl9CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJaGlkZTogZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCWlmICggc3BlZWQgfHwgc3BlZWQgPT09IDAgKSB7CgkJCXJldHVybiB0aGlzLmFuaW1hdGUoIGdlbkZ4KCJoaWRlIiwgMyksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCgkJfSBlbHNlIHsKCQkJZm9yICggdmFyIGkgPSAwLCBqID0gdGhpcy5sZW5ndGg7IGkgPCBqOyBpKysgKSB7CgkJCQlpZiAoIHRoaXNbaV0uc3R5bGUgKSB7CgkJCQkJdmFyIGRpc3BsYXkgPSBqUXVlcnkuY3NzKCB0aGlzW2ldLCAiZGlzcGxheSIgKTsKCgkJCQkJaWYgKCBkaXNwbGF5ICE9PSAibm9uZSIgJiYgIWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiICkgKSB7CgkJCQkJCWpRdWVyeS5fZGF0YSggdGhpc1tpXSwgIm9sZGRpc3BsYXkiLCBkaXNwbGF5ICk7CgkJCQkJfQoJCQkJfQoJCQl9CgoJCQkvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AKCQkJLy8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvdwoJCQlmb3IgKCBpID0gMDsgaSA8IGo7IGkrKyApIHsKCQkJCWlmICggdGhpc1tpXS5zdHlsZSApIHsKCQkJCQl0aGlzW2ldLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CgkJCQl9CgkJCX0KCgkJCXJldHVybiB0aGlzOwoJCX0KCX0sCgoJLy8gU2F2ZSB0aGUgb2xkIHRvZ2dsZSBmdW5jdGlvbgoJX3RvZ2dsZTogalF1ZXJ5LmZuLnRvZ2dsZSwKCgl0b2dnbGU6IGZ1bmN0aW9uKCBmbiwgZm4yLCBjYWxsYmFjayApIHsKCQl2YXIgYm9vbCA9IHR5cGVvZiBmbiA9PT0gImJvb2xlYW4iOwoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKGZuKSAmJiBqUXVlcnkuaXNGdW5jdGlvbihmbjIpICkgewoJCQl0aGlzLl90b2dnbGUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQl9IGVsc2UgaWYgKCBmbiA9PSBudWxsIHx8IGJvb2wgKSB7CgkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBzdGF0ZSA9IGJvb2wgPyBmbiA6IGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpOwoJCQkJalF1ZXJ5KHRoaXMpWyBzdGF0ZSA/ICJzaG93IiA6ICJoaWRlIiBdKCk7CgkJCX0pOwoKCQl9IGVsc2UgewoJCQl0aGlzLmFuaW1hdGUoZ2VuRngoInRvZ2dsZSIsIDMpLCBmbiwgZm4yLCBjYWxsYmFjayk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCgoJZmFkZVRvOiBmdW5jdGlvbiggc3BlZWQsIHRvLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmZpbHRlcigiOmhpZGRlbiIpLmNzcygib3BhY2l0eSIsIDApLnNob3coKS5lbmQoKQoJCQkJCS5hbmltYXRlKHtvcGFjaXR5OiB0b30sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrKTsKCX0sCgoJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXZhciBvcHRhbGwgPSBqUXVlcnkuc3BlZWQoc3BlZWQsIGVhc2luZywgY2FsbGJhY2spOwoKCQlpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBwcm9wICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goIG9wdGFsbC5jb21wbGV0ZSwgWyBmYWxzZSBdICk7CgkJfQoKCQkvLyBEbyBub3QgY2hhbmdlIHJlZmVyZW5jZWQgcHJvcGVydGllcyBhcyBwZXItcHJvcGVydHkgZWFzaW5nIHdpbGwgYmUgbG9zdAoJCXByb3AgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcCApOwoKCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpIHsKCQkJLy8gWFhYICd0aGlzJyBkb2VzIG5vdCBhbHdheXMgaGF2ZSBhIG5vZGVOYW1lIHdoZW4gcnVubmluZyB0aGUKCQkJLy8gdGVzdCBzdWl0ZQoKCQkJaWYgKCBvcHRhbGwucXVldWUgPT09IGZhbHNlICkgewoJCQkJalF1ZXJ5Ll9tYXJrKCB0aGlzICk7CgkJCX0KCgkJCXZhciBvcHQgPSBqUXVlcnkuZXh0ZW5kKCB7fSwgb3B0YWxsICksCgkJCQlpc0VsZW1lbnQgPSB0aGlzLm5vZGVUeXBlID09PSAxLAoJCQkJaGlkZGVuID0gaXNFbGVtZW50ICYmIGpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLAoJCQkJbmFtZSwgdmFsLCBwLAoJCQkJZGlzcGxheSwgZSwKCQkJCXBhcnRzLCBzdGFydCwgZW5kLCB1bml0OwoKCQkJLy8gd2lsbCBzdG9yZSBwZXIgcHJvcGVydHkgZWFzaW5nIGFuZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGVuIGFuIGFuaW1hdGlvbiBpcyBjb21wbGV0ZQoJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzID0ge307CgoJCQlmb3IgKCBwIGluIHByb3AgKSB7CgoJCQkJLy8gcHJvcGVydHkgbmFtZSBub3JtYWxpemF0aW9uCgkJCQluYW1lID0galF1ZXJ5LmNhbWVsQ2FzZSggcCApOwoJCQkJaWYgKCBwICE9PSBuYW1lICkgewoJCQkJCXByb3BbIG5hbWUgXSA9IHByb3BbIHAgXTsKCQkJCQlkZWxldGUgcHJvcFsgcCBdOwoJCQkJfQoKCQkJCXZhbCA9IHByb3BbIG5hbWUgXTsKCgkJCQkvLyBlYXNpbmcgcmVzb2x1dGlvbjogcGVyIHByb3BlcnR5ID4gb3B0LnNwZWNpYWxFYXNpbmcgPiBvcHQuZWFzaW5nID4gJ3N3aW5nJyAoZGVmYXVsdCkKCQkJCWlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkgewoJCQkJCW9wdC5hbmltYXRlZFByb3BlcnRpZXNbIG5hbWUgXSA9IHZhbFsgMSBdOwoJCQkJCXZhbCA9IHByb3BbIG5hbWUgXSA9IHZhbFsgMCBdOwoJCQkJfSBlbHNlIHsKCQkJCQlvcHQuYW5pbWF0ZWRQcm9wZXJ0aWVzWyBuYW1lIF0gPSBvcHQuc3BlY2lhbEVhc2luZyAmJiBvcHQuc3BlY2lhbEVhc2luZ1sgbmFtZSBdIHx8IG9wdC5lYXNpbmcgfHwgJ3N3aW5nJzsKCQkJCX0KCgkJCQlpZiAoIHZhbCA9PT0gImhpZGUiICYmIGhpZGRlbiB8fCB2YWwgPT09ICJzaG93IiAmJiAhaGlkZGVuICkgewoJCQkJCXJldHVybiBvcHQuY29tcGxldGUuY2FsbCggdGhpcyApOwoJCQkJfQoKCQkJCWlmICggaXNFbGVtZW50ICYmICggbmFtZSA9PT0gImhlaWdodCIgfHwgbmFtZSA9PT0gIndpZHRoIiApICkgewoJCQkJCS8vIE1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgc25lYWtzIG91dAoJCQkJCS8vIFJlY29yZCBhbGwgMyBvdmVyZmxvdyBhdHRyaWJ1dGVzIGJlY2F1c2UgSUUgZG9lcyBub3QKCQkJCQkvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmQKCQkJCQkvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZQoJCQkJCW9wdC5vdmVyZmxvdyA9IFsgdGhpcy5zdHlsZS5vdmVyZmxvdywgdGhpcy5zdHlsZS5vdmVyZmxvd1gsIHRoaXMuc3R5bGUub3ZlcmZsb3dZIF07CgoJCQkJCS8vIFNldCBkaXNwbGF5IHByb3BlcnR5IHRvIGlubGluZS1ibG9jayBmb3IgaGVpZ2h0L3dpZHRoCgkJCQkJLy8gYW5pbWF0aW9ucyBvbiBpbmxpbmUgZWxlbWVudHMgdGhhdCBhcmUgaGF2aW5nIHdpZHRoL2hlaWdodAoJCQkJCS8vIGFuaW1hdGVkCgkJCQkJaWYgKCBqUXVlcnkuY3NzKCB0aGlzLCAiZGlzcGxheSIgKSA9PT0gImlubGluZSIgJiYKCQkJCQkJCWpRdWVyeS5jc3MoIHRoaXMsICJmbG9hdCIgKSA9PT0gIm5vbmUiICkgewoJCQkJCQlpZiAoICFqUXVlcnkuc3VwcG9ydC5pbmxpbmVCbG9ja05lZWRzTGF5b3V0ICkgewoJCQkJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gImlubGluZS1ibG9jayI7CgoJCQkJCQl9IGVsc2UgewoJCQkJCQkJZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5KCB0aGlzLm5vZGVOYW1lICk7CgoJCQkJCQkJLy8gaW5saW5lLWxldmVsIGVsZW1lbnRzIGFjY2VwdCBpbmxpbmUtYmxvY2s7CgkJCQkJCQkvLyBibG9jay1sZXZlbCBlbGVtZW50cyBuZWVkIHRvIGJlIGlubGluZSB3aXRoIGxheW91dAoJCQkJCQkJaWYgKCBkaXNwbGF5ID09PSAiaW5saW5lIiApIHsKCQkJCQkJCQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAiaW5saW5lLWJsb2NrIjsKCgkJCQkJCQl9IGVsc2UgewoJCQkJCQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9ICJpbmxpbmUiOwoJCQkJCQkJCXRoaXMuc3R5bGUuem9vbSA9IDE7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCX0KCgkJCWlmICggb3B0Lm92ZXJmbG93ICE9IG51bGwgKSB7CgkJCQl0aGlzLnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CgkJCX0KCgkJCWZvciAoIHAgaW4gcHJvcCApIHsKCQkJCWUgPSBuZXcgalF1ZXJ5LmZ4KCB0aGlzLCBvcHQsIHAgKTsKCQkJCXZhbCA9IHByb3BbIHAgXTsKCgkJCQlpZiAoIHJmeHR5cGVzLnRlc3QodmFsKSApIHsKCQkJCQllWyB2YWwgPT09ICJ0b2dnbGUiID8gaGlkZGVuID8gInNob3ciIDogImhpZGUiIDogdmFsIF0oKTsKCgkJCQl9IGVsc2UgewoJCQkJCXBhcnRzID0gcmZ4bnVtLmV4ZWMoIHZhbCApOwoJCQkJCXN0YXJ0ID0gZS5jdXIoKTsKCgkJCQkJaWYgKCBwYXJ0cyApIHsKCQkJCQkJZW5kID0gcGFyc2VGbG9hdCggcGFydHNbMl0gKTsKCQkJCQkJdW5pdCA9IHBhcnRzWzNdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcCBdID8gIiIgOiAicHgiICk7CgoJCQkJCQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKCQkJCQkJaWYgKCB1bml0ICE9PSAicHgiICkgewoJCQkJCQkJalF1ZXJ5LnN0eWxlKCB0aGlzLCBwLCAoZW5kIHx8IDEpICsgdW5pdCk7CgkJCQkJCQlzdGFydCA9ICgoZW5kIHx8IDEpIC8gZS5jdXIoKSkgKiBzdGFydDsKCQkJCQkJCWpRdWVyeS5zdHlsZSggdGhpcywgcCwgc3RhcnQgKyB1bml0KTsKCQkJCQkJfQoKCQkJCQkJLy8gSWYgYSArPS8tPSB0b2tlbiB3YXMgcHJvdmlkZWQsIHdlJ3JlIGRvaW5nIGEgcmVsYXRpdmUgYW5pbWF0aW9uCgkJCQkJCWlmICggcGFydHNbMV0gKSB7CgkJCQkJCQllbmQgPSAoIChwYXJ0c1sgMSBdID09PSAiLT0iID8gLTEgOiAxKSAqIGVuZCApICsgc3RhcnQ7CgkJCQkJCX0KCgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgZW5kLCB1bml0ICk7CgoJCQkJCX0gZWxzZSB7CgkJCQkJCWUuY3VzdG9tKCBzdGFydCwgdmFsLCAiIiApOwoJCQkJCX0KCQkJCX0KCQkJfQoKCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNlCgkJCXJldHVybiB0cnVlOwoJCX0pOwoJfSwKCglzdG9wOiBmdW5jdGlvbiggY2xlYXJRdWV1ZSwgZ290b0VuZCApIHsKCQlpZiAoIGNsZWFyUXVldWUgKSB7CgkJCXRoaXMucXVldWUoW10pOwoJCX0KCgkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVycywKCQkJCWkgPSB0aW1lcnMubGVuZ3RoOwoJCQkvLyBjbGVhciBtYXJrZXIgY291bnRlcnMgaWYgd2Uga25vdyB0aGV5IHdvbid0IGJlCgkJCWlmICggIWdvdG9FbmQgKSB7CgkJCQlqUXVlcnkuX3VubWFyayggdHJ1ZSwgdGhpcyApOwoJCQl9CgkJCXdoaWxlICggaS0tICkgewoJCQkJaWYgKCB0aW1lcnNbaV0uZWxlbSA9PT0gdGhpcyApIHsKCQkJCQlpZiAoZ290b0VuZCkgewoJCQkJCQkvLyBmb3JjZSB0aGUgbmV4dCBzdGVwIHRvIGJlIHRoZSBsYXN0CgkJCQkJCXRpbWVyc1tpXSh0cnVlKTsKCQkJCQl9CgoJCQkJCXRpbWVycy5zcGxpY2UoaSwgMSk7CgkJCQl9CgkJCX0KCQl9KTsKCgkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlmIHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAoJCWlmICggIWdvdG9FbmQgKSB7CgkJCXRoaXMuZGVxdWV1ZSgpOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9Cgp9KTsKCi8vIEFuaW1hdGlvbnMgY3JlYXRlZCBzeW5jaHJvbm91c2x5IHdpbGwgcnVuIHN5bmNocm9ub3VzbHkKZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7CglzZXRUaW1lb3V0KCBjbGVhckZ4Tm93LCAwICk7CglyZXR1cm4gKCBmeE5vdyA9IGpRdWVyeS5ub3coKSApOwp9CgpmdW5jdGlvbiBjbGVhckZ4Tm93KCkgewoJZnhOb3cgPSB1bmRlZmluZWQ7Cn0KCi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uCmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBudW0gKSB7Cgl2YXIgb2JqID0ge307CgoJalF1ZXJ5LmVhY2goIGZ4QXR0cnMuY29uY2F0LmFwcGx5KFtdLCBmeEF0dHJzLnNsaWNlKDAsbnVtKSksIGZ1bmN0aW9uKCkgewoJCW9ialsgdGhpcyBdID0gdHlwZTsKCX0pOwoKCXJldHVybiBvYmo7Cn0KCi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnMKalF1ZXJ5LmVhY2goewoJc2xpZGVEb3duOiBnZW5GeCgic2hvdyIsIDEpLAoJc2xpZGVVcDogZ2VuRngoImhpZGUiLCAxKSwKCXNsaWRlVG9nZ2xlOiBnZW5GeCgidG9nZ2xlIiwgMSksCglmYWRlSW46IHsgb3BhY2l0eTogInNob3ciIH0sCglmYWRlT3V0OiB7IG9wYWNpdHk6ICJoaWRlIiB9LAoJZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiAidG9nZ2xlIiB9Cn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCWpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkgewoJCXJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApOwoJfTsKfSk7CgpqUXVlcnkuZXh0ZW5kKHsKCXNwZWVkOiBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7CgkJdmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gIm9iamVjdCIgPyBqUXVlcnkuZXh0ZW5kKHt9LCBzcGVlZCkgOiB7CgkJCWNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8CgkJCQlqUXVlcnkuaXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCwKCQkJZHVyYXRpb246IHNwZWVkLAoJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWpRdWVyeS5pc0Z1bmN0aW9uKGVhc2luZykgJiYgZWFzaW5nCgkJfTsKCgkJb3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4Lm9mZiA/IDAgOiB0eXBlb2Ygb3B0LmR1cmF0aW9uID09PSAibnVtYmVyIiA/IG9wdC5kdXJhdGlvbiA6CgkJCW9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzID8galF1ZXJ5LmZ4LnNwZWVkc1tvcHQuZHVyYXRpb25dIDogalF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDsKCgkJLy8gUXVldWVpbmcKCQlvcHQub2xkID0gb3B0LmNvbXBsZXRlOwoJCW9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCBub1VubWFyayApIHsKCQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkgewoJCQkJb3B0Lm9sZC5jYWxsKCB0aGlzICk7CgkJCX0KCgkJCWlmICggb3B0LnF1ZXVlICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5kZXF1ZXVlKCB0aGlzICk7CgkJCX0gZWxzZSBpZiAoIG5vVW5tYXJrICE9PSBmYWxzZSApIHsKCQkJCWpRdWVyeS5fdW5tYXJrKCB0aGlzICk7CgkJCX0KCQl9OwoKCQlyZXR1cm4gb3B0OwoJfSwKCgllYXNpbmc6IHsKCQlsaW5lYXI6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwgZGlmZiApIHsKCQkJcmV0dXJuIGZpcnN0TnVtICsgZGlmZiAqIHA7CgkJfSwKCQlzd2luZzogZnVuY3Rpb24oIHAsIG4sIGZpcnN0TnVtLCBkaWZmICkgewoJCQlyZXR1cm4gKCgtTWF0aC5jb3MocCpNYXRoLlBJKS8yKSArIDAuNSkgKiBkaWZmICsgZmlyc3ROdW07CgkJfQoJfSwKCgl0aW1lcnM6IFtdLAoKCWZ4OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgcHJvcCApIHsKCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwoJCXRoaXMuZWxlbSA9IGVsZW07CgkJdGhpcy5wcm9wID0gcHJvcDsKCgkJb3B0aW9ucy5vcmlnID0gb3B0aW9ucy5vcmlnIHx8IHt9OwoJfQoKfSk7CgpqUXVlcnkuZngucHJvdG90eXBlID0gewoJLy8gU2ltcGxlIGZ1bmN0aW9uIGZvciBzZXR0aW5nIGEgc3R5bGUgdmFsdWUKCXVwZGF0ZTogZnVuY3Rpb24oKSB7CgkJaWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHsKCQkJdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApOwoJCX0KCgkJKGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF0gfHwgalF1ZXJ5LmZ4LnN0ZXAuX2RlZmF1bHQpKCB0aGlzICk7Cgl9LAoKCS8vIEdldCB0aGUgY3VycmVudCBzaXplCgljdXI6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy5lbGVtW3RoaXMucHJvcF0gIT0gbnVsbCAmJiAoIXRoaXMuZWxlbS5zdHlsZSB8fCB0aGlzLmVsZW0uc3R5bGVbdGhpcy5wcm9wXSA9PSBudWxsKSApIHsKCQkJcmV0dXJuIHRoaXMuZWxlbVsgdGhpcy5wcm9wIF07CgkJfQoKCQl2YXIgcGFyc2VkLAoJCQlyID0galF1ZXJ5LmNzcyggdGhpcy5lbGVtLCB0aGlzLnByb3AgKTsKCQkvLyBFbXB0eSBzdHJpbmdzLCBudWxsLCB1bmRlZmluZWQgYW5kICJhdXRvIiBhcmUgY29udmVydGVkIHRvIDAsCgkJLy8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyAicm90YXRlKDFyYWQpIiBhcmUgcmV0dXJuZWQgYXMgaXMsCgkJLy8gc2ltcGxlIHZhbHVlcyBzdWNoIGFzICIxMHB4IiBhcmUgcGFyc2VkIHRvIEZsb2F0LgoJCXJldHVybiBpc05hTiggcGFyc2VkID0gcGFyc2VGbG9hdCggciApICkgPyAhciB8fCByID09PSAiYXV0byIgPyAwIDogciA6IHBhcnNlZDsKCX0sCgoJLy8gU3RhcnQgYW4gYW5pbWF0aW9uIGZyb20gb25lIG51bWJlciB0byBhbm90aGVyCgljdXN0b206IGZ1bmN0aW9uKCBmcm9tLCB0bywgdW5pdCApIHsKCQl2YXIgc2VsZiA9IHRoaXMsCgkJCWZ4ID0galF1ZXJ5LmZ4OwoKCQl0aGlzLnN0YXJ0VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCk7CgkJdGhpcy5zdGFydCA9IGZyb207CgkJdGhpcy5lbmQgPSB0bzsKCQl0aGlzLnVuaXQgPSB1bml0IHx8IHRoaXMudW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHRoaXMucHJvcCBdID8gIiIgOiAicHgiICk7CgkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0OwoJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDA7CgoJCWZ1bmN0aW9uIHQoIGdvdG9FbmQgKSB7CgkJCXJldHVybiBzZWxmLnN0ZXAoZ290b0VuZCk7CgkJfQoKCQl0LmVsZW0gPSB0aGlzLmVsZW07CgoJCWlmICggdCgpICYmIGpRdWVyeS50aW1lcnMucHVzaCh0KSAmJiAhdGltZXJJZCApIHsKCQkJdGltZXJJZCA9IHNldEludGVydmFsKCBmeC50aWNrLCBmeC5pbnRlcnZhbCApOwoJCX0KCX0sCgoJLy8gU2ltcGxlICdzaG93JyBmdW5jdGlvbgoJc2hvdzogZnVuY3Rpb24oKSB7CgkJLy8gUmVtZW1iZXIgd2hlcmUgd2Ugc3RhcnRlZCwgc28gdGhhdCB3ZSBjYW4gZ28gYmFjayB0byBpdCBsYXRlcgoJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnkuc3R5bGUoIHRoaXMuZWxlbSwgdGhpcy5wcm9wICk7CgkJdGhpcy5vcHRpb25zLnNob3cgPSB0cnVlOwoKCQkvLyBCZWdpbiB0aGUgYW5pbWF0aW9uCgkJLy8gTWFrZSBzdXJlIHRoYXQgd2Ugc3RhcnQgYXQgYSBzbWFsbCB3aWR0aC9oZWlnaHQgdG8gYXZvaWQgYW55CgkJLy8gZmxhc2ggb2YgY29udGVudAoJCXRoaXMuY3VzdG9tKHRoaXMucHJvcCA9PT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT09ICJoZWlnaHQiID8gMSA6IDAsIHRoaXMuY3VyKCkpOwoKCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBlbGVtZW50CgkJalF1ZXJ5KCB0aGlzLmVsZW0gKS5zaG93KCk7Cgl9LAoKCS8vIFNpbXBsZSAnaGlkZScgZnVuY3Rpb24KCWhpZGU6IGZ1bmN0aW9uKCkgewoJCS8vIFJlbWVtYmVyIHdoZXJlIHdlIHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKCQl0aGlzLm9wdGlvbnMub3JpZ1t0aGlzLnByb3BdID0galF1ZXJ5LnN0eWxlKCB0aGlzLmVsZW0sIHRoaXMucHJvcCApOwoJCXRoaXMub3B0aW9ucy5oaWRlID0gdHJ1ZTsKCgkJLy8gQmVnaW4gdGhlIGFuaW1hdGlvbgoJCXRoaXMuY3VzdG9tKHRoaXMuY3VyKCksIDApOwoJfSwKCgkvLyBFYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCglzdGVwOiBmdW5jdGlvbiggZ290b0VuZCApIHsKCQl2YXIgdCA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksCgkJCWRvbmUgPSB0cnVlLAoJCQllbGVtID0gdGhpcy5lbGVtLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlpLCBuOwoKCQlpZiAoIGdvdG9FbmQgfHwgdCA+PSBvcHRpb25zLmR1cmF0aW9uICsgdGhpcy5zdGFydFRpbWUgKSB7CgkJCXRoaXMubm93ID0gdGhpcy5lbmQ7CgkJCXRoaXMucG9zID0gdGhpcy5zdGF0ZSA9IDE7CgkJCXRoaXMudXBkYXRlKCk7CgoJCQlvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gPSB0cnVlOwoKCQkJZm9yICggaSBpbiBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllcyApIHsKCQkJCWlmICggb3B0aW9ucy5hbmltYXRlZFByb3BlcnRpZXNbaV0gIT09IHRydWUgKSB7CgkJCQkJZG9uZSA9IGZhbHNlOwoJCQkJfQoJCQl9CgoJCQlpZiAoIGRvbmUgKSB7CgkJCQkvLyBSZXNldCB0aGUgb3ZlcmZsb3cKCQkJCWlmICggb3B0aW9ucy5vdmVyZmxvdyAhPSBudWxsICYmICFqUXVlcnkuc3VwcG9ydC5zaHJpbmtXcmFwQmxvY2tzICkgewoKCQkJCQlqUXVlcnkuZWFjaCggWyAiIiwgIlgiLCAiWSIgXSwgZnVuY3Rpb24gKGluZGV4LCB2YWx1ZSkgewoJCQkJCQllbGVtLnN0eWxlWyAib3ZlcmZsb3ciICsgdmFsdWUgXSA9IG9wdGlvbnMub3ZlcmZsb3dbaW5kZXhdOwoJCQkJCX0pOwoJCQkJfQoKCQkJCS8vIEhpZGUgdGhlIGVsZW1lbnQgaWYgdGhlICJoaWRlIiBvcGVyYXRpb24gd2FzIGRvbmUKCQkJCWlmICggb3B0aW9ucy5oaWRlICkgewoJCQkJCWpRdWVyeShlbGVtKS5oaWRlKCk7CgkJCQl9CgoJCQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBvciBzaG93bgoJCQkJaWYgKCBvcHRpb25zLmhpZGUgfHwgb3B0aW9ucy5zaG93ICkgewoJCQkJCWZvciAoIHZhciBwIGluIG9wdGlvbnMuYW5pbWF0ZWRQcm9wZXJ0aWVzICkgewoJCQkJCQlqUXVlcnkuc3R5bGUoIGVsZW0sIHAsIG9wdGlvbnMub3JpZ1twXSApOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgoJCQkJb3B0aW9ucy5jb21wbGV0ZS5jYWxsKCBlbGVtICk7CgkJCX0KCgkJCXJldHVybiBmYWxzZTsKCgkJfSBlbHNlIHsKCQkJLy8gY2xhc3NpY2FsIGVhc2luZyBjYW5ub3QgYmUgdXNlZCB3aXRoIGFuIEluZmluaXR5IGR1cmF0aW9uCgkJCWlmICggb3B0aW9ucy5kdXJhdGlvbiA9PSBJbmZpbml0eSApIHsKCQkJCXRoaXMubm93ID0gdDsKCQkJfSBlbHNlIHsKCQkJCW4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CgkJCQl0aGlzLnN0YXRlID0gbiAvIG9wdGlvbnMuZHVyYXRpb247CgoJCQkJLy8gUGVyZm9ybSB0aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZwoJCQkJdGhpcy5wb3MgPSBqUXVlcnkuZWFzaW5nWyBvcHRpb25zLmFuaW1hdGVkUHJvcGVydGllc1sgdGhpcy5wcm9wIF0gXSggdGhpcy5zdGF0ZSwgbiwgMCwgMSwgb3B0aW9ucy5kdXJhdGlvbiApOwoJCQkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3RhcnQpICogdGhpcy5wb3MpOwoJCQl9CgkJCS8vIFBlcmZvcm0gdGhlIG5leHQgc3RlcCBvZiB0aGUgYW5pbWF0aW9uCgkJCXRoaXMudXBkYXRlKCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0KfTsKCmpRdWVyeS5leHRlbmQoIGpRdWVyeS5meCwgewoJdGljazogZnVuY3Rpb24oKSB7CgkJZm9yICggdmFyIHRpbWVycyA9IGpRdWVyeS50aW1lcnMsIGkgPSAwIDsgaSA8IHRpbWVycy5sZW5ndGggOyArK2kgKSB7CgkJCWlmICggIXRpbWVyc1tpXSgpICkgewoJCQkJdGltZXJzLnNwbGljZShpLS0sIDEpOwoJCQl9CgkJfQoKCQlpZiAoICF0aW1lcnMubGVuZ3RoICkgewoJCQlqUXVlcnkuZnguc3RvcCgpOwoJCX0KCX0sCgoJaW50ZXJ2YWw6IDEzLAoKCXN0b3A6IGZ1bmN0aW9uKCkgewoJCWNsZWFySW50ZXJ2YWwoIHRpbWVySWQgKTsKCQl0aW1lcklkID0gbnVsbDsKCX0sCgoJc3BlZWRzOiB7CgkJc2xvdzogNjAwLAoJCWZhc3Q6IDIwMCwKCQkvLyBEZWZhdWx0IHNwZWVkCgkJX2RlZmF1bHQ6IDQwMAoJfSwKCglzdGVwOiB7CgkJb3BhY2l0eTogZnVuY3Rpb24oIGZ4ICkgewoJCQlqUXVlcnkuc3R5bGUoIGZ4LmVsZW0sICJvcGFjaXR5IiwgZngubm93ICk7CgkJfSwKCgkJX2RlZmF1bHQ6IGZ1bmN0aW9uKCBmeCApIHsKCQkJaWYgKCBmeC5lbGVtLnN0eWxlICYmIGZ4LmVsZW0uc3R5bGVbIGZ4LnByb3AgXSAhPSBudWxsICkgewoJCQkJZnguZWxlbS5zdHlsZVsgZngucHJvcCBdID0gKGZ4LnByb3AgPT09ICJ3aWR0aCIgfHwgZngucHJvcCA9PT0gImhlaWdodCIgPyBNYXRoLm1heCgwLCBmeC5ub3cpIDogZngubm93KSArIGZ4LnVuaXQ7CgkJCX0gZWxzZSB7CgkJCQlmeC5lbGVtWyBmeC5wcm9wIF0gPSBmeC5ub3c7CgkJCX0KCQl9Cgl9Cn0pOwoKaWYgKCBqUXVlcnkuZXhwciAmJiBqUXVlcnkuZXhwci5maWx0ZXJzICkgewoJalF1ZXJ5LmV4cHIuZmlsdGVycy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiBqUXVlcnkuZ3JlcChqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7CgkJCXJldHVybiBlbGVtID09PSBmbi5lbGVtOwoJCX0pLmxlbmd0aDsKCX07Cn0KCi8vIFRyeSB0byByZXN0b3JlIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudApmdW5jdGlvbiBkZWZhdWx0RGlzcGxheSggbm9kZU5hbWUgKSB7CgoJaWYgKCAhZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gKSB7CgoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwKCQkJZWxlbSA9IGpRdWVyeSggIjwiICsgbm9kZU5hbWUgKyAiPiIgKS5hcHBlbmRUbyggYm9keSApLAoJCQlkaXNwbGF5ID0gZWxlbS5jc3MoICJkaXNwbGF5IiApOwoKCQllbGVtLnJlbW92ZSgpOwoKCQkvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywKCQkvLyBnZXQgZWxlbWVudCdzIHJlYWwgZGVmYXVsdCBkaXNwbGF5IGJ5IGF0dGFjaGluZyBpdCB0byBhIHRlbXAgaWZyYW1lCgkJaWYgKCBkaXNwbGF5ID09PSAibm9uZSIgfHwgZGlzcGxheSA9PT0gIiIgKSB7CgkJCS8vIE5vIGlmcmFtZSB0byB1c2UgeWV0LCBzbyBjcmVhdGUgaXQKCQkJaWYgKCAhaWZyYW1lICkgewoJCQkJaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImlmcmFtZSIgKTsKCQkJCWlmcmFtZS5mcmFtZUJvcmRlciA9IGlmcmFtZS53aWR0aCA9IGlmcmFtZS5oZWlnaHQgPSAwOwoJCQl9CgoJCQlib2R5LmFwcGVuZENoaWxkKCBpZnJhbWUgKTsKCgkJCS8vIENyZWF0ZSBhIGNhY2hlYWJsZSBjb3B5IG9mIHRoZSBpZnJhbWUgZG9jdW1lbnQgb24gZmlyc3QgY2FsbC4KCQkJLy8gSUUgYW5kIE9wZXJhIHdpbGwgYWxsb3cgdXMgdG8gcmV1c2UgdGhlIGlmcmFtZURvYyB3aXRob3V0IHJlLXdyaXRpbmcgdGhlIGZha2UgSFRNTAoJCQkvLyBkb2N1bWVudCB0byBpdDsgV2ViS2l0ICYgRmlyZWZveCB3b24ndCBhbGxvdyByZXVzaW5nIHRoZSBpZnJhbWUgZG9jdW1lbnQuCgkJCWlmICggIWlmcmFtZURvYyB8fCAhaWZyYW1lLmNyZWF0ZUVsZW1lbnQgKSB7CgkJCQlpZnJhbWVEb2MgPSAoIGlmcmFtZS5jb250ZW50V2luZG93IHx8IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgKS5kb2N1bWVudDsKCQkJCWlmcmFtZURvYy53cml0ZSggKCBkb2N1bWVudC5jb21wYXRNb2RlID09PSAiQ1NTMUNvbXBhdCIgPyAiPCFkb2N0eXBlIGh0bWw+IiA6ICIiICkgKyAiPGh0bWw+PGJvZHk+IiApOwoJCQkJaWZyYW1lRG9jLmNsb3NlKCk7CgkJCX0KCgkJCWVsZW0gPSBpZnJhbWVEb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKTsKCgkJCWlmcmFtZURvYy5ib2R5LmFwcGVuZENoaWxkKCBlbGVtICk7CgoJCQlkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgImRpc3BsYXkiICk7CgoJCQlib2R5LnJlbW92ZUNoaWxkKCBpZnJhbWUgKTsKCQl9CgoJCS8vIFN0b3JlIHRoZSBjb3JyZWN0IGRlZmF1bHQgZGlzcGxheQoJCWVsZW1kaXNwbGF5WyBub2RlTmFtZSBdID0gZGlzcGxheTsKCX0KCglyZXR1cm4gZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF07Cn0KCgoKCnZhciBydGFibGUgPSAvXnQoPzphYmxlfGR8aCkkL2ksCglycm9vdCA9IC9eKD86Ym9keXxodG1sKSQvaTsKCmlmICggImdldEJvdW5kaW5nQ2xpZW50UmVjdCIgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICkgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXSwgYm94OwoKCQlpZiAoIG9wdGlvbnMgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQlqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApOwoJCQl9KTsKCQl9CgoJCWlmICggIWVsZW0gfHwgIWVsZW0ub3duZXJEb2N1bWVudCApIHsKCQkJcmV0dXJuIG51bGw7CgkJfQoKCQlpZiAoIGVsZW0gPT09IGVsZW0ub3duZXJEb2N1bWVudC5ib2R5ICkgewoJCQlyZXR1cm4galF1ZXJ5Lm9mZnNldC5ib2R5T2Zmc2V0KCBlbGVtICk7CgkJfQoKCQl0cnkgewoJCQlib3ggPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoJCX0gY2F0Y2goZSkge30KCgkJdmFyIGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7CgoJCS8vIE1ha2Ugc3VyZSB3ZSdyZSBub3QgZGVhbGluZyB3aXRoIGEgZGlzY29ubmVjdGVkIERPTSBub2RlCgkJaWYgKCAhYm94IHx8ICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHsKCQkJcmV0dXJuIGJveCA/IHsgdG9wOiBib3gudG9wLCBsZWZ0OiBib3gubGVmdCB9IDogeyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQl9CgoJCXZhciBib2R5ID0gZG9jLmJvZHksCgkJCXdpbiA9IGdldFdpbmRvdyhkb2MpLAoJCQljbGllbnRUb3AgID0gZG9jRWxlbS5jbGllbnRUb3AgIHx8IGJvZHkuY2xpZW50VG9wICB8fCAwLAoJCQljbGllbnRMZWZ0ID0gZG9jRWxlbS5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwLAoJCQlzY3JvbGxUb3AgID0gd2luLnBhZ2VZT2Zmc2V0IHx8IGpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIGRvY0VsZW0uc2Nyb2xsVG9wICB8fCBib2R5LnNjcm9sbFRvcCwKCQkJc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldCB8fCBqUXVlcnkuc3VwcG9ydC5ib3hNb2RlbCAmJiBkb2NFbGVtLnNjcm9sbExlZnQgfHwgYm9keS5zY3JvbGxMZWZ0LAoJCQl0b3AgID0gYm94LnRvcCAgKyBzY3JvbGxUb3AgIC0gY2xpZW50VG9wLAoJCQlsZWZ0ID0gYm94LmxlZnQgKyBzY3JvbGxMZWZ0IC0gY2xpZW50TGVmdDsKCgkJcmV0dXJuIHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfTsKCX07Cgp9IGVsc2UgewoJalF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXZhciBlbGVtID0gdGhpc1swXTsKCgkJaWYgKCBvcHRpb25zICkgewoJCQlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJalF1ZXJ5Lm9mZnNldC5zZXRPZmZzZXQoIHRoaXMsIG9wdGlvbnMsIGkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoICFlbGVtIHx8ICFlbGVtLm93bmVyRG9jdW1lbnQgKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJaWYgKCBlbGVtID09PSBlbGVtLm93bmVyRG9jdW1lbnQuYm9keSApIHsKCQkJcmV0dXJuIGpRdWVyeS5vZmZzZXQuYm9keU9mZnNldCggZWxlbSApOwoJCX0KCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCXZhciBjb21wdXRlZFN0eWxlLAoJCQlvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCwKCQkJcHJldk9mZnNldFBhcmVudCA9IGVsZW0sCgkJCWRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCwKCQkJZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQsCgkJCWJvZHkgPSBkb2MuYm9keSwKCQkJZGVmYXVsdFZpZXcgPSBkb2MuZGVmYXVsdFZpZXcsCgkJCXByZXZDb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxsICkgOiBlbGVtLmN1cnJlbnRTdHlsZSwKCQkJdG9wID0gZWxlbS5vZmZzZXRUb3AsCgkJCWxlZnQgPSBlbGVtLm9mZnNldExlZnQ7CgoJCXdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0gIT09IGJvZHkgJiYgZWxlbSAhPT0gZG9jRWxlbSApIHsKCQkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJCWJyZWFrOwoJCQl9CgoJCQljb21wdXRlZFN0eWxlID0gZGVmYXVsdFZpZXcgPyBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpIDogZWxlbS5jdXJyZW50U3R5bGU7CgkJCXRvcCAgLT0gZWxlbS5zY3JvbGxUb3A7CgkJCWxlZnQgLT0gZWxlbS5zY3JvbGxMZWZ0OwoKCQkJaWYgKCBlbGVtID09PSBvZmZzZXRQYXJlbnQgKSB7CgkJCQl0b3AgICs9IGVsZW0ub2Zmc2V0VG9wOwoJCQkJbGVmdCArPSBlbGVtLm9mZnNldExlZnQ7CgoJCQkJaWYgKCBqUXVlcnkub2Zmc2V0LmRvZXNOb3RBZGRCb3JkZXIgJiYgIShqUXVlcnkub2Zmc2V0LmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzICYmIHJ0YWJsZS50ZXN0KGVsZW0ubm9kZU5hbWUpKSApIHsKCQkJCQl0b3AgICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyVG9wV2lkdGggICkgfHwgMDsKCQkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJCX0KCgkJCQlwcmV2T2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50OwoJCQkJb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CgkJCX0KCgkJCWlmICggalF1ZXJ5Lm9mZnNldC5zdWJ0cmFjdHNCb3JkZXJGb3JPdmVyZmxvd05vdFZpc2libGUgJiYgY29tcHV0ZWRTdHlsZS5vdmVyZmxvdyAhPT0gInZpc2libGUiICkgewoJCQkJdG9wICArPSBwYXJzZUZsb2F0KCBjb21wdXRlZFN0eWxlLmJvcmRlclRvcFdpZHRoICApIHx8IDA7CgkJCQlsZWZ0ICs9IHBhcnNlRmxvYXQoIGNvbXB1dGVkU3R5bGUuYm9yZGVyTGVmdFdpZHRoICkgfHwgMDsKCQkJfQoKCQkJcHJldkNvbXB1dGVkU3R5bGUgPSBjb21wdXRlZFN0eWxlOwoJCX0KCgkJaWYgKCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCXRvcCAgKz0gYm9keS5vZmZzZXRUb3A7CgkJCWxlZnQgKz0gYm9keS5vZmZzZXRMZWZ0OwoJCX0KCgkJaWYgKCBqUXVlcnkub2Zmc2V0LnN1cHBvcnRzRml4ZWRQb3NpdGlvbiAmJiBwcmV2Q29tcHV0ZWRTdHlsZS5wb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJdG9wICArPSBNYXRoLm1heCggZG9jRWxlbS5zY3JvbGxUb3AsIGJvZHkuc2Nyb2xsVG9wICk7CgkJCWxlZnQgKz0gTWF0aC5tYXgoIGRvY0VsZW0uc2Nyb2xsTGVmdCwgYm9keS5zY3JvbGxMZWZ0ICk7CgkJfQoKCQlyZXR1cm4geyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9OwoJfTsKfQoKalF1ZXJ5Lm9mZnNldCA9IHsKCWluaXRpYWxpemU6IGZ1bmN0aW9uKCkgewoJCXZhciBib2R5ID0gZG9jdW1lbnQuYm9keSwgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksIGlubmVyRGl2LCBjaGVja0RpdiwgdGFibGUsIHRkLCBib2R5TWFyZ2luVG9wID0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luVG9wIikgKSB8fCAwLAoJCQlodG1sID0gIjxkaXYgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4Oyc+PGRpdj48L2Rpdj48L2Rpdj48dGFibGUgc3R5bGU9J3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDttYXJnaW46MDtib3JkZXI6NXB4IHNvbGlkICMwMDA7cGFkZGluZzowO3dpZHRoOjFweDtoZWlnaHQ6MXB4OycgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiI7CgoJCWpRdWVyeS5leHRlbmQoIGNvbnRhaW5lci5zdHlsZSwgeyBwb3NpdGlvbjogImFic29sdXRlIiwgdG9wOiAwLCBsZWZ0OiAwLCBtYXJnaW46IDAsIGJvcmRlcjogMCwgd2lkdGg6ICIxcHgiLCBoZWlnaHQ6ICIxcHgiLCB2aXNpYmlsaXR5OiAiaGlkZGVuIiB9ICk7CgoJCWNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sOwoJCWJvZHkuaW5zZXJ0QmVmb3JlKCBjb250YWluZXIsIGJvZHkuZmlyc3RDaGlsZCApOwoJCWlubmVyRGl2ID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CgkJY2hlY2tEaXYgPSBpbm5lckRpdi5maXJzdENoaWxkOwoJCXRkID0gaW5uZXJEaXYubmV4dFNpYmxpbmcuZmlyc3RDaGlsZC5maXJzdENoaWxkOwoKCQl0aGlzLmRvZXNOb3RBZGRCb3JkZXIgPSAoY2hlY2tEaXYub2Zmc2V0VG9wICE9PSA1KTsKCQl0aGlzLmRvZXNBZGRCb3JkZXJGb3JUYWJsZUFuZENlbGxzID0gKHRkLm9mZnNldFRvcCA9PT0gNSk7CgoJCWNoZWNrRGl2LnN0eWxlLnBvc2l0aW9uID0gImZpeGVkIjsKCQljaGVja0Rpdi5zdHlsZS50b3AgPSAiMjBweCI7CgoJCS8vIHNhZmFyaSBzdWJ0cmFjdHMgcGFyZW50IGJvcmRlciB3aWR0aCBoZXJlIHdoaWNoIGlzIDVweAoJCXRoaXMuc3VwcG9ydHNGaXhlZFBvc2l0aW9uID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gMjAgfHwgY2hlY2tEaXYub2Zmc2V0VG9wID09PSAxNSk7CgkJY2hlY2tEaXYuc3R5bGUucG9zaXRpb24gPSBjaGVja0Rpdi5zdHlsZS50b3AgPSAiIjsKCgkJaW5uZXJEaXYuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKCQlpbm5lckRpdi5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSI7CgoJCXRoaXMuc3VidHJhY3RzQm9yZGVyRm9yT3ZlcmZsb3dOb3RWaXNpYmxlID0gKGNoZWNrRGl2Lm9mZnNldFRvcCA9PT0gLTUpOwoKCQl0aGlzLmRvZXNOb3RJbmNsdWRlTWFyZ2luSW5Cb2R5T2Zmc2V0ID0gKGJvZHkub2Zmc2V0VG9wICE9PSBib2R5TWFyZ2luVG9wKTsKCgkJYm9keS5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7CgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplID0galF1ZXJ5Lm5vb3A7Cgl9LAoKCWJvZHlPZmZzZXQ6IGZ1bmN0aW9uKCBib2R5ICkgewoJCXZhciB0b3AgPSBib2R5Lm9mZnNldFRvcCwKCQkJbGVmdCA9IGJvZHkub2Zmc2V0TGVmdDsKCgkJalF1ZXJ5Lm9mZnNldC5pbml0aWFsaXplKCk7CgoJCWlmICggalF1ZXJ5Lm9mZnNldC5kb2VzTm90SW5jbHVkZU1hcmdpbkluQm9keU9mZnNldCApIHsKCQkJdG9wICArPSBwYXJzZUZsb2F0KCBqUXVlcnkuY3NzKGJvZHksICJtYXJnaW5Ub3AiKSApIHx8IDA7CgkJCWxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhib2R5LCAibWFyZ2luTGVmdCIpICkgfHwgMDsKCQl9CgoJCXJldHVybiB7IHRvcDogdG9wLCBsZWZ0OiBsZWZ0IH07Cgl9LAoKCXNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7CgkJdmFyIHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgInBvc2l0aW9uIiApOwoKCQkvLyBzZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtCgkJaWYgKCBwb3NpdGlvbiA9PT0gInN0YXRpYyIgKSB7CgkJCWVsZW0uc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwoJCX0KCgkJdmFyIGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSwKCQkJY3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKSwKCQkJY3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgInRvcCIgKSwKCQkJY3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sICJsZWZ0IiApLAoJCQljYWxjdWxhdGVQb3NpdGlvbiA9IChwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIikgJiYgalF1ZXJ5LmluQXJyYXkoImF1dG8iLCBbY3VyQ1NTVG9wLCBjdXJDU1NMZWZ0XSkgPiAtMSwKCQkJcHJvcHMgPSB7fSwgY3VyUG9zaXRpb24gPSB7fSwgY3VyVG9wLCBjdXJMZWZ0OwoKCQkvLyBuZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlciB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWQKCQlpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkgewoJCQljdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTsKCQkJY3VyVG9wID0gY3VyUG9zaXRpb24udG9wOwoJCQljdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDsKCQl9IGVsc2UgewoJCQljdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwOwoJCQljdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJCW9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGN1ck9mZnNldCApOwoJCX0KCgkJaWYgKG9wdGlvbnMudG9wICE9IG51bGwpIHsKCQkJcHJvcHMudG9wID0gKG9wdGlvbnMudG9wIC0gY3VyT2Zmc2V0LnRvcCkgKyBjdXJUb3A7CgkJfQoJCWlmIChvcHRpb25zLmxlZnQgIT0gbnVsbCkgewoJCQlwcm9wcy5sZWZ0ID0gKG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0KSArIGN1ckxlZnQ7CgkJfQoKCQlpZiAoICJ1c2luZyIgaW4gb3B0aW9ucyApIHsKCQkJb3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApOwoJCX0gZWxzZSB7CgkJCWN1ckVsZW0uY3NzKCBwcm9wcyApOwoJCX0KCX0KfTsKCgpqUXVlcnkuZm4uZXh0ZW5kKHsKCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzWzBdICkgewoJCQlyZXR1cm4gbnVsbDsKCQl9CgoJCXZhciBlbGVtID0gdGhpc1swXSwKCgkJLy8gR2V0ICpyZWFsKiBvZmZzZXRQYXJlbnQKCQlvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpLAoKCQkvLyBHZXQgY29ycmVjdCBvZmZzZXRzCgkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZzZXQoKSwKCQlwYXJlbnRPZmZzZXQgPSBycm9vdC50ZXN0KG9mZnNldFBhcmVudFswXS5ub2RlTmFtZSkgPyB7IHRvcDogMCwgbGVmdDogMCB9IDogb2Zmc2V0UGFyZW50Lm9mZnNldCgpOwoKCQkvLyBTdWJ0cmFjdCBlbGVtZW50IG1hcmdpbnMKCQkvLyBub3RlOiB3aGVuIGFuIGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdAoJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNvcnJlY3RseSBiZSAwCgkJb2Zmc2V0LnRvcCAgLT0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhlbGVtLCAibWFyZ2luVG9wIikgKSB8fCAwOwoJCW9mZnNldC5sZWZ0IC09IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoZWxlbSwgIm1hcmdpbkxlZnQiKSApIHx8IDA7CgoJCS8vIEFkZCBvZmZzZXRQYXJlbnQgYm9yZGVycwoJCXBhcmVudE9mZnNldC50b3AgICs9IHBhcnNlRmxvYXQoIGpRdWVyeS5jc3Mob2Zmc2V0UGFyZW50WzBdLCAiYm9yZGVyVG9wV2lkdGgiKSApIHx8IDA7CgkJcGFyZW50T2Zmc2V0LmxlZnQgKz0gcGFyc2VGbG9hdCggalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnRbMF0sICJib3JkZXJMZWZ0V2lkdGgiKSApIHx8IDA7CgoJCS8vIFN1YnRyYWN0IHRoZSB0d28gb2Zmc2V0cwoJCXJldHVybiB7CgkJCXRvcDogIG9mZnNldC50b3AgIC0gcGFyZW50T2Zmc2V0LnRvcCwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgLSBwYXJlbnRPZmZzZXQubGVmdAoJCX07Cgl9LAoKCW9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCkgewoJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQgfHwgZG9jdW1lbnQuYm9keTsKCQkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCFycm9vdC50ZXN0KG9mZnNldFBhcmVudC5ub2RlTmFtZSkgJiYgalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsICJwb3NpdGlvbiIpID09PSAic3RhdGljIikgKSB7CgkJCQlvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OwoJCQl9CgkJCXJldHVybiBvZmZzZXRQYXJlbnQ7CgkJfSk7Cgl9Cn0pOwoKCi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kcwpqUXVlcnkuZWFjaCggWyJMZWZ0IiwgIlRvcCJdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCXZhciBtZXRob2QgPSAic2Nyb2xsIiArIG5hbWU7CgoJalF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7CgkJdmFyIGVsZW0sIHdpbjsKCgkJaWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHsKCQkJZWxlbSA9IHRoaXNbIDAgXTsKCgkJCWlmICggIWVsZW0gKSB7CgkJCQlyZXR1cm4gbnVsbDsKCQkJfQoKCQkJd2luID0gZ2V0V2luZG93KCBlbGVtICk7CgoJCQkvLyBSZXR1cm4gdGhlIHNjcm9sbCBvZmZzZXQKCQkJcmV0dXJuIHdpbiA/ICgicGFnZVhPZmZzZXQiIGluIHdpbikgPyB3aW5bIGkgPyAicGFnZVlPZmZzZXQiIDogInBhZ2VYT2Zmc2V0IiBdIDoKCQkJCWpRdWVyeS5zdXBwb3J0LmJveE1vZGVsICYmIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIG1ldGhvZCBdIHx8CgkJCQkJd2luLmRvY3VtZW50LmJvZHlbIG1ldGhvZCBdIDoKCQkJCWVsZW1bIG1ldGhvZCBdOwoJCX0KCgkJLy8gU2V0IHRoZSBzY3JvbGwgb2Zmc2V0CgkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJd2luID0gZ2V0V2luZG93KCB0aGlzICk7CgoJCQlpZiAoIHdpbiApIHsKCQkJCXdpbi5zY3JvbGxUbygKCQkJCQkhaSA/IHZhbCA6IGpRdWVyeSggd2luICkuc2Nyb2xsTGVmdCgpLAoJCQkJCSBpID8gdmFsIDogalF1ZXJ5KCB3aW4gKS5zY3JvbGxUb3AoKQoJCQkJKTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzWyBtZXRob2QgXSA9IHZhbDsKCQkJfQoJCX0pOwoJfTsKfSk7CgpmdW5jdGlvbiBnZXRXaW5kb3coIGVsZW0gKSB7CglyZXR1cm4galF1ZXJ5LmlzV2luZG93KCBlbGVtICkgPwoJCWVsZW0gOgoJCWVsZW0ubm9kZVR5cGUgPT09IDkgPwoJCQllbGVtLmRlZmF1bHRWaWV3IHx8IGVsZW0ucGFyZW50V2luZG93IDoKCQkJZmFsc2U7Cn0KCgoKCi8vIENyZWF0ZSB3aWR0aCwgaGVpZ2h0LCBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kcwpqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkgewoKCXZhciB0eXBlID0gbmFtZS50b0xvd2VyQ2FzZSgpOwoKCS8vIGlubmVySGVpZ2h0IGFuZCBpbm5lcldpZHRoCglqUXVlcnkuZm5bICJpbm5lciIgKyBuYW1lIF0gPSBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsICJwYWRkaW5nIiApICkgOgoJCQludWxsOwoJfTsKCgkvLyBvdXRlckhlaWdodCBhbmQgb3V0ZXJXaWR0aAoJalF1ZXJ5LmZuWyAib3V0ZXIiICsgbmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiApIHsKCQl2YXIgZWxlbSA9IHRoaXNbMF07CgkJcmV0dXJuIGVsZW0gJiYgZWxlbS5zdHlsZSA/CgkJCXBhcnNlRmxvYXQoIGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIG1hcmdpbiA/ICJtYXJnaW4iIDogImJvcmRlciIgKSApIDoKCQkJbnVsbDsKCX07CgoJalF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggc2l6ZSApIHsKCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAoJCXZhciBlbGVtID0gdGhpc1swXTsKCQlpZiAoICFlbGVtICkgewoJCQlyZXR1cm4gc2l6ZSA9PSBudWxsID8gbnVsbCA6IHRoaXM7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzaXplICkgKSB7CgkJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oIGkgKSB7CgkJCQl2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApOwoJCQkJc2VsZlsgdHlwZSBdKCBzaXplLmNhbGwoIHRoaXMsIGksIHNlbGZbIHR5cGUgXSgpICkgKTsKCQkJfSk7CgkJfQoKCQlpZiAoIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkgewoJCQkvLyBFdmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9keSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0YW5kYXJkcyBtb2RlCgkJCS8vIDNyZCBjb25kaXRpb24gYWxsb3dzIE5va2lhIHN1cHBvcnQsIGFzIGl0IHN1cHBvcnRzIHRoZSBkb2NFbGVtIHByb3AgYnV0IG5vdCBDU1MxQ29tcGF0CgkJCXZhciBkb2NFbGVtUHJvcCA9IGVsZW0uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyAiY2xpZW50IiArIG5hbWUgXSwKCQkJCWJvZHkgPSBlbGVtLmRvY3VtZW50LmJvZHk7CgkJCXJldHVybiBlbGVtLmRvY3VtZW50LmNvbXBhdE1vZGUgPT09ICJDU1MxQ29tcGF0IiAmJiBkb2NFbGVtUHJvcCB8fAoJCQkJYm9keSAmJiBib2R5WyAiY2xpZW50IiArIG5hbWUgXSB8fCBkb2NFbGVtUHJvcDsKCgkJLy8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAoJCX0gZWxzZSBpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDkgKSB7CgkJCS8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSwgd2hpY2hldmVyIGlzIGdyZWF0ZXIKCQkJcmV0dXJuIE1hdGgubWF4KAoJCQkJZWxlbS5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIgKyBuYW1lXSwKCQkJCWVsZW0uYm9keVsic2Nyb2xsIiArIG5hbWVdLCBlbGVtLmRvY3VtZW50RWxlbWVudFsic2Nyb2xsIiArIG5hbWVdLAoJCQkJZWxlbS5ib2R5WyJvZmZzZXQiICsgbmFtZV0sIGVsZW0uZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiICsgbmFtZV0KCQkJKTsKCgkJLy8gR2V0IG9yIHNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQKCQl9IGVsc2UgaWYgKCBzaXplID09PSB1bmRlZmluZWQgKSB7CgkJCXZhciBvcmlnID0galF1ZXJ5LmNzcyggZWxlbSwgdHlwZSApLAoJCQkJcmV0ID0gcGFyc2VGbG9hdCggb3JpZyApOwoKCQkJcmV0dXJuIGpRdWVyeS5pc05hTiggcmV0ICkgPyBvcmlnIDogcmV0OwoKCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxlc3MpCgkJfSBlbHNlIHsKCQkJcmV0dXJuIHRoaXMuY3NzKCB0eXBlLCB0eXBlb2Ygc2l6ZSA9PT0gInN0cmluZyIgPyBzaXplIDogc2l6ZSArICJweCIgKTsKCQl9Cgl9OwoKfSk7CgoKLy8gRXhwb3NlIGpRdWVyeSB0byB0aGUgZ2xvYmFsIG9iamVjdAp3aW5kb3cualF1ZXJ5ID0gd2luZG93LiQgPSBqUXVlcnk7Cn0pKHdpbmRvdyk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/lib/themeswitchertool.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogalF1ZXJ5IHBsdWdpbiB0aGVtZXN3aXRjaGVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiQuZm4udGhlbWVzd2l0Y2hlciA9IGZ1bmN0aW9uKHNldHRpbmdzKXsKCXZhciBvcHRpb25zID0galF1ZXJ5LmV4dGVuZCh7CgkJbG9hZFRoZW1lOiBudWxsLAoJCWluaXRpYWxUZXh0OiAnU3dpdGNoIFRoZW1lJywKCQl3aWR0aDogMTUwLAoJCWhlaWdodDogMjAwLAoJCWJ1dHRvblByZVRleHQ6ICdUaGVtZTogJywKCQljbG9zZU9uU2VsZWN0OiB0cnVlLAoJCWJ1dHRvbkhlaWdodDogMTQsCgkJY29va2llTmFtZTogJ2pxdWVyeS11aS10aGVtZScsCgkJb25PcGVuOiBmdW5jdGlvbigpe30sCgkJb25DbG9zZTogZnVuY3Rpb24oKXt9LAoJCW9uU2VsZWN0OiBmdW5jdGlvbigpe30KCX0sIHNldHRpbmdzKTsKCgkvL21hcmt1cCAKCXZhciBidXR0b24gPSAkKCc8YSBocmVmPSIjIiBjbGFzcz0ianF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdHJpZ2dlciI+PHNwYW4gY2xhc3M9ImpxdWVyeS11aS10aGVtZXN3aXRjaGVyLWljb24iPjwvc3Bhbj48c3BhbiBjbGFzcz0ianF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdGl0bGUiPicrIG9wdGlvbnMuaW5pdGlhbFRleHQgKyc8L3NwYW4+PC9hPicpOwoJdmFyIHN3aXRjaGVycGFuZSA9ICQoJzxkaXYgY2xhc3M9ImpxdWVyeS11aS10aGVtZXN3aXRjaGVyIj48ZGl2IGlkPSJ0aGVtZUdhbGxlcnkiPgk8dWw+CQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMsK1RhaG9tYSwrVmVyZGFuYSwrQXJpYWwsK3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9ZjZhODI4JmFtcDtiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0zNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9ZTc4ZjA4JmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PWVlZWVlZSZhbXA7YmdUZXh0dXJlQ29udGVudD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmFtcDtib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmFtcDtmY0NvbnRlbnQ9MzMzMzMzJmFtcDtpY29uQ29sb3JDb250ZW50PTIyMjIyMiZhbXA7YmdDb2xvckRlZmF1bHQ9ZjZmNmY2JmFtcDtiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0xMDAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmYW1wO2ZjRGVmYXVsdD0xYzk0YzQmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZWY4YzA4JmFtcDtiZ0NvbG9ySG92ZXI9ZmRmNWNlJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTEwMCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj1mYmNiMDkmYW1wO2ZjSG92ZXI9Yzc3NDA1JmFtcDtpY29uQ29sb3JIb3Zlcj1lZjhjMDgmYW1wO2JnQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWZiZDg1MCZhbXA7ZmNBY3RpdmU9ZWI4ZjAwJmFtcDtpY29uQ29sb3JBY3RpdmU9ZWY4YzA4JmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWZmZTQ1YyZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTc1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mZWQyMmYmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTIyOGVmMSZhbXA7YmdDb2xvckVycm9yPWI4MTkwMCZhbXA7YmdUZXh0dXJlRXJyb3I9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9MTgmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWZmZmZmZiZhbXA7aWNvbkNvbG9yRXJyb3I9ZmZkMjdhJmFtcDtiZ0NvbG9yT3ZlcmxheT02NjY2NjYmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT0yMCZhbXA7b3BhY2l0eU92ZXJsYXk9NTAmYW1wO2JnQ29sb3JTaGFkb3c9MDAwMDAwJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0xMCZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTVweCZhbXA7b2Zmc2V0VG9wU2hhZG93PS01cHgmYW1wO29mZnNldExlZnRTaGFkb3c9LTVweCZhbXA7Y29ybmVyUmFkaXVzU2hhZG93PTVweCI+CQkJPGltZyBzcmM9Imh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL3RoZW1lXzkwX3VpX2xpZ2h0LnBuZyIgYWx0PSJVSSBMaWdodG5lc3MiIHRpdGxlPSJVSSBMaWdodG5lc3MiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VUkgbGlnaHRuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz02cHgmYW1wO2JnQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0yNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PTAwMDAwMCZhbXA7YmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0yNSZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTY2NjY2NiZhbXA7ZmNDb250ZW50PWZmZmZmZiZhbXA7aWNvbkNvbG9yQ29udGVudD1jY2NjY2MmYW1wO2JnQ29sb3JEZWZhdWx0PTU1NTU1NSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MjAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD02NjY2NjYmYW1wO2ZjRGVmYXVsdD1lZWVlZWUmYW1wO2ljb25Db2xvckRlZmF1bHQ9Y2NjY2NjJmFtcDtiZ0NvbG9ySG92ZXI9MDA3OGEzJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTQwJmFtcDtib3JkZXJDb2xvckhvdmVyPTU5YjRkNCZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1mNTg0MDAmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTMwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1mZmFmMGYmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPTIyMjIyMiZhbXA7YmdDb2xvckhpZ2hsaWdodD1lZWVlZWUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD04MCZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmFtcDtmY0hpZ2hsaWdodD0yZTdkYjImYW1wO2ljb25Db2xvckhpZ2hsaWdodD00YjhlMGImYW1wO2JnQ29sb3JFcnJvcj1mZmM3M2QmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9NDAmYW1wO2JvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmFtcDtmY0Vycm9yPTExMTExMSZhbXA7aWNvbkNvbG9yRXJyb3I9YTgzMzAwJmFtcDtiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9NTAmYW1wO29wYWNpdHlPdmVybGF5PTgwJmFtcDtiZ0NvbG9yU2hhZG93PWNjY2NjYyZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmYW1wO29wYWNpdHlTaGFkb3c9NjAmYW1wO3RoaWNrbmVzc1NoYWRvdz03cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tN3B4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS03cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF91aV9kYXJrLnBuZyIgYWx0PSJVSSBEYXJrbmVzcyIgdGl0bGU9IlVJIERhcmtuZXNzIiAvPgkJCTxzcGFuIGNsYXNzPSJ0aGVtZU5hbWUiPlVJIGRhcmtuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9VmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9Y2NjY2NjJmFtcDtiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmFtcDtiZ0ltZ09wYWNpdHlIZWFkZXI9NzUmYW1wO2JvcmRlckNvbG9ySGVhZGVyPWFhYWFhYSZhbXA7ZmNIZWFkZXI9MjIyMjIyJmFtcDtpY29uQ29sb3JIZWFkZXI9MjIyMjIyJmFtcDtiZ0NvbG9yQ29udGVudD1mZmZmZmYmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYW1wO2JvcmRlckNvbG9yQ29udGVudD1hYWFhYWEmYW1wO2ZjQ29udGVudD0yMjIyMjImYW1wO2ljb25Db2xvckNvbnRlbnQ9MjIyMjIyJmFtcDtiZ0NvbG9yRGVmYXVsdD1lNmU2ZTYmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTc1JmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9ZDNkM2QzJmFtcDtmY0RlZmF1bHQ9NTU1NTU1JmFtcDtpY29uQ29sb3JEZWZhdWx0PTg4ODg4OCZhbXA7YmdDb2xvckhvdmVyPWRhZGFkYSZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj03NSZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj05OTk5OTkmYW1wO2ZjSG92ZXI9MjEyMTIxJmFtcDtpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYW1wO2JnQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWFhYWFhYSZhbXA7ZmNBY3RpdmU9MjEyMTIxJmFtcDtpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWZiZjllZSZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mY2VmYTEmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZhbXA7YmdDb2xvckVycm9yPWZlZjFlYyZhbXA7YmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj05NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2ZjRXJyb3I9Y2QwYTBhJmFtcDtpY29uQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2JnQ29sb3JPdmVybGF5PWFhYWFhYSZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT0wJmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz1hYWFhYWEmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTAmYW1wO29wYWNpdHlTaGFkb3c9MzAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zbW9vdGhuZXNzLnBuZyIgYWx0PSJTbW9vdGhuZXNzIiB0aXRsZT0iU21vb3RobmVzcyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5TbW9vdGhuZXNzPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVZlcmRhbmElMkNBcmlhbCUyQ3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ub3JtYWwmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTVweCZhbXA7YmdDb2xvckhlYWRlcj0yMTkxYzAmYW1wO2JnVGV4dHVyZUhlYWRlcj0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTc1JmFtcDtib3JkZXJDb2xvckhlYWRlcj00Mjk3ZDcmYW1wO2ZjSGVhZGVyPWVhZjVmNyZhbXA7aWNvbkNvbG9ySGVhZGVyPWQ4ZTdmMyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmNmZGZkJmFtcDtiZ1RleHR1cmVDb250ZW50PTA2X2luc2V0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWE2YzllMiZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD0wMDc4YWUmYW1wO2JnQ29sb3JEZWZhdWx0PTAwNzhhZSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NDUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD03N2Q1ZjcmYW1wO2ZjRGVmYXVsdD1mZmZmZmYmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZTBmZGZmJmFtcDtiZ0NvbG9ySG92ZXI9NzljOWVjJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTc1JmFtcDtib3JkZXJDb2xvckhvdmVyPTQ0OGRhZSZhbXA7ZmNIb3Zlcj0wMjY4OTAmYW1wO2ljb25Db2xvckhvdmVyPTA1NmI5MyZhbXA7YmdDb2xvckFjdGl2ZT02ZWFjMmMmYW1wO2JnVGV4dHVyZUFjdGl2ZT0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTUwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1hY2RkNGEmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWY1ZTE3NSZhbXA7YmdDb2xvckhpZ2hsaWdodD1mOGRhNGUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmNkMTEzJmFtcDtmY0hpZ2hsaWdodD05MTU2MDgmYW1wO2ljb25Db2xvckhpZ2hsaWdodD1mN2E1MGQmYW1wO2JnQ29sb3JFcnJvcj1lMTRmMWMmYW1wO2JnVGV4dHVyZUVycm9yPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj00NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2ZjRXJyb3I9ZmZmZmZmJmFtcDtpY29uQ29sb3JFcnJvcj1mY2QxMTMmYW1wO2JnQ29sb3JPdmVybGF5PWFhYWFhYSZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT03NSZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9OTk5OTk5JmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz01NSZhbXA7b3BhY2l0eVNoYWRvdz00NSZhbXA7dGhpY2tuZXNzU2hhZG93PTBweCZhbXA7b2Zmc2V0VG9wU2hhZG93PTVweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz01cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz01cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zdGFydF9tZW51LnBuZyIgYWx0PSJTdGFydCIgdGl0bGU9IlN0YXJ0IiAvPgkJCTxzcGFuIGNsYXNzPSJ0aGVtZU5hbWUiPlN0YXJ0PC9zcGFuPgkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUsK0x1Y2lkYStTYW5zLCtBcmlhbCwrc2Fucy1zZXJpZiZhbXA7ZndEZWZhdWx0PWJvbGQmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTVweCZhbXA7YmdDb2xvckhlYWRlcj01YzljY2MmYW1wO2JnVGV4dHVyZUhlYWRlcj0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTU1JmFtcDtib3JkZXJDb2xvckhlYWRlcj00Mjk3ZDcmYW1wO2ZjSGVhZGVyPWZmZmZmZiZhbXA7aWNvbkNvbG9ySGVhZGVyPWQ4ZTdmMyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmNmZGZkJmFtcDtiZ1RleHR1cmVDb250ZW50PTA2X2luc2V0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWE2YzllMiZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD00NjliZGQmYW1wO2JnQ29sb3JEZWZhdWx0PWRmZWZmYyZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9ODUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jNWRiZWMmYW1wO2ZjRGVmYXVsdD0yZTZlOWUmYW1wO2ljb25Db2xvckRlZmF1bHQ9NmRhOGQ1JmFtcDtiZ0NvbG9ySG92ZXI9ZDBlNWY1JmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTc1JmFtcDtib3JkZXJDb2xvckhvdmVyPTc5YjdlNyZhbXA7ZmNIb3Zlcj0xZDU5ODcmYW1wO2ljb25Db2xvckhvdmVyPTIxN2JjMCZhbXA7YmdDb2xvckFjdGl2ZT1mNWY4ZjkmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9NzliN2U3JmFtcDtmY0FjdGl2ZT1lMTcwMDkmYW1wO2ljb25Db2xvckFjdGl2ZT1mOWJkMDEmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZmJlYzg4JmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmFkNDJlJmFtcDtmY0hpZ2hsaWdodD0zNjM2MzYmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0yZTgzZmYmYW1wO2JnQ29sb3JFcnJvcj1mZWYxZWMmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9OTUmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWNkMGEwYSZhbXA7aWNvbkNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0wJmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfd2luZG96ZS5wbmciIGFsdD0iUmVkbW9uZCIgdGl0bGU9IlJlZG1vbmQiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+UmVkbW9uZDwvc3Bhbj4JCTwvYT48L2xpPgkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz04cHgmYmdDb2xvckhlYWRlcj04MTc4NjUmYmdUZXh0dXJlSGVhZGVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj00NSZib3JkZXJDb2xvckhlYWRlcj00OTQ0MzcmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mYWRjN2EmYmdDb2xvckNvbnRlbnQ9ZmVlZWJkJmJnVGV4dHVyZUNvbnRlbnQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD04ZTg0NmImZmNDb250ZW50PTM4MzgzOCZpY29uQ29sb3JDb250ZW50PWQxOTQwNSZiZ0NvbG9yRGVmYXVsdD1mZWNlMmYmYmdUZXh0dXJlRGVmYXVsdD0xMl9nbG9zc193YXZlLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTYwJmJvcmRlckNvbG9yRGVmYXVsdD1kMTk0MDUmZmNEZWZhdWx0PTRjMzAwMCZpY29uQ29sb3JEZWZhdWx0PTNkM2QzZCZiZ0NvbG9ySG92ZXI9ZmZkZDU3JmJnVGV4dHVyZUhvdmVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTcwJmJvcmRlckNvbG9ySG92ZXI9YTQ1YjEzJmZjSG92ZXI9MzgxZjAwJmljb25Db2xvckhvdmVyPWJkN2IwMCZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDVfaW5zZXRfc29mdC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTMwJmJvcmRlckNvbG9yQWN0aXZlPTY1NWU0ZSZmY0FjdGl2ZT0wMDc0YzcmaWNvbkNvbG9yQWN0aXZlPWViOTkwZiZiZ0NvbG9ySGlnaGxpZ2h0PWZmZjllNSZiZ1RleHR1cmVIaWdobGlnaHQ9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTkwJmJvcmRlckNvbG9ySGlnaGxpZ2h0PWVlYjQyMCZmY0hpZ2hsaWdodD0xZjFmMWYmaWNvbkNvbG9ySGlnaGxpZ2h0PWVkOWYyNiZiZ0NvbG9yRXJyb3I9ZDM0ZDE3JmJnVGV4dHVyZUVycm9yPTA3X2RpYWdvbmFsc19tZWRpdW0ucG5nJmJnSW1nT3BhY2l0eUVycm9yPTIwJmJvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZTE4MCZiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfc3VubnkucG5nIiBhbHQ9IlN1bm55IiB0aXRsZT0iU3VubnkiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U3Vubnk8L3NwYW4+CQk8L2E+PC9saT4JCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMlMkMrSGVsdmV0aWNhJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj1kZGRkZGQmYmdUZXh0dXJlSGVhZGVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MzUmYm9yZGVyQ29sb3JIZWFkZXI9YmJiYmJiJmZjSGVhZGVyPTQ0NDQ0NCZpY29uQ29sb3JIZWFkZXI9OTk5OTk5JmJnQ29sb3JDb250ZW50PWM5YzljOSZiZ1RleHR1cmVDb250ZW50PTA1X2luc2V0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NTAmYm9yZGVyQ29sb3JDb250ZW50PWFhYWFhYSZmY0NvbnRlbnQ9MzMzMzMzJmljb25Db2xvckNvbnRlbnQ9OTk5OTk5JmJnQ29sb3JEZWZhdWx0PWVlZWVlZSZiZ1RleHR1cmVEZWZhdWx0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTYwJmJvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmZmNEZWZhdWx0PTMzODNiYiZpY29uQ29sb3JEZWZhdWx0PTcwYjJlMSZiZ0NvbG9ySG92ZXI9ZjhmOGY4JmJnVGV4dHVyZUhvdmVyPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYm9yZGVyQ29sb3JIb3Zlcj1iYmJiYmImZmNIb3Zlcj01OTlmY2YmaWNvbkNvbG9ySG92ZXI9MzM4M2JiJmJnQ29sb3JBY3RpdmU9OTk5OTk5JmJnVGV4dHVyZUFjdGl2ZT0wNl9pbnNldF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NzUmYm9yZGVyQ29sb3JBY3RpdmU9OTk5OTk5JmZjQWN0aXZlPWZmZmZmZiZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZWVlZWVlJmJnVGV4dHVyZUhpZ2hsaWdodD0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmZjSGlnaGxpZ2h0PTQ0NDQ0NCZpY29uQ29sb3JIaWdobGlnaHQ9MzM4M2JiJmJnQ29sb3JFcnJvcj1jMDQwMmEmYmdUZXh0dXJlRXJyb3I9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5RXJyb3I9NTUmYm9yZGVyQ29sb3JFcnJvcj1jMDQwMmEmZmNFcnJvcj1mZmZmZmYmaWNvbkNvbG9yRXJyb3I9ZmJjODU2JmJnQ29sb3JPdmVybGF5PWVlZWVlZSZiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9MCZvcGFjaXR5T3ZlcmxheT04MCZiZ0NvbG9yU2hhZG93PWFhYWFhYSZiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NHB4Jm9mZnNldFRvcFNoYWRvdz0tNHB4Jm9mZnNldExlZnRTaGFkb3c9LTRweCZjb3JuZXJSYWRpdXNTaGFkb3c9MHB4ZG93JTNEMHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfb3ZlcmNhc3QucG5nIiBhbHQ9Ik92ZXJjYXN0IiB0aXRsZT0iT3ZlcmNhc3QiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+T3ZlcmNhc3Q8L3NwYW4+CQkJCTwvYT48L2xpPgkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUlMkMrTHVjaWRhK1NhbnMlMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9bm9ybWFsJmZzRGVmYXVsdD0xLjFlbSZjb3JuZXJSYWRpdXM9MTBweCZiZ0NvbG9ySGVhZGVyPTNhODEwNCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj0zMyZib3JkZXJDb2xvckhlYWRlcj0zZjc1MDYmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mZmZmZmYmYmdDb2xvckNvbnRlbnQ9Mjg1YzAwJmJnVGV4dHVyZUNvbnRlbnQ9MDVfaW5zZXRfc29mdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD0xMCZib3JkZXJDb2xvckNvbnRlbnQ9NzJiNDJkJmZjQ29udGVudD1mZmZmZmYmaWNvbkNvbG9yQ29udGVudD03MmI0MmQmYmdDb2xvckRlZmF1bHQ9NGNhMjBiJmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9NjAmYm9yZGVyQ29sb3JEZWZhdWx0PTQ1OTMwYiZmY0RlZmF1bHQ9ZmZmZmZmJmljb25Db2xvckRlZmF1bHQ9ZmZmZmZmJmJnQ29sb3JIb3Zlcj00ZWIzMDUmYmdUZXh0dXJlSG92ZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTUwJmJvcmRlckNvbG9ySG92ZXI9OGJkODNiJmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPTI4NWMwMCZiZ1RleHR1cmVBY3RpdmU9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0zMCZib3JkZXJDb2xvckFjdGl2ZT03MmI0MmQmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT1mZmZmZmYmYmdDb2xvckhpZ2hsaWdodD1mYmY1ZDAmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZjlkZDM0JmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9NGViMzA1JmJnQ29sb3JFcnJvcj1mZmRjMmUmYmdUZXh0dXJlRXJyb3I9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj05NSZib3JkZXJDb2xvckVycm9yPWZhZDAwMCZmY0Vycm9yPTJiMmIyYiZpY29uQ29sb3JFcnJvcj1jZDBhMGEmYmdDb2xvck92ZXJsYXk9NDQ0NDQ0JmJnVGV4dHVyZU92ZXJsYXk9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTE1Jm9wYWNpdHlPdmVybGF5PTMwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wN19kaWFnb25hbHNfc21hbGwucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PTBweCZvZmZzZXRUb3BTaGFkb3c9NHB4Jm9mZnNldExlZnRTaGFkb3c9NHB4JmNvcm5lclJhZGl1c1NoYWRvdz00cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9sZV9mcm9nLnBuZyIgYWx0PSJMZSBGcm9nIiB0aXRsZT0iTGUgRnJvZyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5MZSBGcm9nPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1IZWx2ZXRpY2ElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTJweCZiZ0NvbG9ySGVhZGVyPWRkZGRkZCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj01MCZib3JkZXJDb2xvckhlYWRlcj1kZGRkZGQmZmNIZWFkZXI9NDQ0NDQ0Jmljb25Db2xvckhlYWRlcj0wMDczZWEmYmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmJnVGV4dHVyZUNvbnRlbnQ9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD03NSZib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmZjQ29udGVudD00NDQ0NDQmaWNvbkNvbG9yQ29udGVudD1mZjAwODQmYmdDb2xvckRlZmF1bHQ9ZjZmNmY2JmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9MTAwJmJvcmRlckNvbG9yRGVmYXVsdD1kZGRkZGQmZmNEZWZhdWx0PTAwNzNlYSZpY29uQ29sb3JEZWZhdWx0PTY2NjY2NiZiZ0NvbG9ySG92ZXI9MDA3M2VhJmJnVGV4dHVyZUhvdmVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIb3Zlcj0yNSZib3JkZXJDb2xvckhvdmVyPTAwNzNlYSZmY0hvdmVyPWZmZmZmZiZpY29uQ29sb3JIb3Zlcj1mZmZmZmYmYmdDb2xvckFjdGl2ZT1mZmZmZmYmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9ZGRkZGRkJmZjQWN0aXZlPWZmMDA4NCZpY29uQ29sb3JBY3RpdmU9NDU0NTQ1JmJnQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmJnVGV4dHVyZUhpZ2hsaWdodD0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmZjSGlnaGxpZ2h0PTQ0NDQ0NCZpY29uQ29sb3JIaWdobGlnaHQ9MDA3M2VhJmJnQ29sb3JFcnJvcj1mZmZmZmYmYmdUZXh0dXJlRXJyb3I9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5RXJyb3I9NTUmYm9yZGVyQ29sb3JFcnJvcj1mZjAwODQmZmNFcnJvcj0yMjIyMjImaWNvbkNvbG9yRXJyb3I9ZmYwMDg0JmJnQ29sb3JPdmVybGF5PWVlZWVlZSZiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9MCZvcGFjaXR5T3ZlcmxheT04MCZiZ0NvbG9yU2hhZG93PWFhYWFhYSZiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NHB4Jm9mZnNldFRvcFNoYWRvdz0tNHB4Jm9mZnNldExlZnRTaGFkb3c9LTRweCZjb3JuZXJSYWRpdXNTaGFkb3c9MHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZmxpY2sucG5nIiBhbHQ9IkZsaWNrIiB0aXRsZT0iRmxpY2siIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RmxpY2s8L3NwYW4+CQkJCTwvYT48L2xpPgkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1UcmVidWNoZXQrTVMlMkMrVGFob21hJTJDK1ZlcmRhbmElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWZmZmZmZiZiZ1RleHR1cmVIZWFkZXI9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTE1JmJvcmRlckNvbG9ySGVhZGVyPWQ0ZDFiZiZmY0hlYWRlcj00NTM4MjEmaWNvbkNvbG9ySGVhZGVyPWI4MzQwMCZiZ0NvbG9yQ29udGVudD1lY2VhZGYmYmdUZXh0dXJlQ29udGVudD0yM19maW5lX2dyYWluLnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwJmJvcmRlckNvbG9yQ29udGVudD1kOWQ2YzQmZmNDb250ZW50PTFmMWYxZiZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD1mOGY3ZjYmYmdUZXh0dXJlRGVmYXVsdD0yM19maW5lX2dyYWluLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwJmJvcmRlckNvbG9yRGVmYXVsdD1jYmM3YmQmZmNEZWZhdWx0PTY1NGIyNCZpY29uQ29sb3JEZWZhdWx0PWI4MzQwMCZiZ0NvbG9ySG92ZXI9NjU0YjI0JmJnVGV4dHVyZUhvdmVyPTIzX2ZpbmVfZ3JhaW4ucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTY1JmJvcmRlckNvbG9ySG92ZXI9NjU0YjI0JmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPWVjZWFkZiZiZ1RleHR1cmVBY3RpdmU9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTE1JmJvcmRlckNvbG9yQWN0aXZlPWQ5ZDZjNCZmY0FjdGl2ZT0xNDBmMDYmaWNvbkNvbG9yQWN0aXZlPThjMjkxZCZiZ0NvbG9ySGlnaGxpZ2h0PWY3ZjNkZSZiZ1RleHR1cmVIaWdobGlnaHQ9MjNfZmluZV9ncmFpbi5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTE1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWIyYTI2NiZmY0hpZ2hsaWdodD0zYTM0MjcmaWNvbkNvbG9ySGlnaGxpZ2h0PTM1NzJhYyZiZ0NvbG9yRXJyb3I9YjgzNDAwJmJnVGV4dHVyZUVycm9yPTIzX2ZpbmVfZ3JhaW4ucG5nJmJnSW1nT3BhY2l0eUVycm9yPTY4JmJvcmRlckNvbG9yRXJyb3I9NjgxODE4JmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZiZGI5MyZiZ0NvbG9yT3ZlcmxheT02ZTRmMWMmYmdUZXh0dXJlT3ZlcmxheT0xNl9kaWFnb25hbF9tYXplLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTIwJm9wYWNpdHlPdmVybGF5PTYwJmJnQ29sb3JTaGFkb3c9MDAwMDAwJmJnVGV4dHVyZVNoYWRvdz0xNl9kaWFnb25hbF9tYXplLnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9NDAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9NXB4Jm9mZnNldFRvcFNoYWRvdz0wJm9mZnNldExlZnRTaGFkb3c9LTEwcHgmY29ybmVyUmFkaXVzU2hhZG93PTE4cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9wZXBwZXJfZ3JpbmRlci5wbmciIGFsdD0iUGVwcGVyIEdyaW5kZXIiIHRpdGxlPSJQZXBwZXIgR3JpbmRlciIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5QZXBwZXIgR3JpbmRlcjwvc3Bhbj4JCQkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1MdWNpZGErR3JhbmRlJTJDK0x1Y2lkYStTYW5zJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj0zMDI3M2EmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MjUmYm9yZGVyQ29sb3JIZWFkZXI9MjMxZDJiJmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9YThhM2FlJmJnQ29sb3JDb250ZW50PTNkMzY0NCZiZ1RleHR1cmVDb250ZW50PTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MzAmYm9yZGVyQ29sb3JDb250ZW50PTdlNzc4MyZmY0NvbnRlbnQ9ZmZmZmZmJmljb25Db2xvckNvbnRlbnQ9ZmZmZmZmJmJnQ29sb3JEZWZhdWx0PWRjZDlkZSZiZ1RleHR1cmVEZWZhdWx0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9ZGNkOWRlJmZjRGVmYXVsdD02NjU4NzQmaWNvbkNvbG9yRGVmYXVsdD04ZDc4YTUmYmdDb2xvckhvdmVyPWVhZTZlYSZiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MTAwJmJvcmRlckNvbG9ySG92ZXI9ZDFjNWQ4JmZjSG92ZXI9NzM0ZDk5Jmljb25Db2xvckhvdmVyPTczNGQ5OSZiZ0NvbG9yQWN0aXZlPTVmNTk2NCZiZ1RleHR1cmVBY3RpdmU9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT00NSZib3JkZXJDb2xvckFjdGl2ZT03ZTc3ODMmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT00NTQ1NDUmYmdDb2xvckhpZ2hsaWdodD1mYWZhZmEmYmdUZXh0dXJlSGlnaGxpZ2h0PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZib3JkZXJDb2xvckhpZ2hsaWdodD1mZmRiMWYmZmNIaWdobGlnaHQ9MzMzMzMzJmljb25Db2xvckhpZ2hsaWdodD04ZDc4YTUmYmdDb2xvckVycm9yPTk5NGQ1MyZiZ1RleHR1cmVFcnJvcj0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlFcnJvcj01NSZib3JkZXJDb2xvckVycm9yPTk5NGQ1MyZmY0Vycm9yPWZmZmZmZiZpY29uQ29sb3JFcnJvcj1lYmNjY2UmYmdDb2xvck92ZXJsYXk9ZWVlZWVlJmJnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5T3ZlcmxheT0wJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9YWFhYWFhJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTYwJnRoaWNrbmVzc1NoYWRvdz00cHgmb2Zmc2V0VG9wU2hhZG93PS00cHgmb2Zmc2V0TGVmdFNoYWRvdz0tNHB4JmNvcm5lclJhZGl1c1NoYWRvdz0wcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9lZ2dwbGFudC5wbmciIGFsdD0iRWdncGxhbnQiIHRpdGxlPSJFZ2dwbGFudCIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5FZ2dwbGFudDwvc3Bhbj4JCQkJPC9hPjwvbGk+CQkJCQkJCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1WZXJkYW5hJTJDK0FyaWFsJTJDK3NhbnMtc2VyaWYmZndEZWZhdWx0PW5vcm1hbCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPTQ0NDQ0NCZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj00NCZib3JkZXJDb2xvckhlYWRlcj0zMzMzMzMmZmNIZWFkZXI9ZmZmZmZmJmljb25Db2xvckhlYWRlcj1mZmZmZmYmYmdDb2xvckNvbnRlbnQ9MDAwMDAwJmJnVGV4dHVyZUNvbnRlbnQ9MTRfbG9vcC5wbmcmYmdJbWdPcGFjaXR5Q29udGVudD0yNSZib3JkZXJDb2xvckNvbnRlbnQ9NTU1NTU1JmZjQ29udGVudD1mZmZmZmYmaWNvbkNvbG9yQ29udGVudD1jY2NjY2MmYmdDb2xvckRlZmF1bHQ9MjIyMjIyJmJnVGV4dHVyZURlZmF1bHQ9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9MzUmYm9yZGVyQ29sb3JEZWZhdWx0PTQ0NDQ0NCZmY0RlZmF1bHQ9ZWVlZWVlJmljb25Db2xvckRlZmF1bHQ9Y2NjY2NjJmJnQ29sb3JIb3Zlcj0wMDMxNDcmYmdUZXh0dXJlSG92ZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTMzJmJvcmRlckNvbG9ySG92ZXI9MGI5M2Q1JmZjSG92ZXI9ZmZmZmZmJmljb25Db2xvckhvdmVyPWZmZmZmZiZiZ0NvbG9yQWN0aXZlPTA5NzJhNSZiZ1RleHR1cmVBY3RpdmU9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0yMCZib3JkZXJDb2xvckFjdGl2ZT0yNmIzZjcmZmNBY3RpdmU9ZmZmZmZmJmljb25Db2xvckFjdGl2ZT0yMjIyMjImYmdDb2xvckhpZ2hsaWdodD1lZWVlZWUmYmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9ODAmYm9yZGVyQ29sb3JIaWdobGlnaHQ9Y2NjY2NjJmZjSGlnaGxpZ2h0PTJlN2RiMiZpY29uQ29sb3JIaWdobGlnaHQ9NGI4ZTBiJmJnQ29sb3JFcnJvcj1mZmM3M2QmYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTQwJmJvcmRlckNvbG9yRXJyb3I9ZmZiNzNkJmZjRXJyb3I9MTExMTExJmljb25Db2xvckVycm9yPWE4MzMwMCZiZ0NvbG9yT3ZlcmxheT01YzVjNWMmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJm9wYWNpdHlPdmVybGF5PTgwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MzAmb3BhY2l0eVNoYWRvdz02MCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZGFya19oaXZlLnBuZyIgYWx0PSJEYXJrIEhpdmUiIHRpdGxlPSJEYXJrIEhpdmUiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RGFyayBIaXZlPC9zcGFuPgkJPC9hPjwvbGk+CQkJCQkJCQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUx1Y2lkYStHcmFuZGUlMkMrTHVjaWRhK1NhbnMlMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWRlZWRmNyZiZ1RleHR1cmVIZWFkZXI9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUhlYWRlcj0xMDAmYm9yZGVyQ29sb3JIZWFkZXI9YWVkMGVhJmZjSGVhZGVyPTIyMjIyMiZpY29uQ29sb3JIZWFkZXI9NzJhN2NmJmJnQ29sb3JDb250ZW50PWYyZjVmNyZiZ1RleHR1cmVDb250ZW50PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZib3JkZXJDb2xvckNvbnRlbnQ9ZGRkZGRkJmZjQ29udGVudD0zNjJiMzYmaWNvbkNvbG9yQ29udGVudD03MmE3Y2YmYmdDb2xvckRlZmF1bHQ9ZDdlYmY5JmJnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eURlZmF1bHQ9ODAmYm9yZGVyQ29sb3JEZWZhdWx0PWFlZDBlYSZmY0RlZmF1bHQ9Mjc3OWFhJmljb25Db2xvckRlZmF1bHQ9M2Q4MGIzJmJnQ29sb3JIb3Zlcj1lNGYxZmImYmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTEwMCZib3JkZXJDb2xvckhvdmVyPTc0YjJlMiZmY0hvdmVyPTAwNzBhMyZpY29uQ29sb3JIb3Zlcj0yNjk0ZTgmYmdDb2xvckFjdGl2ZT0zYmFhZTMmYmdUZXh0dXJlQWN0aXZlPTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlBY3RpdmU9NTAmYm9yZGVyQ29sb3JBY3RpdmU9MjY5NGU4JmZjQWN0aXZlPWZmZmZmZiZpY29uQ29sb3JBY3RpdmU9ZmZmZmZmJmJnQ29sb3JIaWdobGlnaHQ9ZmZlZjhmJmJnVGV4dHVyZUhpZ2hsaWdodD0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTI1JmJvcmRlckNvbG9ySGlnaGxpZ2h0PWY5ZGQzNCZmY0hpZ2hsaWdodD0zNjM2MzYmaWNvbkNvbG9ySGlnaGxpZ2h0PTJlODNmZiZiZ0NvbG9yRXJyb3I9Y2QwYTBhJmJnVGV4dHVyZUVycm9yPTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUVycm9yPTE1JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZmZmZiZiZ0NvbG9yT3ZlcmxheT1lZWVlZWUmYmdUZXh0dXJlT3ZlcmxheT0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmJnSW1nT3BhY2l0eU92ZXJsYXk9OTAmb3BhY2l0eU92ZXJsYXk9ODAmYmdDb2xvclNoYWRvdz0wMDAwMDAmYmdUZXh0dXJlU2hhZG93PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9NzAmb3BhY2l0eVNoYWRvdz0zMCZ0aGlja25lc3NTaGFkb3c9N3B4Jm9mZnNldFRvcFNoYWRvdz0tN3B4Jm9mZnNldExlZnRTaGFkb3c9LTdweCZjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfY3VwZXJ0aW5vLnBuZyIgYWx0PSJDdXBlcnRpbm8iIHRpdGxlPSJDdXBlcnRpbm8iIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+Q3VwZXJ0aW5vPC9zcGFuPgkJCQk8L2E+PC9saT4JCQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9c2Vnb2UrdWklMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTZweCZiZ0NvbG9ySGVhZGVyPWVjZThkYSZiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTEwMCZib3JkZXJDb2xvckhlYWRlcj1kNGNjYjAmZmNIZWFkZXI9NDMzZjM4Jmljb25Db2xvckhlYWRlcj04NDdlNzEmYmdDb2xvckNvbnRlbnQ9ZjVmM2U1JmJnVGV4dHVyZUNvbnRlbnQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD1kZmQ5YzMmZmNDb250ZW50PTMxMmUyNSZpY29uQ29sb3JDb250ZW50PTgwODA4MCZiZ0NvbG9yRGVmYXVsdD00NTllMDAmYmdUZXh0dXJlRGVmYXVsdD0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5RGVmYXVsdD0xNSZib3JkZXJDb2xvckRlZmF1bHQ9MzI3RTA0JmZjRGVmYXVsdD1mZmZmZmYmaWNvbkNvbG9yRGVmYXVsdD1lZWVlZWUmYmdDb2xvckhvdmVyPTY3YjAyMSZiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MjUmYm9yZGVyQ29sb3JIb3Zlcj0zMjdFMDQmZmNIb3Zlcj1mZmZmZmYmaWNvbkNvbG9ySG92ZXI9ZmZmZmZmJmJnQ29sb3JBY3RpdmU9ZmFmYWY0JmJnVGV4dHVyZUFjdGl2ZT0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZib3JkZXJDb2xvckFjdGl2ZT1kNGNjYjAmZmNBY3RpdmU9NDU5ZTAwJmljb25Db2xvckFjdGl2ZT04REMyNjImYmdDb2xvckhpZ2hsaWdodD1mY2YwYmEmYmdUZXh0dXJlSGlnaGxpZ2h0PTAyX2dsYXNzLnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NTUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZThlMWI1JmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9OERDMjYyJmJnQ29sb3JFcnJvcj1mZmVkYWQmYmdUZXh0dXJlRXJyb3I9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUVycm9yPTk1JmJvcmRlckNvbG9yRXJyb3I9ZTNhMzQ1JmZjRXJyb3I9Y2Q1YzBhJmljb25Db2xvckVycm9yPWNkMGEwYSZiZ0NvbG9yT3ZlcmxheT0yYjI5MjImYmdUZXh0dXJlT3ZlcmxheT0wNV9pbnNldF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTE1Jm9wYWNpdHlPdmVybGF5PTkwJmJnQ29sb3JTaGFkb3c9Y2NjY2NjJmJnVGV4dHVyZVNoYWRvdz0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5U2hhZG93PTk1Jm9wYWNpdHlTaGFkb3c9MjAmdGhpY2tuZXNzU2hhZG93PTEycHgmb2Zmc2V0VG9wU2hhZG93PS0xMnB4Jm9mZnNldExlZnRTaGFkb3c9LTEycHgmY29ybmVyUmFkaXVzU2hhZG93PTEwcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9zb3V0aF9zdHJlZXQucG5nIiBhbHQ9IlNvdXRoIFN0IiB0aXRsZT0iU291dGggU3QiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U291dGggU3RyZWV0PC9zcGFuPgkJCQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUFyaWFsLHNhbnMtc2VyaWYmZndEZWZhdWx0PWJvbGQmZnNEZWZhdWx0PTEuMWVtJmNvcm5lclJhZGl1cz02cHgmYmdDb2xvckhlYWRlcj1jYzAwMDAmYmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIZWFkZXI9MTUmYm9yZGVyQ29sb3JIZWFkZXI9ZTNhMWExJmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9ZmZmZmZmJmJnQ29sb3JDb250ZW50PWZmZmZmZiZiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eUNvbnRlbnQ9NzUmYm9yZGVyQ29sb3JDb250ZW50PWVlZWVlZSZmY0NvbnRlbnQ9MzMzMzMzJmljb25Db2xvckNvbnRlbnQ9Y2MwMDAwJmJnQ29sb3JEZWZhdWx0PWVlZWVlZSZiZ1RleHR1cmVEZWZhdWx0PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9ZDhkY2RmJmZjRGVmYXVsdD0wMDQyNzYmaWNvbkNvbG9yRGVmYXVsdD1jYzAwMDAmYmdDb2xvckhvdmVyPWY2ZjZmNiZiZ1RleHR1cmVIb3Zlcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYmdJbWdPcGFjaXR5SG92ZXI9MTAwJmJvcmRlckNvbG9ySG92ZXI9Y2RkNWRhJmZjSG92ZXI9MTExMTExJmljb25Db2xvckhvdmVyPWNjMDAwMCZiZ0NvbG9yQWN0aXZlPWZmZmZmZiZiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYmdJbWdPcGFjaXR5QWN0aXZlPTY1JmJvcmRlckNvbG9yQWN0aXZlPWVlZWVlZSZmY0FjdGl2ZT1jYzAwMDAmaWNvbkNvbG9yQWN0aXZlPWNjMDAwMCZiZ0NvbG9ySGlnaGxpZ2h0PWZiZjhlZSZiZ1RleHR1cmVIaWdobGlnaHQ9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZib3JkZXJDb2xvckhpZ2hsaWdodD1mY2QzYTEmZmNIaWdobGlnaHQ9NDQ0NDQ0Jmljb25Db2xvckhpZ2hsaWdodD0wMDQyNzYmYmdDb2xvckVycm9yPWYzZDhkOCZiZ1RleHR1cmVFcnJvcj0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmJnSW1nT3BhY2l0eUVycm9yPTc1JmJvcmRlckNvbG9yRXJyb3I9Y2MwMDAwJmZjRXJyb3I9MmUyZTJlJmljb25Db2xvckVycm9yPWNjMDAwMCZiZ0NvbG9yT3ZlcmxheT1hNmE2YTYmYmdUZXh0dXJlT3ZlcmxheT0wOV9kb3RzX3NtYWxsLnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTY1Jm9wYWNpdHlPdmVybGF5PTQwJmJnQ29sb3JTaGFkb3c9MzMzMzMzJmJnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlTaGFkb3c9MCZvcGFjaXR5U2hhZG93PTEwJnRoaWNrbmVzc1NoYWRvdz04cHgmb2Zmc2V0VG9wU2hhZG93PS04cHgmb2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmNvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ibGl0emVyLnBuZyIgYWx0PSJCbGl0emVyIiB0aXRsZT0iQmxpdHplciIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5CbGl0emVyPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD90cj1mZkRlZmF1bHQ9SGVsdmV0aWNhLEFyaWFsLHNhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ub3JtYWwmYW1wO2ZzRGVmYXVsdD0xLjFlbSZhbXA7Y29ybmVyUmFkaXVzPTZweCZhbXA7YmdDb2xvckhlYWRlcj1jYjg0MmUmYW1wO2JnVGV4dHVyZUhlYWRlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0yNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9ZDQ5NzY4JmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1mZmZmZmYmYW1wO2JnQ29sb3JDb250ZW50PWY0ZjBlYyZhbXA7YmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xMDAmYW1wO2JvcmRlckNvbG9yQ29udGVudD1lMGNmYzImYW1wO2ZjQ29udGVudD0xZTFiMWQmYW1wO2ljb25Db2xvckNvbnRlbnQ9YzQ3YTIzJmFtcDtiZ0NvbG9yRGVmYXVsdD1lZGU0ZDQmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTcwJmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9Y2RjM2I3JmFtcDtmY0RlZmF1bHQ9M2YzNzMxJmFtcDtpY29uQ29sb3JEZWZhdWx0PWYwODAwMCZhbXA7YmdDb2xvckhvdmVyPWY1ZjBlNSZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYW1wO2JvcmRlckNvbG9ySG92ZXI9ZjVhZDY2JmFtcDtmY0hvdmVyPWE0NjMxMyZhbXA7aWNvbkNvbG9ySG92ZXI9ZjA4MDAwJmFtcDtiZ0NvbG9yQWN0aXZlPWY0ZjBlYyZhbXA7YmdUZXh0dXJlQWN0aXZlPTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTEwMCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9ZTBjZmMyJmFtcDtmY0FjdGl2ZT1iODU3MDAmYW1wO2ljb25Db2xvckFjdGl2ZT1mMzVmMDcmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZjVmNWI1JmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NzUmYW1wO2JvcmRlckNvbG9ySGlnaGxpZ2h0PWQ5YmI3MyZhbXA7ZmNIaWdobGlnaHQ9MDYwMjAwJmFtcDtpY29uQ29sb3JIaWdobGlnaHQ9Y2I2NzJiJmFtcDtiZ0NvbG9yRXJyb3I9ZmVlNGJkJmFtcDtiZ1RleHR1cmVFcnJvcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTY1JmFtcDtib3JkZXJDb2xvckVycm9yPWY4ODkzZiZhbXA7ZmNFcnJvcj01OTIwMDMmYW1wO2ljb25Db2xvckVycm9yPWZmNzUxOSZhbXA7YmdDb2xvck92ZXJsYXk9YWFhYWFhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTc1JmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz1hYWFhYWEmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTc1JmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfaHVtYW5pdHkucG5nIiBhbHQ9Ikh1bWFuaXR5IiB0aXRsZT0iSHVtYW5pdHkiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+SHVtYW5pdHk8L3NwYW4+CQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1HaWxsK1NhbnMsQXJpYWwsc2Fucy1zZXJpZiZhbXA7ZndEZWZhdWx0PWJvbGQmYW1wO2ZzRGVmYXVsdD0xLjJlbSZhbXA7Y29ybmVyUmFkaXVzPTRweCZhbXA7YmdDb2xvckhlYWRlcj0zNTQxNGYmYW1wO2JnVGV4dHVyZUhlYWRlcj0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTM1JmFtcDtib3JkZXJDb2xvckhlYWRlcj0yYzQzNTkmYW1wO2ZjSGVhZGVyPWUxZTQ2MyZhbXA7aWNvbkNvbG9ySGVhZGVyPWUxZTQ2MyZhbXA7YmdDb2xvckNvbnRlbnQ9ZmZmZmZmJmFtcDtiZ1RleHR1cmVDb250ZW50PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTc1JmFtcDtib3JkZXJDb2xvckNvbnRlbnQ9YWFhYWFhJmFtcDtmY0NvbnRlbnQ9MmM0MzU5JmFtcDtpY29uQ29sb3JDb250ZW50PWMwMjY2OSZhbXA7YmdDb2xvckRlZmF1bHQ9OTNjM2NkJmFtcDtiZ1RleHR1cmVEZWZhdWx0PTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NTAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD05M2MzY2QmYW1wO2ZjRGVmYXVsdD0zMzMzMzMmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZmZmZmZmJmFtcDtiZ0NvbG9ySG92ZXI9Y2NkMjMyJmFtcDtiZ1RleHR1cmVIb3Zlcj0wN19kaWFnb25hbHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj03NSZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj05OTk5OTkmYW1wO2ZjSG92ZXI9MjEyMTIxJmFtcDtpY29uQ29sb3JIb3Zlcj00NTQ1NDUmYW1wO2JnQ29sb3JBY3RpdmU9ZGI0ODY1JmFtcDtiZ1RleHR1cmVBY3RpdmU9MDdfZGlhZ29uYWxzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTQwJmFtcDtib3JkZXJDb2xvckFjdGl2ZT1mZjZiN2YmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWZmZmZmZiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mZmZmMzgmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0xMF9kb3RzX21lZGl1bS5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD04MCZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9YjRkMTAwJmFtcDtmY0hpZ2hsaWdodD0zNjM2MzYmYW1wO2ljb25Db2xvckhpZ2hsaWdodD04OGEyMDYmYW1wO2JnQ29sb3JFcnJvcj1mZjM4NTMmYW1wO2JnVGV4dHVyZUVycm9yPTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTUwJmFtcDtib3JkZXJDb2xvckVycm9yPWZmNmI3ZiZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmZWIzMyZhbXA7YmdDb2xvck92ZXJsYXk9ZjdmN2JhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTExX3doaXRlX2xpbmVzLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT04NSZhbXA7b3BhY2l0eU92ZXJsYXk9ODAmYW1wO2JnQ29sb3JTaGFkb3c9YmE5MjE3JmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz03NSZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTEwcHgmYW1wO29mZnNldFRvcFNoYWRvdz04cHgmYW1wO29mZnNldExlZnRTaGFkb3c9OHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9NXB4Ij4JCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ob3Rfc25lYWtzLnBuZyIgYWx0PSJIb3QgU25lYWtzIiB0aXRsZT0iSG90IFNuZWFrcyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5Ib3Qgc25lYWtzPC9zcGFuPgkJPC9hPjwvbGk+CQkJPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvY3NzL3BhcnNlVGhlbWUuY3NzLnBocD9mZkRlZmF1bHQ9c2Vnb2UrdWksK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuMWVtJmFtcDtjb3JuZXJSYWRpdXM9M3B4JmFtcDtiZ0NvbG9ySGVhZGVyPWY5ZjlmOSZhbXA7YmdUZXh0dXJlSGVhZGVyPTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTEwMCZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9Y2NjY2NjJmFtcDtmY0hlYWRlcj1lNjk3MDAmYW1wO2ljb25Db2xvckhlYWRlcj01ZmE1ZTMmYW1wO2JnQ29sb3JDb250ZW50PWVlZWVlZSZhbXA7YmdUZXh0dXJlQ29udGVudD0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xMDAmYW1wO2JvcmRlckNvbG9yQ29udGVudD1hYWFhYWEmYW1wO2ZjQ29udGVudD0yMjIyMjImYW1wO2ljb25Db2xvckNvbnRlbnQ9MGE4MmViJmFtcDtiZ0NvbG9yRGVmYXVsdD0xNDg0ZTYmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0yMiZhbXA7Ym9yZGVyQ29sb3JEZWZhdWx0PWZmZmZmZiZhbXA7ZmNEZWZhdWx0PWZmZmZmZiZhbXA7aWNvbkNvbG9yRGVmYXVsdD1mY2RkNGEmYW1wO2JnQ29sb3JIb3Zlcj0yMjkzZjcmYW1wO2JnVGV4dHVyZUhvdmVyPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTI2JmFtcDtib3JkZXJDb2xvckhvdmVyPTIyOTNmNyZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1lNjk3MDAmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wOF9kaWFnb25hbHNfdGhpY2sucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9MjAmYW1wO2JvcmRlckNvbG9yQWN0aXZlPWU2OTcwMCZhbXA7ZmNBY3RpdmU9ZmZmZmZmJmFtcDtpY29uQ29sb3JBY3RpdmU9ZmZmZmZmJmFtcDtiZ0NvbG9ySGlnaGxpZ2h0PWM1ZGRmYyZhbXA7YmdUZXh0dXJlSGlnaGxpZ2h0PTA3X2RpYWdvbmFsc19zbWFsbC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD0yNSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmFtcDtmY0hpZ2hsaWdodD0zMzMzMzMmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wYjU0ZDUmYW1wO2JnQ29sb3JFcnJvcj1lNjk3MDAmYW1wO2JnVGV4dHVyZUVycm9yPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTIwJmFtcDtib3JkZXJDb2xvckVycm9yPWU2OTcwMCZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmZmZmZiZhbXA7YmdDb2xvck92ZXJsYXk9ZTZiOTAwJmFtcDtiZ1RleHR1cmVPdmVybGF5PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTAmYW1wO29wYWNpdHlPdmVybGF5PTMwJmFtcDtiZ0NvbG9yU2hhZG93PWU2OTcwMCZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9MCZhbXA7b3BhY2l0eVNoYWRvdz0yMCZhbXA7dGhpY2tuZXNzU2hhZG93PTBweCZhbXA7b2Zmc2V0VG9wU2hhZG93PTZweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz02cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0zcHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9leGNpdGVfYmlrZS5wbmciIGFsdD0iRXhjaXRlIEJpa2UiIHRpdGxlPSJFeGNpdGUgQmlrZSIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5FeGNpdGUgQmlrZTwvc3Bhbj4JCQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/dHImYW1wO2ZmRGVmYXVsdD1IZWx2ZXRpY2EsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xJmFtcDtmc0RlZmF1bHRVbml0PWVtJmFtcDtjb3JuZXJSYWRpdXM9NSZhbXA7Y29ybmVyUmFkaXVzVW5pdD1weCZhbXA7YmdDb2xvckhlYWRlcj04ODg4ODgmYW1wO2JnVGV4dHVyZUhlYWRlcj0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0xNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9NDA0MDQwJmFtcDtmY0hlYWRlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhlYWRlcj1jY2NjY2MmYW1wO2JnQ29sb3JDb250ZW50PTEyMTIxMiZhbXA7YmdUZXh0dXJlQ29udGVudD0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0xNiZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTQwNDA0MCZhbXA7ZmNDb250ZW50PWVlZWVlZSZhbXA7aWNvbkNvbG9yQ29udGVudD1iYmJiYmImYW1wO2JnQ29sb3JEZWZhdWx0PWFkYWRhZCZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MzUmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD1jY2NjY2MmYW1wO2ZjRGVmYXVsdD0zMzMzMzMmYW1wO2ljb25Db2xvckRlZmF1bHQ9NjY2NjY2JmFtcDtiZ0NvbG9ySG92ZXI9ZGRkZGRkJmFtcDtiZ1RleHR1cmVIb3Zlcj0wM19oaWdobGlnaHRfc29mdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTYwJmFtcDtib3JkZXJDb2xvckhvdmVyPWRkZGRkZCZhbXA7ZmNIb3Zlcj0wMDAwMDAmYW1wO2ljb25Db2xvckhvdmVyPWM5ODAwMCZhbXA7YmdDb2xvckFjdGl2ZT0xMjEyMTImYW1wO2JnVGV4dHVyZUFjdGl2ZT0wNV9pbnNldF9zb2Z0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTE1JmFtcDtib3JkZXJDb2xvckFjdGl2ZT0wMDAwMDAmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWYyOWEwMCZhbXA7YmdDb2xvckhpZ2hsaWdodD01NTU1NTUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wNF9oaWdobGlnaHRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9NDA0MDQwJmFtcDtmY0hpZ2hsaWdodD1jY2NjY2MmYW1wO2ljb25Db2xvckhpZ2hsaWdodD1hYWFhYWEmYW1wO2JnQ29sb3JFcnJvcj1mZWYxZWMmYW1wO2JnVGV4dHVyZUVycm9yPTAyX2dsYXNzLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9OTUmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWNkMGEwYSZhbXA7aWNvbkNvbG9yRXJyb3I9Y2QwYTBhIj4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfYmxhY2tfbWF0dGUucG5nIiBhbHQ9IlZhZGVyIiB0aXRsZT0iVmFkZXIiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VmFkZXI8L3NwYW4+CQkJPC9hPjwvbGk+CQkJCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PUFyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuM2VtJmFtcDtjb3JuZXJSYWRpdXM9NHB4JmFtcDtiZ0NvbG9ySGVhZGVyPTBiM2U2ZiZhbXA7YmdUZXh0dXJlSGVhZGVyPTA4X2RpYWdvbmFsc190aGljay5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj0xNSZhbXA7Ym9yZGVyQ29sb3JIZWFkZXI9MGIzZTZmJmFtcDtmY0hlYWRlcj1mNmY2ZjYmYW1wO2ljb25Db2xvckhlYWRlcj05OGQyZmImYW1wO2JnQ29sb3JDb250ZW50PTExMTExMSZhbXA7YmdUZXh0dXJlQ29udGVudD0xMl9nbG9zc193YXZlLnBuZyZhbXA7YmdJbWdPcGFjaXR5Q29udGVudD0yMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PTAwMDAwMCZhbXA7ZmNDb250ZW50PWQ5ZDlkOSZhbXA7aWNvbkNvbG9yQ29udGVudD05Y2NkZmMmYW1wO2JnQ29sb3JEZWZhdWx0PTMzMzMzMyZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5RGVmYXVsdD0yMCZhbXA7Ym9yZGVyQ29sb3JEZWZhdWx0PTMzMzMzMyZhbXA7ZmNEZWZhdWx0PWZmZmZmZiZhbXA7aWNvbkNvbG9yRGVmYXVsdD05Y2NkZmMmYW1wO2JnQ29sb3JIb3Zlcj0wMDQ5OGYmYW1wO2JnVGV4dHVyZUhvdmVyPTA5X2RvdHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj00MCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj0yMjIyMjImYW1wO2ZjSG92ZXI9ZmZmZmZmJmFtcDtpY29uQ29sb3JIb3Zlcj1mZmZmZmYmYW1wO2JnQ29sb3JBY3RpdmU9MjkyOTI5JmFtcDtiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUFjdGl2ZT00MCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9MDk2YWM4JmFtcDtmY0FjdGl2ZT03NWFiZmYmYW1wO2ljb25Db2xvckFjdGl2ZT0wMDQ5OGYmYW1wO2JnQ29sb3JIaWdobGlnaHQ9MGI1OGEyJmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MTBfZG90c19tZWRpdW0ucG5nJmFtcDtiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9MzAmYW1wO2JvcmRlckNvbG9ySGlnaGxpZ2h0PTA1MmY1NyZhbXA7ZmNIaWdobGlnaHQ9ZmZmZmZmJmFtcDtpY29uQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmFtcDtiZ0NvbG9yRXJyb3I9YTMyZDAwJmFtcDtiZ1RleHR1cmVFcnJvcj0wOV9kb3RzX3NtYWxsLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9MzAmYW1wO2JvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmFtcDtmY0Vycm9yPWZmZmZmZiZhbXA7aWNvbkNvbG9yRXJyb3I9ZmZmZmZmJmFtcDtiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eVNoYWRvdz0wJmFtcDtvcGFjaXR5U2hhZG93PTMwJmFtcDt0aGlja25lc3NTaGFkb3c9OHB4JmFtcDtvZmZzZXRUb3BTaGFkb3c9LThweCZhbXA7b2Zmc2V0TGVmdFNoYWRvdz0tOHB4JmFtcDtjb3JuZXJSYWRpdXNTaGFkb3c9OHB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfZG90X2x1di5wbmciIGFsdD0iRG90IEx1diIgdGl0bGU9IkRvdCBMdXYiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+RG90IEx1djwvc3Bhbj4JCQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1TZWdvZStVSSUyQytIZWx2ZXRpY2ElMkMrQXJpYWwlMkMrc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPTQ1MzMyNiZiZ1RleHR1cmVIZWFkZXI9MTJfZ2xvc3Nfd2F2ZS5wbmcmYmdJbWdPcGFjaXR5SGVhZGVyPTI1JmJvcmRlckNvbG9ySGVhZGVyPTY5NTY0OSZmY0hlYWRlcj1lM2RkYzkmaWNvbkNvbG9ySGVhZGVyPWUzZGRjOSZiZ0NvbG9yQ29udGVudD0yMDE5MTMmYmdUZXh0dXJlQ29udGVudD0wNV9pbnNldF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlDb250ZW50PTEwJmJvcmRlckNvbG9yQ29udGVudD05Yzk0N2MmZmNDb250ZW50PWZmZmZmZiZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD0xYzE2MGQmYmdUZXh0dXJlRGVmYXVsdD0xMl9nbG9zc193YXZlLnBuZyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTIwJmJvcmRlckNvbG9yRGVmYXVsdD02OTU0NDQmZmNEZWZhdWx0PTliY2M2MCZpY29uQ29sb3JEZWZhdWx0PTliY2M2MCZiZ0NvbG9ySG92ZXI9NDQzNzJjJmJnVGV4dHVyZUhvdmVyPTEyX2dsb3NzX3dhdmUucG5nJmJnSW1nT3BhY2l0eUhvdmVyPTMwJmJvcmRlckNvbG9ySG92ZXI9OWM5NDdjJmZjSG92ZXI9YmFlYzdlJmljb25Db2xvckhvdmVyPWFkZDk3OCZiZ0NvbG9yQWN0aXZlPTIwMTkxMyZiZ1RleHR1cmVBY3RpdmU9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmJnSW1nT3BhY2l0eUFjdGl2ZT0yMCZib3JkZXJDb2xvckFjdGl2ZT05Yzk0N2MmZmNBY3RpdmU9ZTNkZGM5Jmljb25Db2xvckFjdGl2ZT1lM2RkYzkmYmdDb2xvckhpZ2hsaWdodD02MTkyMjYmYmdUZXh0dXJlSGlnaGxpZ2h0PTAzX2hpZ2hsaWdodF9zb2Z0LnBuZyZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9MjAmYm9yZGVyQ29sb3JIaWdobGlnaHQ9YWRkOTc4JmZjSGlnaGxpZ2h0PWZmZmZmZiZpY29uQ29sb3JIaWdobGlnaHQ9ZmZmZmZmJmJnQ29sb3JFcnJvcj01ZjM5MWImYmdUZXh0dXJlRXJyb3I9MDJfZ2xhc3MucG5nJmJnSW1nT3BhY2l0eUVycm9yPTE1JmJvcmRlckNvbG9yRXJyb3I9NWYzOTFiJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWYxZmQ4NiZiZ0NvbG9yT3ZlcmxheT1hYWFhYWEmYmdUZXh0dXJlT3ZlcmxheT0wMV9mbGF0LnBuZyZiZ0ltZ09wYWNpdHlPdmVybGF5PTAmb3BhY2l0eU92ZXJsYXk9MzAmYmdDb2xvclNoYWRvdz1hYWFhYWEmYmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmJnSW1nT3BhY2l0eVNoYWRvdz0wJm9wYWNpdHlTaGFkb3c9MzAmdGhpY2tuZXNzU2hhZG93PThweCZvZmZzZXRUb3BTaGFkb3c9LThweCZvZmZzZXRMZWZ0U2hhZG93PS04cHgmY29ybmVyUmFkaXVzU2hhZG93PThweCI+CQkJPGltZyBzcmM9Imh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL3RoZW1lXzkwX21pbnRfY2hvY28ucG5nIiBhbHQ9Ik1pbnQgQ2hvYyIgdGl0bGU9Ik1pbnQgQ2hvYyIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5NaW50IENob2M8L3NwYW4+CQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVZlcmRhbmEsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9bm9ybWFsJmFtcDtmc0RlZmF1bHQ9MS4xZW0mYW1wO2Nvcm5lclJhZGl1cz00cHgmYW1wO2JnQ29sb3JIZWFkZXI9MzMzMzMzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MDhfZGlhZ29uYWxzX3RoaWNrLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGVhZGVyPTgmYW1wO2JvcmRlckNvbG9ySGVhZGVyPWEzYTNhMyZhbXA7ZmNIZWFkZXI9ZWVlZWVlJmFtcDtpY29uQ29sb3JIZWFkZXI9YmJiYmJiJmFtcDtiZ0NvbG9yQ29udGVudD1mOWY5ZjkmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MDRfaGlnaGxpZ2h0X2hhcmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTEwMCZhbXA7Ym9yZGVyQ29sb3JDb250ZW50PWNjY2NjYyZhbXA7ZmNDb250ZW50PTIyMjIyMiZhbXA7aWNvbkNvbG9yQ29udGVudD0yMjIyMjImYW1wO2JnQ29sb3JEZWZhdWx0PTExMTExMSZhbXA7YmdUZXh0dXJlRGVmYXVsdD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9NDAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD03Nzc3NzcmYW1wO2ZjRGVmYXVsdD1lM2UzZTMmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZWRlZGVkJmFtcDtiZ0NvbG9ySG92ZXI9MWMxYzFjJmFtcDtiZ1RleHR1cmVIb3Zlcj0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhvdmVyPTU1JmFtcDtib3JkZXJDb2xvckhvdmVyPTAwMDAwMCZhbXA7ZmNIb3Zlcj1mZmZmZmYmYW1wO2ljb25Db2xvckhvdmVyPWZmZmZmZiZhbXA7YmdDb2xvckFjdGl2ZT1mZmZmZmYmYW1wO2JnVGV4dHVyZUFjdGl2ZT0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5QWN0aXZlPTY1JmFtcDtib3JkZXJDb2xvckFjdGl2ZT1jY2NjY2MmYW1wO2ZjQWN0aXZlPTIyMjIyMiZhbXA7aWNvbkNvbG9yQWN0aXZlPTIyMjIyMiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mZmViODAmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wNl9pbnNldF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5SGlnaGxpZ2h0PTU1JmFtcDtib3JkZXJDb2xvckhpZ2hsaWdodD1mZmRlMmUmYW1wO2ZjSGlnaGxpZ2h0PTM2MzYzNiZhbXA7aWNvbkNvbG9ySGlnaGxpZ2h0PTRjYTMwMCZhbXA7YmdDb2xvckVycm9yPWNkMGEwYSZhbXA7YmdUZXh0dXJlRXJyb3I9MDZfaW5zZXRfaGFyZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUVycm9yPTQ1JmFtcDtib3JkZXJDb2xvckVycm9yPTllMDUwNSZhbXA7ZmNFcnJvcj1mZmZmZmYmYW1wO2ljb25Db2xvckVycm9yPWZmY2YyOSZhbXA7YmdDb2xvck92ZXJsYXk9YWFhYWFhJmFtcDtiZ1RleHR1cmVPdmVybGF5PTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5T3ZlcmxheT00MCZhbXA7b3BhY2l0eU92ZXJsYXk9MzAmYW1wO2JnQ29sb3JTaGFkb3c9YWFhYWFhJmFtcDtiZ1RleHR1cmVTaGFkb3c9MDNfaGlnaGxpZ2h0X3NvZnQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9NTAmYW1wO29wYWNpdHlTaGFkb3c9MjAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz04cHgiPgkJCTxpbWcgc3JjPSJodHRwOi8vbGVhcm5pbmdqcXVlcnkua3N3ZWRiZXJnLm5ldGRuYS1jZG4uY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy90aGVtZXJvbGxlci90aGVtZV85MF9ibGFja190aWUucG5nIiBhbHQ9IkJsYWNrIFRpZSIgdGl0bGU9IkJsYWNrIFRpZSIgLz4JCQk8c3BhbiBjbGFzcz0idGhlbWVOYW1lIj5CbGFjayBUaWU8L3NwYW4+CQk8L2E+PC9saT4JCTxsaT48YSBocmVmPSJodHRwOi8vanF1ZXJ5dWkuY29tL3RoZW1lcm9sbGVyL2Nzcy9wYXJzZVRoZW1lLmNzcy5waHA/ZmZEZWZhdWx0PVNlZ29lK1VJLCtIZWx2ZXRpY2EsK0FyaWFsLCtzYW5zLXNlcmlmJmFtcDtmd0RlZmF1bHQ9Ym9sZCZhbXA7ZnNEZWZhdWx0PTEuMWVtJmFtcDtjb3JuZXJSYWRpdXM9NnB4JmFtcDtiZ0NvbG9ySGVhZGVyPTlmZGE1OCZhbXA7YmdUZXh0dXJlSGVhZGVyPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlIZWFkZXI9ODUmYW1wO2JvcmRlckNvbG9ySGVhZGVyPTAwMDAwMCZhbXA7ZmNIZWFkZXI9MjIyMjIyJmFtcDtpY29uQ29sb3JIZWFkZXI9MWYxZjFmJmFtcDtiZ0NvbG9yQ29udGVudD0wMDAwMDAmYW1wO2JnVGV4dHVyZUNvbnRlbnQ9MTJfZ2xvc3Nfd2F2ZS5wbmcmYW1wO2JnSW1nT3BhY2l0eUNvbnRlbnQ9NTUmYW1wO2JvcmRlckNvbG9yQ29udGVudD00YTRhNGEmYW1wO2ZjQ29udGVudD1mZmZmZmYmYW1wO2ljb25Db2xvckNvbnRlbnQ9OWZkYTU4JmFtcDtiZ0NvbG9yRGVmYXVsdD0wYTBhMGEmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlEZWZhdWx0PTQwJmFtcDtib3JkZXJDb2xvckRlZmF1bHQ9MWIxNjEzJmFtcDtmY0RlZmF1bHQ9YjhlYzc5JmFtcDtpY29uQ29sb3JEZWZhdWx0PWI4ZWM3OSZhbXA7YmdDb2xvckhvdmVyPTAwMDAwMCZhbXA7YmdUZXh0dXJlSG92ZXI9MDJfZ2xhc3MucG5nJmFtcDtiZ0ltZ09wYWNpdHlIb3Zlcj02MCZhbXA7Ym9yZGVyQ29sb3JIb3Zlcj0wMDAwMDAmYW1wO2ZjSG92ZXI9OTZmMjI2JmFtcDtpY29uQ29sb3JIb3Zlcj1iOGVjNzkmYW1wO2JnQ29sb3JBY3RpdmU9NGM0YzRjJmFtcDtiZ1RleHR1cmVBY3RpdmU9MDFfZmxhdC5wbmcmYW1wO2JnSW1nT3BhY2l0eUFjdGl2ZT0wJmFtcDtib3JkZXJDb2xvckFjdGl2ZT02OTY5NjkmYW1wO2ZjQWN0aXZlPWZmZmZmZiZhbXA7aWNvbkNvbG9yQWN0aXZlPWZmZmZmZiZhbXA7YmdDb2xvckhpZ2hsaWdodD1mMWZiZTUmYW1wO2JnVGV4dHVyZUhpZ2hsaWdodD0wMl9nbGFzcy5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD01NSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9OGNjZTNiJmFtcDtmY0hpZ2hsaWdodD0wMzAzMDMmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wMDAwMDAmYW1wO2JnQ29sb3JFcnJvcj1mNmVjZDUmYW1wO2JnVGV4dHVyZUVycm9yPTEyX2dsb3NzX3dhdmUucG5nJmFtcDtiZ0ltZ09wYWNpdHlFcnJvcj05NSZhbXA7Ym9yZGVyQ29sb3JFcnJvcj1mMWFjODgmYW1wO2ZjRXJyb3I9NzQ3MzZkJmFtcDtpY29uQ29sb3JFcnJvcj1jZDBhMGEmYW1wO2JnQ29sb3JPdmVybGF5PTI2MjYyNiZhbXA7YmdUZXh0dXJlT3ZlcmxheT0wN19kaWFnb25hbHNfc21hbGwucG5nJmFtcDtiZ0ltZ09wYWNpdHlPdmVybGF5PTUwJmFtcDtvcGFjaXR5T3ZlcmxheT0zMCZhbXA7YmdDb2xvclNoYWRvdz0zMDMwMzAmYW1wO2JnVGV4dHVyZVNoYWRvdz0wMV9mbGF0LnBuZyZhbXA7YmdJbWdPcGFjaXR5U2hhZG93PTAmYW1wO29wYWNpdHlTaGFkb3c9NTAmYW1wO3RoaWNrbmVzc1NoYWRvdz02cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tNnB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS02cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0xMnB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfdHJvbnRhc3RpYy5wbmciIGFsdD0iVHJvbnRhc3RpYyIgdGl0bGU9IlRyb250YXN0aWMiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+VHJvbnRhc3RpYzwvc3Bhbj4JCQk8L2E+PC9saT4JCQk8bGk+PGEgaHJlZj0iaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci9jc3MvcGFyc2VUaGVtZS5jc3MucGhwP2ZmRGVmYXVsdD1HZW9yZ2lhJTJDK1ZlcmRhbmElMkNBcmlhbCUyQ3NhbnMtc2VyaWYmYW1wO2Z3RGVmYXVsdD1ib2xkJmFtcDtmc0RlZmF1bHQ9MS4yZW0mYW1wO2Nvcm5lclJhZGl1cz01cHgmYW1wO2JnQ29sb3JIZWFkZXI9MjYxODAzJmFtcDtiZ1RleHR1cmVIZWFkZXI9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhlYWRlcj04JmFtcDtib3JkZXJDb2xvckhlYWRlcj1iYWFhNWEmYW1wO2ZjSGVhZGVyPWVhY2Q4NiZhbXA7aWNvbkNvbG9ySGVhZGVyPWU5Y2Q4NiZhbXA7YmdDb2xvckNvbnRlbnQ9NDQzMTEzJmFtcDtiZ1RleHR1cmVDb250ZW50PTEzX2RpYW1vbmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlDb250ZW50PTgmYW1wO2JvcmRlckNvbG9yQ29udGVudD1lZmVjOWYmYW1wO2ZjQ29udGVudD1lZmVjOWYmYW1wO2ljb25Db2xvckNvbnRlbnQ9ZWZlYzlmJmFtcDtiZ0NvbG9yRGVmYXVsdD00ZjQyMjEmYW1wO2JnVGV4dHVyZURlZmF1bHQ9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eURlZmF1bHQ9MTAmYW1wO2JvcmRlckNvbG9yRGVmYXVsdD0zNjI5MTcmYW1wO2ZjRGVmYXVsdD1mOGVlYzkmYW1wO2ljb25Db2xvckRlZmF1bHQ9ZThlMmI1JmFtcDtiZ0NvbG9ySG92ZXI9Njc1NDIzJmFtcDtiZ1RleHR1cmVIb3Zlcj0xM19kaWFtb25kLnBuZyZhbXA7YmdJbWdPcGFjaXR5SG92ZXI9MjUmYW1wO2JvcmRlckNvbG9ySG92ZXI9MzYyOTE3JmFtcDtmY0hvdmVyPWY4ZWVjOSZhbXA7aWNvbkNvbG9ySG92ZXI9ZjJlYzY0JmFtcDtiZ0NvbG9yQWN0aXZlPTQ0MzExMyZhbXA7YmdUZXh0dXJlQWN0aXZlPTEzX2RpYW1vbmQucG5nJmFtcDtiZ0ltZ09wYWNpdHlBY3RpdmU9OCZhbXA7Ym9yZGVyQ29sb3JBY3RpdmU9ZWZlYzlmJmFtcDtmY0FjdGl2ZT1mOWYyYmQmYW1wO2ljb25Db2xvckFjdGl2ZT1mOWYyYmQmYW1wO2JnQ29sb3JIaWdobGlnaHQ9ZDVhYzVkJmFtcDtiZ1RleHR1cmVIaWdobGlnaHQ9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eUhpZ2hsaWdodD0yNSZhbXA7Ym9yZGVyQ29sb3JIaWdobGlnaHQ9MzYyOTE3JmFtcDtmY0hpZ2hsaWdodD0wNjAyMDAmYW1wO2ljb25Db2xvckhpZ2hsaWdodD0wNzA2MDMmYW1wO2JnQ29sb3JFcnJvcj1mZWU0YmQmYW1wO2JnVGV4dHVyZUVycm9yPTA0X2hpZ2hsaWdodF9oYXJkLnBuZyZhbXA7YmdJbWdPcGFjaXR5RXJyb3I9NjUmYW1wO2JvcmRlckNvbG9yRXJyb3I9YzI2NjI5JmFtcDtmY0Vycm9yPTgwM2YxZSZhbXA7aWNvbkNvbG9yRXJyb3I9ZmY3NTE5JmFtcDtiZ0NvbG9yT3ZlcmxheT0zNzI4MDYmYW1wO2JnVGV4dHVyZU92ZXJsYXk9MTNfZGlhbW9uZC5wbmcmYW1wO2JnSW1nT3BhY2l0eU92ZXJsYXk9MjAmYW1wO29wYWNpdHlPdmVybGF5PTgwJmFtcDtiZ0NvbG9yU2hhZG93PWRkZDRiMCZhbXA7YmdUZXh0dXJlU2hhZG93PTAxX2ZsYXQucG5nJmFtcDtiZ0ltZ09wYWNpdHlTaGFkb3c9NzUmYW1wO29wYWNpdHlTaGFkb3c9MzAmYW1wO3RoaWNrbmVzc1NoYWRvdz04cHgmYW1wO29mZnNldFRvcFNoYWRvdz0tOHB4JmFtcDtvZmZzZXRMZWZ0U2hhZG93PS04cHgmYW1wO2Nvcm5lclJhZGl1c1NoYWRvdz0xMnB4Ij4JCQk8aW1nIHNyYz0iaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvdGhlbWVfOTBfc3dhbmt5X3B1cnNlLnBuZyIgYWx0PSJTd2Fua3kgUHVyc2UiIHRpdGxlPSJTd2Fua3kgUHVyc2UiIC8+CQkJPHNwYW4gY2xhc3M9InRoZW1lTmFtZSI+U3dhbmt5IFB1cnNlPC9zcGFuPgkJCTwvYT48L2xpPgk8L3VsPjwvZGl2PjwvZGl2PicpLmZpbmQoJ2RpdicpLnJlbW92ZUF0dHIoJ2lkJyk7CgkKCS8vYnV0dG9uIGV2ZW50cwoJYnV0dG9uLmNsaWNrKAoJCWZ1bmN0aW9uKCl7CgkJCWlmKHN3aXRjaGVycGFuZS5pcygnOnZpc2libGUnKSl7IHN3aXRjaGVycGFuZS5zcEhpZGUoKTsgfQoJCQllbHNleyBzd2l0Y2hlcnBhbmUuc3BTaG93KCk7IH0KCQkJCQlyZXR1cm4gZmFsc2U7CgkJfQoJKTsKCQoJLy9tZW51IGV2ZW50cyAobW91c2VvdXQgZGlkbid0IHdvcmsuLi4pCglzd2l0Y2hlcnBhbmUuaG92ZXIoCgkJZnVuY3Rpb24oKXt9LAoJCWZ1bmN0aW9uKCl7aWYoc3dpdGNoZXJwYW5lLmlzKCc6dmlzaWJsZScpKXskKHRoaXMpLnNwSGlkZSgpO319CgkpOwoKCS8vc2hvdy9oaWRlIHBhbmVsIGZ1bmN0aW9ucwoJJC5mbi5zcFNob3cgPSBmdW5jdGlvbigpeyAkKHRoaXMpLmNzcyh7dG9wOiBidXR0b24ub2Zmc2V0KCkudG9wICsgb3B0aW9ucy5idXR0b25IZWlnaHQgKyA2LCBsZWZ0OiBidXR0b24ub2Zmc2V0KCkubGVmdH0pLnNsaWRlRG93big1MCk7IGJ1dHRvbi5jc3MoYnV0dG9uX2FjdGl2ZSk7IG9wdGlvbnMub25PcGVuKCk7IH0KCSQuZm4uc3BIaWRlID0gZnVuY3Rpb24oKXsgJCh0aGlzKS5zbGlkZVVwKDUwLCBmdW5jdGlvbigpe29wdGlvbnMub25DbG9zZSgpO30pOyBidXR0b24uY3NzKGJ1dHRvbl9kZWZhdWx0KTsgfQoJCgkJCgkvKiBUaGVtZSBMb2FkaW5nCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJc3dpdGNoZXJwYW5lLmZpbmQoJ2EnKS5jbGljayhmdW5jdGlvbigpewoJCXVwZGF0ZUNTUyggJCh0aGlzKS5hdHRyKCdocmVmJykgKTsKCQl2YXIgdGhlbWVOYW1lID0gJCh0aGlzKS5maW5kKCdzcGFuJykudGV4dCgpOwoJCWJ1dHRvbi5maW5kKCcuanF1ZXJ5LXVpLXRoZW1lc3dpdGNoZXItdGl0bGUnKS50ZXh0KCBvcHRpb25zLmJ1dHRvblByZVRleHQgKyB0aGVtZU5hbWUgKTsKCQkkLmNvb2tpZShvcHRpb25zLmNvb2tpZU5hbWUsIHRoZW1lTmFtZSk7CgkJb3B0aW9ucy5vblNlbGVjdCgpOwoJCWlmKG9wdGlvbnMuY2xvc2VPblNlbGVjdCAmJiBzd2l0Y2hlcnBhbmUuaXMoJzp2aXNpYmxlJykpeyBzd2l0Y2hlcnBhbmUuc3BIaWRlKCk7IH0KCQlyZXR1cm4gZmFsc2U7Cgl9KTsKCQoJLy9mdW5jdGlvbiB0byBhcHBlbmQgYSBuZXcgdGhlbWUgc3R5bGVzaGVldCB3aXRoIHRoZSBuZXcgc3R5bGUgY2hhbmdlcwoJZnVuY3Rpb24gdXBkYXRlQ1NTKGxvY1N0cil7CgkJdmFyIGNzc0xpbmsgPSAkKCc8bGluayBocmVmPSInK2xvY1N0cisnIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJTdHlsZXNoZWV0IiBjbGFzcz0idWktdGhlbWUiIC8+Jyk7CgkJJCgiaGVhZCIpLmFwcGVuZChjc3NMaW5rKTsKCQkKCQkKCQlpZiggJCgibGluay51aS10aGVtZSIpLnNpemUoKSA+IDMpewoJCQkkKCJsaW5rLnVpLXRoZW1lOmZpcnN0IikucmVtb3ZlKCk7CgkJfQkKCX0JCgkKCS8qIElubGluZSBDU1MgCgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoJdmFyIGJ1dHRvbl9kZWZhdWx0ID0gewoJCWZvbnRGYW1pbHk6ICdUcmVidWNoZXQgTVMsIFZlcmRhbmEsIHNhbnMtc2VyaWYnLAoJCWZvbnRTaXplOiAnMTFweCcsCgkJY29sb3I6ICcjNjY2JywKCQliYWNrZ3JvdW5kOiAnI2VlZSB1cmwoaHR0cDovL2xlYXJuaW5nanF1ZXJ5Lmtzd2VkYmVyZy5uZXRkbmEtY2RuLmNvbS93cC1jb250ZW50L3VwbG9hZHMvdGhlbWVyb2xsZXIvYnV0dG9uYmcucG5nKSA1MCUgNTAlIHJlcGVhdC14JywKCQlib3JkZXI6ICcxcHggc29saWQgI2NjYycsCgkJJy1tb3otYm9yZGVyLXJhZGl1cyc6ICc2cHgnLAoJCSctd2Via2l0LWJvcmRlci1yYWRpdXMnOiAnNnB4JywKCQl0ZXh0RGVjb3JhdGlvbjogJ25vbmUnLAoJCXBhZGRpbmc6ICczcHggM3B4IDNweCA4cHgnLAoJCXdpZHRoOiBvcHRpb25zLndpZHRoIC0gMTEsLy9taW51cyBtdXN0IG1hdGNoIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgCgkJZGlzcGxheTogJ2Jsb2NrJywKCQloZWlnaHQ6IG9wdGlvbnMuYnV0dG9uSGVpZ2h0LAoJCW91dGxpbmU6ICcwJwoJfTsKCXZhciBidXR0b25faG92ZXIgPSB7CgkJJ2JvcmRlckNvbG9yJzonI2JiYicsCgkJJ2JhY2tncm91bmQnOiAnI2YwZjBmMCcsCgkJY3Vyc29yOiAncG9pbnRlcicsCgkJY29sb3I6ICcjNDQ0JwoJfTsKCXZhciBidXR0b25fYWN0aXZlID0gewoJCWNvbG9yOiAnI2FhYScsCgkJYmFja2dyb3VuZDogJyMwMDAnLAoJCWJvcmRlcjogJzFweCBzb2xpZCAjY2NjJywKCQlib3JkZXJCb3R0b206IDAsCgkJJy1tb3otYm9yZGVyLXJhZGl1cy1ib3R0b21sZWZ0JzogMCwKCQknLXdlYmtpdC1ib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzJzogMCwKCQknLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0JzogMCwKCQknLXdlYmtpdC1ib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyc6IDAsCgkJb3V0bGluZTogJzAnCgl9OwoJCgkKCQoJLy9idXR0b24gY3NzCglidXR0b24uY3NzKGJ1dHRvbl9kZWZhdWx0KQoJLmhvdmVyKAoJCWZ1bmN0aW9uKCl7IAoJCQkkKHRoaXMpLmNzcyhidXR0b25faG92ZXIpOyAKCQl9LAoJCWZ1bmN0aW9uKCl7IAoJCSBpZiggIXN3aXRjaGVycGFuZS5pcygnOmFuaW1hdGVkJykgJiYgc3dpdGNoZXJwYW5lLmlzKCc6aGlkZGVuJykgKXsJJCh0aGlzKS5jc3MoYnV0dG9uX2RlZmF1bHQpOyAgfQoJCX0JCgkpCgkuZmluZCgnLmpxdWVyeS11aS10aGVtZXN3aXRjaGVyLWljb24nKS5jc3MoewoJCSdmbG9hdCc6ICdyaWdodCcsCgkJd2lkdGg6ICcxNnB4JywKCQloZWlnaHQ6ICcxNnB4JywKCQliYWNrZ3JvdW5kOiAndXJsKGh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL2ljb25fY29sb3JfYXJyb3cuZ2lmKSA1MCUgNTAlIG5vLXJlcGVhdCcKCX0pOwkKCS8vcGFuZSBjc3MKCXN3aXRjaGVycGFuZS5jc3MoewoJCXBvc2l0aW9uOiAnYWJzb2x1dGUnLAoJCSdmbG9hdCc6ICdsZWZ0JywKCQlmb250RmFtaWx5OiAnVHJlYnVjaGV0IE1TLCBWZXJkYW5hLCBzYW5zLXNlcmlmJywKCQlmb250U2l6ZTogJzEycHgnLAoJCWJhY2tncm91bmQ6ICcjMDAwJywKCQljb2xvcjogJyNmZmYnLAoJCXBhZGRpbmc6ICc4cHggM3B4IDNweCcsCgkJYm9yZGVyOiAnMXB4IHNvbGlkICNjY2MnLAoJCSctbW96LWJvcmRlci1yYWRpdXMtYm90dG9tbGVmdCc6ICc2cHgnLAoJCSctd2Via2l0LWJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMnOiAnNnB4JywKCQknLW1vei1ib3JkZXItcmFkaXVzLWJvdHRvbXJpZ2h0JzogJzZweCcsCgkJJy13ZWJraXQtYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMnOiAnNnB4JywKCQlib3JkZXJUb3A6IDAsCgkJekluZGV4OiA5OTk5OTksCgkJd2lkdGg6IG9wdGlvbnMud2lkdGgtNi8vbWludXMgbXVzdCBtYXRjaCBsZWZ0IGFuZCByaWdodCBwYWRkaW5nCgl9KQoJLmZpbmQoJ3VsJykuY3NzKHsKCQlsaXN0U3R5bGU6ICdub25lJywKCQltYXJnaW46ICcwJywKCQlwYWRkaW5nOiAnMCcsCgkJb3ZlcmZsb3c6ICdhdXRvJywKCQloZWlnaHQ6IG9wdGlvbnMuaGVpZ2h0Cgl9KS5lbmQoKQoJLmZpbmQoJ2xpJykuaG92ZXIoCgkJZnVuY3Rpb24oKXsgCgkJCSQodGhpcykuY3NzKHsKCQkJCSdib3JkZXJDb2xvcic6JyM1NTUnLAoJCQkJJ2JhY2tncm91bmQnOiAndXJsKGh0dHA6Ly9sZWFybmluZ2pxdWVyeS5rc3dlZGJlcmcubmV0ZG5hLWNkbi5jb20vd3AtY29udGVudC91cGxvYWRzL3RoZW1lcm9sbGVyL21lbnVob3ZlcmJnLnBuZykgNTAlIDUwJSByZXBlYXQteCcsCgkJCQljdXJzb3I6ICdwb2ludGVyJwoJCQl9KTsgCgkJfSwKCQlmdW5jdGlvbigpeyAKCQkJJCh0aGlzKS5jc3MoewoJCQkJJ2JvcmRlckNvbG9yJzonIzExMScsCgkJCQknYmFja2dyb3VuZCc6ICcjMDAwJywKCQkJCWN1cnNvcjogJ2F1dG8nCgkJCX0pOyAKCQl9CgkpLmNzcyh7CgkJd2lkdGg6IG9wdGlvbnMud2lkdGgtMzAsCgkJaGVpZ2h0OiAnJywKCQlwYWRkaW5nOiAnMnB4JywKCQltYXJnaW46ICcxcHgnLAoJCWJvcmRlcjogJzFweCBzb2xpZCAjMTExJywKCQknLW1vei1ib3JkZXItcmFkaXVzJzogJzRweCcsCgkJY2xlYXI6ICdsZWZ0JywKCQknZmxvYXQnOiAnbGVmdCcKCX0pLmVuZCgpCgkuZmluZCgnYScpLmNzcyh7CgkJY29sb3I6ICcjYWFhJywKCQl0ZXh0RGVjb3JhdGlvbjogJ25vbmUnLAoJCSdmbG9hdCc6ICdsZWZ0JywKCQl3aWR0aDogJzEwMCUnLAoJCW91dGxpbmU6ICcwJwoJfSkuZW5kKCkKCS5maW5kKCdpbWcnKS5jc3MoewoJCSdmbG9hdCc6ICdsZWZ0JywKCQlib3JkZXI6ICcxcHggc29saWQgIzMzMycsCgkJbWFyZ2luOiAnMCAycHgnCgl9KS5lbmQoKQoJLmZpbmQoJy50aGVtZU5hbWUnKS5jc3MoewoJCSdmbG9hdCc6ICdsZWZ0JywKCQltYXJnaW46ICczcHggMCcKCX0pLmVuZCgpOwoJCgoKCSQodGhpcykuYXBwZW5kKGJ1dHRvbik7CgkkKCdib2R5JykuYXBwZW5kKHN3aXRjaGVycGFuZSk7Cglzd2l0Y2hlcnBhbmUuaGlkZSgpOwoJaWYoICQuY29va2llKG9wdGlvbnMuY29va2llTmFtZSkgfHwgb3B0aW9ucy5sb2FkVGhlbWUgKXsKCQl2YXIgdGhlbWVOYW1lID0gJC5jb29raWUob3B0aW9ucy5jb29raWVOYW1lKSB8fCBvcHRpb25zLmxvYWRUaGVtZTsKCQlzd2l0Y2hlcnBhbmUuZmluZCgnYTpjb250YWlucygnKyB0aGVtZU5hbWUgKycpJykudHJpZ2dlcignY2xpY2snKTsKCX0KCglyZXR1cm4gdGhpczsKfTsKCgoKCi8qKgogKiBDb29raWUgcGx1Z2luCiAqCiAqIENvcHlyaWdodCAoYykgMjAwNiBLbGF1cyBIYXJ0bCAoc3RpbGJ1ZXJvLmRlKQogKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIEdQTCBsaWNlbnNlczoKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAKICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqCiAqLwpqUXVlcnkuY29va2llID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIG9wdGlvbnMpIHsKICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcpIHsgLy8gbmFtZSBhbmQgdmFsdWUgZ2l2ZW4sIHNldCBjb29raWUKICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgdmFsdWUgPSAnJzsKICAgICAgICAgICAgb3B0aW9ucy5leHBpcmVzID0gLTE7CiAgICAgICAgfQogICAgICAgIHZhciBleHBpcmVzID0gJyc7CiAgICAgICAgaWYgKG9wdGlvbnMuZXhwaXJlcyAmJiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlcyA9PSAnbnVtYmVyJyB8fCBvcHRpb25zLmV4cGlyZXMudG9VVENTdHJpbmcpKSB7CiAgICAgICAgICAgIHZhciBkYXRlOwogICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZXhwaXJlcyA9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICBkYXRlLnNldFRpbWUoZGF0ZS5nZXRUaW1lKCkgKyAob3B0aW9ucy5leHBpcmVzICogMjQgKiA2MCAqIDYwICogMTAwMCkpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0ZSA9IG9wdGlvbnMuZXhwaXJlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBleHBpcmVzID0gJzsgZXhwaXJlcz0nICsgZGF0ZS50b1VUQ1N0cmluZygpOyAvLyB1c2UgZXhwaXJlcyBhdHRyaWJ1dGUsIG1heC1hZ2UgaXMgbm90IHN1cHBvcnRlZCBieSBJRQogICAgICAgIH0KICAgICAgICAvLyBDQVVUSU9OOiBOZWVkZWQgdG8gcGFyZW50aGVzaXplIG9wdGlvbnMucGF0aCBhbmQgb3B0aW9ucy5kb21haW4KICAgICAgICAvLyBpbiB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zLCBvdGhlcndpc2UgdGhleSBldmFsdWF0ZSB0byB1bmRlZmluZWQKICAgICAgICAvLyBpbiB0aGUgcGFja2VkIHZlcnNpb24gZm9yIHNvbWUgcmVhc29uLi4uCiAgICAgICAgdmFyIHBhdGggPSBvcHRpb25zLnBhdGggPyAnOyBwYXRoPScgKyAob3B0aW9ucy5wYXRoKSA6ICcnOwogICAgICAgIHZhciBkb21haW4gPSBvcHRpb25zLmRvbWFpbiA/ICc7IGRvbWFpbj0nICsgKG9wdGlvbnMuZG9tYWluKSA6ICcnOwogICAgICAgIHZhciBzZWN1cmUgPSBvcHRpb25zLnNlY3VyZSA/ICc7IHNlY3VyZScgOiAnJzsKICAgICAgICBkb2N1bWVudC5jb29raWUgPSBbbmFtZSwgJz0nLCBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLCBleHBpcmVzLCBwYXRoLCBkb21haW4sIHNlY3VyZV0uam9pbignJyk7CiAgICB9IGVsc2UgeyAvLyBvbmx5IG5hbWUgZ2l2ZW4sIGdldCBjb29raWUKICAgICAgICB2YXIgY29va2llVmFsdWUgPSBudWxsOwogICAgICAgIGlmIChkb2N1bWVudC5jb29raWUgJiYgZG9jdW1lbnQuY29va2llICE9ICcnKSB7CiAgICAgICAgICAgIHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7Jyk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGNvb2tpZSA9IGpRdWVyeS50cmltKGNvb2tpZXNbaV0pOwogICAgICAgICAgICAgICAgLy8gRG9lcyB0aGlzIGNvb2tpZSBzdHJpbmcgYmVnaW4gd2l0aCB0aGUgbmFtZSB3ZSB3YW50PwogICAgICAgICAgICAgICAgaWYgKGNvb2tpZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGggKyAxKSA9PSAobmFtZSArICc9JykpIHsKICAgICAgICAgICAgICAgICAgICBjb29raWVWYWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChjb29raWUuc3Vic3RyaW5nKG5hbWUubGVuZ3RoICsgMSkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb29raWVWYWx1ZTsKICAgIH0KfTsK]]></data>
	</file>
	<file>
	  <filename>/lib/cluetip.lib/readme.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBqUXVlcnkgY2x1ZVRpcCBQbHVnaW4KCiMjIExpY2Vuc2UKCkR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgoKKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAoqIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbAoKQ29weXJpZ2h0IEthcmwgU3dlZGJlcmcKCiMjIFJlcXVpcmVtZW50cwoKKiBqUXVlcnkgdjEuMysKCiMjIERlc2NyaXB0aW9uCgpEaXNwbGF5cyBhIGhpZ2hseSBjdXN0b21pemFibGUgdG9vbHRpcCB3aGVuIHRoZSB1c2VyIGludGVyYWN0cyB3aXRoIHRoZSBtYXRjaGVkIGVsZW1lbnQuIEFzIG9mIGNsdWVUaXAgdmVyc2lvbiAxLjEsIHRoaXMgcGx1Z2luIGlzIFtUaGVtZVJvbGxlciBSZWFkeV1bMV0uCgoqICoqRnVsbCBkb2N1bWVudGF0aW9uKio6IFtodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC9dCiogKipEZW1vcyoqOiBbaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvZGVtby9dCgojIyBLbm93biBJc3N1ZXMKCiogV2hlbiBgLmNsdWV0aXAoKWAgaXMgaW52b2tlZCBmcm9tIGFuIGltYWdlIG1hcCBgPGFyZWE+YCBlbGVtZW50LCB0aGUgcGx1Z2luIGlnbm9yZXMgdGhlIGBwb3N0aW9uQnlgIG9wdGlvbi4gUG9zaXRpb25pbmcgdGhlIHRvb2x0aXAgYnkgdGhlIGBjb29yZHNgIGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhlIHBsdWdpbiwgc28gaXQgaW5zdGVhZCBmYWxscyBiYWNrIHRvIHBvc2l0aW9uaW5nIGFjY29yZGluZyB0byB0aGUgbW91c2UncyBwb3NpdGlvbiAoYGV2ZW50LnBhZ2VYYCBhbmQgYGV2ZW50LnBhZ2VZYCkgd2hlbiBpdCBlbnRlcnMgdGhlIGA8YXJlYT5gLgoKIyMgSW1wb3J0YW50IGNsdWVUaXAgMS4yIENoYW5nZQoKVmVyc2lvbiAxLjIgb2YgdGhlIGNsdWVUaXAgcGx1Z2luIGNoYW5nZXMgdGhlIEhUTUwgc3RydWN0dXJlIG9mIHRoZSB0b29sdGlwLiBJdCB1c2VzIGNsYXNzZXMgaW5zdGVhZCBvZiBJRHMgZm9yIHRoZSBlbGVtZW50cyB3aXRoaW4gdGhlIGNsdWVUaXAuIFRoaXMgYWxsb3dzIG11bHRpcGxlIHRvb2x0aXBzIHRvIGJlIHZpc2libGUgYXQgdGhlIHNhbWUgdGltZSAob25lIHBlciBjYWxsIHRvIHRoZSAuY2x1ZXRpcCgpIG1ldGhvZCkgaWYgdGhlIGBtdWx0aXBsZWAgb3B0aW9uIGlzIHNldCB0byBgdHJ1ZWAuCgpUaGUgcGx1Z2luIG1heSBub3Qgd29yayBhcyBleHBlY3RlZCBpZiB5b3UgdXBkYXRlIGpxdWVyeS5jbHVldGlwLmpzIHRvIHZlcnNpb24gMS4yKyBhbmQgeW91IGRvbid0IGFsc28gdXBkYXRlIHRoZSBqcXVlcnkuY2x1ZXRpcC5jc3Mgc3R5bGVzaGVldC4KCklmIHlvdSBoYXZlIGEgbG90IGludmVzdGVkIGluIHRoZSBvbGQgY2x1ZVRpcCdzIHN0cnVjdHVyZSB3aXRoIHRoZSBJRHMsIHlvdSBjYW4gZ2V0IGl0IGJhY2sgYnk6CgoxLiBhZGRpbmcgdGhlIGpxdWVyeS5jb21wYXQuY2x1ZXRpcC5qcyBmaWxlIGltbWVkaWF0ZWx5IGFmdGVyIGpxdWVyeS5jbHVldGlwLmpzLCBBTkQKMi4gcmVwbGFjaW5nIGpxdWVyeS5jbHVldGlwLmNzcyB3aXRoIGpxdWVyeS5jb21wYXQuY2x1ZXRpcC5jc3MuCgojIyBGZWF0dXJlcwoKIyMjIE9wdGlvbnMKClRoZSBjbHVlVGlwIHBsdWdpbiBhbGxvd3MgZm9yICh0b28/KSBtYW55IG9wdGlvbnMuIEZvciBhIGNvbXBsZXRlIGxpc3QsIGNoZWNrIG91dCB0aGUgW3BsdWdpbidzIGhvbWVwYWdlXVsyXQoKIyMjIENvbnRlbnQgdmlhIGFqYXgKCkJ5IGRlZmF1bHQsIHRoZSBjbHVlVGlwIHBsdWdpbiBsb2FkcyBhIHBhZ2UgaW5kaWNhdGVkIGJ5IHRoZSAicmVsIiBhdHRyaWJ1dGUgdmlhIGFqYXggYW5kIGRpc3BsYXlzIGl0cyBjb250ZW50cy4gSG93ZXZlciwgKnRoZSBhdHRyaWJ1dGUgdG8gYmUgdXNlZCBmb3IgYm90aCB0aGUgYm9keSBhbmQgdGhlIGhlYWRpbmcgb2YgdGhlIGNsdWVUaXAgaXMgdXNlci1jb25maWd1cmFibGUqLgpJZiBhICJ0aXRsZSIgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwgaXRzIHZhbHVlIGlzIHVzZWQgYXMgdGhlIGNsdWVUaXAncyBoZWFkaW5nLgoKIyMjIENvbnRlbnQgZnJvbSBIVE1MIGVsZW1lbnQKCk9wdGlvbmFsbHksIHRoZSBjbHVlVGlwJ3MgYm9keSBjYW4gZGlzcGxheSBjb250ZW50IGZyb20gYW4gZWxlbWVudCBvbiB0aGUgc2FtZSBwYWdlLgoKSnVzdCBpbmRpY2F0ZSB0aGUgZWxlbWVudCdzIGlkIChlLmcuICIjc29tZS1pZCIpIGluIHRoZSByZWwgYXR0cmlidXRlLgoKIyMjIENvbnRlbnQgZnJvbSB0aXRsZSBhdHRyaWJ1dGUKCk9wdGlvbmFsbHksIHRoZSBjbHVlVGlwJ3MgYm9keSBjYW4gZGlzcGxheSBjb250ZW50IGZyb20gdGhlIHRpdGxlIGF0dHJpYnV0ZSwgd2hlbiBhIGRlbGltaXRlciBpcyBpbmRpY2F0ZWQuCgoqIFRoZSBzdHJpbmcgYmVmb3JlIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgZGVsaW1pdGVyIGlzIHNldCBhcyB0aGUgY2x1ZVRpcCdzIGhlYWRpbmcuCiogQWxsIHN1YnNlcXVlbnQgc3RyaW5ncyBhcmUgd3JhcHBlZCBpbiBzZXBhcmF0ZSBESVZzIGFuZCBwbGFjZWQgaW4gdGhlIGNsdWVUaXAncyBib2R5LgoKIyMgRXhhbXBsZXMKCiMjIyBCYXNpYwoKVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBjbHVlVGlwLiBJdCBkaXNwbGF5cyBhIDI3NXB4LXdpZGUgY2x1ZVRpcCBvbiBtb3VzZW92ZXIgb2YgdGhlIGVsZW1lbnQgd2l0aCBhbiBJRCBvZiAidGlwLiIgT24gbW91c2VvdXQgb2YgdGhlIGVsZW1lbnQsIHRoZSBjbHVlVGlwIGlzIGhpZGRlbi4KCmBgYGphdmFzY3JpcHQKJCgnI3RpcCkuY2x1ZXRpcCgpOwpgYGAKCiMjIyBTZXR0aW5nIE11bHRpcGxlIE9wdGlvbnMKVGhlIGZvbGxvd2luZyBkaXNwbGF5cyBhIGNsdWVUaXAgb24gbW91c2VvdmVyIG9mIGFsbCBgPGE+YCBlbGVtZW50cyB3aXRoIGNsYXNzPSJjbHVlIi4gVGhlIGhvdmVyZWQgZWxlbWVudCBnZXRzIGEgY2xhc3Mgb2YgImhpZ2hsaWdodCIgYWRkZWQgdG8gaXQgKHNvIHRoYXQgaXQgY2FuIGJlIHN0eWxlZCBhcHByb3ByaWF0ZWx5LiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIG5vbi1hbmNob3IgZWxlbWVudHMgaW4gb2xkZXIgYnJvd3NlcnMgc3VjaCBhcyBJRTYuKS4gVGhlIGNsdWVUaXAgaXMgInN0aWNreSwiIHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBub3QgYmUgaGlkZGVuIHVudGlsIHRoZSB1c2VyIGVpdGhlciBjbGlja3Mgb24gaXRzICJjbG9zZSIgdGV4dC9ncmFwaGljIG9yIGRpc3BsYXlzIGFub3RoZXIgY2x1ZVRpcC4gVGhlICJjbG9zZSIgdGV4dC9ncmFwaGljIGlzIHNldCB0byBkaXNwbGF5IGF0IHRoZSBib3R0b20gb2YgdGhlIGNsdWVUaXAgKGRlZmF1bHQgaXMgdG9wKSBhbmQgZGlzcGxheSBhbiBpbWFnZSByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCAiQ2xvc2UiIHRleHQuIE1vcmVvdmVyLCB0aGUgYm9keSBvZiB0aGUgY2x1ZVRpcCBpcyB0cnVuY2F0ZWQgdG8gdGhlIGZpcnN0IDYwIGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBmb2xsb3dlZCBieSBhbiBlbGxpcHNpcyAoLi4uKS4gRmluYWxseSwgdGhlIGNsdWVUaXAgcmV0cmlldmVzIHRoZSBjb250ZW50IHdpdGggYSBgUE9TVGAgcmVxdWVzdCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBgR0VUYC4KCmBgYGphdmFzY3JpcHQKJCgnYS5jbHVlJykuY2x1ZXRpcCh7CiAgaG92ZXJDbGFzczogJ2hpZ2hsaWdodCcsCiAgc3RpY2t5OiB0cnVlLAogIGNsb3NlUG9zaXRpb246ICdib3R0b20nLAogIGNsb3NlVGV4dDogJzxpbWcgc3JjPSJjcm9zcy5wbmciIGFsdD0iY2xvc2UiIC8+JywKICB0cnVuY2F0ZTogNjAsCiAgYWpheFNldHRpbmdzOiB7CiAgICB0eXBlOiAnUE9TVCcKICB9Cn0pOwpgYGAKCiMjIyBUcmlnZ2VyaW5nIHRoZSBgaGlkZUNsdWV0aXBgIGV2ZW50ICh1c2VmdWwgZm9yIHRvdWNoIGRldmljZXMpCgpZb3UgY2FuIHByb2dyYW1tYXRpY2FsbHkgaGlkZSAoY2xvc2UpIGEgY2x1ZVRpcCBieSB0cmlnZ2VyaW5nIHRoZSAiaGlkZUNsdWV0aXAiIGN1c3RvbSBldmVudC4gT24gYSB0b3VjaC1lbmFibGVkIGRldmljZSwgZm9yIGV4YW1wbGUsIHlvdSBjb3VsZCBoaWRlIGFueSB2aXNpYmxlIGNsdWVUaXBzIHdoZW4gdGhlIHVzZXIgdG91Y2hlcyBhbnl3aGVyZSBpbiB0aGUgYm9keSBleGNlcHQgb24gYSBsaW5rIG9yIG9uIHRoZSBjbHVlVGlwIGl0c2VsZjoKCmBgYGphdmFzY3JpcHQKJCgnYm9keScpLmJpbmQoJ3RvdWNoc3RhcnQnLCBmdW5jdGlvbihldmVudCkgewogZXZlbnQgPSBldmVudC5vcmlnaW5hbEV2ZW50OwogdmFyIHRndCA9IGV2ZW50LnRvdWNoZXNbMF0gJiYgZXZlbnQudG91Y2hlc1swXS50YXJnZXQsCiAgICAgJHRndCA9ICQodGd0KTsKCiBpZiAodGd0Lm5vZGVOYW1lICE9PSAnQScgJiYgISR0Z3QuY2xvc2VzdCgnZGl2LmNsdWV0aXAnKS5sZW5ndGggKSB7CiAgICQoZG9jdW1lbnQpLnRyaWdnZXIoJ2hpZGVDbHVldGlwJyk7CiB9Cn0pOwpgYGAKCk1vcmUgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIGF0IFtodHRwOi8vcGx1Z2lucy5sZWFybmluZ2pxdWVyeS5jb20vY2x1ZXRpcC9kZW1vL10oaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvZGVtby8pCgoKIyMgQ3JlZGl0cwoKKiBPcmlnaW5hbGx5IGluc3BpcmVkIGJ5IENvZHkgTGluZGxleSdzIGpUaXAgKGh0dHA6Ly93d3cuY29keWxpbmRsZXkuY29tKQoqIEh1Z2UgdGhhbmtzIHRvIEpvbmF0aGFuIENoYWZmZXIsIEdsZW4gTGlwa2EsIFNoZWxhbmUgRW5vcywgSGVjdG9yIFNhbnRvcywgVG9yYmVuIFNjaHJlaXRlciwgRGFuIEcuIFN3aXR6ZXIsIErDtnJuIFphZWZmZXJlciwgYW5kIHRoZSBtYW55IG90aGVycyB3aG8gaGVscGVkIHJlcG9ydCBhbmQgZml4IGJ1Z3MgYW5kIHN1Z2dlc3QgZmVhdHVyZXMuCgpbMV06IGh0dHA6Ly9qcXVlcnl1aS5jb20vdGhlbWVyb2xsZXIvClsyXTogaHR0cDovL3BsdWdpbnMubGVhcm5pbmdqcXVlcnkuY29tL2NsdWV0aXAvCg==]]></data>
	</file>
	<file>
	  <filename>/lib/combobox.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/combobox.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmN1c3RvbS1jb21ib2JveC5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAndWknOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/combobox.lib/jquery.custom-combobox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCAkICkgewogICAgJC53aWRnZXQoICJjdXN0b20uY29tYm9ib3giLCB7CglvcHRpb25zOiB7CgkgICAgYXV0b0FkZDogZmFsc2UKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkgICAgdGhpcy53cmFwcGVyID0gJCggIjxzcGFuPiIgKQoJCS5hZGRDbGFzcyggImN1c3RvbS1jb21ib2JveCIgKQoJCS5pbnNlcnRBZnRlciggdGhpcy5lbGVtZW50ICk7CgoJICAgIHRoaXMuZWxlbWVudC5oaWRlKCk7CgkgICAgdGhpcy5fY3JlYXRlQXV0b2NvbXBsZXRlKCk7CgkgICAgdGhpcy5fY3JlYXRlU2hvd0FsbEJ1dHRvbigpOwoJfSwKCglfY3JlYXRlQXV0b2NvbXBsZXRlOiBmdW5jdGlvbigpIHsKCSAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oICI6c2VsZWN0ZWQiICksCgkJdmFsdWUgPSBzZWxlY3RlZC52YWwoKSA/IHNlbGVjdGVkLnRleHQoKSA6ICIiOwoKCSAgICB0aGlzLmlucHV0ID0gJCggIjxpbnB1dD4iICkKCQkuYXBwZW5kVG8oIHRoaXMud3JhcHBlciApCgkJLnZhbCggdmFsdWUgKQoJCS5hdHRyKCAidGl0bGUiLCAiIiApCgkJLmFkZENsYXNzKCAiY3VzdG9tLWNvbWJvYm94LWlucHV0IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1sZWZ0IiApCgkJLmF1dG9jb21wbGV0ZSh7CgkJICAgIGRlbGF5OiAwLAoJCSAgICBtaW5MZW5ndGg6IDAsCgkJICAgIHNvdXJjZTogJC5wcm94eSggdGhpcywgIl9zb3VyY2UiICkKCQl9KQoJCS50b29sdGlwKHsKCQkgICAgdG9vbHRpcENsYXNzOiAidWktc3RhdGUtaGlnaGxpZ2h0IgoJCX0pOwoKCSAgICB0aGlzLl9vbiggdGhpcy5pbnB1dCwgewoJCWF1dG9jb21wbGV0ZXNlbGVjdDogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkgICAgdWkuaXRlbS5vcHRpb24uc2VsZWN0ZWQgPSB0cnVlOwoJCSAgICB0aGlzLl90cmlnZ2VyKCAic2VsZWN0IiwgZXZlbnQsIHsKCQkJaXRlbTogdWkuaXRlbS5vcHRpb24KCQkgICAgfSk7CgkJfSwKCgkJYXV0b2NvbXBsZXRlY2hhbmdlOiAiX3JlbW92ZUlmSW52YWxpZCIKCSAgICB9KTsKCX0sCgoJX2NyZWF0ZVNob3dBbGxCdXR0b246IGZ1bmN0aW9uKCkgewoJICAgIHZhciBpbnB1dCA9IHRoaXMuaW5wdXQsCgkJd2FzT3BlbiA9IGZhbHNlOwoKCSAgICAkKCAiPGE+IiApCgkJLmF0dHIoICJ0YWJJbmRleCIsIC0xICkKCQkuYXR0ciggInRpdGxlIiwgIlNob3cgQWxsIEl0ZW1zIiApCgkJLnRvb2x0aXAoKQoJCS5hcHBlbmRUbyggdGhpcy53cmFwcGVyICkKCQkuYnV0dG9uKHsKCQkgICAgaWNvbnM6IHsKCQkJcHJpbWFyeTogInVpLWljb24tdHJpYW5nbGUtMS1zIgoJCSAgICB9LAoJCSAgICB0ZXh0OiBmYWxzZQoJCX0pCgkJLnJlbW92ZUNsYXNzKCAidWktY29ybmVyLWFsbCIgKQoJCS5hZGRDbGFzcyggImN1c3RvbS1jb21ib2JveC10b2dnbGUgdWktY29ybmVyLXJpZ2h0IiApCgkJLm1vdXNlZG93bihmdW5jdGlvbigpIHsKCQkgICAgd2FzT3BlbiA9IGlucHV0LmF1dG9jb21wbGV0ZSggIndpZGdldCIgKS5pcyggIjp2aXNpYmxlIiApOwoJCX0pCgkJLmNsaWNrKGZ1bmN0aW9uKCkgewoJCSAgICBpbnB1dC5mb2N1cygpOwoKCQkgICAgLy8gQ2xvc2UgaWYgYWxyZWFkeSB2aXNpYmxlCgkJICAgIGlmICggd2FzT3BlbiApIHsKCQkJcmV0dXJuOwoJCSAgICB9CgoJCSAgICAvLyBQYXNzIGVtcHR5IHN0cmluZyBhcyB2YWx1ZSB0byBzZWFyY2ggZm9yLCBkaXNwbGF5aW5nIGFsbCByZXN1bHRzCgkJICAgIGlucHV0LmF1dG9jb21wbGV0ZSggInNlYXJjaCIsICIiICk7CgkJfSk7Cgl9LAoKCV9zb3VyY2U6IGZ1bmN0aW9uKCByZXF1ZXN0LCByZXNwb25zZSApIHsKCSAgICB2YXIgbWF0Y2hlciA9IG5ldyBSZWdFeHAoICQudWkuYXV0b2NvbXBsZXRlLmVzY2FwZVJlZ2V4KHJlcXVlc3QudGVybSksICJpIiApOwoJICAgIHJlc3BvbnNlKCB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oICJvcHRpb24iICkubWFwKGZ1bmN0aW9uKCkgewoJCXZhciB0ZXh0ID0gJCggdGhpcyApLnRleHQoKTsKCQlpZiAoIHRoaXMudmFsdWUgJiYgKCAhcmVxdWVzdC50ZXJtIHx8IG1hdGNoZXIudGVzdCh0ZXh0KSApICkKCQkgICAgcmV0dXJuIHsKCQkJbGFiZWw6IHRleHQsCgkJCXZhbHVlOiB0ZXh0LAoJCQlvcHRpb246IHRoaXMKCQkgICAgfTsKCSAgICB9KSApOwoJfSwKCglfcmVtb3ZlSWZJbnZhbGlkOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoKCSAgICAvLyBTZWxlY3RlZCBhbiBpdGVtLCBub3RoaW5nIHRvIGRvCgkgICAgaWYgKCB1aS5pdGVtICkgewoJCXJldHVybjsKCSAgICB9CgoJICAgIC8vIFNlYXJjaCBmb3IgYSBtYXRjaCAoY2FzZS1pbnNlbnNpdGl2ZSkKCSAgICB2YXIgdmFsdWUgPSB0aGlzLmlucHV0LnZhbCgpLAoJCXZhbHVlTG93ZXJDYXNlID0gdmFsdWUudG9Mb3dlckNhc2UoKSwKCQl2YWxpZCA9IGZhbHNlOwoJICAgIHRoaXMuZWxlbWVudC5jaGlsZHJlbiggIm9wdGlvbiIgKS5lYWNoKGZ1bmN0aW9uKCkgewoJCWlmICggJCggdGhpcyApLnRleHQoKS50b0xvd2VyQ2FzZSgpID09PSB2YWx1ZUxvd2VyQ2FzZSApIHsKCQkgICAgdGhpcy5zZWxlY3RlZCA9IHZhbGlkID0gdHJ1ZTsKCQkgICAgcmV0dXJuIGZhbHNlOwoJCX0KCSAgICB9KTsKCgkgICAgLy8gRm91bmQgYSBtYXRjaCwgbm90aGluZyB0byBkbwoJICAgIGlmICggdmFsaWQgKSB7CgkJdGhpcy5lbGVtZW50LnZhbCh2YWx1ZSk7CgkJdGhpcy5lbGVtZW50LnRyaWdnZXIoJ2NoYW5nZScsZXZlbnQsdWkpCgkJcmV0dXJuOwoJICAgIH0KCgkgICAgaWYoIHRoaXMub3B0aW9ucy5hdXRvQWRkICkgewoJCS8vIGF1dG8gYWRkIHRoaXMgdGhpbmcgdG8gdGhlIGxpc3Q/CgkJdmFyIHIgPSB0cnVlOwoJCWlmKCAkLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLmF1dG9BZGQgKSApIHsKCQkgICAgciA9IHRoaXMub3B0aW9ucy5hdXRvQWRkKHZhbCk7CgkJfQoJCXZhciB2ID0gJCgnPG9wdGlvbi8+JykudmFsKHZhbHVlKS5odG1sKHZhbHVlKTsKCQl0aGlzLmVsZW1lbnQuYXBwZW5kKHYpOwoJCXRoaXMuZWxlbWVudC52YWwodmFsdWUpOwoJCXRoaXMuX3RyaWdnZXIoJ2FmdGVyYWRkJyxldmVudCx1aSk7CgkgICAgfQoJICAgIGVsc2UgewoJCS8vIFJlbW92ZSBpbnZhbGlkIHZhbHVlCgkJdGhpcy5pbnB1dAoJCSAgICAudmFsKCAiIiApCgkJICAgIC5hdHRyKCAidGl0bGUiLCB2YWx1ZSArICIgZGlkbid0IG1hdGNoIGFueSBpdGVtIiApCgkJICAgIC50b29sdGlwKCAib3BlbiIgKTsKCQl0aGlzLmVsZW1lbnQudmFsKCAiIiApOwoJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCSAgICB0aGlzLmlucHV0LnRvb2x0aXAoICJjbG9zZSIgKS5hdHRyKCAidGl0bGUiLCAiIiApOwoJCX0sIDI1MDAgKTsKCQl0aGlzLmlucHV0LmRhdGEoICJ1aS1hdXRvY29tcGxldGUiICkudGVybSA9ICIiOwoJICAgIH0KCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJICAgIHRoaXMud3JhcHBlci5yZW1vdmUoKTsKCSAgICB0aGlzLmVsZW1lbnQuc2hvdygpOwoJfSwKCglyZW1vdmVJdGVtczogZnVuY3Rpb24oKSB7CgkgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuKCdvcHRpb24nKS5yZW1vdmUoKTsKCX0sCgoJYWRkSXRlbTogZnVuY3Rpb24obykgewogICAgICAgICAgICB2YXIgdiA9ICQoJzxvcHRpb24vPicpLnZhbChvLnZhbCkuaHRtbChvLnRleHQpOwoJICAgIHRoaXMuZWxlbWVudC5hcHBlbmQodik7CgkgICAgdGhpcy5lbGVtZW50LnZhbChvLnZhbCk7CgkgICAgdGhpcy5pbnB1dC52YWwoby50ZXh0KTsKCX0sCgoJc2VsZWN0OiBmdW5jdGlvbih2KSB7CgkgICAgLyogZmluZCB0aGUgb3B0aW9uLCBnZXQgaXRzIHRleHQgKi8KCSAgICB2YXIgc2VsZiA9IHRoaXM7CgkgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuKCdvcHRpb24nKS5lYWNoKGZ1bmN0aW9uKCl7CgkJaWYoICQodGhpcykudmFsKCkgPT0gdiApIHsKCQkgICAgdGhpcy5zZWxlY3RlZCA9IHRydWU7CgkJICAgIHNlbGYuaW5wdXQudmFsKHRoaXMuaHRtbCgpKQoJCX0KCSAgICB9KQoJfQogICAgfSk7Cn0pKCBqUXVlcnkgKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/blank.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhGAAYAPcIADo6OkVFRTQ0NMnJydPT04yMjC8vL7y8vB0dHXl5eX5+fu7u7lJSUqGhoQ0NDSsrK62treXl5ZSUlMLCwhgYGKenp7S0tLu7u/X19fr6+kNDQ5ycnBISEgQEBFtbW7GxsRcXFzAwMCMjI2ZmZoaGhktLS83NzQoKClxcXE1NTc7OzhQUFGVlZQUFBVRUVG9vbxkZGZWVlebm5tzc3NTU1OLi4jExMVlZWUBAQJ6eniYmJqKiopqamoeHh6+vr8PDwwkJCT8/P5OTkw8PDykpKRAQECEhIYmJiYiIiCQkJF1dXS0tLSAgILCwsAgICBERETMzM4WFhb29vSoqKgsLC6Ojo7+/v5mZmfT09Pn5+Tg4OLa2trq6utDQ0CIiIp2dnaurqwwMDD09PUdHR66urkRERExMTNXV1eHh4ZaWlhMTE9vb28/Pzzw8PKCgoBYWFqysrL6+vlpaWm5ubp+fn0ZGRsDAwJubmz4+Pg4ODjk5OZCQkAYGBicnJywsLDIyMnh4eAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/i1NYWRlIGJ5IEtyYXNpbWlyYSBOZWpjaGV2YSAod3d3LmxvYWRpbmZvLm5ldCkAIfkEBQoACAAsAAAAABgAGAAAB/+ACIKDhAg2NoWJiUAtgkMHB0OKkys8L44qKpIIMEaNkwgrBzQGCEOZkkA2RJ+gLjJCLaeanAJFlCuCQDs1AUCoRQI6gy2tLQU+KUAIADMxQDc3LUY2ki1FREbELD8EMQJAKcODQLdAOgI2MIVEPSoDAZNDh0bLiS04R9qKQEa3hUACMrIHSlAxQUaE8FiYI0jBIgaISCTSL8aOHBhxPCQSkYiOVEOAhGw1qdHBREM8Ter3bxE1Gy0LFaFHUBAMG8IkhSR0zRQ6dYSMECnSSJW2IreobVqRjWcrdLc4yrKxD8HJRDO1tZCI0FZBq0RsLNvKytQqkveMrBMUcVAntF8IdRD5+lXk10AAIfkEBQoABgAsAAAAABgAGAAAB/+ABoKDhC1LD4SJioItToJOTRAOjC2LiQUsgg5SUpMGCRUUloMQE4ibnQZQESqiowYpBFEtqA4tDRlKlk9PjxIqGk6cTikYTY6LChvBBgIDSE4MDE4NCxqCTw9MhEpNUlFLTgFJhA8MtElQUBSVg0kKFxYAu+pMyIoACgiWTkyehQbatXs1qJKTJA8SLuk16smhhEmcOEjy8AHDXQ8PTWpRaSBBj4mebLPUgsnFRE4QqDtJ6AkUAfYSUVCXZJItQhINTBQAZQUhJgs1QdnGywATKBtXaCOZRECvB0toCSBH0MATmIISCmIiwCdBqMi06lyypCoTVy0StqMwsuogsW4GFzm5ZykQACH5BAUKAAIALAAAAAAYABgAAAf/gAKCg4QCU0mFiYkdHYJUDQ1Ujo2KgxwKHoJhZGRhgi9XIJWCHF9kiJtgngY0XKKjAmNWCQJUZGCSMTIulYyOSFxatrgBNZGCMDCEXlMcgjZbCVRjY1QxMwACYR5dVZLINjZJYR1iCIRT1WIfWTIJlI4IWjaeigwLWA02lWFe34lTqqSAN4gSQUUGB1GZwpChs1EcDEyROIXKQoYSH1bi0FDiP1iLICL4SIgKgnqJwsijtzGcv0IwDIgjF+YjFU9hkmgx8EqQFwMPw9jwIoCDMwQG6nEkWpCgFk8Mi2oh5EsRBy1EO0QV4EWLxl4TvzFsREXiwUIdvCgToHXKIBheC87CSuIWJCyLIAMBACH5BAUKAAAALAIAAAAWABcAAAfegACCg4MiIoSIiYgSBYqKHSIwgg45V1SCIwUcjh1TIZdUlZdTExBqjgBqAoeUVx0dJARmqII6IQ6hljhsEoSnAIeDDiEiHTg4HUgDAgBULhOugiEhOg4dHB2EImVUAlURZy+XgiICt45ma2hpD4kOwYo6aWWJ2bSCVFQOHA4OAA8A29G6waYgGysPpkwRONAgmwkhBNmjpa9fP0IOJKGC4Q8RlXICOiqaBi9VCAHVrrkD4ECHOY06HvxyIEAjuXOpppQcZGsTIWr3AKxKJCLiPYaIkMajtZOWDkQTBwUCACH5BAUKAAEALAIAAAAWABcAAAfRgAGCg4NUVISIiYhTSYMdiogUg1NTjwFKCpCJHZSDPjwcmqGTlR0KF2WaAR1JIRwdD1NUbRc9gysrmggdHK8KFg+CZhZIghQhAo0BDoeDCABUITEEPyyWgiGqZQMqSFOqiiI9beCqDufMAZSdqgw/Fxc/FutTwe3w8MDlkM2DIteIHuwwA3BQCFeQGCzAsiOEJUkBlK0i1MFBhzIWsshI8EjEg1EBQiAQlEvQISpKVFToJ4gVIksiBlGASKikIHu3wIVwsC+RCJqRegpKkqQgokAAIfkEBQoAAAAsAAAAABgAGAAAB8uAAIKDhABAQIWJiokdi46FS4MUIo2Pgg6CS1ONQJqVlooiAhyghVOCHCFJg2+kjyKEIkuYQHV0Cpafhg4dIUhxEHKFiJZBW1wJq47EiQgJWo66ix2HDoeGU9lTkY8pEN9wblNA2pqWJd/f4oLSy4dA1omui1MxdYvMjikzaDHcpYKmuACipUqEM3MgFYIFgEMHNwsCGHJhIkY7QpgGpcAAgdibN4tADjplyE0GYaUQddgmKEQEExQAZtokKEGVmAA7JCFpKF9Kn4kCAQAh+QQFCgABACwAAAAAGAAYAAAH0YABgoOEAVRUhYmKhA+LjoIwgw+NkI+SIYgBk4JUBpSPK4yfloubgx2CHaiMlgaDHAYihJGEHIWZDkkCIaGEmY8cISEiv4rFhB0iDqSWVA7OiFSTk66PZXfYbkLE06aOAHc8PHfbzL6HVB3HAQ7EiyJIAIuZBsuKZQMEPaMBtIPPhJKkoBIiBgE7LAqNitXhxg0qMWbIo5LCRwFSDlSooFKmxg57K3olEplRhYMOQmS4IPUgxLKSywzQOCDSES0HBEwKesHDH0Y7duypMzdImKVAACH5BAUKACkALAAAAAAYABgAAAatwJRwSEydTsWkcslUUpbPJtGRREqFnKs26RBsmaEmxdDsZIUhA6hoTZ3LSw6irXwPO18l/coxPPwPR3kcfw+Ge1d4TRwiiEIICUyORQAWFwpJIAZhQgwPRCIBHQYkBxAoRWRCGgsNJwwMJyQDXicBG5h6HxglJwcHJxoEElYcdkQeGQ0dDr8nHSQEJVIUJhGcEwdCDxMQa0wUFZFCv0MjBcdJHVYnHx9til9/UkEAIfkEBQoAAAAsAAAAABgAGAAAB9mAAIKDhABUVIWJiouMiV6NSY2EiIVUD5KEj4WamACcgxwhjZ9DIZ9eIUODD58AogBDHUOUg7FDSQIhFJWtiUMPAl60hUPCi1S9nYUdgsyGD9DQmNHQVM7KgtFJqsuYHdeEHSk7l4odXtzLITtYCwyLoabDHQkyWR94VCWRgwh4HVRw6RpEpUIXD4i0zIihLwW9La84sCJEYZehHTUCUAEDh4qWA0gofVvEQEYMgBytJbASQNKbAzQuDQEDBlESOF84NHpz5YWgmWC4eVDQiRKVHTuGYRvEj1EgACH5BAUKAAAALAAAAAAYABgAAAfjgACCg4QAQECFiYqDLUkPi4stIoktgyKVkII2eQCYgkA2D56Zk4wAIgJqkZ5JNhyeeTaELaOlgrGTqqcGnJaFBrcAeaMtnHmtsoVAIjbJirE2IoiKHDDTlLaEedvbmYWYNnYq4yo33gYP6Q9ABlbk5d6D6MbcedeQo7MBaUmRIr2JDKRBs8YMpGbSZr04E6GKHiABsgHhIEzTLB52XCASMABJCxw4WsDYRCibLkNpVITkkQNIrH6CaC0yc8YjEJacUFHMpAaCnU8sEbETxbPACKA5eqm55A0IJiB70tyLVyjbokAAIfkEBQoAAQAsAAAAABgAGAAAB/eAAYKDhAFUVIWJioRERIuLfIWNkYOUkEQhiHyNglR+RJaPhH5+lCEcixQUgyIhYZtEVGEhfZR8lnwVXR5hAbOCqIKug46VCTJZH2J8YYiVqGF9AiErhSE7WAsMi7MCIs6FfGY7xYmhhGHpzeCPfFSUfh8XcfTbop9En54f9PWiAY0C9lK37l+AW+cOikEiYhEVBL0UEemhYkCZRyFCfCPEh8WPLjEEUAGAgJAsX9JCcCzgwwwiPxYS8OGACsGwACvKCVpRzVCPOAAAOuJAq1JCQWXiyOTz6egiDjx8FJtkqKkoDgo8CII1aIUIp0YH9dFpMNGhf4EAACH5BAUKAAAALAAAAAAYABgAAAj/AAEIHEgQwIkTBRMm5INQYJ8+CiMCoFAhwcApUwgykSiQgokIfwRi5GNwSUaOAFBkqIJwyhKBTP4UifjmjcAwTTCk4INRYEiJV+K4QBhkQRU+RWbGHFhkysaBc85EqKLlBAOIA0/MPNHnzx8KBZekQTOjRMQiXpmEiRggDdaEJ9QqPEgXpUA+eAFMqQIBDhwIZiUWMYmxD9cqfiEA5jgYI0aEdOvalagFEIKIcWcq7JOAy5YgEcP8EcCk4UA5EOIg+YPUNACkA70WVEAnAOQ/TJAq/QngjVOCRWw6/LPWJZ8wAiYDQNsHr0uYAjRL5Lmk4fOSJ6czAStyCsmJT5XrCH0rnuBBlAEBADs=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_overlay.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpCMEM4NDgzQjlDRTNFMTExODE4NUVDOTdFQ0I0RDgxRSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGREU5OEVCQzAzMjYxMUUyOTg5OURDMDlDRTJDMTc0RSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGREU5OEVCQjAzMjYxMUUyOTg5OURDMDlDRTJDMTc0RSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkIxQzg0ODNCOUNFM0UxMTE4MTg1RUM5N0VDQjREODFFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkIwQzg0ODNCOUNFM0UxMTE4MTg1RUM5N0VDQjREODFFIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+s3YRAQAAABtJREFUeNpiFODh2cBABGBiIBKMKqSOQoAAAwBokQDs5F/8FAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/fancybox_sprite.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACwAAACYCAMAAACoAftQAAAAvVBMVEUAAAAAAAAAAAAODg4AAAAAAAAAAADNzc0BAQHZ2dkDAwMHBwcAAADf398CAgI/Pz8BAQEAAACCgoIcHBzl5eUAAAC/v7/x8fEGBgZnZ2cAAADs7OwGBgb4+Pg/Pz/Jycmenp5nZ2f39/eDg4MAAADQ0ND4+Piurq7a2tr8/Pzs7OwAAAD5+fn9/f3e3t4AAAD///9OTk7BwcE1NTWsrKyNjY2cnJx6enpdXV1oaGgsLCy6uroiIiLOzs5BQUFt3PCNAAAAL3RSTlMAAQMIDRIZHSMnLTpESFNVXWlpbG15en+HiZCWoaGssrO2vsDFydPU3uL4+fr9/Ywv6xsAAAQVSURBVHhe7JZbc6JMGIQXAUOQEMi3uMYkrmopZgqs5ujZ//+zvpdNzMsMlli1N3uRvtCbpzo9I+nmhyqN9OO6GNQ6Ha1SG0mcrhskXe90rvKE6kbX7r9MF4vp2887nfBrqPW0xJemD4w32e7jHIj2602SbNZ7Qfgd0zJLtgKi2B0+tSsE3h8u0RX7HGGfHWrK9oiIbrK69SiQHxTliO5VWtP0rrNEemhoj6muaYqx2XuGyJrwbgUKohhb3hIFM6wCC7Zm4+M5Zs5fpKNiTYndEOUHDFRYCeADLvGiy7DtL7E5/12gJPacalPlqEc2eoFAdmCa2UOGyOhoUuQgwo7PxCwJMGXYGcQMlyCVX3DchCkGs3V6h0iFgyUSZsuS6QQLGaYDhueUHxhf3RpzOqB8dRMcz84lf5FS9A1Ngi2PQm8PF7RBZOnEyqFnSC/BKX6bHQmucpB13mRzCJtTsPUowlpl14if2JifUXcwgeqdA2OLn1C+PdsbzCKkW0a3KeKxbbAxF4FJ9EgAaXGqyFORAuLZNrkMZNoNKnNS9PE5dpltFofjB4PJXIAk5rP/HMu4Ukmm7XjEkwLfc2yT66tJk7lp2T2H1LMtk2wVVsWpcE0SlW4DbeLE/xG3eRvfQv7Fptw4KvpDNRKLt1/3rZty/xbjrPef1+5D018ITYttkiTrfAUsrmzK3RTIT/woHxH3DaZl9h2rRH2aX0ydaYb1BVK1zNdA32RvNn7DkVmmoyeVJvYBMcdl5Vg2/lW0zpSbUNIKT12KLV8wVjsmNvGW63feU3qj86veGQmAA1e5qzbStNZdmVTlRzzbSjG+4+t4u1iqjxxjR6pczaiNBCCVXoGx25X7mUNGgJBHM/QsXWp+dk4U5xJjX4EXSM7ACcCxnnnm2zI8rxVoFgMr/lUwUpyNPvYVx/eRfaUSQzkzLWxEOVhiwynCAd2GvCm/2bquBPEo+LxnDv0YXdyfFOHQP+8EV/kY0enSorxyitoLxxwiabDRqDImWF2JJVBIeVNEk2HgsDGn7vkhcPy67lMOiBGF4AGS3tX8yYqAfb5eF/kRiMPX4cDjEDLd8wezJT4lwtHrMHBtbg6V9oLhYDYLw3A2eSVbn0elSdMCecFg+Ee0Kq7dlftLXSCrRxNE8lzH7hp0Nu3qpHQty7Ztq2sabHvtpb/SLauisVTye1O+N2Ubbxhu2xSAq6x1UwoAWfum8P3Gu5ZNYaUA2jaFJYCofVPYOWnZFD4TcLpxU1ZAnN24KRnfxQ2bshEE/Vub8r0p35vi/t9eHRoBDMNQDJUvMLkOkDMM+8D7b9cR+kOKLPy4juojnQeAkWWVAyLLLINVdovj44N8LOqi/3Djxo0bN5ZvdbWJuwHhrw2ILYdqBwDT2fEEXtrZFmVcCWLiAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/fancybox_buttons.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAMAAAAPdrEwAAAAvVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKgAAABhYWEAAACKiooAAAAAAADj4+MAAADExMQAAABlZWWAgIAAAAAzMzMAAADg4OArKysAAADk5OR0dHRXV1dgYGCtra3u7u7Hx8eoqKjDw8P4+Pjv7++wsLD4+PjZ2dm/v7/Gxsb39/f5+fn5+fno6Oj6+vrb29vh4eHq6ur7+/vw8PD4+Pj29vb7+/v8/Pz////5+fn09PTy8vLw8PARO2GBAAAANnRSTlMAAQMFBwsOERUXHB8gJiguNzg9Pz8/Q0hLT1VWYGVoeH2IkaKkpKmxsrjExc3T1djc4uPw8vVWxhKTAAAC9ElEQVR4Xu2WXXeaQBCGgQUWiGCsibExiWk+bA0xNlZnP8D8/5/VQUp7FMYc95iLtjw3czHs45zx5bDWv05LS/gc7hewb5/txoOzR7bpP86aDeFMx/ZeNX+WTe7wResJutlE65ew2azPnb3qYK5V3e2iuXAXZnS7TWalb09LbEqttLrabfIpAKAbzQAw5Q3mLNcV38PtFeuKTNTdfi8VQiitFZa059fWheb1ep3nuRCg1NbSudKAp7CHT9TdLOqn2NqcTvsR21nXs1bYRHJEgNxaeiSh8P56gHAXvZoZ8e/w8G/zO2pYnTNrxz1VRU9Na2bL694LkVdyAXC2pc4Bqn1g98dNZ1c90aVaT2pqJ+ihW+TpU8l9ZFt/CB5ef7HKBZoTz941a5FvdkW5AW4G/Q1df2td3WHJ6BUIM4j86SkXQLkhOwv4Bs/Z6vlBSTLP6mbLn2cSRDocpgJkNvetRve7b2PNjPCLBQBmA3MCsLjgVpP7NrL3qx9qZsTtXC7QzBi6F5cdt0Hg8Mjfr/Y7ncJcd/d7RepY1OujuQmbOdZeHJc1/rbLfVZU5nM0/y20tLS0sNmpTXfDGAmrciBc6y8O2Y01ElflQCKp9Qs5eCyVknFZDNSg6MFjmWXoLIqBGoTIycHjDCCLy2KixlsKlIMfXb1GysGPr357Q3e58Q9RA8Cd9yELEfli3D26Ot9cgb8OE370hQgUL8a9yD323ygBRDny0V8ZKUU58vFfdBDUyEiMyxJxWQ5Xz8mRkZMYOanKgfAuOTLiBlEUuFU5EObjyP8jLS0tLexRF7hUl9mnyyvHSO0m00wqGVA35cmnpV56ZlNH11pKGTV3I6W1Wl1zI7X9aSkBSLWUMhsnZlN7y2w1ToFUK6mn3DZS89vVuDeYUuriiw4TZjZ1t5/wKCG2GQxGo9EgcY3Ujsc9m7mM/LAjnOga5JXIOgGRV4OsE9B5pbNOY5JXOus0dF7prNOY5JXOOg2dVzrrNCZ5pbNuTkvLT1EJqK9sfkCLAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-buttons.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2ZhbmN5Ym94LWJ1dHRvbnMgewoJcG9zaXRpb246IGZpeGVkOwoJbGVmdDogMDsKCXdpZHRoOiAxMDAlOwoJei1pbmRleDogODA1MDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMudG9wIHsKCXRvcDogMTBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMuYm90dG9tIHsKCWJvdHRvbTogMTBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgdWwgewoJZGlzcGxheTogYmxvY2s7Cgl3aWR0aDogMTY2cHg7CgloZWlnaHQ6IDMwcHg7CgltYXJnaW46IDAgYXV0bzsKCXBhZGRpbmc6IDA7CglsaXN0LXN0eWxlOiBub25lOwoJYm9yZGVyOiAxcHggc29saWQgIzExMTsKCWJvcmRlci1yYWRpdXM6IDNweDsKCS13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCSAgIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCSAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjA1KTsKCWJhY2tncm91bmQ6IHJnYig1MCw1MCw1MCk7CgliYWNrZ3JvdW5kOiAtbW96LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUsIHJnYig1Miw1Miw1MikgNTAlLCByZ2IoNDEsNDEsNDEpIDUwJSwgcmdiKDUxLDUxLDUxKSAxMDAlKTsKCWJhY2tncm91bmQ6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgbGVmdCBib3R0b20sIGNvbG9yLXN0b3AoMCUscmdiKDY4LDY4LDY4KSksIGNvbG9yLXN0b3AoNTAlLHJnYig1Miw1Miw1MikpLCBjb2xvci1zdG9wKDUwJSxyZ2IoNDEsNDEsNDEpKSwgY29sb3Itc3RvcCgxMDAlLHJnYig1MSw1MSw1MSkpKTsKCWJhY2tncm91bmQ6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDY4LDY4LDY4KSAwJSxyZ2IoNTIsNTIsNTIpIDUwJSxyZ2IoNDEsNDEsNDEpIDUwJSxyZ2IoNTEsNTEsNTEpIDEwMCUpOwoJYmFja2dyb3VuZDogLW8tbGluZWFyLWdyYWRpZW50KHRvcCwgcmdiKDY4LDY4LDY4KSAwJSxyZ2IoNTIsNTIsNTIpIDUwJSxyZ2IoNDEsNDEsNDEpIDUwJSxyZ2IoNTEsNTEsNTEpIDEwMCUpOwoJYmFja2dyb3VuZDogLW1zLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUscmdiKDUyLDUyLDUyKSA1MCUscmdiKDQxLDQxLDQxKSA1MCUscmdiKDUxLDUxLDUxKSAxMDAlKTsKCWJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0b3AsIHJnYig2OCw2OCw2OCkgMCUscmdiKDUyLDUyLDUyKSA1MCUscmdiKDQxLDQxLDQxKSA1MCUscmdiKDUxLDUxLDUxKSAxMDAlKTsKCWZpbHRlcjogcHJvZ2lkOkRYSW1hZ2VUcmFuc2Zvcm0uTWljcm9zb2Z0LmdyYWRpZW50KCBzdGFydENvbG9yc3RyPScjNDQ0NDQ0JywgZW5kQ29sb3JzdHI9JyMyMjIyMjInLEdyYWRpZW50VHlwZT0wICk7Cn0KCiNmYW5jeWJveC1idXR0b25zIHVsIGxpIHsKCWZsb2F0OiBsZWZ0OwoJbWFyZ2luOiAwOwoJcGFkZGluZzogMDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYSB7CglkaXNwbGF5OiBibG9jazsKCXdpZHRoOiAzMHB4OwoJaGVpZ2h0OiAzMHB4OwoJdGV4dC1pbmRlbnQ6IC05OTk5cHg7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoJ2ZhbmN5Ym94X2J1dHRvbnMucG5nJyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJb3V0bGluZTogbm9uZTsKCW9wYWNpdHk6IDAuODsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYTpob3ZlciB7CglvcGFjaXR5OiAxOwp9CgojZmFuY3lib3gtYnV0dG9ucyBhLmJ0blByZXYgewoJYmFja2dyb3VuZC1wb3NpdGlvbjogNXB4IDA7Cn0KCiNmYW5jeWJveC1idXR0b25zIGEuYnRuTmV4dCB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzNweCAwOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzNlM2UzZTsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5QbGF5IHsKCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTMwcHg7Cn0KCiNmYW5jeWJveC1idXR0b25zIGEuYnRuUGxheU9uIHsKCWJhY2tncm91bmQtcG9zaXRpb246IC0zMHB4IC0zMHB4Owp9CgojZmFuY3lib3gtYnV0dG9ucyBhLmJ0blRvZ2dsZSB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAzcHggLTYwcHg7Cglib3JkZXItbGVmdDogMXB4IHNvbGlkICMxMTE7Cglib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjM2UzZTNlOwoJd2lkdGg6IDM1cHgKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5Ub2dnbGVPbiB7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjdweCAtNjBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5DbG9zZSB7Cglib3JkZXItbGVmdDogMXB4IHNvbGlkICMxMTE7Cgl3aWR0aDogMzVweDsKCWJhY2tncm91bmQtcG9zaXRpb246IC01NnB4IDBweDsKfQoKI2ZhbmN5Ym94LWJ1dHRvbnMgYS5idG5EaXNhYmxlZCB7CglvcGFjaXR5IDogMC40OwoJY3Vyc29yOiBkZWZhdWx0Owp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-buttons.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC8qIQogKiBCdXR0b25zIGhlbHBlciBmb3IgZmFuY3lCb3gKICogdmVyc2lvbjogMS4wLjUgKE1vbiwgMTUgT2N0IDIwMTIpCiAqIEByZXF1aXJlcyBmYW5jeUJveCB2Mi4wIG9yIGxhdGVyCiAqCiAqIFVzYWdlOgogKiAgICAgJCgiLmZhbmN5Ym94IikuZmFuY3lib3goewogKiAgICAgICAgIGhlbHBlcnMgOiB7CiAqICAgICAgICAgICAgIGJ1dHRvbnM6IHsKICogICAgICAgICAgICAgICAgIHBvc2l0aW9uIDogJ3RvcCcKICogICAgICAgICAgICAgfQogKiAgICAgICAgIH0KICogICAgIH0pOwogKgogKi8KKGZ1bmN0aW9uICgkKSB7CgkvL1Nob3J0Y3V0IGZvciBmYW5jeUJveCBvYmplY3QKCXZhciBGID0gJC5mYW5jeWJveDsKCgkvL0FkZCBoZWxwZXIgb2JqZWN0CglGLmhlbHBlcnMuYnV0dG9ucyA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJc2tpcFNpbmdsZSA6IGZhbHNlLCAvLyBkaXNhYmxlcyBpZiBnYWxsZXJ5IGNvbnRhaW5zIHNpbmdsZSBpbWFnZQoJCQlwb3NpdGlvbiAgIDogJ3RvcCcsIC8vICd0b3AnIG9yICdib3R0b20nCgkJCXRwbCAgICAgICAgOiAnPGRpdiBpZD0iZmFuY3lib3gtYnV0dG9ucyI+PHVsPjxsaT48YSBjbGFzcz0iYnRuUHJldiIgdGl0bGU9IlByZXZpb3VzIiBocmVmPSJqYXZhc2NyaXB0OjsiPjwvYT48L2xpPjxsaT48YSBjbGFzcz0iYnRuUGxheSIgdGl0bGU9IlN0YXJ0IHNsaWRlc2hvdyIgaHJlZj0iamF2YXNjcmlwdDo7Ij48L2E+PC9saT48bGk+PGEgY2xhc3M9ImJ0bk5leHQiIHRpdGxlPSJOZXh0IiBocmVmPSJqYXZhc2NyaXB0OjsiPjwvYT48L2xpPjxsaT48YSBjbGFzcz0iYnRuVG9nZ2xlIiB0aXRsZT0iVG9nZ2xlIHNpemUiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJidG5DbG9zZSIgdGl0bGU9IkNsb3NlIiBocmVmPSJqYXZhc2NyaXB0OmpRdWVyeS5mYW5jeWJveC5jbG9zZSgpOyI+PC9hPjwvbGk+PC91bD48L2Rpdj4nCgkJfSwKCgkJbGlzdCA6IG51bGwsCgkJYnV0dG9uczogbnVsbCwKCgkJYmVmb3JlTG9hZDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkvL1JlbW92ZSBzZWxmIGlmIGdhbGxlcnkgZG8gbm90IGhhdmUgYXQgbGVhc3QgdHdvIGl0ZW1zCgoJCQlpZiAob3B0cy5za2lwU2luZ2xlICYmIG9iai5ncm91cC5sZW5ndGggPCAyKSB7CgkJCQlvYmouaGVscGVycy5idXR0b25zID0gZmFsc2U7CgkJCQlvYmouY2xvc2VCdG4gPSB0cnVlOwoKCQkJCXJldHVybjsKCQkJfQoKCQkJLy9JbmNyZWFzZSB0b3AgbWFyZ2luIHRvIGdpdmUgc3BhY2UgZm9yIGJ1dHRvbnMKCQkJb2JqLm1hcmdpblsgb3B0cy5wb3NpdGlvbiA9PT0gJ2JvdHRvbScgPyAyIDogMCBdICs9IDMwOwoJCX0sCgoJCW9uUGxheVN0YXJ0OiBmdW5jdGlvbiAoKSB7CgkJCWlmICh0aGlzLmJ1dHRvbnMpIHsKCQkJCXRoaXMuYnV0dG9ucy5wbGF5LmF0dHIoJ3RpdGxlJywgJ1BhdXNlIHNsaWRlc2hvdycpLmFkZENsYXNzKCdidG5QbGF5T24nKTsKCQkJfQoJCX0sCgoJCW9uUGxheUVuZDogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy5idXR0b25zKSB7CgkJCQl0aGlzLmJ1dHRvbnMucGxheS5hdHRyKCd0aXRsZScsICdTdGFydCBzbGlkZXNob3cnKS5yZW1vdmVDbGFzcygnYnRuUGxheU9uJyk7CgkJCX0KCQl9LAoKCQlhZnRlclNob3c6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJdmFyIGJ1dHRvbnMgPSB0aGlzLmJ1dHRvbnM7CgoJCQlpZiAoIWJ1dHRvbnMpIHsKCQkJCXRoaXMubGlzdCA9ICQob3B0cy50cGwpLmFkZENsYXNzKG9wdHMucG9zaXRpb24pLmFwcGVuZFRvKCdib2R5Jyk7CgoJCQkJYnV0dG9ucyA9IHsKCQkJCQlwcmV2ICAgOiB0aGlzLmxpc3QuZmluZCgnLmJ0blByZXYnKS5jbGljayggRi5wcmV2ICksCgkJCQkJbmV4dCAgIDogdGhpcy5saXN0LmZpbmQoJy5idG5OZXh0JykuY2xpY2soIEYubmV4dCApLAoJCQkJCXBsYXkgICA6IHRoaXMubGlzdC5maW5kKCcuYnRuUGxheScpLmNsaWNrKCBGLnBsYXkgKSwKCQkJCQl0b2dnbGUgOiB0aGlzLmxpc3QuZmluZCgnLmJ0blRvZ2dsZScpLmNsaWNrKCBGLnRvZ2dsZSApCgkJCQl9CgkJCX0KCgkJCS8vUHJldgoJCQlpZiAob2JqLmluZGV4ID4gMCB8fCBvYmoubG9vcCkgewoJCQkJYnV0dG9ucy5wcmV2LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQl9IGVsc2UgewoJCQkJYnV0dG9ucy5wcmV2LmFkZENsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQl9CgoJCQkvL05leHQgLyBQbGF5CgkJCWlmIChvYmoubG9vcCB8fCBvYmouaW5kZXggPCBvYmouZ3JvdXAubGVuZ3RoIC0gMSkgewoJCQkJYnV0dG9ucy5uZXh0LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoJCQkJYnV0dG9ucy5wbGF5LnJlbW92ZUNsYXNzKCdidG5EaXNhYmxlZCcpOwoKCQkJfSBlbHNlIHsKCQkJCWJ1dHRvbnMubmV4dC5hZGRDbGFzcygnYnRuRGlzYWJsZWQnKTsKCQkJCWJ1dHRvbnMucGxheS5hZGRDbGFzcygnYnRuRGlzYWJsZWQnKTsKCQkJfQoKCQkJdGhpcy5idXR0b25zID0gYnV0dG9uczsKCgkJCXRoaXMub25VcGRhdGUob3B0cywgb2JqKTsKCQl9LAoKCQlvblVwZGF0ZTogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQl2YXIgdG9nZ2xlOwoKCQkJaWYgKCF0aGlzLmJ1dHRvbnMpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJdG9nZ2xlID0gdGhpcy5idXR0b25zLnRvZ2dsZS5yZW1vdmVDbGFzcygnYnRuRGlzYWJsZWQgYnRuVG9nZ2xlT24nKTsKCgkJCS8vU2l6ZSB0b2dnbGUgYnV0dG9uCgkJCWlmIChvYmouY2FuU2hyaW5rKSB7CgkJCQl0b2dnbGUuYWRkQ2xhc3MoJ2J0blRvZ2dsZU9uJyk7CgoJCQl9IGVsc2UgaWYgKCFvYmouY2FuRXhwYW5kKSB7CgkJCQl0b2dnbGUuYWRkQ2xhc3MoJ2J0bkRpc2FibGVkJyk7CgkJCX0KCQl9LAoKCQliZWZvcmVDbG9zZTogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy5saXN0KSB7CgkJCQl0aGlzLmxpc3QucmVtb3ZlKCk7CgkJCX0KCgkJCXRoaXMubGlzdCAgICA9IG51bGw7CgkJCXRoaXMuYnV0dG9ucyA9IG51bGw7CgkJfQoJfTsKCn0oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-media.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIE1lZGlhIGhlbHBlciBmb3IgZmFuY3lCb3gKICogdmVyc2lvbjogMS4wLjUgKFR1ZSwgMjMgT2N0IDIwMTIpCiAqIEByZXF1aXJlcyBmYW5jeUJveCB2Mi4wIG9yIGxhdGVyCiAqCiAqIFVzYWdlOgogKiAgICAgJCgiLmZhbmN5Ym94IikuZmFuY3lib3goewogKiAgICAgICAgIGhlbHBlcnMgOiB7CiAqICAgICAgICAgICAgIG1lZGlhOiB0cnVlCiAqICAgICAgICAgfQogKiAgICAgfSk7CiAqCiAqIFNldCBjdXN0b20gVVJMIHBhcmFtZXRlcnM6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7CiAqICAgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgbWVkaWE6IHsKICogICAgICAgICAgICAgICAgIHlvdXR1YmUgOiB7CiAqICAgICAgICAgICAgICAgICAgICAgcGFyYW1zIDogewogKiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvcGxheSA6IDAKICogICAgICAgICAgICAgICAgICAgICB9CiAqICAgICAgICAgICAgICAgICB9CiAqICAgICAgICAgICAgIH0KICogICAgICAgICB9CiAqICAgICB9KTsKICoKICogT3I6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7LAogKgkgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgbWVkaWE6IHRydWUKICogICAgICAgICB9LAogKiAgICAgICAgIHlvdXR1YmUgOiB7CiAqICAgICAgICAgICAgIGF1dG9wbGF5OiAwCiAqICAgICAgICAgfQogKiAgICAgfSk7CiAqCiAqICBTdXBwb3J0czoKICoKICogICAgICBZb3V0dWJlCiAqICAgICAgICAgIGh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1vcGoyNEtuenJXbwogKiAgICAgICAgICBodHRwOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL29wajI0S256cldvCiAqICAgICAgICAgIGh0dHA6Ly95b3V0dS5iZS9vcGoyNEtuenJXbwogKiAgICAgIFZpbWVvCiAqICAgICAgICAgIGh0dHA6Ly92aW1lby5jb20vNDA2NDgxNjkKICogICAgICAgICAgaHR0cDovL3ZpbWVvLmNvbS9jaGFubmVscy9zdGFmZnBpY2tzLzM4ODQzNjI4CiAqICAgICAgICAgIGh0dHA6Ly92aW1lby5jb20vZ3JvdXBzL3N1cnJlYWxpc20vdmlkZW9zLzM2NTE2Mzg0CiAqICAgICAgICAgIGh0dHA6Ly9wbGF5ZXIudmltZW8uY29tL3ZpZGVvLzQ1MDc0MzAzCiAqICAgICAgTWV0YWNhZmUKICogICAgICAgICAgaHR0cDovL3d3dy5tZXRhY2FmZS5jb20vd2F0Y2gvNzYzNTk2NC9kcl9zZXVzc190aGVfbG9yYXhfbW92aWVfdHJhaWxlci8KICogICAgICAgICAgaHR0cDovL3d3dy5tZXRhY2FmZS5jb20vd2F0Y2gvNzYzNTk2NC8KICogICAgICBEYWlseW1vdGlvbgogKiAgICAgICAgICBodHRwOi8vd3d3LmRhaWx5bW90aW9uLmNvbS92aWRlby94b3l0cWhfZHItc2V1c3MtdGhlLWxvcmF4LXByZW1pZXJlX3Blb3BsZQogKiAgICAgIFR3aXR2aWQKICogICAgICAgICAgaHR0cDovL3R3aXR2aWQuY29tL1FZN01ECiAqICAgICAgVHdpdHBpYwogKiAgICAgICAgICBodHRwOi8vdHdpdHBpYy5jb20vN3A5M3N0CiAqICAgICAgSW5zdGFncmFtCiAqICAgICAgICAgIGh0dHA6Ly9pbnN0YWdyLmFtL3AvSWVqa3VVR3hRbi8KICogICAgICAgICAgaHR0cDovL2luc3RhZ3JhbS5jb20vcC9JZWprdVVHeFFuLwogKiAgICAgIEdvb2dsZSBtYXBzCiAqICAgICAgICAgIGh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vbWFwcz9xPUVpZmZlbCtUb3dlciwrQXZlbnVlK0d1c3RhdmUrRWlmZmVsLCtQYXJpcywrRnJhbmNlJnQ9aCZ6PTE3CiAqICAgICAgICAgIGh0dHA6Ly9tYXBzLmdvb2dsZS5jb20vP2xsPTQ4Ljg1Nzk5NSwyLjI5NDI5NyZzcG49MC4wMDc2NjYsMC4wMjExMzYmdD1tJno9MTYKICogICAgICAgICAgaHR0cDovL21hcHMuZ29vZ2xlLmNvbS8/bGw9NDguODU5NDYzLDIuMjkyNjI2JnNwbj0wLjAwMDk2NSwwLjAwMjY0MiZ0PW0mej0xOSZsYXllcj1jJmNibGw9NDguODU5NTI0LDIuMjkyNTMyJnBhbm9pZD1ZSjBscTI4T095M1ZUMklxSXVWWTBnJmNicD0xMiwxNTEuNTgsLDAsLTE1LjU2CiAqLwooZnVuY3Rpb24gKCQpIHsKCSJ1c2Ugc3RyaWN0IjsKCgkvL1Nob3J0Y3V0IGZvciBmYW5jeUJveCBvYmplY3QKCXZhciBGID0gJC5mYW5jeWJveCwKCQlmb3JtYXQgPSBmdW5jdGlvbiggdXJsLCByZXosIHBhcmFtcyApIHsKCQkJcGFyYW1zID0gcGFyYW1zIHx8ICcnOwoKCQkJaWYgKCAkLnR5cGUoIHBhcmFtcyApID09PSAib2JqZWN0IiApIHsKCQkJCXBhcmFtcyA9ICQucGFyYW0ocGFyYW1zLCB0cnVlKTsKCQkJfQoKCQkJJC5lYWNoKHJleiwgZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewoJCQkJdXJsID0gdXJsLnJlcGxhY2UoICckJyArIGtleSwgdmFsdWUgfHwgJycgKTsKCQkJfSk7CgoJCQlpZiAocGFyYW1zLmxlbmd0aCkgewoJCQkJdXJsICs9ICggdXJsLmluZGV4T2YoJz8nKSA+IDAgPyAnJicgOiAnPycgKSArIHBhcmFtczsKCQkJfQoKCQkJcmV0dXJuIHVybDsKCQl9OwoKCS8vQWRkIGhlbHBlciBvYmplY3QKCUYuaGVscGVycy5tZWRpYSA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJeW91dHViZSA6IHsKCQkJCW1hdGNoZXIgOiAvKHlvdXR1YmVcLmNvbXx5b3V0dVwuYmUpXC8od2F0Y2hcP3Y9fHZcL3x1XC98ZW1iZWRcLz8pPyh2aWRlb3Nlcmllc1w/bGlzdD0oLiopfFtcdy1dezExfXxcP2xpc3RUeXBlPSguKikmbGlzdD0oLiopKS4qL2ksCgkJCQlwYXJhbXMgIDogewoJCQkJCWF1dG9wbGF5ICAgIDogMSwKCQkJCQlhdXRvaGlkZSAgICA6IDEsCgkJCQkJZnMgICAgICAgICAgOiAxLAoJCQkJCXJlbCAgICAgICAgIDogMCwKCQkJCQloZCAgICAgICAgICA6IDEsCgkJCQkJd21vZGUgICAgICAgOiAnb3BhcXVlJywKCQkJCQllbmFibGVqc2FwaSA6IDEKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLyQzJwoJCQl9LAoJCQl2aW1lbyA6IHsKCQkJCW1hdGNoZXIgOiAvKD86dmltZW8oPzpwcm8pPy5jb20pXC8oPzpbXlxkXSspPyhcZCspKD86LiopLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYXV0b3BsYXkgICAgICA6IDEsCgkJCQkJaGQgICAgICAgICAgICA6IDEsCgkJCQkJc2hvd190aXRsZSAgICA6IDEsCgkJCQkJc2hvd19ieWxpbmUgICA6IDEsCgkJCQkJc2hvd19wb3J0cmFpdCA6IDAsCgkJCQkJZnVsbHNjcmVlbiAgICA6IDEKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vcGxheWVyLnZpbWVvLmNvbS92aWRlby8kMScKCQkJfSwKCQkJbWV0YWNhZmUgOiB7CgkJCQltYXRjaGVyIDogL21ldGFjYWZlLmNvbVwvKD86d2F0Y2h8ZnBsYXllcilcLyhbXHdcLV17MSwxMH0pLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYXV0b1BsYXkgOiAneWVzJwoJCQkJfSwKCQkJCXR5cGUgOiAnc3dmJywKCQkJCXVybCAgOiBmdW5jdGlvbiggcmV6LCBwYXJhbXMsIG9iaiApIHsKCQkJCQlvYmouc3dmLmZsYXNoVmFycyA9ICdwbGF5ZXJWYXJzPScgKyAkLnBhcmFtKCBwYXJhbXMsIHRydWUgKTsKCgkJCQkJcmV0dXJuICcvL3d3dy5tZXRhY2FmZS5jb20vZnBsYXllci8nICsgcmV6WzFdICsgJy8uc3dmJzsKCQkJCX0KCQkJfSwKCQkJZGFpbHltb3Rpb24gOiB7CgkJCQltYXRjaGVyIDogL2RhaWx5bW90aW9uLmNvbVwvdmlkZW9cLyguKilcLz8oLiopLywKCQkJCXBhcmFtcyAgOiB7CgkJCQkJYWRkaXRpb25hbEluZm9zIDogMCwKCQkJCQlhdXRvU3RhcnQgOiAxCgkJCQl9LAoJCQkJdHlwZSA6ICdzd2YnLAoJCQkJdXJsICA6ICcvL3d3dy5kYWlseW1vdGlvbi5jb20vc3dmL3ZpZGVvLyQxJwoJCQl9LAoJCQl0d2l0dmlkIDogewoJCQkJbWF0Y2hlciA6IC90d2l0dmlkXC5jb21cLyhbYS16QS1aMC05X1wtXD9cPV0rKS9pLAoJCQkJcGFyYW1zICA6IHsKCQkJCQlhdXRvcGxheSA6IDAKCQkJCX0sCgkJCQl0eXBlIDogJ2lmcmFtZScsCgkJCQl1cmwgIDogJy8vd3d3LnR3aXR2aWQuY29tL2VtYmVkLnBocD9ndWlkPSQxJwoJCQl9LAoJCQl0d2l0cGljIDogewoJCQkJbWF0Y2hlciA6IC90d2l0cGljXC5jb21cLyg/ISg/OnBsYWNlfHBob3Rvc3xldmVudHMpXC8pKFthLXpBLVowLTlcP1w9XC1dKykvaSwKCQkJCXR5cGUgOiAnaW1hZ2UnLAoJCQkJdXJsICA6ICcvL3R3aXRwaWMuY29tL3Nob3cvZnVsbC8kMS8nCgkJCX0sCgkJCWluc3RhZ3JhbSA6IHsKCQkJCW1hdGNoZXIgOiAvKGluc3RhZ3JcLmFtfGluc3RhZ3JhbVwuY29tKVwvcFwvKFthLXpBLVowLTlfXC1dKylcLz8vaSwKCQkJCXR5cGUgOiAnaW1hZ2UnLAoJCQkJdXJsICA6ICcvLyQxL3AvJDIvbWVkaWEvJwoJCQl9LAoJCQlnb29nbGVfbWFwcyA6IHsKCQkJCW1hdGNoZXIgOiAvbWFwc1wuZ29vZ2xlXC4oW2Etel17MiwzfShcLlthLXpdezJ9KT8pXC8oXD9sbD18bWFwc1w/KSguKikvaSwKCQkJCXR5cGUgOiAnaWZyYW1lJywKCQkJCXVybCAgOiBmdW5jdGlvbiggcmV6ICkgewoJCQkJCXJldHVybiAnLy9tYXBzLmdvb2dsZS4nICsgcmV6WzFdICsgJy8nICsgcmV6WzNdICsgJycgKyByZXpbNF0gKyAnJm91dHB1dD0nICsgKHJlels0XS5pbmRleE9mKCdsYXllcj1jJykgPiAwID8gJ3N2ZW1iZWQnIDogJ2VtYmVkJyk7CgkJCQl9CgkJCX0KCQl9LAoKCQliZWZvcmVMb2FkIDogZnVuY3Rpb24ob3B0cywgb2JqKSB7CgkJCXZhciB1cmwgICA9IG9iai5ocmVmIHx8ICcnLAoJCQkJdHlwZSAgPSBmYWxzZSwKCQkJCXdoYXQsCgkJCQlpdGVtLAoJCQkJcmV6LAoJCQkJcGFyYW1zOwoKCQkJZm9yICh3aGF0IGluIG9wdHMpIHsKCQkJCWl0ZW0gPSBvcHRzWyB3aGF0IF07CgkJCQlyZXogID0gdXJsLm1hdGNoKCBpdGVtLm1hdGNoZXIgKTsKCgkJCQlpZiAocmV6KSB7CgkJCQkJdHlwZSAgID0gaXRlbS50eXBlOwoJCQkJCXBhcmFtcyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBpdGVtLnBhcmFtcywgb2JqWyB3aGF0IF0gfHwgKCQuaXNQbGFpbk9iamVjdChvcHRzWyB3aGF0IF0pID8gb3B0c1sgd2hhdCBdLnBhcmFtcyA6IG51bGwpKTsKCgkJCQkJdXJsID0gJC50eXBlKCBpdGVtLnVybCApID09PSAiZnVuY3Rpb24iID8gaXRlbS51cmwuY2FsbCggdGhpcywgcmV6LCBwYXJhbXMsIG9iaiApIDogZm9ybWF0KCBpdGVtLnVybCwgcmV6LCBwYXJhbXMgKTsKCgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCWlmICh0eXBlKSB7CgkJCQlvYmouaHJlZiA9IHVybDsKCQkJCW9iai50eXBlID0gdHlwZTsKCgkJCQlvYmouYXV0b0hlaWdodCA9IGZhbHNlOwoJCQl9CgkJfQoJfTsKCn0oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-thumbs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[I2ZhbmN5Ym94LXRodW1icyB7Cglwb3NpdGlvbjogZml4ZWQ7CglsZWZ0OiAwOwoJd2lkdGg6IDEwMCU7CglvdmVyZmxvdzogaGlkZGVuOwoJei1pbmRleDogODA1MDsKfQoKI2ZhbmN5Ym94LXRodW1icy5ib3R0b20gewoJYm90dG9tOiAycHg7Cn0KCiNmYW5jeWJveC10aHVtYnMudG9wIHsKCXRvcDogMnB4Owp9CgojZmFuY3lib3gtdGh1bWJzIHVsIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCWxpc3Qtc3R5bGU6IG5vbmU7CgltYXJnaW46IDA7CglwYWRkaW5nOiAwOwp9CgojZmFuY3lib3gtdGh1bWJzIHVsIGxpIHsKCWZsb2F0OiBsZWZ0OwoJcGFkZGluZzogMXB4OwoJb3BhY2l0eTogMC41Owp9CgojZmFuY3lib3gtdGh1bWJzIHVsIGxpLmFjdGl2ZSB7CglvcGFjaXR5OiAwLjc1OwoJcGFkZGluZzogMDsKCWJvcmRlcjogMXB4IHNvbGlkICNmZmY7Cn0KCiNmYW5jeWJveC10aHVtYnMgdWwgbGk6aG92ZXIgewoJb3BhY2l0eTogMTsKfQoKI2ZhbmN5Ym94LXRodW1icyB1bCBsaSBhIHsKCWRpc3BsYXk6IGJsb2NrOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCWJvcmRlcjogMXB4IHNvbGlkICMyMjI7CgliYWNrZ3JvdW5kOiAjMTExOwoJb3V0bGluZTogbm9uZTsKfQoKI2ZhbmN5Ym94LXRodW1icyB1bCBsaSBpbWcgewoJZGlzcGxheTogYmxvY2s7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cglib3JkZXI6IDA7CglwYWRkaW5nOiAwOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/helpers/jquery.fancybox-thumbs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IC8qIQogKiBUaHVtYm5haWwgaGVscGVyIGZvciBmYW5jeUJveAogKiB2ZXJzaW9uOiAxLjAuNyAoTW9uLCAwMSBPY3QgMjAxMikKICogQHJlcXVpcmVzIGZhbmN5Qm94IHYyLjAgb3IgbGF0ZXIKICoKICogVXNhZ2U6CiAqICAgICAkKCIuZmFuY3lib3giKS5mYW5jeWJveCh7CiAqICAgICAgICAgaGVscGVycyA6IHsKICogICAgICAgICAgICAgdGh1bWJzOiB7CiAqICAgICAgICAgICAgICAgICB3aWR0aCAgOiA1MCwKICogICAgICAgICAgICAgICAgIGhlaWdodCA6IDUwCiAqICAgICAgICAgICAgIH0KICogICAgICAgICB9CiAqICAgICB9KTsKICoKICovCihmdW5jdGlvbiAoJCkgewoJLy9TaG9ydGN1dCBmb3IgZmFuY3lCb3ggb2JqZWN0Cgl2YXIgRiA9ICQuZmFuY3lib3g7CgoJLy9BZGQgaGVscGVyIG9iamVjdAoJRi5oZWxwZXJzLnRodW1icyA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJd2lkdGggICAgOiA1MCwgICAgICAgLy8gdGh1bWJuYWlsIHdpZHRoCgkJCWhlaWdodCAgIDogNTAsICAgICAgIC8vIHRodW1ibmFpbCBoZWlnaHQKCQkJcG9zaXRpb24gOiAnYm90dG9tJywgLy8gJ3RvcCcgb3IgJ2JvdHRvbScKCQkJc291cmNlICAgOiBmdW5jdGlvbiAoIGl0ZW0gKSB7ICAvLyBmdW5jdGlvbiB0byBvYnRhaW4gdGhlIFVSTCBvZiB0aGUgdGh1bWJuYWlsIGltYWdlCgkJCQl2YXIgaHJlZjsKCgkJCQlpZiAoaXRlbS5lbGVtZW50KSB7CgkJCQkJaHJlZiA9ICQoaXRlbS5lbGVtZW50KS5maW5kKCdpbWcnKS5hdHRyKCdzcmMnKTsKCQkJCX0KCgkJCQlpZiAoIWhyZWYgJiYgaXRlbS50eXBlID09PSAnaW1hZ2UnICYmIGl0ZW0uaHJlZikgewoJCQkJCWhyZWYgPSBpdGVtLmhyZWY7CgkJCQl9CgoJCQkJcmV0dXJuIGhyZWY7CgkJCX0KCQl9LAoKCQl3cmFwICA6IG51bGwsCgkJbGlzdCAgOiBudWxsLAoJCXdpZHRoIDogMCwKCgkJaW5pdDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQl2YXIgdGhhdCA9IHRoaXMsCgkJCQlsaXN0LAoJCQkJdGh1bWJXaWR0aCAgPSBvcHRzLndpZHRoLAoJCQkJdGh1bWJIZWlnaHQgPSBvcHRzLmhlaWdodCwKCQkJCXRodW1iU291cmNlID0gb3B0cy5zb3VyY2U7CgoJCQkvL0J1aWxkIGxpc3Qgc3RydWN0dXJlCgkJCWxpc3QgPSAnJzsKCgkJCWZvciAodmFyIG4gPSAwOyBuIDwgb2JqLmdyb3VwLmxlbmd0aDsgbisrKSB7CgkJCQlsaXN0ICs9ICc8bGk+PGEgc3R5bGU9IndpZHRoOicgKyB0aHVtYldpZHRoICsgJ3B4O2hlaWdodDonICsgdGh1bWJIZWlnaHQgKyAncHg7IiBocmVmPSJqYXZhc2NyaXB0OmpRdWVyeS5mYW5jeWJveC5qdW1wdG8oJyArIG4gKyAnKTsiPjwvYT48L2xpPic7CgkJCX0KCgkJCXRoaXMud3JhcCA9ICQoJzxkaXYgaWQ9ImZhbmN5Ym94LXRodW1icyI+PC9kaXY+JykuYWRkQ2xhc3Mob3B0cy5wb3NpdGlvbikuYXBwZW5kVG8oJ2JvZHknKTsKCQkJdGhpcy5saXN0ID0gJCgnPHVsPicgKyBsaXN0ICsgJzwvdWw+JykuYXBwZW5kVG8odGhpcy53cmFwKTsKCgkJCS8vTG9hZCBlYWNoIHRodW1ibmFpbAoJCQkkLmVhY2gob2JqLmdyb3VwLCBmdW5jdGlvbiAoaSkgewoJCQkJdmFyIGhyZWYgPSB0aHVtYlNvdXJjZSggb2JqLmdyb3VwWyBpIF0gKTsKCgkJCQlpZiAoIWhyZWYpIHsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJJCgiPGltZyAvPiIpLmxvYWQoZnVuY3Rpb24gKCkgewoJCQkJCXZhciB3aWR0aCAgPSB0aGlzLndpZHRoLAoJCQkJCQloZWlnaHQgPSB0aGlzLmhlaWdodCwKCQkJCQkJd2lkdGhSYXRpbywgaGVpZ2h0UmF0aW8sIHBhcmVudDsKCgkJCQkJaWYgKCF0aGF0Lmxpc3QgfHwgIXdpZHRoIHx8ICFoZWlnaHQpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJLy9DYWxjdWxhdGUgdGh1bWJuYWlsIHdpZHRoL2hlaWdodCBhbmQgY2VudGVyIGl0CgkJCQkJd2lkdGhSYXRpbyAgPSB3aWR0aCAvIHRodW1iV2lkdGg7CgkJCQkJaGVpZ2h0UmF0aW8gPSBoZWlnaHQgLyB0aHVtYkhlaWdodDsKCgkJCQkJcGFyZW50ID0gdGhhdC5saXN0LmNoaWxkcmVuKCkuZXEoaSkuZmluZCgnYScpOwoKCQkJCQlpZiAod2lkdGhSYXRpbyA+PSAxICYmIGhlaWdodFJhdGlvID49IDEpIHsKCQkJCQkJaWYgKHdpZHRoUmF0aW8gPiBoZWlnaHRSYXRpbykgewoJCQkJCQkJd2lkdGggID0gTWF0aC5mbG9vcih3aWR0aCAvIGhlaWdodFJhdGlvKTsKCQkJCQkJCWhlaWdodCA9IHRodW1iSGVpZ2h0OwoKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXdpZHRoICA9IHRodW1iV2lkdGg7CgkJCQkJCQloZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIHdpZHRoUmF0aW8pOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkkKHRoaXMpLmNzcyh7CgkJCQkJCXdpZHRoICA6IHdpZHRoLAoJCQkJCQloZWlnaHQgOiBoZWlnaHQsCgkJCQkJCXRvcCAgICA6IE1hdGguZmxvb3IodGh1bWJIZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMiksCgkJCQkJCWxlZnQgICA6IE1hdGguZmxvb3IodGh1bWJXaWR0aCAvIDIgLSB3aWR0aCAvIDIpCgkJCQkJfSk7CgoJCQkJCXBhcmVudC53aWR0aCh0aHVtYldpZHRoKS5oZWlnaHQodGh1bWJIZWlnaHQpOwoKCQkJCQkkKHRoaXMpLmhpZGUoKS5hcHBlbmRUbyhwYXJlbnQpLmZhZGVJbigzMDApOwoKCQkJCX0pLmF0dHIoJ3NyYycsIGhyZWYpOwoJCQl9KTsKCgkJCS8vU2V0IGluaXRpYWwgd2lkdGgKCQkJdGhpcy53aWR0aCA9IHRoaXMubGlzdC5jaGlsZHJlbigpLmVxKDApLm91dGVyV2lkdGgodHJ1ZSk7CgoJCQl0aGlzLmxpc3Qud2lkdGgodGhpcy53aWR0aCAqIChvYmouZ3JvdXAubGVuZ3RoICsgMSkpLmNzcygnbGVmdCcsIE1hdGguZmxvb3IoJCh3aW5kb3cpLndpZHRoKCkgKiAwLjUgLSAob2JqLmluZGV4ICogdGhpcy53aWR0aCArIHRoaXMud2lkdGggKiAwLjUpKSk7CgkJfSwKCgkJYmVmb3JlTG9hZDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkvL1JlbW92ZSBzZWxmIGlmIGdhbGxlcnkgZG8gbm90IGhhdmUgYXQgbGVhc3QgdHdvIGl0ZW1zCgkJCWlmIChvYmouZ3JvdXAubGVuZ3RoIDwgMikgewoJCQkJb2JqLmhlbHBlcnMudGh1bWJzID0gZmFsc2U7CgoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvL0luY3JlYXNlIGJvdHRvbSBtYXJnaW4gdG8gZ2l2ZSBzcGFjZSBmb3IgdGh1bWJzCgkJCW9iai5tYXJnaW5bIG9wdHMucG9zaXRpb24gPT09ICd0b3AnID8gMCA6IDIgXSArPSAoKG9wdHMuaGVpZ2h0KSArIDE1KTsKCQl9LAoKCQlhZnRlclNob3c6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJLy9DaGVjayBpZiBleGlzdHMgYW5kIGNyZWF0ZSBvciB1cGRhdGUgbGlzdAoJCQlpZiAodGhpcy5saXN0KSB7CgkJCQl0aGlzLm9uVXBkYXRlKG9wdHMsIG9iaik7CgoJCQl9IGVsc2UgewoJCQkJdGhpcy5pbml0KG9wdHMsIG9iaik7CgkJCX0KCgkJCS8vU2V0IGFjdGl2ZSBlbGVtZW50CgkJCXRoaXMubGlzdC5jaGlsZHJlbigpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKS5lcShvYmouaW5kZXgpLmFkZENsYXNzKCdhY3RpdmUnKTsKCQl9LAoKCQkvL0NlbnRlciBsaXN0CgkJb25VcGRhdGU6IGZ1bmN0aW9uIChvcHRzLCBvYmopIHsKCQkJaWYgKHRoaXMubGlzdCkgewoJCQkJdGhpcy5saXN0LnN0b3AodHJ1ZSkuYW5pbWF0ZSh7CgkJCQkJJ2xlZnQnOiBNYXRoLmZsb29yKCQod2luZG93KS53aWR0aCgpICogMC41IC0gKG9iai5pbmRleCAqIHRoaXMud2lkdGggKyB0aGlzLndpZHRoICogMC41KSkKCQkJCX0sIDE1MCk7CgkJCX0KCQl9LAoKCQliZWZvcmVDbG9zZTogZnVuY3Rpb24gKCkgewoJCQlpZiAodGhpcy53cmFwKSB7CgkJCQl0aGlzLndyYXAucmVtb3ZlKCk7CgkJCX0KCgkJCXRoaXMud3JhcCAgPSBudWxsOwoJCQl0aGlzLmxpc3QgID0gbnVsbDsKCQkJdGhpcy53aWR0aCA9IDA7CgkJfQoJfQoKfShqUXVlcnkpKTs=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LmZhbmN5Ym94LnBhY2suanMnLCdqcXVlcnkubW91c2V3aGVlbC0zLjAuNi5wYWNrLmpzJyk7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2NzcyddID0gJ2pxdWVyeS5mYW5jeWJveC5jc3MnOwokaW5mb1snanNfbm9taW5pZnknXSA9IDE7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGZhbmN5Qm94IHYyLjEuMyBmYW5jeWFwcHMuY29tIHwgZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZSAqLwouZmFuY3lib3gtd3JhcCwKLmZhbmN5Ym94LXNraW4sCi5mYW5jeWJveC1vdXRlciwKLmZhbmN5Ym94LWlubmVyLAouZmFuY3lib3gtaW1hZ2UsCi5mYW5jeWJveC13cmFwIGlmcmFtZSwKLmZhbmN5Ym94LXdyYXAgb2JqZWN0LAouZmFuY3lib3gtbmF2LAouZmFuY3lib3gtbmF2IHNwYW4sCi5mYW5jeWJveC10bXAKewoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCWJvcmRlcjogMDsKCW91dGxpbmU6IG5vbmU7Cgl2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgouZmFuY3lib3gtd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJei1pbmRleDogODAyMDsKfQoKLmZhbmN5Ym94LXNraW4gewoJcG9zaXRpb246IHJlbGF0aXZlOwoJYmFja2dyb3VuZDogI2Y5ZjlmOTsKCWNvbG9yOiAjNDQ0OwoJdGV4dC1zaGFkb3c6IG5vbmU7Cgktd2Via2l0LWJvcmRlci1yYWRpdXM6IDRweDsKCSAgIC1tb3otYm9yZGVyLXJhZGl1czogNHB4OwoJICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi5mYW5jeWJveC1vcGVuZWQgewoJei1pbmRleDogODAzMDsKfQoKLmZhbmN5Ym94LW9wZW5lZCAuZmFuY3lib3gtc2tpbiB7Cgktd2Via2l0LWJveC1zaGFkb3c6IDAgMTBweCAyNXB4IHJnYmEoMCwgMCwgMCwgMC41KTsKCSAgIC1tb3otYm94LXNoYWRvdzogMCAxMHB4IDI1cHggcmdiYSgwLCAwLCAwLCAwLjUpOwoJICAgICAgICBib3gtc2hhZG93OiAwIDEwcHggMjVweCByZ2JhKDAsIDAsIDAsIDAuNSk7Cn0KCi5mYW5jeWJveC1vdXRlciwgLmZhbmN5Ym94LWlubmVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLmZhbmN5Ym94LWlubmVyIHsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYW5jeWJveC10eXBlLWlmcmFtZSAuZmFuY3lib3gtaW5uZXIgewoJLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwp9CgouZmFuY3lib3gtZXJyb3IgewoJY29sb3I6ICM0NDQ7Cglmb250OiAxNHB4LzIwcHggIkhlbHZldGljYSBOZXVlIixIZWx2ZXRpY2EsQXJpYWwsc2Fucy1zZXJpZjsKCW1hcmdpbjogMDsKCXBhZGRpbmc6IDE1cHg7Cgl3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgouZmFuY3lib3gtaW1hZ2UsIC5mYW5jeWJveC1pZnJhbWUgewoJZGlzcGxheTogYmxvY2s7Cgl3aWR0aDogMTAwJTsKCWhlaWdodDogMTAwJTsKfQoKLmZhbmN5Ym94LWltYWdlIHsKCW1heC13aWR0aDogMTAwJTsKCW1heC1oZWlnaHQ6IDEwMCU7Cn0KCiNmYW5jeWJveC1sb2FkaW5nLCAuZmFuY3lib3gtY2xvc2UsIC5mYW5jeWJveC1wcmV2IHNwYW4sIC5mYW5jeWJveC1uZXh0IHNwYW4gewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKCdmYW5jeWJveF9zcHJpdGUucG5nJyk7Cn0KCiNmYW5jeWJveC1sb2FkaW5nIHsKCXBvc2l0aW9uOiBmaXhlZDsKCXRvcDogNTAlOwoJbGVmdDogNTAlOwoJbWFyZ2luLXRvcDogLTIycHg7CgltYXJnaW4tbGVmdDogLTIycHg7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xMDhweDsKCW9wYWNpdHk6IDAuODsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNjA7Cn0KCiNmYW5jeWJveC1sb2FkaW5nIGRpdiB7Cgl3aWR0aDogNDRweDsKCWhlaWdodDogNDRweDsKCWJhY2tncm91bmQ6IHVybCgnZmFuY3lib3hfbG9hZGluZy5naWYnKSBjZW50ZXIgY2VudGVyIG5vLXJlcGVhdDsKfQoKLmZhbmN5Ym94LWNsb3NlIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogLTE4cHg7CglyaWdodDogLTE4cHg7Cgl3aWR0aDogMzZweDsKCWhlaWdodDogMzZweDsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNDA7Cn0KCi5mYW5jeWJveC1uYXYgewoJcG9zaXRpb246IGFic29sdXRlOwoJdG9wOiAwOwoJd2lkdGg6IDQwJTsKCWhlaWdodDogMTAwJTsKCWN1cnNvcjogcG9pbnRlcjsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWJhY2tncm91bmQ6IHRyYW5zcGFyZW50IHVybCgnYmxhbmsuZ2lmJyk7IC8qIGhlbHBzIElFICovCgktd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7Cgl6LWluZGV4OiA4MDQwOwp9CgouZmFuY3lib3gtcHJldiB7CglsZWZ0OiAwOwp9CgouZmFuY3lib3gtbmV4dCB7CglyaWdodDogMDsKfQoKLmZhbmN5Ym94LW5hdiBzcGFuIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNTAlOwoJd2lkdGg6IDM2cHg7CgloZWlnaHQ6IDM0cHg7CgltYXJnaW4tdG9wOiAtMThweDsKCWN1cnNvcjogcG9pbnRlcjsKCXotaW5kZXg6IDgwNDA7Cgl2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCi5mYW5jeWJveC1wcmV2IHNwYW4gewoJbGVmdDogMTBweDsKCWJhY2tncm91bmQtcG9zaXRpb246IDAgLTM2cHg7Cn0KCi5mYW5jeWJveC1uZXh0IHNwYW4gewoJcmlnaHQ6IDEwcHg7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC03MnB4Owp9CgouZmFuY3lib3gtbmF2OmhvdmVyIHNwYW4gewoJdmlzaWJpbGl0eTogdmlzaWJsZTsKfQoKLmZhbmN5Ym94LXRtcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IC05OTk5OXB4OwoJbGVmdDogLTk5OTk5cHg7Cgl2aXNpYmlsaXR5OiBoaWRkZW47CgltYXgtd2lkdGg6IDk5OTk5cHg7CgltYXgtaGVpZ2h0OiA5OTk5OXB4OwoJb3ZlcmZsb3c6IHZpc2libGUgIWltcG9ydGFudDsKfQoKLyogT3ZlcmxheSBoZWxwZXIgKi8KCi5mYW5jeWJveC1sb2NrIHsKCW92ZXJmbG93OiBoaWRkZW47Cn0KCi5mYW5jeWJveC1vdmVybGF5IHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCWxlZnQ6IDA7CglvdmVyZmxvdzogaGlkZGVuOwoJZGlzcGxheTogbm9uZTsKCXotaW5kZXg6IDgwMTA7CgliYWNrZ3JvdW5kOiB1cmwoJ2ZhbmN5Ym94X292ZXJsYXkucG5nJyk7Cn0KCi5mYW5jeWJveC1vdmVybGF5LWZpeGVkIHsKCXBvc2l0aW9uOiBmaXhlZDsKCWJvdHRvbTogMDsKCXJpZ2h0OiAwOwp9CgouZmFuY3lib3gtbG9jayAuZmFuY3lib3gtb3ZlcmxheSB7CglvdmVyZmxvdzogYXV0bzsKCW92ZXJmbG93LXk6IHNjcm9sbDsKfQoKLyogVGl0bGUgaGVscGVyICovCgouZmFuY3lib3gtdGl0bGUgewoJdmlzaWJpbGl0eTogaGlkZGVuOwoJZm9udDogbm9ybWFsIDEzcHgvMjBweCAiSGVsdmV0aWNhIE5ldWUiLEhlbHZldGljYSxBcmlhbCxzYW5zLXNlcmlmOwoJcG9zaXRpb246IHJlbGF0aXZlOwoJdGV4dC1zaGFkb3c6IG5vbmU7Cgl6LWluZGV4OiA4MDUwOwp9CgouZmFuY3lib3gtb3BlbmVkIC5mYW5jeWJveC10aXRsZSB7Cgl2aXNpYmlsaXR5OiB2aXNpYmxlOwp9CgouZmFuY3lib3gtdGl0bGUtZmxvYXQtd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3R0b206IDA7CglyaWdodDogNTAlOwoJbWFyZ2luLWJvdHRvbTogLTM1cHg7Cgl6LWluZGV4OiA4MDUwOwoJdGV4dC1hbGlnbjogY2VudGVyOwp9CgouZmFuY3lib3gtdGl0bGUtZmxvYXQtd3JhcCAuY2hpbGQgewoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJbWFyZ2luLXJpZ2h0OiAtMTAwJTsKCXBhZGRpbmc6IDJweCAyMHB4OwoJYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IC8qIEZhbGxiYWNrIGZvciB3ZWIgYnJvd3NlcnMgdGhhdCBkb2Vzbid0IHN1cHBvcnQgUkdCYSAqLwoJYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjgpOwoJLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAxNXB4OwoJICAgLW1vei1ib3JkZXItcmFkaXVzOiAxNXB4OwoJICAgICAgICBib3JkZXItcmFkaXVzOiAxNXB4OwoJdGV4dC1zaGFkb3c6IDAgMXB4IDJweCAjMjIyOwoJY29sb3I6ICNGRkY7Cglmb250LXdlaWdodDogYm9sZDsKCWxpbmUtaGVpZ2h0OiAyNHB4OwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLmZhbmN5Ym94LXRpdGxlLW91dHNpZGUtd3JhcCB7Cglwb3NpdGlvbjogcmVsYXRpdmU7CgltYXJnaW4tdG9wOiAxMHB4OwoJY29sb3I6ICNmZmY7Cn0KCi5mYW5jeWJveC10aXRsZS1pbnNpZGUtd3JhcCB7CglwYWRkaW5nLXRvcDogMTBweDsKfQoKLmZhbmN5Ym94LXRpdGxlLW92ZXItd3JhcCB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cglib3R0b206IDA7CglsZWZ0OiAwOwoJY29sb3I6ICNmZmY7CglwYWRkaW5nOiAxMHB4OwoJYmFja2dyb3VuZDogIzAwMDsKCWJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgLjgpOwp9]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGZhbmN5Qm94IC0galF1ZXJ5IFBsdWdpbgogKiB2ZXJzaW9uOiAyLjEuMyAoVHVlLCAyMyBPY3QgMjAxMikKICogQHJlcXVpcmVzIGpRdWVyeSB2MS42IG9yIGxhdGVyCiAqCiAqIEV4YW1wbGVzIGF0IGh0dHA6Ly9mYW5jeWFwcHMuY29tL2ZhbmN5Ym94LwogKiBMaWNlbnNlOiB3d3cuZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZQogKgogKiBDb3B5cmlnaHQgMjAxMiBKYW5pcyBTa2FybmVsaXMgLSBqYW5pc0BmYW5jeWFwcHMuY29tCiAqCiAqLwoKKGZ1bmN0aW9uICh3aW5kb3csIGRvY3VtZW50LCAkLCB1bmRlZmluZWQpIHsKCSJ1c2Ugc3RyaWN0IjsKCgl2YXIgVyA9ICQod2luZG93KSwKCQlEID0gJChkb2N1bWVudCksCgkJRiA9ICQuZmFuY3lib3ggPSBmdW5jdGlvbiAoKSB7CgkJCUYub3Blbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSwKCQlkaWRVcGRhdGUgPSBudWxsLAoJCWlzVG91Y2gJICA9IGRvY3VtZW50LmNyZWF0ZVRvdWNoICE9PSB1bmRlZmluZWQsCgoJCWlzUXVlcnkJPSBmdW5jdGlvbihvYmopIHsKCQkJcmV0dXJuIG9iaiAmJiBvYmouaGFzT3duUHJvcGVydHkgJiYgb2JqIGluc3RhbmNlb2YgJDsKCQl9LAoJCWlzU3RyaW5nID0gZnVuY3Rpb24oc3RyKSB7CgkJCXJldHVybiBzdHIgJiYgJC50eXBlKHN0cikgPT09ICJzdHJpbmciOwoJCX0sCgkJaXNQZXJjZW50YWdlID0gZnVuY3Rpb24oc3RyKSB7CgkJCXJldHVybiBpc1N0cmluZyhzdHIpICYmIHN0ci5pbmRleE9mKCclJykgPiAwOwoJCX0sCgkJaXNTY3JvbGxhYmxlID0gZnVuY3Rpb24oZWwpIHsKCQkJcmV0dXJuIChlbCAmJiAhKGVsLnN0eWxlLm92ZXJmbG93ICYmIGVsLnN0eWxlLm92ZXJmbG93ID09PSAnaGlkZGVuJykgJiYgKChlbC5jbGllbnRXaWR0aCAmJiBlbC5zY3JvbGxXaWR0aCA+IGVsLmNsaWVudFdpZHRoKSB8fCAoZWwuY2xpZW50SGVpZ2h0ICYmIGVsLnNjcm9sbEhlaWdodCA+IGVsLmNsaWVudEhlaWdodCkpKTsKCQl9LAoJCWdldFNjYWxhciA9IGZ1bmN0aW9uKG9yaWcsIGRpbSkgewoJCQl2YXIgdmFsdWUgPSBwYXJzZUludChvcmlnLCAxMCkgfHwgMDsKCgkJCWlmIChkaW0gJiYgaXNQZXJjZW50YWdlKG9yaWcpKSB7CgkJCQl2YWx1ZSA9IEYuZ2V0Vmlld3BvcnQoKVsgZGltIF0gLyAxMDAgKiB2YWx1ZTsKCQkJfQoKCQkJcmV0dXJuIE1hdGguY2VpbCh2YWx1ZSk7CgkJfSwKCQlnZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlLCBkaW0pIHsKCQkJcmV0dXJuIGdldFNjYWxhcih2YWx1ZSwgZGltKSArICdweCc7CgkJfTsKCgkkLmV4dGVuZChGLCB7CgkJLy8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBmYW5jeUJveAoJCXZlcnNpb246ICcyLjEuMycsCgoJCWRlZmF1bHRzOiB7CgkJCXBhZGRpbmcgOiAxNSwKCQkJbWFyZ2luICA6IDIwLAoKCQkJd2lkdGggICAgIDogODAwLAoJCQloZWlnaHQgICAgOiA2MDAsCgkJCW1pbldpZHRoICA6IDEwMCwKCQkJbWluSGVpZ2h0IDogMTAwLAoJCQltYXhXaWR0aCAgOiA5OTk5LAoJCQltYXhIZWlnaHQgOiA5OTk5LAoKCQkJYXV0b1NpemUgICA6IHRydWUsCgkJCWF1dG9IZWlnaHQgOiBmYWxzZSwKCQkJYXV0b1dpZHRoICA6IGZhbHNlLAoKCQkJYXV0b1Jlc2l6ZSAgOiB0cnVlLAoJCQlhdXRvQ2VudGVyICA6ICFpc1RvdWNoLAoJCQlmaXRUb1ZpZXcgICA6IHRydWUsCgkJCWFzcGVjdFJhdGlvIDogZmFsc2UsCgkJCXRvcFJhdGlvICAgIDogMC41LAoJCQlsZWZ0UmF0aW8gICA6IDAuNSwKCgkJCXNjcm9sbGluZyA6ICdhdXRvJywgLy8gJ2F1dG8nLCAneWVzJyBvciAnbm8nCgkJCXdyYXBDU1MgICA6ICcnLAoKCQkJYXJyb3dzICAgICA6IHRydWUsCgkJCWNsb3NlQnRuICAgOiB0cnVlLAoJCQljbG9zZUNsaWNrIDogZmFsc2UsCgkJCW5leHRDbGljayAgOiBmYWxzZSwKCQkJbW91c2VXaGVlbCA6IHRydWUsCgkJCWF1dG9QbGF5ICAgOiBmYWxzZSwKCQkJcGxheVNwZWVkICA6IDMwMDAsCgkJCXByZWxvYWQgICAgOiAzLAoJCQltb2RhbCAgICAgIDogZmFsc2UsCgkJCWxvb3AgICAgICAgOiB0cnVlLAoKCQkJYWpheCAgOiB7CgkJCQlkYXRhVHlwZSA6ICdodG1sJywKCQkJCWhlYWRlcnMgIDogeyAnWC1mYW5jeUJveCc6IHRydWUgfQoJCQl9LAoJCQlpZnJhbWUgOiB7CgkJCQlzY3JvbGxpbmcgOiAnYXV0bycsCgkJCQlwcmVsb2FkICAgOiB0cnVlCgkJCX0sCgkJCXN3ZiA6IHsKCQkJCXdtb2RlOiAndHJhbnNwYXJlbnQnLAoJCQkJYWxsb3dmdWxsc2NyZWVuICAgOiAndHJ1ZScsCgkJCQlhbGxvd3NjcmlwdGFjY2VzcyA6ICdhbHdheXMnCgkJCX0sCgoJCQlrZXlzICA6IHsKCQkJCW5leHQgOiB7CgkJCQkJMTMgOiAnbGVmdCcsIC8vIGVudGVyCgkJCQkJMzQgOiAndXAnLCAgIC8vIHBhZ2UgZG93bgoJCQkJCTM5IDogJ2xlZnQnLCAvLyByaWdodCBhcnJvdwoJCQkJCTQwIDogJ3VwJyAgICAvLyBkb3duIGFycm93CgkJCQl9LAoJCQkJcHJldiA6IHsKCQkJCQk4ICA6ICdyaWdodCcsICAvLyBiYWNrc3BhY2UKCQkJCQkzMyA6ICdkb3duJywgICAvLyBwYWdlIHVwCgkJCQkJMzcgOiAncmlnaHQnLCAgLy8gbGVmdCBhcnJvdwoJCQkJCTM4IDogJ2Rvd24nICAgIC8vIHVwIGFycm93CgkJCQl9LAoJCQkJY2xvc2UgIDogWzI3XSwgLy8gZXNjYXBlIGtleQoJCQkJcGxheSAgIDogWzMyXSwgLy8gc3BhY2UgLSBzdGFydC9zdG9wIHNsaWRlc2hvdwoJCQkJdG9nZ2xlIDogWzcwXSAgLy8gbGV0dGVyICJmIiAtIHRvZ2dsZSBmdWxsc2NyZWVuCgkJCX0sCgoJCQlkaXJlY3Rpb24gOiB7CgkJCQluZXh0IDogJ2xlZnQnLAoJCQkJcHJldiA6ICdyaWdodCcKCQkJfSwKCgkJCXNjcm9sbE91dHNpZGUgIDogdHJ1ZSwKCgkJCS8vIE92ZXJyaWRlIHNvbWUgcHJvcGVydGllcwoJCQlpbmRleCAgIDogMCwKCQkJdHlwZSAgICA6IG51bGwsCgkJCWhyZWYgICAgOiBudWxsLAoJCQljb250ZW50IDogbnVsbCwKCQkJdGl0bGUgICA6IG51bGwsCgoJCQkvLyBIVE1MIHRlbXBsYXRlcwoJCQl0cGw6IHsKCQkJCXdyYXAgICAgIDogJzxkaXYgY2xhc3M9ImZhbmN5Ym94LXdyYXAiIHRhYkluZGV4PSItMSI+PGRpdiBjbGFzcz0iZmFuY3lib3gtc2tpbiI+PGRpdiBjbGFzcz0iZmFuY3lib3gtb3V0ZXIiPjxkaXYgY2xhc3M9ImZhbmN5Ym94LWlubmVyIj48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nLAoJCQkJaW1hZ2UgICAgOiAnPGltZyBjbGFzcz0iZmFuY3lib3gtaW1hZ2UiIHNyYz0ie2hyZWZ9IiBhbHQ9IiIgLz4nLAoJCQkJaWZyYW1lICAgOiAnPGlmcmFtZSBpZD0iZmFuY3lib3gtZnJhbWV7cm5kfSIgbmFtZT0iZmFuY3lib3gtZnJhbWV7cm5kfSIgY2xhc3M9ImZhbmN5Ym94LWlmcmFtZSIgZnJhbWVib3JkZXI9IjAiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiB3ZWJraXRBbGxvd0Z1bGxTY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93RnVsbFNjcmVlbicgKyAoJC5icm93c2VyLm1zaWUgPyAnIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIicgOiAnJykgKyAnPjwvaWZyYW1lPicsCgkJCQllcnJvciAgICA6ICc8cCBjbGFzcz0iZmFuY3lib3gtZXJyb3IiPlRoZSByZXF1ZXN0ZWQgY29udGVudCBjYW5ub3QgYmUgbG9hZGVkLjxici8+UGxlYXNlIHRyeSBhZ2FpbiBsYXRlci48L3A+JywKCQkJCWNsb3NlQnRuIDogJzxhIHRpdGxlPSJDbG9zZSIgY2xhc3M9ImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtY2xvc2UiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPicsCgkJCQluZXh0ICAgICA6ICc8YSB0aXRsZT0iTmV4dCIgY2xhc3M9ImZhbmN5Ym94LW5hdiBmYW5jeWJveC1uZXh0IiBocmVmPSJqYXZhc2NyaXB0OjsiPjxzcGFuPjwvc3Bhbj48L2E+JywKCQkJCXByZXYgICAgIDogJzxhIHRpdGxlPSJQcmV2aW91cyIgY2xhc3M9ImZhbmN5Ym94LW5hdiBmYW5jeWJveC1wcmV2IiBocmVmPSJqYXZhc2NyaXB0OjsiPjxzcGFuPjwvc3Bhbj48L2E+JwoJCQl9LAoKCQkJLy8gUHJvcGVydGllcyBmb3IgZWFjaCBhbmltYXRpb24gdHlwZQoJCQkvLyBPcGVuaW5nIGZhbmN5Qm94CgkJCW9wZW5FZmZlY3QgIDogJ2ZhZGUnLCAvLyAnZWxhc3RpYycsICdmYWRlJyBvciAnbm9uZScKCQkJb3BlblNwZWVkICAgOiAyNTAsCgkJCW9wZW5FYXNpbmcgIDogJ3N3aW5nJywKCQkJb3Blbk9wYWNpdHkgOiB0cnVlLAoJCQlvcGVuTWV0aG9kICA6ICd6b29tSW4nLAoKCQkJLy8gQ2xvc2luZyBmYW5jeUJveAoJCQljbG9zZUVmZmVjdCAgOiAnZmFkZScsIC8vICdlbGFzdGljJywgJ2ZhZGUnIG9yICdub25lJwoJCQljbG9zZVNwZWVkICAgOiAyNTAsCgkJCWNsb3NlRWFzaW5nICA6ICdzd2luZycsCgkJCWNsb3NlT3BhY2l0eSA6IHRydWUsCgkJCWNsb3NlTWV0aG9kICA6ICd6b29tT3V0JywKCgkJCS8vIENoYW5naW5nIG5leHQgZ2FsbGVyeSBpdGVtCgkJCW5leHRFZmZlY3QgOiAnZWxhc3RpYycsIC8vICdlbGFzdGljJywgJ2ZhZGUnIG9yICdub25lJwoJCQluZXh0U3BlZWQgIDogMjUwLAoJCQluZXh0RWFzaW5nIDogJ3N3aW5nJywKCQkJbmV4dE1ldGhvZCA6ICdjaGFuZ2VJbicsCgoJCQkvLyBDaGFuZ2luZyBwcmV2aW91cyBnYWxsZXJ5IGl0ZW0KCQkJcHJldkVmZmVjdCA6ICdlbGFzdGljJywgLy8gJ2VsYXN0aWMnLCAnZmFkZScgb3IgJ25vbmUnCgkJCXByZXZTcGVlZCAgOiAyNTAsCgkJCXByZXZFYXNpbmcgOiAnc3dpbmcnLAoJCQlwcmV2TWV0aG9kIDogJ2NoYW5nZU91dCcsCgoJCQkvLyBFbmFibGUgZGVmYXVsdCBoZWxwZXJzCgkJCWhlbHBlcnMgOiB7CgkJCQlvdmVybGF5IDogdHJ1ZSwKCQkJCXRpdGxlICAgOiB0cnVlCgkJCX0sCgoJCQkvLyBDYWxsYmFja3MKCQkJb25DYW5jZWwgICAgIDogJC5ub29wLCAvLyBJZiBjYW5jZWxpbmcKCQkJYmVmb3JlTG9hZCAgIDogJC5ub29wLCAvLyBCZWZvcmUgbG9hZGluZwoJCQlhZnRlckxvYWQgICAgOiAkLm5vb3AsIC8vIEFmdGVyIGxvYWRpbmcKCQkJYmVmb3JlU2hvdyAgIDogJC5ub29wLCAvLyBCZWZvcmUgY2hhbmdpbmcgaW4gY3VycmVudCBpdGVtCgkJCWFmdGVyU2hvdyAgICA6ICQubm9vcCwgLy8gQWZ0ZXIgb3BlbmluZwoJCQliZWZvcmVDaGFuZ2UgOiAkLm5vb3AsIC8vIEJlZm9yZSBjaGFuZ2luZyBnYWxsZXJ5IGl0ZW0KCQkJYmVmb3JlQ2xvc2UgIDogJC5ub29wLCAvLyBCZWZvcmUgY2xvc2luZwoJCQlhZnRlckNsb3NlICAgOiAkLm5vb3AgIC8vIEFmdGVyIGNsb3NpbmcKCQl9LAoKCQkvL0N1cnJlbnQgc3RhdGUKCQlncm91cCAgICA6IHt9LCAvLyBTZWxlY3RlZCBncm91cAoJCW9wdHMgICAgIDoge30sIC8vIEdyb3VwIG9wdGlvbnMKCQlwcmV2aW91cyA6IG51bGwsICAvLyBQcmV2aW91cyBlbGVtZW50CgkJY29taW5nICAgOiBudWxsLCAgLy8gRWxlbWVudCBiZWluZyBsb2FkZWQKCQljdXJyZW50ICA6IG51bGwsICAvLyBDdXJyZW50bHkgbG9hZGVkIGVsZW1lbnQKCQlpc0FjdGl2ZSA6IGZhbHNlLCAvLyBJcyBhY3RpdmF0ZWQKCQlpc09wZW4gICA6IGZhbHNlLCAvLyBJcyBjdXJyZW50bHkgb3BlbgoJCWlzT3BlbmVkIDogZmFsc2UsIC8vIEhhdmUgYmVlbiBmdWxseSBvcGVuZWQgYXQgbGVhc3Qgb25jZQoKCQl3cmFwICA6IG51bGwsCgkJc2tpbiAgOiBudWxsLAoJCW91dGVyIDogbnVsbCwKCQlpbm5lciA6IG51bGwsCgoJCXBsYXllciA6IHsKCQkJdGltZXIgICAgOiBudWxsLAoJCQlpc0FjdGl2ZSA6IGZhbHNlCgkJfSwKCgkJLy8gTG9hZGVycwoJCWFqYXhMb2FkICAgOiBudWxsLAoJCWltZ1ByZWxvYWQgOiBudWxsLAoKCQkvLyBTb21lIGNvbGxlY3Rpb25zCgkJdHJhbnNpdGlvbnMgOiB7fSwKCQloZWxwZXJzICAgICA6IHt9LAoKCQkvKgoJCSAqCVN0YXRpYyBtZXRob2RzCgkJICovCgoJCW9wZW46IGZ1bmN0aW9uIChncm91cCwgb3B0cykgewoJCQlpZiAoIWdyb3VwKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmICghJC5pc1BsYWluT2JqZWN0KG9wdHMpKSB7CgkJCQlvcHRzID0ge307CgkJCX0KCgkJCS8vIENsb3NlIGlmIGFscmVhZHkgYWN0aXZlCgkJCWlmIChmYWxzZSA9PT0gRi5jbG9zZSh0cnVlKSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBOb3JtYWxpemUgZ3JvdXAKCQkJaWYgKCEkLmlzQXJyYXkoZ3JvdXApKSB7CgkJCQlncm91cCA9IGlzUXVlcnkoZ3JvdXApID8gJChncm91cCkuZ2V0KCkgOiBbZ3JvdXBdOwoJCQl9CgoJCQkvLyBSZWNoZWNrIGlmIHRoZSB0eXBlIG9mIGVhY2ggZWxlbWVudCBpcyBgb2JqZWN0YCBhbmQgc2V0IGNvbnRlbnQgdHlwZSAoaW1hZ2UsIGFqYXgsIGV0YykKCQkJJC5lYWNoKGdyb3VwLCBmdW5jdGlvbihpLCBlbGVtZW50KSB7CgkJCQl2YXIgb2JqID0ge30sCgkJCQkJaHJlZiwKCQkJCQl0aXRsZSwKCQkJCQljb250ZW50LAoJCQkJCXR5cGUsCgkJCQkJcmV6LAoJCQkJCWhyZWZQYXJ0cywKCQkJCQlzZWxlY3RvcjsKCgkJCQlpZiAoJC50eXBlKGVsZW1lbnQpID09PSAib2JqZWN0IikgewoJCQkJCS8vIENoZWNrIGlmIGlzIERPTSBlbGVtZW50CgkJCQkJaWYgKGVsZW1lbnQubm9kZVR5cGUpIHsKCQkJCQkJZWxlbWVudCA9ICQoZWxlbWVudCk7CgkJCQkJfQoKCQkJCQlpZiAoaXNRdWVyeShlbGVtZW50KSkgewoJCQkJCQlvYmogPSB7CgkJCQkJCQlocmVmICAgIDogZWxlbWVudC5kYXRhKCdmYW5jeWJveC1ocmVmJykgfHwgZWxlbWVudC5hdHRyKCdocmVmJyksCgkJCQkJCQl0aXRsZSAgIDogZWxlbWVudC5kYXRhKCdmYW5jeWJveC10aXRsZScpIHx8IGVsZW1lbnQuYXR0cigndGl0bGUnKSwKCQkJCQkJCWlzRG9tICAgOiB0cnVlLAoJCQkJCQkJZWxlbWVudCA6IGVsZW1lbnQKCQkJCQkJfTsKCgkJCQkJCWlmICgkLm1ldGFkYXRhKSB7CgkJCQkJCQkkLmV4dGVuZCh0cnVlLCBvYmosIGVsZW1lbnQubWV0YWRhdGEoKSk7CgkJCQkJCX0KCgkJCQkJfSBlbHNlIHsKCQkJCQkJb2JqID0gZWxlbWVudDsKCQkJCQl9CgkJCQl9CgoJCQkJaHJlZiAgPSBvcHRzLmhyZWYgIHx8IG9iai5ocmVmIHx8IChpc1N0cmluZyhlbGVtZW50KSA/IGVsZW1lbnQgOiBudWxsKTsKCQkJCXRpdGxlID0gb3B0cy50aXRsZSAhPT0gdW5kZWZpbmVkID8gb3B0cy50aXRsZSA6IG9iai50aXRsZSB8fCAnJzsKCgkJCQljb250ZW50ID0gb3B0cy5jb250ZW50IHx8IG9iai5jb250ZW50OwoJCQkJdHlwZSAgICA9IGNvbnRlbnQgPyAnaHRtbCcgOiAob3B0cy50eXBlICB8fCBvYmoudHlwZSk7CgoJCQkJaWYgKCF0eXBlICYmIG9iai5pc0RvbSkgewoJCQkJCXR5cGUgPSBlbGVtZW50LmRhdGEoJ2ZhbmN5Ym94LXR5cGUnKTsKCgkJCQkJaWYgKCF0eXBlKSB7CgkJCQkJCXJleiAgPSBlbGVtZW50LnByb3AoJ2NsYXNzJykubWF0Y2goL2ZhbmN5Ym94XC4oXHcrKS8pOwoJCQkJCQl0eXBlID0gcmV6ID8gcmV6WzFdIDogbnVsbDsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKGlzU3RyaW5nKGhyZWYpKSB7CgkJCQkJLy8gVHJ5IHRvIGd1ZXNzIHRoZSBjb250ZW50IHR5cGUKCQkJCQlpZiAoIXR5cGUpIHsKCQkJCQkJaWYgKEYuaXNJbWFnZShocmVmKSkgewoJCQkJCQkJdHlwZSA9ICdpbWFnZSc7CgoJCQkJCQl9IGVsc2UgaWYgKEYuaXNTV0YoaHJlZikpIHsKCQkJCQkJCXR5cGUgPSAnc3dmJzsKCgkJCQkJCX0gZWxzZSBpZiAoaHJlZi5jaGFyQXQoMCkgPT09ICcjJykgewoJCQkJCQkJdHlwZSA9ICdpbmxpbmUnOwoKCQkJCQkJfSBlbHNlIGlmIChpc1N0cmluZyhlbGVtZW50KSkgewoJCQkJCQkJdHlwZSAgICA9ICdodG1sJzsKCQkJCQkJCWNvbnRlbnQgPSBlbGVtZW50OwoJCQkJCQl9CgkJCQkJfQoKCQkJCQkvLyBTcGxpdCB1cmwgaW50byB0d28gcGllY2VzIHdpdGggc291cmNlIHVybCBhbmQgY29udGVudCBzZWxlY3RvciwgZS5nLAoJCQkJCS8vICIvbXlwYWdlLmh0bWwgI215X2lkIiB3aWxsIGxvYWQgIi9teXBhZ2UuaHRtbCIgYW5kIGRpc3BsYXkgZWxlbWVudCBoYXZpbmcgaWQgIm15X2lkIgoJCQkJCWlmICh0eXBlID09PSAnYWpheCcpIHsKCQkJCQkJaHJlZlBhcnRzID0gaHJlZi5zcGxpdCgvXHMrLywgMik7CgkJCQkJCWhyZWYgICAgICA9IGhyZWZQYXJ0cy5zaGlmdCgpOwoJCQkJCQlzZWxlY3RvciAgPSBocmVmUGFydHMuc2hpZnQoKTsKCQkJCQl9CgkJCQl9CgoJCQkJaWYgKCFjb250ZW50KSB7CgkJCQkJaWYgKHR5cGUgPT09ICdpbmxpbmUnKSB7CgkJCQkJCWlmIChocmVmKSB7CgkJCQkJCQljb250ZW50ID0gJCggaXNTdHJpbmcoaHJlZikgPyBocmVmLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywgJycpIDogaHJlZiApOyAvL3N0cmlwIGZvciBpZTcKCgkJCQkJCX0gZWxzZSBpZiAob2JqLmlzRG9tKSB7CgkJCQkJCQljb250ZW50ID0gZWxlbWVudDsKCQkJCQkJfQoKCQkJCQl9IGVsc2UgaWYgKHR5cGUgPT09ICdodG1sJykgewoJCQkJCQljb250ZW50ID0gaHJlZjsKCgkJCQkJfSBlbHNlIGlmICghdHlwZSAmJiAhaHJlZiAmJiBvYmouaXNEb20pIHsKCQkJCQkJdHlwZSAgICA9ICdpbmxpbmUnOwoJCQkJCQljb250ZW50ID0gZWxlbWVudDsKCQkJCQl9CgkJCQl9CgoJCQkJJC5leHRlbmQob2JqLCB7CgkJCQkJaHJlZiAgICAgOiBocmVmLAoJCQkJCXR5cGUgICAgIDogdHlwZSwKCQkJCQljb250ZW50ICA6IGNvbnRlbnQsCgkJCQkJdGl0bGUgICAgOiB0aXRsZSwKCQkJCQlzZWxlY3RvciA6IHNlbGVjdG9yCgkJCQl9KTsKCgkJCQlncm91cFsgaSBdID0gb2JqOwoJCQl9KTsKCgkJCS8vIEV4dGVuZCB0aGUgZGVmYXVsdHMKCQkJRi5vcHRzID0gJC5leHRlbmQodHJ1ZSwge30sIEYuZGVmYXVsdHMsIG9wdHMpOwoKCQkJLy8gQWxsIG9wdGlvbnMgYXJlIG1lcmdlZCByZWN1cnNpdmUgZXhjZXB0IGtleXMKCQkJaWYgKG9wdHMua2V5cyAhPT0gdW5kZWZpbmVkKSB7CgkJCQlGLm9wdHMua2V5cyA9IG9wdHMua2V5cyA/ICQuZXh0ZW5kKHt9LCBGLmRlZmF1bHRzLmtleXMsIG9wdHMua2V5cykgOiBmYWxzZTsKCQkJfQoKCQkJRi5ncm91cCA9IGdyb3VwOwoKCQkJcmV0dXJuIEYuX3N0YXJ0KEYub3B0cy5pbmRleCk7CgkJfSwKCgkJLy8gQ2FuY2VsIGltYWdlIGxvYWRpbmcgb3IgYWJvcnQgYWpheCByZXF1ZXN0CgkJY2FuY2VsOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjb21pbmcgPSBGLmNvbWluZzsKCgkJCWlmICghY29taW5nIHx8IGZhbHNlID09PSBGLnRyaWdnZXIoJ29uQ2FuY2VsJykpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJRi5oaWRlTG9hZGluZygpOwoKCQkJaWYgKEYuYWpheExvYWQpIHsKCQkJCUYuYWpheExvYWQuYWJvcnQoKTsKCQkJfQoKCQkJRi5hamF4TG9hZCA9IG51bGw7CgoJCQlpZiAoRi5pbWdQcmVsb2FkKSB7CgkJCQlGLmltZ1ByZWxvYWQub25sb2FkID0gRi5pbWdQcmVsb2FkLm9uZXJyb3IgPSBudWxsOwoJCQl9CgoJCQlpZiAoY29taW5nLndyYXApIHsKCQkJCWNvbWluZy53cmFwLnN0b3AodHJ1ZSwgdHJ1ZSkudHJpZ2dlcignb25SZXNldCcpLnJlbW92ZSgpOwoJCQl9CgoJCQlGLmNvbWluZyA9IG51bGw7CgoJCQkvLyBJZiB0aGUgZmlyc3QgaXRlbSBoYXMgYmVlbiBjYW5jZWxlZCwgdGhlbiBjbGVhciBldmVyeXRoaW5nCgkJCWlmICghRi5jdXJyZW50KSB7CgkJCQlGLl9hZnRlclpvb21PdXQoIGNvbWluZyApOwoJCQl9CgkJfSwKCgkJLy8gU3RhcnQgY2xvc2luZyBhbmltYXRpb24gaWYgaXMgb3BlbjsgcmVtb3ZlIGltbWVkaWF0ZWx5IGlmIG9wZW5pbmcvY2xvc2luZwoJCWNsb3NlOiBmdW5jdGlvbiAoZXZlbnQpIHsKCQkJRi5jYW5jZWwoKTsKCgkJCWlmIChmYWxzZSA9PT0gRi50cmlnZ2VyKCdiZWZvcmVDbG9zZScpKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCUYudW5iaW5kRXZlbnRzKCk7CgoJCQlpZiAoIUYuaXNBY3RpdmUpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCFGLmlzT3BlbiB8fCBldmVudCA9PT0gdHJ1ZSkgewoJCQkJJCgnLmZhbmN5Ym94LXdyYXAnKS5zdG9wKHRydWUpLnRyaWdnZXIoJ29uUmVzZXQnKS5yZW1vdmUoKTsKCgkJCQlGLl9hZnRlclpvb21PdXQoKTsKCgkJCX0gZWxzZSB7CgkJCQlGLmlzT3BlbiA9IEYuaXNPcGVuZWQgPSBmYWxzZTsKCQkJCUYuaXNDbG9zaW5nID0gdHJ1ZTsKCgkJCQkkKCcuZmFuY3lib3gtaXRlbSwgLmZhbmN5Ym94LW5hdicpLnJlbW92ZSgpOwoKCQkJCUYud3JhcC5zdG9wKHRydWUsIHRydWUpLnJlbW92ZUNsYXNzKCdmYW5jeWJveC1vcGVuZWQnKTsKCgkJCQlGLnRyYW5zaXRpb25zWyBGLmN1cnJlbnQuY2xvc2VNZXRob2QgXSgpOwoJCQl9CgkJfSwKCgkJLy8gTWFuYWdlIHNsaWRlc2hvdzoKCQkvLyAgICQuZmFuY3lib3gucGxheSgpOyAtIHRvZ2dsZSBzbGlkZXNob3cKCQkvLyAgICQuZmFuY3lib3gucGxheSggdHJ1ZSApOyAtIHN0YXJ0CgkJLy8gICAkLmZhbmN5Ym94LnBsYXkoIGZhbHNlICk7IC0gc3RvcAoJCXBsYXk6IGZ1bmN0aW9uICggYWN0aW9uICkgewoJCQl2YXIgY2xlYXIgPSBmdW5jdGlvbiAoKSB7CgkJCQkJY2xlYXJUaW1lb3V0KEYucGxheWVyLnRpbWVyKTsKCQkJCX0sCgkJCQlzZXQgPSBmdW5jdGlvbiAoKSB7CgkJCQkJY2xlYXIoKTsKCgkJCQkJaWYgKEYuY3VycmVudCAmJiBGLnBsYXllci5pc0FjdGl2ZSkgewoJCQkJCQlGLnBsYXllci50aW1lciA9IHNldFRpbWVvdXQoRi5uZXh0LCBGLmN1cnJlbnQucGxheVNwZWVkKTsKCQkJCQl9CgkJCQl9LAoJCQkJc3RvcCA9IGZ1bmN0aW9uICgpIHsKCQkJCQljbGVhcigpOwoKCQkJCQkkKCdib2R5JykudW5iaW5kKCcucGxheWVyJyk7CgoJCQkJCUYucGxheWVyLmlzQWN0aXZlID0gZmFsc2U7CgoJCQkJCUYudHJpZ2dlcignb25QbGF5RW5kJyk7CgkJCQl9LAoJCQkJc3RhcnQgPSBmdW5jdGlvbiAoKSB7CgkJCQkJaWYgKEYuY3VycmVudCAmJiAoRi5jdXJyZW50Lmxvb3AgfHwgRi5jdXJyZW50LmluZGV4IDwgRi5ncm91cC5sZW5ndGggLSAxKSkgewoJCQkJCQlGLnBsYXllci5pc0FjdGl2ZSA9IHRydWU7CgoJCQkJCQkkKCdib2R5JykuYmluZCh7CgkJCQkJCQknYWZ0ZXJTaG93LnBsYXllciBvblVwZGF0ZS5wbGF5ZXInICAgOiBzZXQsCgkJCQkJCQknb25DYW5jZWwucGxheWVyIGJlZm9yZUNsb3NlLnBsYXllcicgOiBzdG9wLAoJCQkJCQkJJ2JlZm9yZUxvYWQucGxheWVyJyA6IGNsZWFyCgkJCQkJCX0pOwoKCQkJCQkJc2V0KCk7CgoJCQkJCQlGLnRyaWdnZXIoJ29uUGxheVN0YXJ0Jyk7CgkJCQkJfQoJCQkJfTsKCgkJCWlmIChhY3Rpb24gPT09IHRydWUgfHwgKCFGLnBsYXllci5pc0FjdGl2ZSAmJiBhY3Rpb24gIT09IGZhbHNlKSkgewoJCQkJc3RhcnQoKTsKCQkJfSBlbHNlIHsKCQkJCXN0b3AoKTsKCQkJfQoJCX0sCgoJCS8vIE5hdmlnYXRlIHRvIG5leHQgZ2FsbGVyeSBpdGVtCgkJbmV4dDogZnVuY3Rpb24gKCBkaXJlY3Rpb24gKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50OwoKCQkJaWYgKGN1cnJlbnQpIHsKCQkJCWlmICghaXNTdHJpbmcoZGlyZWN0aW9uKSkgewoJCQkJCWRpcmVjdGlvbiA9IGN1cnJlbnQuZGlyZWN0aW9uLm5leHQ7CgkJCQl9CgoJCQkJRi5qdW1wdG8oY3VycmVudC5pbmRleCArIDEsIGRpcmVjdGlvbiwgJ25leHQnKTsKCQkJfQoJCX0sCgoJCS8vIE5hdmlnYXRlIHRvIHByZXZpb3VzIGdhbGxlcnkgaXRlbQoJCXByZXY6IGZ1bmN0aW9uICggZGlyZWN0aW9uICkgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudDsKCgkJCWlmIChjdXJyZW50KSB7CgkJCQlpZiAoIWlzU3RyaW5nKGRpcmVjdGlvbikpIHsKCQkJCQlkaXJlY3Rpb24gPSBjdXJyZW50LmRpcmVjdGlvbi5wcmV2OwoJCQkJfQoKCQkJCUYuanVtcHRvKGN1cnJlbnQuaW5kZXggLSAxLCBkaXJlY3Rpb24sICdwcmV2Jyk7CgkJCX0KCQl9LAoKCQkvLyBOYXZpZ2F0ZSB0byBnYWxsZXJ5IGl0ZW0gYnkgaW5kZXgKCQlqdW1wdG86IGZ1bmN0aW9uICggaW5kZXgsIGRpcmVjdGlvbiwgcm91dGVyICkgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudDsKCgkJCWlmICghY3VycmVudCkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpbmRleCA9IGdldFNjYWxhcihpbmRleCk7CgoJCQlGLmRpcmVjdGlvbiA9IGRpcmVjdGlvbiB8fCBjdXJyZW50LmRpcmVjdGlvblsgKGluZGV4ID49IGN1cnJlbnQuaW5kZXggPyAnbmV4dCcgOiAncHJldicpIF07CgkJCUYucm91dGVyICAgID0gcm91dGVyIHx8ICdqdW1wdG8nOwoKCQkJaWYgKGN1cnJlbnQubG9vcCkgewoJCQkJaWYgKGluZGV4IDwgMCkgewoJCQkJCWluZGV4ID0gY3VycmVudC5ncm91cC5sZW5ndGggKyAoaW5kZXggJSBjdXJyZW50Lmdyb3VwLmxlbmd0aCk7CgkJCQl9CgoJCQkJaW5kZXggPSBpbmRleCAlIGN1cnJlbnQuZ3JvdXAubGVuZ3RoOwoJCQl9CgoJCQlpZiAoY3VycmVudC5ncm91cFsgaW5kZXggXSAhPT0gdW5kZWZpbmVkKSB7CgkJCQlGLmNhbmNlbCgpOwoKCQkJCUYuX3N0YXJ0KGluZGV4KTsKCQkJfQoJCX0sCgoJCS8vIENlbnRlciBpbnNpZGUgdmlld3BvcnQgYW5kIHRvZ2dsZSBwb3NpdGlvbiB0eXBlIHRvIGZpeGVkIG9yIGFic29sdXRlIGlmIG5lZWRlZAoJCXJlcG9zaXRpb246IGZ1bmN0aW9uIChlLCBvbmx5QWJzb2x1dGUpIHsKCQkJdmFyIGN1cnJlbnQgPSBGLmN1cnJlbnQsCgkJCQl3cmFwICAgID0gY3VycmVudCA/IGN1cnJlbnQud3JhcCA6IG51bGwsCgkJCQlwb3M7CgoJCQlpZiAod3JhcCkgewoJCQkJcG9zID0gRi5fZ2V0UG9zaXRpb24ob25seUFic29sdXRlKTsKCgkJCQlpZiAoZSAmJiBlLnR5cGUgPT09ICdzY3JvbGwnKSB7CgkJCQkJZGVsZXRlIHBvcy5wb3NpdGlvbjsKCgkJCQkJd3JhcC5zdG9wKHRydWUsIHRydWUpLmFuaW1hdGUocG9zLCAyMDApOwoKCQkJCX0gZWxzZSB7CgkJCQkJd3JhcC5jc3MocG9zKTsKCgkJCQkJY3VycmVudC5wb3MgPSAkLmV4dGVuZCh7fSwgY3VycmVudC5kaW0sIHBvcyk7CgkJCQl9CgkJCX0KCQl9LAoKCQl1cGRhdGU6IGZ1bmN0aW9uIChlKSB7CgkJCXZhciB0eXBlID0gKGUgJiYgZS50eXBlKSwKCQkJCWFueXdheSA9ICF0eXBlIHx8IHR5cGUgPT09ICdvcmllbnRhdGlvbmNoYW5nZSc7CgoJCQlpZiAoYW55d2F5KSB7CgkJCQljbGVhclRpbWVvdXQoZGlkVXBkYXRlKTsKCgkJCQlkaWRVcGRhdGUgPSBudWxsOwoJCQl9CgoJCQlpZiAoIUYuaXNPcGVuIHx8IGRpZFVwZGF0ZSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlkaWRVcGRhdGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewoJCQkJdmFyIGN1cnJlbnQgPSBGLmN1cnJlbnQ7CgoJCQkJaWYgKCFjdXJyZW50IHx8IEYuaXNDbG9zaW5nKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCUYud3JhcC5yZW1vdmVDbGFzcygnZmFuY3lib3gtdG1wJyk7CgoJCQkJaWYgKGFueXdheSB8fCB0eXBlID09PSAnbG9hZCcgfHwgKHR5cGUgPT09ICdyZXNpemUnICYmIGN1cnJlbnQuYXV0b1Jlc2l6ZSkpIHsKCQkJCQlGLl9zZXREaW1lbnNpb24oKTsKCQkJCX0KCgkJCQlpZiAoISh0eXBlID09PSAnc2Nyb2xsJyAmJiBjdXJyZW50LmNhblNocmluaykpIHsKCQkJCQlGLnJlcG9zaXRpb24oZSk7CgkJCQl9CgoJCQkJRi50cmlnZ2VyKCdvblVwZGF0ZScpOwoKCQkJCWRpZFVwZGF0ZSA9IG51bGw7CgoJCQl9LCAoYW55d2F5ICYmICFpc1RvdWNoID8gMCA6IDMwMCkpOwoJCX0sCgoJCS8vIFNocmluayBjb250ZW50IHRvIGZpdCBpbnNpZGUgdmlld3BvcnQgb3IgcmVzdG9yZSBpZiByZXNpemVkCgkJdG9nZ2xlOiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCQkJaWYgKEYuaXNPcGVuKSB7CgkJCQlGLmN1cnJlbnQuZml0VG9WaWV3ID0gJC50eXBlKGFjdGlvbikgPT09ICJib29sZWFuIiA/IGFjdGlvbiA6ICFGLmN1cnJlbnQuZml0VG9WaWV3OwoKCQkJCS8vIEhlbHAgYnJvd3NlciB0byByZXN0b3JlIGRvY3VtZW50IGRpbWVuc2lvbnMKCQkJCWlmIChpc1RvdWNoKSB7CgkJCQkJRi53cmFwLnJlbW92ZUF0dHIoJ3N0eWxlJykuYWRkQ2xhc3MoJ2ZhbmN5Ym94LXRtcCcpOwoKCQkJCQlGLnRyaWdnZXIoJ29uVXBkYXRlJyk7CgkJCQl9CgoJCQkJRi51cGRhdGUoKTsKCQkJfQoJCX0sCgoJCWhpZGVMb2FkaW5nOiBmdW5jdGlvbiAoKSB7CgkJCUQudW5iaW5kKCcubG9hZGluZycpOwoKCQkJJCgnI2ZhbmN5Ym94LWxvYWRpbmcnKS5yZW1vdmUoKTsKCQl9LAoKCQlzaG93TG9hZGluZzogZnVuY3Rpb24gKCkgewoJCQl2YXIgZWwsIHZpZXdwb3J0OwoKCQkJRi5oaWRlTG9hZGluZygpOwoKCQkJZWwgPSAkKCc8ZGl2IGlkPSJmYW5jeWJveC1sb2FkaW5nIj48ZGl2PjwvZGl2PjwvZGl2PicpLmNsaWNrKEYuY2FuY2VsKS5hcHBlbmRUbygnYm9keScpOwoKCQkJLy8gSWYgdXNlciB3aWxsIHByZXNzIHRoZSBlc2NhcGUtYnV0dG9uLCB0aGUgcmVxdWVzdCB3aWxsIGJlIGNhbmNlbGVkCgkJCUQuYmluZCgna2V5ZG93bi5sb2FkaW5nJywgZnVuY3Rpb24oZSkgewoJCQkJaWYgKChlLndoaWNoIHx8IGUua2V5Q29kZSkgPT09IDI3KSB7CgkJCQkJZS5wcmV2ZW50RGVmYXVsdCgpOwoKCQkJCQlGLmNhbmNlbCgpOwoJCQkJfQoJCQl9KTsKCgkJCWlmICghRi5kZWZhdWx0cy5maXhlZCkgewoJCQkJdmlld3BvcnQgPSBGLmdldFZpZXdwb3J0KCk7CgoJCQkJZWwuY3NzKHsKCQkJCQlwb3NpdGlvbiA6ICdhYnNvbHV0ZScsCgkJCQkJdG9wICA6ICh2aWV3cG9ydC5oICogMC41KSArIHZpZXdwb3J0LnksCgkJCQkJbGVmdCA6ICh2aWV3cG9ydC53ICogMC41KSArIHZpZXdwb3J0LngKCQkJCX0pOwoJCQl9CgkJfSwKCgkJZ2V0Vmlld3BvcnQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGxvY2tlZCA9IChGLmN1cnJlbnQgJiYgRi5jdXJyZW50LmxvY2tlZCkgfHwgZmFsc2UsCgkJCQlyZXogICAgPSB7CgkJCQkJeDogVy5zY3JvbGxMZWZ0KCksCgkJCQkJeTogVy5zY3JvbGxUb3AoKQoJCQkJfTsKCgkJCWlmIChsb2NrZWQpIHsKCQkJCXJlei53ID0gbG9ja2VkWzBdLmNsaWVudFdpZHRoOwoJCQkJcmV6LmggPSBsb2NrZWRbMF0uY2xpZW50SGVpZ2h0OwoKCQkJfSBlbHNlIHsKCQkJCS8vIFNlZSBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC82NzI0CgkJCQlyZXoudyA9IGlzVG91Y2ggJiYgd2luZG93LmlubmVyV2lkdGggID8gd2luZG93LmlubmVyV2lkdGggIDogVy53aWR0aCgpOwoJCQkJcmV6LmggPSBpc1RvdWNoICYmIHdpbmRvdy5pbm5lckhlaWdodCA/IHdpbmRvdy5pbm5lckhlaWdodCA6IFcuaGVpZ2h0KCk7CgkJCX0KCgkJCXJldHVybiByZXo7CgkJfSwKCgkJLy8gVW5iaW5kIHRoZSBrZXlib2FyZCAvIGNsaWNraW5nIGFjdGlvbnMKCQl1bmJpbmRFdmVudHM6IGZ1bmN0aW9uICgpIHsKCQkJaWYgKEYud3JhcCAmJiBpc1F1ZXJ5KEYud3JhcCkpIHsKCQkJCUYud3JhcC51bmJpbmQoJy5mYicpOwoJCQl9CgoJCQlELnVuYmluZCgnLmZiJyk7CgkJCVcudW5iaW5kKCcuZmInKTsKCQl9LAoKCQliaW5kRXZlbnRzOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50LAoJCQkJa2V5czsKCgkJCWlmICghY3VycmVudCkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvLyBDaGFuZ2luZyBkb2N1bWVudCBoZWlnaHQgb24gaU9TIGRldmljZXMgdHJpZ2dlcnMgYSAncmVzaXplJyBldmVudCwKCQkJLy8gdGhhdCBjYW4gY2hhbmdlIGRvY3VtZW50IGhlaWdodC4uLiByZXBlYXRpbmcgaW5maW5pdGVseQoJCQlXLmJpbmQoJ29yaWVudGF0aW9uY2hhbmdlLmZiJyArIChpc1RvdWNoID8gJycgOiAnIHJlc2l6ZS5mYicpICsgKGN1cnJlbnQuYXV0b0NlbnRlciAmJiAhY3VycmVudC5sb2NrZWQgPyAnIHNjcm9sbC5mYicgOiAnJyksIEYudXBkYXRlKTsKCgkJCWtleXMgPSBjdXJyZW50LmtleXM7CgoJCQlpZiAoa2V5cykgewoJCQkJRC5iaW5kKCdrZXlkb3duLmZiJywgZnVuY3Rpb24gKGUpIHsKCQkJCQl2YXIgY29kZSAgID0gZS53aGljaCB8fCBlLmtleUNvZGUsCgkJCQkJCXRhcmdldCA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDsKCgkJCQkJLy8gU2tpcCBlc2Mga2V5IGlmIGxvYWRpbmcsIGJlY2F1c2Ugc2hvd0xvYWRpbmcgd2lsbCBjYW5jZWwgcHJlbG9hZGluZwoJCQkJCWlmIChjb2RlID09PSAyNyAmJiBGLmNvbWluZykgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoKCQkJCQkvLyBJZ25vcmUga2V5IGNvbWJpbmF0aW9ucyBhbmQga2V5IGV2ZW50cyB3aXRoaW4gZm9ybSBlbGVtZW50cwoJCQkJCWlmICghZS5jdHJsS2V5ICYmICFlLmFsdEtleSAmJiAhZS5zaGlmdEtleSAmJiAhZS5tZXRhS2V5ICYmICEodGFyZ2V0ICYmICh0YXJnZXQudHlwZSB8fCAkKHRhcmdldCkuaXMoJ1tjb250ZW50ZWRpdGFibGVdJykpKSkgewoJCQkJCQkkLmVhY2goa2V5cywgZnVuY3Rpb24oaSwgdmFsKSB7CgkJCQkJCQlpZiAoY3VycmVudC5ncm91cC5sZW5ndGggPiAxICYmIHZhbFsgY29kZSBdICE9PSB1bmRlZmluZWQpIHsKCQkJCQkJCQlGWyBpIF0oIHZhbFsgY29kZSBdICk7CgoJCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9CgoJCQkJCQkJaWYgKCQuaW5BcnJheShjb2RlLCB2YWwpID4gLTEpIHsKCQkJCQkJCQlGWyBpIF0gKCk7CgoJCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJCQl9CgkJCQkJCX0pOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQlpZiAoJC5mbi5tb3VzZXdoZWVsICYmIGN1cnJlbnQubW91c2VXaGVlbCkgewoJCQkJRi53cmFwLmJpbmQoJ21vdXNld2hlZWwuZmInLCBmdW5jdGlvbiAoZSwgZGVsdGEsIGRlbHRhWCwgZGVsdGFZKSB7CgkJCQkJdmFyIHRhcmdldCA9IGUudGFyZ2V0IHx8IG51bGwsCgkJCQkJCXBhcmVudCA9ICQodGFyZ2V0KSwKCQkJCQkJY2FuU2Nyb2xsID0gZmFsc2U7CgoJCQkJCXdoaWxlIChwYXJlbnQubGVuZ3RoKSB7CgkJCQkJCWlmIChjYW5TY3JvbGwgfHwgcGFyZW50LmlzKCcuZmFuY3lib3gtc2tpbicpIHx8IHBhcmVudC5pcygnLmZhbmN5Ym94LXdyYXAnKSkgewoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCgkJCQkJCWNhblNjcm9sbCA9IGlzU2Nyb2xsYWJsZSggcGFyZW50WzBdICk7CgkJCQkJCXBhcmVudCAgICA9ICQocGFyZW50KS5wYXJlbnQoKTsKCQkJCQl9CgoJCQkJCWlmIChkZWx0YSAhPT0gMCAmJiAhY2FuU2Nyb2xsKSB7CgkJCQkJCWlmIChGLmdyb3VwLmxlbmd0aCA+IDEgJiYgIWN1cnJlbnQuY2FuU2hyaW5rKSB7CgkJCQkJCQlpZiAoZGVsdGFZID4gMCB8fCBkZWx0YVggPiAwKSB7CgkJCQkJCQkJRi5wcmV2KCBkZWx0YVkgPiAwID8gJ2Rvd24nIDogJ2xlZnQnICk7CgoJCQkJCQkJfSBlbHNlIGlmIChkZWx0YVkgPCAwIHx8IGRlbHRhWCA8IDApIHsKCQkJCQkJCQlGLm5leHQoIGRlbHRhWSA8IDAgPyAndXAnIDogJ3JpZ2h0JyApOwoJCQkJCQkJfQoKCQkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfSwKCgkJdHJpZ2dlcjogZnVuY3Rpb24gKGV2ZW50LCBvKSB7CgkJCXZhciByZXQsIG9iaiA9IG8gfHwgRi5jb21pbmcgfHwgRi5jdXJyZW50OwoKCQkJaWYgKCFvYmopIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCQuaXNGdW5jdGlvbiggb2JqW2V2ZW50XSApKSB7CgkJCQlyZXQgPSBvYmpbZXZlbnRdLmFwcGx5KG9iaiwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CgkJCX0KCgkJCWlmIChyZXQgPT09IGZhbHNlKSB7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCWlmIChvYmouaGVscGVycykgewoJCQkJJC5lYWNoKG9iai5oZWxwZXJzLCBmdW5jdGlvbiAoaGVscGVyLCBvcHRzKSB7CgkJCQkJaWYgKG9wdHMgJiYgRi5oZWxwZXJzW2hlbHBlcl0gJiYgJC5pc0Z1bmN0aW9uKEYuaGVscGVyc1toZWxwZXJdW2V2ZW50XSkpIHsKCQkJCQkJb3B0cyA9ICQuZXh0ZW5kKHRydWUsIHt9LCBGLmhlbHBlcnNbaGVscGVyXS5kZWZhdWx0cywgb3B0cyk7CgoJCQkJCQlGLmhlbHBlcnNbaGVscGVyXVtldmVudF0ob3B0cywgb2JqKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoKCQkJJC5ldmVudC50cmlnZ2VyKGV2ZW50ICsgJy5mYicpOwoJCX0sCgoJCWlzSW1hZ2U6IGZ1bmN0aW9uIChzdHIpIHsKCQkJcmV0dXJuIGlzU3RyaW5nKHN0cikgJiYgc3RyLm1hdGNoKC8oXmRhdGE6aW1hZ2VcLy4qLCl8KFwuKGpwKGV8Z3xlZyl8Z2lmfHBuZ3xibXB8d2VicCkoKFw/fCMpLiopPyQpL2kpOwoJCX0sCgoJCWlzU1dGOiBmdW5jdGlvbiAoc3RyKSB7CgkJCXJldHVybiBpc1N0cmluZyhzdHIpICYmIHN0ci5tYXRjaCgvXC4oc3dmKSgoXD98IykuKik/JC9pKTsKCQl9LAoKCQlfc3RhcnQ6IGZ1bmN0aW9uIChpbmRleCkgewoJCQl2YXIgY29taW5nID0ge30sCgkJCQlvYmosCgkJCQlocmVmLAoJCQkJdHlwZSwKCQkJCW1hcmdpbiwKCQkJCXBhZGRpbmc7CgoJCQlpbmRleCA9IGdldFNjYWxhciggaW5kZXggKTsKCQkJb2JqICAgPSBGLmdyb3VwWyBpbmRleCBdIHx8IG51bGw7CgoJCQlpZiAoIW9iaikgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgoJCQljb21pbmcgPSAkLmV4dGVuZCh0cnVlLCB7fSwgRi5vcHRzLCBvYmopOwoKCQkJLy8gQ29udmVydCBtYXJnaW4gYW5kIHBhZGRpbmcgcHJvcGVydGllcyB0byBhcnJheSAtIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdAoJCQltYXJnaW4gID0gY29taW5nLm1hcmdpbjsKCQkJcGFkZGluZyA9IGNvbWluZy5wYWRkaW5nOwoKCQkJaWYgKCQudHlwZShtYXJnaW4pID09PSAnbnVtYmVyJykgewoJCQkJY29taW5nLm1hcmdpbiA9IFttYXJnaW4sIG1hcmdpbiwgbWFyZ2luLCBtYXJnaW5dOwoJCQl9CgoJCQlpZiAoJC50eXBlKHBhZGRpbmcpID09PSAnbnVtYmVyJykgewoJCQkJY29taW5nLnBhZGRpbmcgPSBbcGFkZGluZywgcGFkZGluZywgcGFkZGluZywgcGFkZGluZ107CgkJCX0KCgkJCS8vICdtb2RhbCcgcHJvcGVyeSBpcyBqdXN0IGEgc2hvcnRjdXQKCQkJaWYgKGNvbWluZy5tb2RhbCkgewoJCQkJJC5leHRlbmQodHJ1ZSwgY29taW5nLCB7CgkJCQkJY2xvc2VCdG4gICA6IGZhbHNlLAoJCQkJCWNsb3NlQ2xpY2sgOiBmYWxzZSwKCQkJCQluZXh0Q2xpY2sgIDogZmFsc2UsCgkJCQkJYXJyb3dzICAgICA6IGZhbHNlLAoJCQkJCW1vdXNlV2hlZWwgOiBmYWxzZSwKCQkJCQlrZXlzICAgICAgIDogbnVsbCwKCQkJCQloZWxwZXJzOiB7CgkJCQkJCW92ZXJsYXkgOiB7CgkJCQkJCQljbG9zZUNsaWNrIDogZmFsc2UKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyAnYXV0b1NpemUnIHByb3BlcnR5IGlzIGEgc2hvcnRjdXQsIHRvbwoJCQlpZiAoY29taW5nLmF1dG9TaXplKSB7CgkJCQljb21pbmcuYXV0b1dpZHRoID0gY29taW5nLmF1dG9IZWlnaHQgPSB0cnVlOwoJCQl9CgoJCQlpZiAoY29taW5nLndpZHRoID09PSAnYXV0bycpIHsKCQkJCWNvbWluZy5hdXRvV2lkdGggPSB0cnVlOwoJCQl9CgoJCQlpZiAoY29taW5nLmhlaWdodCA9PT0gJ2F1dG8nKSB7CgkJCQljb21pbmcuYXV0b0hlaWdodCA9IHRydWU7CgkJCX0KCgkJCS8qCgkJCSAqIEFkZCByZWZlcmVuY2UgdG8gdGhlIGdyb3VwLCBzbyBpdGBzIHBvc3NpYmxlIHRvIGFjY2VzcyBmcm9tIGNhbGxiYWNrcywgZXhhbXBsZToKCQkJICogYWZ0ZXJMb2FkIDogZnVuY3Rpb24oKSB7CgkJCSAqICAgICB0aGlzLnRpdGxlID0gJ0ltYWdlICcgKyAodGhpcy5pbmRleCArIDEpICsgJyBvZiAnICsgdGhpcy5ncm91cC5sZW5ndGggKyAodGhpcy50aXRsZSA/ICcgLSAnICsgdGhpcy50aXRsZSA6ICcnKTsKCQkJICogfQoJCQkgKi8KCgkJCWNvbWluZy5ncm91cCAgPSBGLmdyb3VwOwoJCQljb21pbmcuaW5kZXggID0gaW5kZXg7CgoJCQkvLyBHaXZlIGEgY2hhbmNlIGZvciBjYWxsYmFjayBvciBoZWxwZXJzIHRvIHVwZGF0ZSBjb21pbmcgaXRlbSAodHlwZSwgdGl0bGUsIGV0YykKCQkJRi5jb21pbmcgPSBjb21pbmc7CgoJCQlpZiAoZmFsc2UgPT09IEYudHJpZ2dlcignYmVmb3JlTG9hZCcpKSB7CgkJCQlGLmNvbWluZyA9IG51bGw7CgoJCQkJcmV0dXJuOwoJCQl9CgoJCQl0eXBlID0gY29taW5nLnR5cGU7CgkJCWhyZWYgPSBjb21pbmcuaHJlZjsKCgkJCWlmICghdHlwZSkgewoJCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJCS8vSWYgd2UgY2FuIG5vdCBkZXRlcm1pbmUgY29udGVudCB0eXBlIHRoZW4gZHJvcCBzaWxlbnRseSBvciBkaXNwbGF5IG5leHQvcHJldiBpdGVtIGlmIGxvb3BpbmcgdGhyb3VnaCBnYWxsZXJ5CgkJCQlpZiAoRi5jdXJyZW50ICYmIEYucm91dGVyICYmIEYucm91dGVyICE9PSAnanVtcHRvJykgewoJCQkJCUYuY3VycmVudC5pbmRleCA9IGluZGV4OwoKCQkJCQlyZXR1cm4gRlsgRi5yb3V0ZXIgXSggRi5kaXJlY3Rpb24gKTsKCQkJCX0KCgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCgkJCUYuaXNBY3RpdmUgPSB0cnVlOwoKCQkJaWYgKHR5cGUgPT09ICdpbWFnZScgfHwgdHlwZSA9PT0gJ3N3ZicpIHsKCQkJCWNvbWluZy5hdXRvSGVpZ2h0ID0gY29taW5nLmF1dG9XaWR0aCA9IGZhbHNlOwoJCQkJY29taW5nLnNjcm9sbGluZyAgPSAndmlzaWJsZSc7CgkJCX0KCgkJCWlmICh0eXBlID09PSAnaW1hZ2UnKSB7CgkJCQljb21pbmcuYXNwZWN0UmF0aW8gPSB0cnVlOwoJCQl9CgoJCQlpZiAodHlwZSA9PT0gJ2lmcmFtZScgJiYgaXNUb3VjaCkgewoJCQkJY29taW5nLnNjcm9sbGluZyA9ICdzY3JvbGwnOwoJCQl9CgoJCQkvLyBCdWlsZCB0aGUgbmVjY2Vzc2FyeSBtYXJrdXAKCQkJY29taW5nLndyYXAgPSAkKGNvbWluZy50cGwud3JhcCkuYWRkQ2xhc3MoJ2ZhbmN5Ym94LScgKyAoaXNUb3VjaCA/ICdtb2JpbGUnIDogJ2Rlc2t0b3AnKSArICcgZmFuY3lib3gtdHlwZS0nICsgdHlwZSArICcgZmFuY3lib3gtdG1wICcgKyBjb21pbmcud3JhcENTUykuYXBwZW5kVG8oIGNvbWluZy5wYXJlbnQgfHwgJ2JvZHknICk7CgoJCQkkLmV4dGVuZChjb21pbmcsIHsKCQkJCXNraW4gIDogJCgnLmZhbmN5Ym94LXNraW4nLCAgY29taW5nLndyYXApLAoJCQkJb3V0ZXIgOiAkKCcuZmFuY3lib3gtb3V0ZXInLCBjb21pbmcud3JhcCksCgkJCQlpbm5lciA6ICQoJy5mYW5jeWJveC1pbm5lcicsIGNvbWluZy53cmFwKQoJCQl9KTsKCgkJCSQuZWFjaChbIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCJdLCBmdW5jdGlvbihpLCB2KSB7CgkJCQljb21pbmcuc2tpbi5jc3MoJ3BhZGRpbmcnICsgdiwgZ2V0VmFsdWUoY29taW5nLnBhZGRpbmdbIGkgXSkpOwoJCQl9KTsKCgkJCUYudHJpZ2dlcignb25SZWFkeScpOwoKCQkJLy8gQ2hlY2sgYmVmb3JlIHRyeSB0byBsb2FkOyAnaW5saW5lJyBhbmQgJ2h0bWwnIHR5cGVzIG5lZWQgY29udGVudCwgb3RoZXJzIC0gaHJlZgoJCQlpZiAodHlwZSA9PT0gJ2lubGluZScgfHwgdHlwZSA9PT0gJ2h0bWwnKSB7CgkJCQlpZiAoIWNvbWluZy5jb250ZW50IHx8ICFjb21pbmcuY29udGVudC5sZW5ndGgpIHsKCQkJCQlyZXR1cm4gRi5fZXJyb3IoICdjb250ZW50JyApOwoJCQkJfQoKCQkJfSBlbHNlIGlmICghaHJlZikgewoJCQkJcmV0dXJuIEYuX2Vycm9yKCAnaHJlZicgKTsKCQkJfQoKCQkJaWYgKHR5cGUgPT09ICdpbWFnZScpIHsKCQkJCUYuX2xvYWRJbWFnZSgpOwoKCQkJfSBlbHNlIGlmICh0eXBlID09PSAnYWpheCcpIHsKCQkJCUYuX2xvYWRBamF4KCk7CgoJCQl9IGVsc2UgaWYgKHR5cGUgPT09ICdpZnJhbWUnKSB7CgkJCQlGLl9sb2FkSWZyYW1lKCk7CgoJCQl9IGVsc2UgewoJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCX0KCQl9LAoKCQlfZXJyb3I6IGZ1bmN0aW9uICggdHlwZSApIHsKCQkJJC5leHRlbmQoRi5jb21pbmcsIHsKCQkJCXR5cGUgICAgICAgOiAnaHRtbCcsCgkJCQlhdXRvV2lkdGggIDogdHJ1ZSwKCQkJCWF1dG9IZWlnaHQgOiB0cnVlLAoJCQkJbWluV2lkdGggICA6IDAsCgkJCQltaW5IZWlnaHQgIDogMCwKCQkJCXNjcm9sbGluZyAgOiAnbm8nLAoJCQkJaGFzRXJyb3IgICA6IHR5cGUsCgkJCQljb250ZW50ICAgIDogRi5jb21pbmcudHBsLmVycm9yCgkJCX0pOwoKCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJfSwKCgkJX2xvYWRJbWFnZTogZnVuY3Rpb24gKCkgewoJCQkvLyBSZXNldCBwcmVsb2FkIGltYWdlIHNvIGl0IGlzIGxhdGVyIHBvc3NpYmxlIHRvIGNoZWNrICJjb21wbGV0ZSIgcHJvcGVydHkKCQkJdmFyIGltZyA9IEYuaW1nUHJlbG9hZCA9IG5ldyBJbWFnZSgpOwoKCQkJaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsKCQkJCXRoaXMub25sb2FkID0gdGhpcy5vbmVycm9yID0gbnVsbDsKCgkJCQlGLmNvbWluZy53aWR0aCAgPSB0aGlzLndpZHRoOwoJCQkJRi5jb21pbmcuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CgoJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCX07CgoJCQlpbWcub25lcnJvciA9IGZ1bmN0aW9uICgpIHsKCQkJCXRoaXMub25sb2FkID0gdGhpcy5vbmVycm9yID0gbnVsbDsKCgkJCQlGLl9lcnJvciggJ2ltYWdlJyApOwoJCQl9OwoKCQkJaW1nLnNyYyA9IEYuY29taW5nLmhyZWY7CgoJCQlpZiAoaW1nLmNvbXBsZXRlICE9PSB0cnVlKSB7CgkJCQlGLnNob3dMb2FkaW5nKCk7CgkJCX0KCQl9LAoKCQlfbG9hZEFqYXg6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGNvbWluZyA9IEYuY29taW5nOwoKCQkJRi5zaG93TG9hZGluZygpOwoKCQkJRi5hamF4TG9hZCA9ICQuYWpheCgkLmV4dGVuZCh7fSwgY29taW5nLmFqYXgsIHsKCQkJCXVybDogY29taW5nLmhyZWYsCgkJCQllcnJvcjogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzKSB7CgkJCQkJaWYgKEYuY29taW5nICYmIHRleHRTdGF0dXMgIT09ICdhYm9ydCcpIHsKCQkJCQkJRi5fZXJyb3IoICdhamF4JywganFYSFIgKTsKCgkJCQkJfSBlbHNlIHsKCQkJCQkJRi5oaWRlTG9hZGluZygpOwoJCQkJCX0KCQkJCX0sCgkJCQlzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cykgewoJCQkJCWlmICh0ZXh0U3RhdHVzID09PSAnc3VjY2VzcycpIHsKCQkJCQkJY29taW5nLmNvbnRlbnQgPSBkYXRhOwoKCQkJCQkJRi5fYWZ0ZXJMb2FkKCk7CgkJCQkJfQoJCQkJfQoJCQl9KSk7CgkJfSwKCgkJX2xvYWRJZnJhbWU6IGZ1bmN0aW9uKCkgewoJCQl2YXIgY29taW5nID0gRi5jb21pbmcsCgkJCQlpZnJhbWUgPSAkKGNvbWluZy50cGwuaWZyYW1lLnJlcGxhY2UoL1x7cm5kXH0vZywgbmV3IERhdGUoKS5nZXRUaW1lKCkpKQoJCQkJCS5hdHRyKCdzY3JvbGxpbmcnLCBpc1RvdWNoID8gJ2F1dG8nIDogY29taW5nLmlmcmFtZS5zY3JvbGxpbmcpCgkJCQkJLmF0dHIoJ3NyYycsIGNvbWluZy5ocmVmKTsKCgkJCS8vIFRoaXMgaGVscHMgSUUKCQkJJChjb21pbmcud3JhcCkuYmluZCgnb25SZXNldCcsIGZ1bmN0aW9uICgpIHsKCQkJCXRyeSB7CgkJCQkJJCh0aGlzKS5maW5kKCdpZnJhbWUnKS5oaWRlKCkuYXR0cignc3JjJywgJy8vYWJvdXQ6YmxhbmsnKS5lbmQoKS5lbXB0eSgpOwoJCQkJfSBjYXRjaCAoZSkge30KCQkJfSk7CgoJCQlpZiAoY29taW5nLmlmcmFtZS5wcmVsb2FkKSB7CgkJCQlGLnNob3dMb2FkaW5nKCk7CgoJCQkJaWZyYW1lLm9uZSgnbG9hZCcsIGZ1bmN0aW9uKCkgewoJCQkJCSQodGhpcykuZGF0YSgncmVhZHknLCAxKTsKCgkJCQkJLy8gaU9TIHdpbGwgbG9zZSBzY3JvbGxpbmcgaWYgd2UgcmVzaXplCgkJCQkJaWYgKCFpc1RvdWNoKSB7CgkJCQkJCSQodGhpcykuYmluZCgnbG9hZC5mYicsIEYudXBkYXRlKTsKCQkJCQl9CgoJCQkJCS8vIFdpdGhvdXQgdGhpcyB0cmljazoKCQkJCQkvLyAgIC0gaWZyYW1lIHdvbid0IHNjcm9sbCBvbiBpT1MgZGV2aWNlcwoJCQkJCS8vICAgLSBJRTcgc29tZXRpbWVzIGRpc3BsYXlzIGVtcHR5IGlmcmFtZQoJCQkJCSQodGhpcykucGFyZW50cygnLmZhbmN5Ym94LXdyYXAnKS53aWR0aCgnMTAwJScpLnJlbW92ZUNsYXNzKCdmYW5jeWJveC10bXAnKS5zaG93KCk7CgoJCQkJCUYuX2FmdGVyTG9hZCgpOwoJCQkJfSk7CgkJCX0KCgkJCWNvbWluZy5jb250ZW50ID0gaWZyYW1lLmFwcGVuZFRvKCBjb21pbmcuaW5uZXIgKTsKCgkJCWlmICghY29taW5nLmlmcmFtZS5wcmVsb2FkKSB7CgkJCQlGLl9hZnRlckxvYWQoKTsKCQkJfQoJCX0sCgoJCV9wcmVsb2FkSW1hZ2VzOiBmdW5jdGlvbigpIHsKCQkJdmFyIGdyb3VwICAgPSBGLmdyb3VwLAoJCQkJY3VycmVudCA9IEYuY3VycmVudCwKCQkJCWxlbiAgICAgPSBncm91cC5sZW5ndGgsCgkJCQljbnQgICAgID0gY3VycmVudC5wcmVsb2FkID8gTWF0aC5taW4oY3VycmVudC5wcmVsb2FkLCBsZW4gLSAxKSA6IDAsCgkJCQlpdGVtLAoJCQkJaTsKCgkJCWZvciAoaSA9IDE7IGkgPD0gY250OyBpICs9IDEpIHsKCQkJCWl0ZW0gPSBncm91cFsgKGN1cnJlbnQuaW5kZXggKyBpICkgJSBsZW4gXTsKCgkJCQlpZiAoaXRlbS50eXBlID09PSAnaW1hZ2UnICYmIGl0ZW0uaHJlZikgewoJCQkJCW5ldyBJbWFnZSgpLnNyYyA9IGl0ZW0uaHJlZjsKCQkJCX0KCQkJfQoJCX0sCgoJCV9hZnRlckxvYWQ6IGZ1bmN0aW9uICgpIHsKCQkJdmFyIGNvbWluZyAgID0gRi5jb21pbmcsCgkJCQlwcmV2aW91cyA9IEYuY3VycmVudCwKCQkJCXBsYWNlaG9sZGVyID0gJ2ZhbmN5Ym94LXBsYWNlaG9sZGVyJywKCQkJCWN1cnJlbnQsCgkJCQljb250ZW50LAoJCQkJdHlwZSwKCQkJCXNjcm9sbGluZywKCQkJCWhyZWYsCgkJCQllbWJlZDsKCgkJCUYuaGlkZUxvYWRpbmcoKTsKCgkJCWlmICghY29taW5nIHx8IEYuaXNBY3RpdmUgPT09IGZhbHNlKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmIChmYWxzZSA9PT0gRi50cmlnZ2VyKCdhZnRlckxvYWQnLCBjb21pbmcsIHByZXZpb3VzKSkgewoJCQkJY29taW5nLndyYXAuc3RvcCh0cnVlKS50cmlnZ2VyKCdvblJlc2V0JykucmVtb3ZlKCk7CgoJCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKHByZXZpb3VzKSB7CgkJCQlGLnRyaWdnZXIoJ2JlZm9yZUNoYW5nZScsIHByZXZpb3VzKTsKCgkJCQlwcmV2aW91cy53cmFwLnN0b3AodHJ1ZSkucmVtb3ZlQ2xhc3MoJ2ZhbmN5Ym94LW9wZW5lZCcpCgkJCQkJLmZpbmQoJy5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2JykKCQkJCQkucmVtb3ZlKCk7CgkJCX0KCgkJCUYudW5iaW5kRXZlbnRzKCk7CgoJCQljdXJyZW50ICAgPSBjb21pbmc7CgkJCWNvbnRlbnQgICA9IGNvbWluZy5jb250ZW50OwoJCQl0eXBlICAgICAgPSBjb21pbmcudHlwZTsKCQkJc2Nyb2xsaW5nID0gY29taW5nLnNjcm9sbGluZzsKCgkJCSQuZXh0ZW5kKEYsIHsKCQkJCXdyYXAgIDogY3VycmVudC53cmFwLAoJCQkJc2tpbiAgOiBjdXJyZW50LnNraW4sCgkJCQlvdXRlciA6IGN1cnJlbnQub3V0ZXIsCgkJCQlpbm5lciA6IGN1cnJlbnQuaW5uZXIsCgkJCQljdXJyZW50ICA6IGN1cnJlbnQsCgkJCQlwcmV2aW91cyA6IHByZXZpb3VzCgkJCX0pOwoKCQkJaHJlZiA9IGN1cnJlbnQuaHJlZjsKCgkJCXN3aXRjaCAodHlwZSkgewoJCQkJY2FzZSAnaW5saW5lJzoKCQkJCWNhc2UgJ2FqYXgnOgoJCQkJY2FzZSAnaHRtbCc6CgkJCQkJaWYgKGN1cnJlbnQuc2VsZWN0b3IpIHsKCQkJCQkJY29udGVudCA9ICQoJzxkaXY+JykuaHRtbChjb250ZW50KS5maW5kKGN1cnJlbnQuc2VsZWN0b3IpOwoKCQkJCQl9IGVsc2UgaWYgKGlzUXVlcnkoY29udGVudCkpIHsKCQkJCQkJaWYgKCFjb250ZW50LmRhdGEocGxhY2Vob2xkZXIpKSB7CgkJCQkJCQljb250ZW50LmRhdGEocGxhY2Vob2xkZXIsICQoJzxkaXYgY2xhc3M9IicgKyBwbGFjZWhvbGRlciArICciPjwvZGl2PicpLmluc2VydEFmdGVyKCBjb250ZW50ICkuaGlkZSgpICk7CgkJCQkJCX0KCgkJCQkJCWNvbnRlbnQgPSBjb250ZW50LnNob3coKS5kZXRhY2goKTsKCgkJCQkJCWN1cnJlbnQud3JhcC5iaW5kKCdvblJlc2V0JywgZnVuY3Rpb24gKCkgewoJCQkJCQkJaWYgKCQodGhpcykuZmluZChjb250ZW50KS5sZW5ndGgpIHsKCQkJCQkJCQljb250ZW50LmhpZGUoKS5yZXBsYWNlQWxsKCBjb250ZW50LmRhdGEocGxhY2Vob2xkZXIpICkuZGF0YShwbGFjZWhvbGRlciwgZmFsc2UpOwoJCQkJCQkJfQoJCQkJCQl9KTsKCQkJCQl9CgkJCQlicmVhazsKCgkJCQljYXNlICdpbWFnZSc6CgkJCQkJY29udGVudCA9IGN1cnJlbnQudHBsLmltYWdlLnJlcGxhY2UoJ3tocmVmfScsIGhyZWYpOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnc3dmJzoKCQkJCQljb250ZW50ID0gJzxvYmplY3QgaWQ9ImZhbmN5Ym94LXN3ZiIgY2xhc3NpZD0iY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSInICsgaHJlZiArICciPjwvcGFyYW0+JzsKCQkJCQllbWJlZCAgID0gJyc7CgoJCQkJCSQuZWFjaChjdXJyZW50LnN3ZiwgZnVuY3Rpb24obmFtZSwgdmFsKSB7CgkJCQkJCWNvbnRlbnQgKz0gJzxwYXJhbSBuYW1lPSInICsgbmFtZSArICciIHZhbHVlPSInICsgdmFsICsgJyI+PC9wYXJhbT4nOwoJCQkJCQllbWJlZCAgICs9ICcgJyArIG5hbWUgKyAnPSInICsgdmFsICsgJyInOwoJCQkJCX0pOwoKCQkJCQljb250ZW50ICs9ICc8ZW1iZWQgc3JjPSInICsgaHJlZiArICciIHR5cGU9ImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIicgKyBlbWJlZCArICc+PC9lbWJlZD48L29iamVjdD4nOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICghKGlzUXVlcnkoY29udGVudCkgJiYgY29udGVudC5wYXJlbnQoKS5pcyhjdXJyZW50LmlubmVyKSkpIHsKCQkJCWN1cnJlbnQuaW5uZXIuYXBwZW5kKCBjb250ZW50ICk7CgkJCX0KCgkJCS8vIEdpdmUgYSBjaGFuY2UgZm9yIGhlbHBlcnMgb3IgY2FsbGJhY2tzIHRvIHVwZGF0ZSBlbGVtZW50cwoJCQlGLnRyaWdnZXIoJ2JlZm9yZVNob3cnKTsKCgkJCS8vIFNldCBzY3JvbGxpbmcgYmVmb3JlIGNhbGN1bGF0aW5nIGRpbWVuc2lvbnMKCQkJY3VycmVudC5pbm5lci5jc3MoJ292ZXJmbG93Jywgc2Nyb2xsaW5nID09PSAneWVzJyA/ICdzY3JvbGwnIDogKHNjcm9sbGluZyA9PT0gJ25vJyA/ICdoaWRkZW4nIDogc2Nyb2xsaW5nKSk7CgoJCQkvLyBTZXQgaW5pdGlhbCBkaW1lbnNpb25zIGFuZCBzdGFydCBwb3NpdGlvbgoJCQlGLl9zZXREaW1lbnNpb24oKTsKCgkJCUYucmVwb3NpdGlvbigpOwoKCQkJRi5pc09wZW4gPSBmYWxzZTsKCQkJRi5jb21pbmcgPSBudWxsOwoKCQkJRi5iaW5kRXZlbnRzKCk7CgoJCQlpZiAoIUYuaXNPcGVuZWQpIHsKCQkJCSQoJy5mYW5jeWJveC13cmFwJykubm90KCBjdXJyZW50LndyYXAgKS5zdG9wKHRydWUpLnRyaWdnZXIoJ29uUmVzZXQnKS5yZW1vdmUoKTsKCgkJCX0gZWxzZSBpZiAocHJldmlvdXMucHJldk1ldGhvZCkgewoJCQkJRi50cmFuc2l0aW9uc1sgcHJldmlvdXMucHJldk1ldGhvZCBdKCk7CgkJCX0KCgkJCUYudHJhbnNpdGlvbnNbIEYuaXNPcGVuZWQgPyBjdXJyZW50Lm5leHRNZXRob2QgOiBjdXJyZW50Lm9wZW5NZXRob2QgXSgpOwoKCQkJRi5fcHJlbG9hZEltYWdlcygpOwoJCX0sCgoJCV9zZXREaW1lbnNpb246IGZ1bmN0aW9uICgpIHsKCQkJdmFyIHZpZXdwb3J0ICAgPSBGLmdldFZpZXdwb3J0KCksCgkJCQlzdGVwcyAgICAgID0gMCwKCQkJCWNhblNocmluayAgPSBmYWxzZSwKCQkJCWNhbkV4cGFuZCAgPSBmYWxzZSwKCQkJCXdyYXAgICAgICAgPSBGLndyYXAsCgkJCQlza2luICAgICAgID0gRi5za2luLAoJCQkJaW5uZXIgICAgICA9IEYuaW5uZXIsCgkJCQljdXJyZW50ICAgID0gRi5jdXJyZW50LAoJCQkJd2lkdGggICAgICA9IGN1cnJlbnQud2lkdGgsCgkJCQloZWlnaHQgICAgID0gY3VycmVudC5oZWlnaHQsCgkJCQltaW5XaWR0aCAgID0gY3VycmVudC5taW5XaWR0aCwKCQkJCW1pbkhlaWdodCAgPSBjdXJyZW50Lm1pbkhlaWdodCwKCQkJCW1heFdpZHRoICAgPSBjdXJyZW50Lm1heFdpZHRoLAoJCQkJbWF4SGVpZ2h0ICA9IGN1cnJlbnQubWF4SGVpZ2h0LAoJCQkJc2Nyb2xsaW5nICA9IGN1cnJlbnQuc2Nyb2xsaW5nLAoJCQkJc2Nyb2xsT3V0ICA9IGN1cnJlbnQuc2Nyb2xsT3V0c2lkZSA/IGN1cnJlbnQuc2Nyb2xsYmFyV2lkdGggOiAwLAoJCQkJbWFyZ2luICAgICA9IGN1cnJlbnQubWFyZ2luLAoJCQkJd01hcmdpbiAgICA9IGdldFNjYWxhcihtYXJnaW5bMV0gKyBtYXJnaW5bM10pLAoJCQkJaE1hcmdpbiAgICA9IGdldFNjYWxhcihtYXJnaW5bMF0gKyBtYXJnaW5bMl0pLAoJCQkJd1BhZGRpbmcsCgkJCQloUGFkZGluZywKCQkJCXdTcGFjZSwKCQkJCWhTcGFjZSwKCQkJCW9yaWdXaWR0aCwKCQkJCW9yaWdIZWlnaHQsCgkJCQlvcmlnTWF4V2lkdGgsCgkJCQlvcmlnTWF4SGVpZ2h0LAoJCQkJcmF0aW8sCgkJCQl3aWR0aF8sCgkJCQloZWlnaHRfLAoJCQkJbWF4V2lkdGhfLAoJCQkJbWF4SGVpZ2h0XywKCQkJCWlmcmFtZSwKCQkJCWJvZHk7CgoJCQkvLyBSZXNldCBkaW1lbnNpb25zIHNvIHdlIGNvdWxkIHJlLWNoZWNrIGFjdHVhbCBzaXplCgkJCXdyYXAuYWRkKHNraW4pLmFkZChpbm5lcikud2lkdGgoJ2F1dG8nKS5oZWlnaHQoJ2F1dG8nKS5yZW1vdmVDbGFzcygnZmFuY3lib3gtdG1wJyk7CgoJCQl3UGFkZGluZyA9IGdldFNjYWxhcihza2luLm91dGVyV2lkdGgodHJ1ZSkgIC0gc2tpbi53aWR0aCgpKTsKCQkJaFBhZGRpbmcgPSBnZXRTY2FsYXIoc2tpbi5vdXRlckhlaWdodCh0cnVlKSAtIHNraW4uaGVpZ2h0KCkpOwoKCQkJLy8gQW55IHNwYWNlIGJldHdlZW4gY29udGVudCBhbmQgdmlld3BvcnQgKG1hcmdpbiwgcGFkZGluZywgYm9yZGVyLCB0aXRsZSkKCQkJd1NwYWNlID0gd01hcmdpbiArIHdQYWRkaW5nOwoJCQloU3BhY2UgPSBoTWFyZ2luICsgaFBhZGRpbmc7CgoJCQlvcmlnV2lkdGggID0gaXNQZXJjZW50YWdlKHdpZHRoKSAgPyAodmlld3BvcnQudyAtIHdTcGFjZSkgKiBnZXRTY2FsYXIod2lkdGgpICAvIDEwMCA6IHdpZHRoOwoJCQlvcmlnSGVpZ2h0ID0gaXNQZXJjZW50YWdlKGhlaWdodCkgPyAodmlld3BvcnQuaCAtIGhTcGFjZSkgKiBnZXRTY2FsYXIoaGVpZ2h0KSAvIDEwMCA6IGhlaWdodDsKCgkJCWlmIChjdXJyZW50LnR5cGUgPT09ICdpZnJhbWUnKSB7CgkJCQlpZnJhbWUgPSBjdXJyZW50LmNvbnRlbnQ7CgoJCQkJaWYgKGN1cnJlbnQuYXV0b0hlaWdodCAmJiBpZnJhbWUuZGF0YSgncmVhZHknKSA9PT0gMSkgewoJCQkJCXRyeSB7CgkJCQkJCWlmIChpZnJhbWVbMF0uY29udGVudFdpbmRvdy5kb2N1bWVudC5sb2NhdGlvbikgewoJCQkJCQkJaW5uZXIud2lkdGgoIG9yaWdXaWR0aCApLmhlaWdodCg5OTk5KTsKCgkJCQkJCQlib2R5ID0gaWZyYW1lLmNvbnRlbnRzKCkuZmluZCgnYm9keScpOwoKCQkJCQkJCWlmIChzY3JvbGxPdXQpIHsKCQkJCQkJCQlib2R5LmNzcygnb3ZlcmZsb3cteCcsICdoaWRkZW4nKTsKCQkJCQkJCX0KCgkJCQkJCQlvcmlnSGVpZ2h0ID0gYm9keS5oZWlnaHQoKTsKCQkJCQkJfQoKCQkJCQl9IGNhdGNoIChlKSB7fQoJCQkJfQoKCQkJfSBlbHNlIGlmIChjdXJyZW50LmF1dG9XaWR0aCB8fCBjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCWlubmVyLmFkZENsYXNzKCAnZmFuY3lib3gtdG1wJyApOwoKCQkJCS8vIFNldCB3aWR0aCBvciBoZWlnaHQgaW4gY2FzZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBvbmx5IG9uZSBkaW1lbnNpb24KCQkJCWlmICghY3VycmVudC5hdXRvV2lkdGgpIHsKCQkJCQlpbm5lci53aWR0aCggb3JpZ1dpZHRoICk7CgkJCQl9CgoJCQkJaWYgKCFjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCQlpbm5lci5oZWlnaHQoIG9yaWdIZWlnaHQgKTsKCQkJCX0KCgkJCQlpZiAoY3VycmVudC5hdXRvV2lkdGgpIHsKCQkJCQlvcmlnV2lkdGggPSBpbm5lci53aWR0aCgpOwoJCQkJfQoKCQkJCWlmIChjdXJyZW50LmF1dG9IZWlnaHQpIHsKCQkJCQlvcmlnSGVpZ2h0ID0gaW5uZXIuaGVpZ2h0KCk7CgkJCQl9CgoJCQkJaW5uZXIucmVtb3ZlQ2xhc3MoICdmYW5jeWJveC10bXAnICk7CgkJCX0KCgkJCXdpZHRoICA9IGdldFNjYWxhciggb3JpZ1dpZHRoICk7CgkJCWhlaWdodCA9IGdldFNjYWxhciggb3JpZ0hlaWdodCApOwoKCQkJcmF0aW8gID0gb3JpZ1dpZHRoIC8gb3JpZ0hlaWdodDsKCgkJCS8vIENhbGN1bGF0aW9ucyBmb3IgdGhlIGNvbnRlbnQKCQkJbWluV2lkdGggID0gZ2V0U2NhbGFyKGlzUGVyY2VudGFnZShtaW5XaWR0aCkgPyBnZXRTY2FsYXIobWluV2lkdGgsICd3JykgLSB3U3BhY2UgOiBtaW5XaWR0aCk7CgkJCW1heFdpZHRoICA9IGdldFNjYWxhcihpc1BlcmNlbnRhZ2UobWF4V2lkdGgpID8gZ2V0U2NhbGFyKG1heFdpZHRoLCAndycpIC0gd1NwYWNlIDogbWF4V2lkdGgpOwoKCQkJbWluSGVpZ2h0ID0gZ2V0U2NhbGFyKGlzUGVyY2VudGFnZShtaW5IZWlnaHQpID8gZ2V0U2NhbGFyKG1pbkhlaWdodCwgJ2gnKSAtIGhTcGFjZSA6IG1pbkhlaWdodCk7CgkJCW1heEhlaWdodCA9IGdldFNjYWxhcihpc1BlcmNlbnRhZ2UobWF4SGVpZ2h0KSA/IGdldFNjYWxhcihtYXhIZWlnaHQsICdoJykgLSBoU3BhY2UgOiBtYXhIZWlnaHQpOwoKCQkJLy8gVGhlc2Ugd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB3cmFwIGNhbiBmaXQgaW4gdGhlIHZpZXdwb3J0CgkJCW9yaWdNYXhXaWR0aCAgPSBtYXhXaWR0aDsKCQkJb3JpZ01heEhlaWdodCA9IG1heEhlaWdodDsKCgkJCWlmIChjdXJyZW50LmZpdFRvVmlldykgewoJCQkJbWF4V2lkdGggID0gTWF0aC5taW4odmlld3BvcnQudyAtIHdTcGFjZSwgbWF4V2lkdGgpOwoJCQkJbWF4SGVpZ2h0ID0gTWF0aC5taW4odmlld3BvcnQuaCAtIGhTcGFjZSwgbWF4SGVpZ2h0KTsKCQkJfQoKCQkJbWF4V2lkdGhfICA9IHZpZXdwb3J0LncgLSB3TWFyZ2luOwoJCQltYXhIZWlnaHRfID0gdmlld3BvcnQuaCAtIGhNYXJnaW47CgoJCQlpZiAoY3VycmVudC5hc3BlY3RSYXRpbykgewoJCQkJaWYgKHdpZHRoID4gbWF4V2lkdGgpIHsKCQkJCQl3aWR0aCAgPSBtYXhXaWR0aDsKCQkJCQloZWlnaHQgPSBnZXRTY2FsYXIod2lkdGggLyByYXRpbyk7CgkJCQl9CgoJCQkJaWYgKGhlaWdodCA+IG1heEhlaWdodCkgewoJCQkJCWhlaWdodCA9IG1heEhlaWdodDsKCQkJCQl3aWR0aCAgPSBnZXRTY2FsYXIoaGVpZ2h0ICogcmF0aW8pOwoJCQkJfQoKCQkJCWlmICh3aWR0aCA8IG1pbldpZHRoKSB7CgkJCQkJd2lkdGggID0gbWluV2lkdGg7CgkJCQkJaGVpZ2h0ID0gZ2V0U2NhbGFyKHdpZHRoIC8gcmF0aW8pOwoJCQkJfQoKCQkJCWlmIChoZWlnaHQgPCBtaW5IZWlnaHQpIHsKCQkJCQloZWlnaHQgPSBtaW5IZWlnaHQ7CgkJCQkJd2lkdGggID0gZ2V0U2NhbGFyKGhlaWdodCAqIHJhdGlvKTsKCQkJCX0KCgkJCX0gZWxzZSB7CgkJCQl3aWR0aCA9IE1hdGgubWF4KG1pbldpZHRoLCBNYXRoLm1pbih3aWR0aCwgbWF4V2lkdGgpKTsKCgkJCQlpZiAoY3VycmVudC5hdXRvSGVpZ2h0ICYmIGN1cnJlbnQudHlwZSAhPT0gJ2lmcmFtZScpIHsKCQkJCQlpbm5lci53aWR0aCggd2lkdGggKTsKCgkJCQkJaGVpZ2h0ID0gaW5uZXIuaGVpZ2h0KCk7CgkJCQl9CgoJCQkJaGVpZ2h0ID0gTWF0aC5tYXgobWluSGVpZ2h0LCBNYXRoLm1pbihoZWlnaHQsIG1heEhlaWdodCkpOwoJCQl9CgoJCQkvLyBUcnkgdG8gZml0IGluc2lkZSB2aWV3cG9ydCAoaW5jbHVkaW5nIHRoZSB0aXRsZSkKCQkJaWYgKGN1cnJlbnQuZml0VG9WaWV3KSB7CgkJCQlpbm5lci53aWR0aCggd2lkdGggKS5oZWlnaHQoIGhlaWdodCApOwoKCQkJCXdyYXAud2lkdGgoIHdpZHRoICsgd1BhZGRpbmcgKTsKCgkJCQkvLyBSZWFsIHdyYXAgZGltZW5zaW9ucwoJCQkJd2lkdGhfICA9IHdyYXAud2lkdGgoKTsKCQkJCWhlaWdodF8gPSB3cmFwLmhlaWdodCgpOwoKCQkJCWlmIChjdXJyZW50LmFzcGVjdFJhdGlvKSB7CgkJCQkJd2hpbGUgKCh3aWR0aF8gPiBtYXhXaWR0aF8gfHwgaGVpZ2h0XyA+IG1heEhlaWdodF8pICYmIHdpZHRoID4gbWluV2lkdGggJiYgaGVpZ2h0ID4gbWluSGVpZ2h0KSB7CgkJCQkJCWlmIChzdGVwcysrID4gMTkpIHsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgoJCQkJCQloZWlnaHQgPSBNYXRoLm1heChtaW5IZWlnaHQsIE1hdGgubWluKG1heEhlaWdodCwgaGVpZ2h0IC0gMTApKTsKCQkJCQkJd2lkdGggID0gZ2V0U2NhbGFyKGhlaWdodCAqIHJhdGlvKTsKCgkJCQkJCWlmICh3aWR0aCA8IG1pbldpZHRoKSB7CgkJCQkJCQl3aWR0aCAgPSBtaW5XaWR0aDsKCQkJCQkJCWhlaWdodCA9IGdldFNjYWxhcih3aWR0aCAvIHJhdGlvKTsKCQkJCQkJfQoKCQkJCQkJaWYgKHdpZHRoID4gbWF4V2lkdGgpIHsKCQkJCQkJCXdpZHRoICA9IG1heFdpZHRoOwoJCQkJCQkJaGVpZ2h0ID0gZ2V0U2NhbGFyKHdpZHRoIC8gcmF0aW8pOwoJCQkJCQl9CgoJCQkJCQlpbm5lci53aWR0aCggd2lkdGggKS5oZWlnaHQoIGhlaWdodCApOwoKCQkJCQkJd3JhcC53aWR0aCggd2lkdGggKyB3UGFkZGluZyApOwoKCQkJCQkJd2lkdGhfICA9IHdyYXAud2lkdGgoKTsKCQkJCQkJaGVpZ2h0XyA9IHdyYXAuaGVpZ2h0KCk7CgkJCQkJfQoKCQkJCX0gZWxzZSB7CgkJCQkJd2lkdGggID0gTWF0aC5tYXgobWluV2lkdGgsICBNYXRoLm1pbih3aWR0aCwgIHdpZHRoICAtICh3aWR0aF8gIC0gbWF4V2lkdGhfKSkpOwoJCQkJCWhlaWdodCA9IE1hdGgubWF4KG1pbkhlaWdodCwgTWF0aC5taW4oaGVpZ2h0LCBoZWlnaHQgLSAoaGVpZ2h0XyAtIG1heEhlaWdodF8pKSk7CgkJCQl9CgkJCX0KCgkJCWlmIChzY3JvbGxPdXQgJiYgc2Nyb2xsaW5nID09PSAnYXV0bycgJiYgaGVpZ2h0IDwgb3JpZ0hlaWdodCAmJiAod2lkdGggKyB3UGFkZGluZyArIHNjcm9sbE91dCkgPCBtYXhXaWR0aF8pIHsKCQkJCXdpZHRoICs9IHNjcm9sbE91dDsKCQkJfQoKCQkJaW5uZXIud2lkdGgoIHdpZHRoICkuaGVpZ2h0KCBoZWlnaHQgKTsKCgkJCXdyYXAud2lkdGgoIHdpZHRoICsgd1BhZGRpbmcgKTsKCgkJCXdpZHRoXyAgPSB3cmFwLndpZHRoKCk7CgkJCWhlaWdodF8gPSB3cmFwLmhlaWdodCgpOwoKCQkJY2FuU2hyaW5rID0gKHdpZHRoXyA+IG1heFdpZHRoXyB8fCBoZWlnaHRfID4gbWF4SGVpZ2h0XykgJiYgd2lkdGggPiBtaW5XaWR0aCAmJiBoZWlnaHQgPiBtaW5IZWlnaHQ7CgkJCWNhbkV4cGFuZCA9IGN1cnJlbnQuYXNwZWN0UmF0aW8gPyAod2lkdGggPCBvcmlnTWF4V2lkdGggJiYgaGVpZ2h0IDwgb3JpZ01heEhlaWdodCAmJiB3aWR0aCA8IG9yaWdXaWR0aCAmJiBoZWlnaHQgPCBvcmlnSGVpZ2h0KSA6ICgod2lkdGggPCBvcmlnTWF4V2lkdGggfHwgaGVpZ2h0IDwgb3JpZ01heEhlaWdodCkgJiYgKHdpZHRoIDwgb3JpZ1dpZHRoIHx8IGhlaWdodCA8IG9yaWdIZWlnaHQpKTsKCgkJCSQuZXh0ZW5kKGN1cnJlbnQsIHsKCQkJCWRpbSA6IHsKCQkJCQl3aWR0aAk6IGdldFZhbHVlKCB3aWR0aF8gKSwKCQkJCQloZWlnaHQJOiBnZXRWYWx1ZSggaGVpZ2h0XyApCgkJCQl9LAoJCQkJb3JpZ1dpZHRoICA6IG9yaWdXaWR0aCwKCQkJCW9yaWdIZWlnaHQgOiBvcmlnSGVpZ2h0LAoJCQkJY2FuU2hyaW5rICA6IGNhblNocmluaywKCQkJCWNhbkV4cGFuZCAgOiBjYW5FeHBhbmQsCgkJCQl3UGFkZGluZyAgIDogd1BhZGRpbmcsCgkJCQloUGFkZGluZyAgIDogaFBhZGRpbmcsCgkJCQl3cmFwU3BhY2UgIDogaGVpZ2h0XyAtIHNraW4ub3V0ZXJIZWlnaHQodHJ1ZSksCgkJCQlza2luU3BhY2UgIDogc2tpbi5oZWlnaHQoKSAtIGhlaWdodAoJCQl9KTsKCgkJCWlmICghaWZyYW1lICYmIGN1cnJlbnQuYXV0b0hlaWdodCAmJiBoZWlnaHQgPiBtaW5IZWlnaHQgJiYgaGVpZ2h0IDwgbWF4SGVpZ2h0ICYmICFjYW5FeHBhbmQpIHsKCQkJCWlubmVyLmhlaWdodCgnYXV0bycpOwoJCQl9CgkJfSwKCgkJX2dldFBvc2l0aW9uOiBmdW5jdGlvbiAob25seUFic29sdXRlKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCXZpZXdwb3J0ID0gRi5nZXRWaWV3cG9ydCgpLAoJCQkJbWFyZ2luICAgPSBjdXJyZW50Lm1hcmdpbiwKCQkJCXdpZHRoICAgID0gRi53cmFwLndpZHRoKCkgICsgbWFyZ2luWzFdICsgbWFyZ2luWzNdLAoJCQkJaGVpZ2h0ICAgPSBGLndyYXAuaGVpZ2h0KCkgKyBtYXJnaW5bMF0gKyBtYXJnaW5bMl0sCgkJCQlyZXogICAgICA9IHsKCQkJCQlwb3NpdGlvbjogJ2Fic29sdXRlJywKCQkJCQl0b3AgIDogbWFyZ2luWzBdLAoJCQkJCWxlZnQgOiBtYXJnaW5bM10KCQkJCX07CgoJCQlpZiAoY3VycmVudC5hdXRvQ2VudGVyICYmIGN1cnJlbnQuZml4ZWQgJiYgIW9ubHlBYnNvbHV0ZSAmJiBoZWlnaHQgPD0gdmlld3BvcnQuaCAmJiB3aWR0aCA8PSB2aWV3cG9ydC53KSB7CgkJCQlyZXoucG9zaXRpb24gPSAnZml4ZWQnOwoKCQkJfSBlbHNlIGlmICghY3VycmVudC5sb2NrZWQpIHsKCQkJCXJlei50b3AgICs9IHZpZXdwb3J0Lnk7CgkJCQlyZXoubGVmdCArPSB2aWV3cG9ydC54OwoJCQl9CgoJCQlyZXoudG9wICA9IGdldFZhbHVlKE1hdGgubWF4KHJlei50b3AsICByZXoudG9wICArICgodmlld3BvcnQuaCAtIGhlaWdodCkgKiBjdXJyZW50LnRvcFJhdGlvKSkpOwoJCQlyZXoubGVmdCA9IGdldFZhbHVlKE1hdGgubWF4KHJlei5sZWZ0LCByZXoubGVmdCArICgodmlld3BvcnQudyAtIHdpZHRoKSAgKiBjdXJyZW50LmxlZnRSYXRpbykpKTsKCgkJCXJldHVybiByZXo7CgkJfSwKCgkJX2FmdGVyWm9vbUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ID0gRi5jdXJyZW50OwoKCQkJaWYgKCFjdXJyZW50KSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCUYuaXNPcGVuID0gRi5pc09wZW5lZCA9IHRydWU7CgoJCQlGLndyYXAuY3NzKCdvdmVyZmxvdycsICd2aXNpYmxlJykuYWRkQ2xhc3MoJ2ZhbmN5Ym94LW9wZW5lZCcpOwoKCQkJRi51cGRhdGUoKTsKCgkJCS8vIEFzc2lnbiBhIGNsaWNrIGV2ZW50CgkJCWlmICggY3VycmVudC5jbG9zZUNsaWNrIHx8IChjdXJyZW50Lm5leHRDbGljayAmJiBGLmdyb3VwLmxlbmd0aCA+IDEpICkgewoJCQkJRi5pbm5lci5jc3MoJ2N1cnNvcicsICdwb2ludGVyJykuYmluZCgnY2xpY2suZmInLCBmdW5jdGlvbihlKSB7CgkJCQkJaWYgKCEkKGUudGFyZ2V0KS5pcygnYScpICYmICEkKGUudGFyZ2V0KS5wYXJlbnQoKS5pcygnYScpKSB7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCgkJCQkJCUZbIGN1cnJlbnQuY2xvc2VDbGljayA/ICdjbG9zZScgOiAnbmV4dCcgXSgpOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQkvLyBDcmVhdGUgYSBjbG9zZSBidXR0b24KCQkJaWYgKGN1cnJlbnQuY2xvc2VCdG4pIHsKCQkJCSQoY3VycmVudC50cGwuY2xvc2VCdG4pLmFwcGVuZFRvKEYuc2tpbikuYmluZCggaXNUb3VjaCA/ICd0b3VjaHN0YXJ0LmZiJyA6ICdjbGljay5mYicsIGZ1bmN0aW9uKGUpIHsKCQkJCQllLnByZXZlbnREZWZhdWx0KCk7CgoJCQkJCUYuY2xvc2UoKTsKCQkJCX0pOwoJCQl9CgoJCQkvLyBDcmVhdGUgbmF2aWdhdGlvbiBhcnJvd3MKCQkJaWYgKGN1cnJlbnQuYXJyb3dzICYmIEYuZ3JvdXAubGVuZ3RoID4gMSkgewoJCQkJaWYgKGN1cnJlbnQubG9vcCB8fCBjdXJyZW50LmluZGV4ID4gMCkgewoJCQkJCSQoY3VycmVudC50cGwucHJldikuYXBwZW5kVG8oRi5vdXRlcikuYmluZCgnY2xpY2suZmInLCBGLnByZXYpOwoJCQkJfQoKCQkJCWlmIChjdXJyZW50Lmxvb3AgfHwgY3VycmVudC5pbmRleCA8IEYuZ3JvdXAubGVuZ3RoIC0gMSkgewoJCQkJCSQoY3VycmVudC50cGwubmV4dCkuYXBwZW5kVG8oRi5vdXRlcikuYmluZCgnY2xpY2suZmInLCBGLm5leHQpOwoJCQkJfQoJCQl9CgoJCQlGLnRyaWdnZXIoJ2FmdGVyU2hvdycpOwoKCQkJLy8gU3RvcCB0aGUgc2xpZGVzaG93IGlmIHRoaXMgaXMgdGhlIGxhc3QgaXRlbQoJCQlpZiAoIWN1cnJlbnQubG9vcCAmJiBjdXJyZW50LmluZGV4ID09PSBjdXJyZW50Lmdyb3VwLmxlbmd0aCAtIDEpIHsKCQkJCUYucGxheSggZmFsc2UgKTsKCgkJCX0gZWxzZSBpZiAoRi5vcHRzLmF1dG9QbGF5ICYmICFGLnBsYXllci5pc0FjdGl2ZSkgewoJCQkJRi5vcHRzLmF1dG9QbGF5ID0gZmFsc2U7CgoJCQkJRi5wbGF5KCk7CgkJCX0KCQl9LAoKCQlfYWZ0ZXJab29tT3V0OiBmdW5jdGlvbiAoIG9iaiApIHsKCQkJb2JqID0gb2JqIHx8IEYuY3VycmVudDsKCgkJCSQoJy5mYW5jeWJveC13cmFwJykudHJpZ2dlcignb25SZXNldCcpLnJlbW92ZSgpOwoKCQkJJC5leHRlbmQoRiwgewoJCQkJZ3JvdXAgIDoge30sCgkJCQlvcHRzICAgOiB7fSwKCQkJCXJvdXRlciA6IGZhbHNlLAoJCQkJY3VycmVudCAgIDogbnVsbCwKCQkJCWlzQWN0aXZlICA6IGZhbHNlLAoJCQkJaXNPcGVuZWQgIDogZmFsc2UsCgkJCQlpc09wZW4gICAgOiBmYWxzZSwKCQkJCWlzQ2xvc2luZyA6IGZhbHNlLAoJCQkJd3JhcCAgIDogbnVsbCwKCQkJCXNraW4gICA6IG51bGwsCgkJCQlvdXRlciAgOiBudWxsLAoJCQkJaW5uZXIgIDogbnVsbAoJCQl9KTsKCgkJCUYudHJpZ2dlcignYWZ0ZXJDbG9zZScsIG9iaik7CgkJfQoJfSk7CgoJLyoKCSAqCURlZmF1bHQgdHJhbnNpdGlvbnMKCSAqLwoKCUYudHJhbnNpdGlvbnMgPSB7CgkJZ2V0T3JpZ1Bvc2l0aW9uOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCWVsZW1lbnQgID0gY3VycmVudC5lbGVtZW50LAoJCQkJb3JpZyAgICAgPSBjdXJyZW50Lm9yaWcsCgkJCQlwb3MgICAgICA9IHt9LAoJCQkJd2lkdGggICAgPSA1MCwKCQkJCWhlaWdodCAgID0gNTAsCgkJCQloUGFkZGluZyA9IGN1cnJlbnQuaFBhZGRpbmcsCgkJCQl3UGFkZGluZyA9IGN1cnJlbnQud1BhZGRpbmcsCgkJCQl2aWV3cG9ydCA9IEYuZ2V0Vmlld3BvcnQoKTsKCgkJCWlmICghb3JpZyAmJiBjdXJyZW50LmlzRG9tICYmIGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHsKCQkJCW9yaWcgPSBlbGVtZW50LmZpbmQoJ2ltZzpmaXJzdCcpOwoKCQkJCWlmICghb3JpZy5sZW5ndGgpIHsKCQkJCQlvcmlnID0gZWxlbWVudDsKCQkJCX0KCQkJfQoKCQkJaWYgKGlzUXVlcnkob3JpZykpIHsKCQkJCXBvcyA9IG9yaWcub2Zmc2V0KCk7CgoJCQkJaWYgKG9yaWcuaXMoJ2ltZycpKSB7CgkJCQkJd2lkdGggID0gb3JpZy5vdXRlcldpZHRoKCk7CgkJCQkJaGVpZ2h0ID0gb3JpZy5vdXRlckhlaWdodCgpOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXBvcy50b3AgID0gdmlld3BvcnQueSArICh2aWV3cG9ydC5oIC0gaGVpZ2h0KSAqIGN1cnJlbnQudG9wUmF0aW87CgkJCQlwb3MubGVmdCA9IHZpZXdwb3J0LnggKyAodmlld3BvcnQudyAtIHdpZHRoKSAgKiBjdXJyZW50LmxlZnRSYXRpbzsKCQkJfQoKCQkJaWYgKEYud3JhcC5jc3MoJ3Bvc2l0aW9uJykgPT09ICdmaXhlZCcgfHwgY3VycmVudC5sb2NrZWQpIHsKCQkJCXBvcy50b3AgIC09IHZpZXdwb3J0Lnk7CgkJCQlwb3MubGVmdCAtPSB2aWV3cG9ydC54OwoJCQl9CgoJCQlwb3MgPSB7CgkJCQl0b3AgICAgIDogZ2V0VmFsdWUocG9zLnRvcCAgLSBoUGFkZGluZyAqIGN1cnJlbnQudG9wUmF0aW8pLAoJCQkJbGVmdCAgICA6IGdldFZhbHVlKHBvcy5sZWZ0IC0gd1BhZGRpbmcgKiBjdXJyZW50LmxlZnRSYXRpbyksCgkJCQl3aWR0aCAgIDogZ2V0VmFsdWUod2lkdGggICsgd1BhZGRpbmcpLAoJCQkJaGVpZ2h0ICA6IGdldFZhbHVlKGhlaWdodCArIGhQYWRkaW5nKQoJCQl9OwoKCQkJcmV0dXJuIHBvczsKCQl9LAoKCQlzdGVwOiBmdW5jdGlvbiAobm93LCBmeCkgewoJCQl2YXIgcmF0aW8sCgkJCQlwYWRkaW5nLAoJCQkJdmFsdWUsCgkJCQlwcm9wICAgICAgID0gZngucHJvcCwKCQkJCWN1cnJlbnQgICAgPSBGLmN1cnJlbnQsCgkJCQl3cmFwU3BhY2UgID0gY3VycmVudC53cmFwU3BhY2UsCgkJCQlza2luU3BhY2UgID0gY3VycmVudC5za2luU3BhY2U7CgoJCQlpZiAocHJvcCA9PT0gJ3dpZHRoJyB8fCBwcm9wID09PSAnaGVpZ2h0JykgewoJCQkJcmF0aW8gPSBmeC5lbmQgPT09IGZ4LnN0YXJ0ID8gMSA6IChub3cgLSBmeC5zdGFydCkgLyAoZnguZW5kIC0gZnguc3RhcnQpOwoKCQkJCWlmIChGLmlzQ2xvc2luZykgewoJCQkJCXJhdGlvID0gMSAtIHJhdGlvOwoJCQkJfQoKCQkJCXBhZGRpbmcgPSBwcm9wID09PSAnd2lkdGgnID8gY3VycmVudC53UGFkZGluZyA6IGN1cnJlbnQuaFBhZGRpbmc7CgkJCQl2YWx1ZSAgID0gbm93IC0gcGFkZGluZzsKCgkJCQlGLnNraW5bIHByb3AgXSggIGdldFNjYWxhciggcHJvcCA9PT0gJ3dpZHRoJyA/ICB2YWx1ZSA6IHZhbHVlIC0gKHdyYXBTcGFjZSAqIHJhdGlvKSApICk7CgkJCQlGLmlubmVyWyBwcm9wIF0oIGdldFNjYWxhciggcHJvcCA9PT0gJ3dpZHRoJyA/ICB2YWx1ZSA6IHZhbHVlIC0gKHdyYXBTcGFjZSAqIHJhdGlvKSAtIChza2luU3BhY2UgKiByYXRpbykgKSApOwoJCQl9CgkJfSwKCgkJem9vbUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCXN0YXJ0UG9zID0gY3VycmVudC5wb3MsCgkJCQllZmZlY3QgICA9IGN1cnJlbnQub3BlbkVmZmVjdCwKCQkJCWVsYXN0aWMgID0gZWZmZWN0ID09PSAnZWxhc3RpYycsCgkJCQllbmRQb3MgICA9ICQuZXh0ZW5kKHtvcGFjaXR5IDogMX0sIHN0YXJ0UG9zKTsKCgkJCS8vIFJlbW92ZSAicG9zaXRpb24iIHByb3BlcnR5IHRoYXQgYnJlYWtzIG9sZGVyIElFCgkJCWRlbGV0ZSBlbmRQb3MucG9zaXRpb247CgoJCQlpZiAoZWxhc3RpYykgewoJCQkJc3RhcnRQb3MgPSB0aGlzLmdldE9yaWdQb3NpdGlvbigpOwoKCQkJCWlmIChjdXJyZW50Lm9wZW5PcGFjaXR5KSB7CgkJCQkJc3RhcnRQb3Mub3BhY2l0eSA9IDAuMTsKCQkJCX0KCgkJCX0gZWxzZSBpZiAoZWZmZWN0ID09PSAnZmFkZScpIHsKCQkJCXN0YXJ0UG9zLm9wYWNpdHkgPSAwLjE7CgkJCX0KCgkJCUYud3JhcC5jc3Moc3RhcnRQb3MpLmFuaW1hdGUoZW5kUG9zLCB7CgkJCQlkdXJhdGlvbiA6IGVmZmVjdCA9PT0gJ25vbmUnID8gMCA6IGN1cnJlbnQub3BlblNwZWVkLAoJCQkJZWFzaW5nICAgOiBjdXJyZW50Lm9wZW5FYXNpbmcsCgkJCQlzdGVwICAgICA6IGVsYXN0aWMgPyB0aGlzLnN0ZXAgOiBudWxsLAoJCQkJY29tcGxldGUgOiBGLl9hZnRlclpvb21JbgoJCQl9KTsKCQl9LAoKCQl6b29tT3V0OiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICA9IEYuY3VycmVudCwKCQkJCWVmZmVjdCAgID0gY3VycmVudC5jbG9zZUVmZmVjdCwKCQkJCWVsYXN0aWMgID0gZWZmZWN0ID09PSAnZWxhc3RpYycsCgkJCQllbmRQb3MgICA9IHtvcGFjaXR5IDogMC4xfTsKCgkJCWlmIChlbGFzdGljKSB7CgkJCQllbmRQb3MgPSB0aGlzLmdldE9yaWdQb3NpdGlvbigpOwoKCQkJCWlmIChjdXJyZW50LmNsb3NlT3BhY2l0eSkgewoJCQkJCWVuZFBvcy5vcGFjaXR5ID0gMC4xOwoJCQkJfQoJCQl9CgoJCQlGLndyYXAuYW5pbWF0ZShlbmRQb3MsIHsKCQkJCWR1cmF0aW9uIDogZWZmZWN0ID09PSAnbm9uZScgPyAwIDogY3VycmVudC5jbG9zZVNwZWVkLAoJCQkJZWFzaW5nICAgOiBjdXJyZW50LmNsb3NlRWFzaW5nLAoJCQkJc3RlcCAgICAgOiBlbGFzdGljID8gdGhpcy5zdGVwIDogbnVsbCwKCQkJCWNvbXBsZXRlIDogRi5fYWZ0ZXJab29tT3V0CgkJCX0pOwoJCX0sCgoJCWNoYW5nZUluOiBmdW5jdGlvbiAoKSB7CgkJCXZhciBjdXJyZW50ICAgPSBGLmN1cnJlbnQsCgkJCQllZmZlY3QgICAgPSBjdXJyZW50Lm5leHRFZmZlY3QsCgkJCQlzdGFydFBvcyAgPSBjdXJyZW50LnBvcywKCQkJCWVuZFBvcyAgICA9IHsgb3BhY2l0eSA6IDEgfSwKCQkJCWRpcmVjdGlvbiA9IEYuZGlyZWN0aW9uLAoJCQkJZGlzdGFuY2UgID0gMjAwLAoJCQkJZmllbGQ7CgoJCQlzdGFydFBvcy5vcGFjaXR5ID0gMC4xOwoKCQkJaWYgKGVmZmVjdCA9PT0gJ2VsYXN0aWMnKSB7CgkJCQlmaWVsZCA9IGRpcmVjdGlvbiA9PT0gJ2Rvd24nIHx8IGRpcmVjdGlvbiA9PT0gJ3VwJyA/ICd0b3AnIDogJ2xlZnQnOwoKCQkJCWlmIChkaXJlY3Rpb24gPT09ICdkb3duJyB8fCBkaXJlY3Rpb24gPT09ICdyaWdodCcpIHsKCQkJCQlzdGFydFBvc1sgZmllbGQgXSA9IGdldFZhbHVlKGdldFNjYWxhcihzdGFydFBvc1sgZmllbGQgXSkgLSBkaXN0YW5jZSk7CgkJCQkJZW5kUG9zWyBmaWVsZCBdICAgPSAnKz0nICsgZGlzdGFuY2UgKyAncHgnOwoKCQkJCX0gZWxzZSB7CgkJCQkJc3RhcnRQb3NbIGZpZWxkIF0gPSBnZXRWYWx1ZShnZXRTY2FsYXIoc3RhcnRQb3NbIGZpZWxkIF0pICsgZGlzdGFuY2UpOwoJCQkJCWVuZFBvc1sgZmllbGQgXSAgID0gJy09JyArIGRpc3RhbmNlICsgJ3B4JzsKCQkJCX0KCQkJfQoKCQkJLy8gV29ya2Fyb3VuZCBmb3IgaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIyNzMKCQkJaWYgKGVmZmVjdCA9PT0gJ25vbmUnKSB7CgkJCQlGLl9hZnRlclpvb21JbigpOwoKCQkJfSBlbHNlIHsKCQkJCUYud3JhcC5jc3Moc3RhcnRQb3MpLmFuaW1hdGUoZW5kUG9zLCB7CgkJCQkJZHVyYXRpb24gOiBjdXJyZW50Lm5leHRTcGVlZCwKCQkJCQllYXNpbmcgICA6IGN1cnJlbnQubmV4dEVhc2luZywKCQkJCQljb21wbGV0ZSA6IGZ1bmN0aW9uKCkgewoJCQkJCQkvLyBUaGlzIGhlbHBzIEZpcmVGb3ggdG8gcHJvcGVybHkgcmVuZGVyIHRoZSBib3gKCQkJCQkJc2V0VGltZW91dChGLl9hZnRlclpvb21JbiwgMjApOwoJCQkJCX0KCQkJCX0pOwoJCQl9CgkJfSwKCgkJY2hhbmdlT3V0OiBmdW5jdGlvbiAoKSB7CgkJCXZhciBwcmV2aW91cyAgPSBGLnByZXZpb3VzLAoJCQkJZWZmZWN0ICAgID0gcHJldmlvdXMucHJldkVmZmVjdCwKCQkJCWVuZFBvcyAgICA9IHsgb3BhY2l0eSA6IDAuMSB9LAoJCQkJZGlyZWN0aW9uID0gRi5kaXJlY3Rpb24sCgkJCQlkaXN0YW5jZSAgPSAyMDA7CgoJCQlpZiAoZWZmZWN0ID09PSAnZWxhc3RpYycpIHsKCQkJCWVuZFBvc1sgZGlyZWN0aW9uID09PSAnZG93bicgfHwgZGlyZWN0aW9uID09PSAndXAnID8gJ3RvcCcgOiAnbGVmdCcgXSA9ICggZGlyZWN0aW9uID09PSAndXAnIHx8IGRpcmVjdGlvbiA9PT0gJ2xlZnQnID8gJy0nIDogJysnICkgKyAnPScgKyBkaXN0YW5jZSArICdweCc7CgkJCX0KCgkJCXByZXZpb3VzLndyYXAuYW5pbWF0ZShlbmRQb3MsIHsKCQkJCWR1cmF0aW9uIDogZWZmZWN0ID09PSAnbm9uZScgPyAwIDogcHJldmlvdXMucHJldlNwZWVkLAoJCQkJZWFzaW5nICAgOiBwcmV2aW91cy5wcmV2RWFzaW5nLAoJCQkJY29tcGxldGUgOiBmdW5jdGlvbiAoKSB7CgkJCQkJJCh0aGlzKS50cmlnZ2VyKCdvblJlc2V0JykucmVtb3ZlKCk7CgkJCQl9CgkJCX0pOwoJCX0KCX07CgoJLyoKCSAqCU92ZXJsYXkgaGVscGVyCgkgKi8KCglGLmhlbHBlcnMub3ZlcmxheSA9IHsKCQlkZWZhdWx0cyA6IHsKCQkJY2xvc2VDbGljayA6IHRydWUsICAvLyBpZiB0cnVlLCBmYW5jeUJveCB3aWxsIGJlIGNsb3NlZCB3aGVuIHVzZXIgY2xpY2tzIG9uIHRoZSBvdmVybGF5CgkJCXNwZWVkT3V0ICAgOiAyMDAsICAgLy8gZHVyYXRpb24gb2YgZmFkZU91dCBhbmltYXRpb24KCQkJc2hvd0Vhcmx5ICA6IHRydWUsICAvLyBpbmRpY2F0ZXMgaWYgc2hvdWxkIGJlIG9wZW5lZCBpbW1lZGlhdGVseSBvciB3YWl0IHVudGlsIHRoZSBjb250ZW50IGlzIHJlYWR5CgkJCWNzcyAgICAgICAgOiB7fSwgICAgLy8gY3VzdG9tIENTUyBwcm9wZXJ0aWVzCgkJCWxvY2tlZCAgICAgOiAhaXNUb3VjaCwgIC8vIGlmIHRydWUsIHRoZSBjb250ZW50IHdpbGwgYmUgbG9ja2VkIGludG8gb3ZlcmxheQoJCQlmaXhlZCAgICAgIDogdHJ1ZSAgIC8vIGlmIGZhbHNlLCB0aGUgb3ZlcmxheSBDU1MgcG9zaXRpb24gcHJvcGVydHkgd2lsbCBub3QgYmUgc2V0IHRvICJmaXhlZCIKCQl9LAoKCQlvdmVybGF5IDogbnVsbCwgICAvLyBjdXJyZW50IGhhbmRsZQoJCWZpeGVkICAgOiBmYWxzZSwgIC8vIGluZGljYXRlcyBpZiB0aGUgb3ZlcmxheSBoYXMgcG9zaXRpb24gImZpeGVkIgoKCQkvLyBQdWJsaWMgbWV0aG9kcwoJCWNyZWF0ZSA6IGZ1bmN0aW9uKG9wdHMpIHsKCQkJb3B0cyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRzKTsKCgkJCWlmICh0aGlzLm92ZXJsYXkpIHsKCQkJCXRoaXMuY2xvc2UoKTsKCQkJfQoKCQkJdGhpcy5vdmVybGF5ID0gJCgnPGRpdiBjbGFzcz0iZmFuY3lib3gtb3ZlcmxheSI+PC9kaXY+JykuYXBwZW5kVG8oICdib2R5JyApOwoJCQl0aGlzLmZpeGVkICAgPSBmYWxzZTsKCgkJCWlmIChvcHRzLmZpeGVkICYmIEYuZGVmYXVsdHMuZml4ZWQpIHsKCQkJCXRoaXMub3ZlcmxheS5hZGRDbGFzcygnZmFuY3lib3gtb3ZlcmxheS1maXhlZCcpOwoKCQkJCXRoaXMuZml4ZWQgPSB0cnVlOwoJCQl9CgkJfSwKCgkJb3BlbiA6IGZ1bmN0aW9uKG9wdHMpIHsKCQkJdmFyIHRoYXQgPSB0aGlzOwoKCQkJb3B0cyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRzKTsKCgkJCWlmICh0aGlzLm92ZXJsYXkpIHsKCQkJCXRoaXMub3ZlcmxheS51bmJpbmQoJy5vdmVybGF5Jykud2lkdGgoJ2F1dG8nKS5oZWlnaHQoJ2F1dG8nKTsKCgkJCX0gZWxzZSB7CgkJCQl0aGlzLmNyZWF0ZShvcHRzKTsKCQkJfQoKCQkJaWYgKCF0aGlzLmZpeGVkKSB7CgkJCQlXLmJpbmQoJ3Jlc2l6ZS5vdmVybGF5JywgJC5wcm94eSggdGhpcy51cGRhdGUsIHRoaXMpICk7CgoJCQkJdGhpcy51cGRhdGUoKTsKCQkJfQoKCQkJaWYgKG9wdHMuY2xvc2VDbGljaykgewoJCQkJdGhpcy5vdmVybGF5LmJpbmQoJ2NsaWNrLm92ZXJsYXknLCBmdW5jdGlvbihlKSB7CgkJCQkJaWYgKCQoZS50YXJnZXQpLmhhc0NsYXNzKCdmYW5jeWJveC1vdmVybGF5JykpIHsKCQkJCQkJaWYgKEYuaXNBY3RpdmUpIHsKCQkJCQkJCUYuY2xvc2UoKTsKCQkJCQkJfSBlbHNlIHsKCQkJCQkJCXRoYXQuY2xvc2UoKTsKCQkJCQkJfQoJCQkJCX0KCQkJCX0pOwoJCQl9CgoJCQl0aGlzLm92ZXJsYXkuY3NzKCBvcHRzLmNzcyApLnNob3coKTsKCQl9LAoKCQljbG9zZSA6IGZ1bmN0aW9uKCkgewoJCQkkKCcuZmFuY3lib3gtb3ZlcmxheScpLnJlbW92ZSgpOwoKCQkJVy51bmJpbmQoJ3Jlc2l6ZS5vdmVybGF5Jyk7CgoJCQl0aGlzLm92ZXJsYXkgPSBudWxsOwoKCQkJaWYgKHRoaXMubWFyZ2luICE9PSBmYWxzZSkgewoJCQkJJCgnYm9keScpLmNzcygnbWFyZ2luLXJpZ2h0JywgdGhpcy5tYXJnaW4pOwoKCQkJCXRoaXMubWFyZ2luID0gZmFsc2U7CgkJCX0KCgkJCWlmICh0aGlzLmVsKSB7CgkJCQl0aGlzLmVsLnJlbW92ZUNsYXNzKCdmYW5jeWJveC1sb2NrJyk7CgkJCX0KCQl9LAoKCQkvLyBQcml2YXRlLCBjYWxsYmFja3MKCgkJdXBkYXRlIDogZnVuY3Rpb24gKCkgewoJCQl2YXIgd2lkdGggPSAnMTAwJScsIG9mZnNldFdpZHRoOwoKCQkJLy8gUmVzZXQgd2lkdGgvaGVpZ2h0IHNvIGl0IHdpbGwgbm90IG1lc3MKCQkJdGhpcy5vdmVybGF5LndpZHRoKHdpZHRoKS5oZWlnaHQoJzEwMCUnKTsKCgkJCS8vIGpRdWVyeSBkb2VzIG5vdCByZXR1cm4gcmVsaWFibGUgcmVzdWx0IGZvciBJRQoJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCW9mZnNldFdpZHRoID0gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldFdpZHRoLCBkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoKTsKCgkJCQlpZiAoRC53aWR0aCgpID4gb2Zmc2V0V2lkdGgpIHsKCQkJCQl3aWR0aCA9IEQud2lkdGgoKTsKCQkJCX0KCgkJCX0gZWxzZSBpZiAoRC53aWR0aCgpID4gVy53aWR0aCgpKSB7CgkJCQl3aWR0aCA9IEQud2lkdGgoKTsKCQkJfQoKCQkJdGhpcy5vdmVybGF5LndpZHRoKHdpZHRoKS5oZWlnaHQoRC5oZWlnaHQoKSk7CgkJfSwKCgkJLy8gVGhpcyBpcyB3aGVyZSB3ZSBjYW4gbWFuaXB1bGF0ZSBET00sIGJlY2F1c2UgbGF0ZXIgaXQgd291bGQgY2F1c2UgaWZyYW1lcyB0byByZWxvYWQKCQlvblJlYWR5IDogZnVuY3Rpb24gKG9wdHMsIG9iaikgewoJCQkkKCcuZmFuY3lib3gtb3ZlcmxheScpLnN0b3AodHJ1ZSwgdHJ1ZSk7CgoJCQlpZiAoIXRoaXMub3ZlcmxheSkgewoJCQkJdGhpcy5tYXJnaW4gPSBELmhlaWdodCgpID4gVy5oZWlnaHQoKSB8fCAkKCdib2R5JykuY3NzKCdvdmVyZmxvdy15JykgPT09ICdzY3JvbGwnID8gJCgnYm9keScpLmNzcygnbWFyZ2luLXJpZ2h0JykgOiBmYWxzZTsKCQkJCXRoaXMuZWwgICAgID0gZG9jdW1lbnQuYWxsICYmICFkb2N1bWVudC5xdWVyeVNlbGVjdG9yID8gJCgnaHRtbCcpIDogJCgnYm9keScpOwoKCQkJCXRoaXMuY3JlYXRlKG9wdHMpOwoJCQl9CgoJCQlpZiAob3B0cy5sb2NrZWQgJiYgdGhpcy5maXhlZCkgewoJCQkJb2JqLmxvY2tlZCA9IHRoaXMub3ZlcmxheS5hcHBlbmQoIG9iai53cmFwICk7CgkJCQlvYmouZml4ZWQgID0gZmFsc2U7CgkJCX0KCgkJCWlmIChvcHRzLnNob3dFYXJseSA9PT0gdHJ1ZSkgewoJCQkJdGhpcy5iZWZvcmVTaG93LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CgkJCX0KCQl9LAoKCQliZWZvcmVTaG93IDogZnVuY3Rpb24ob3B0cywgb2JqKSB7CgkJCWlmIChvYmoubG9ja2VkKSB7CgkJCQl0aGlzLmVsLmFkZENsYXNzKCdmYW5jeWJveC1sb2NrJyk7CgoJCQkJaWYgKHRoaXMubWFyZ2luICE9PSBmYWxzZSkgewoJCQkJCSQoJ2JvZHknKS5jc3MoJ21hcmdpbi1yaWdodCcsIGdldFNjYWxhciggdGhpcy5tYXJnaW4gKSArIG9iai5zY3JvbGxiYXJXaWR0aCk7CgkJCQl9CgkJCX0KCgkJCXRoaXMub3BlbihvcHRzKTsKCQl9LAoKCQlvblVwZGF0ZSA6IGZ1bmN0aW9uKCkgewoJCQlpZiAoIXRoaXMuZml4ZWQpIHsKCQkJCXRoaXMudXBkYXRlKCk7CgkJCX0KCQl9LAoKCQlhZnRlckNsb3NlOiBmdW5jdGlvbiAob3B0cykgewoJCQkvLyBSZW1vdmUgb3ZlcmxheSBpZiBleGlzdHMgYW5kIGZhbmN5Qm94IGlzIG5vdCBvcGVuaW5nCgkJCS8vIChlLmcuLCBpdCBpcyBub3QgYmVpbmcgb3BlbiB1c2luZyBhZnRlckNsb3NlIGNhbGxiYWNrKQoJCQlpZiAodGhpcy5vdmVybGF5ICYmICFGLmlzQWN0aXZlKSB7CgkJCQl0aGlzLm92ZXJsYXkuZmFkZU91dChvcHRzLnNwZWVkT3V0LCAkLnByb3h5KCB0aGlzLmNsb3NlLCB0aGlzICkpOwoJCQl9CgkJfQoJfTsKCgkvKgoJICoJVGl0bGUgaGVscGVyCgkgKi8KCglGLmhlbHBlcnMudGl0bGUgPSB7CgkJZGVmYXVsdHMgOiB7CgkJCXR5cGUgICAgIDogJ2Zsb2F0JywgLy8gJ2Zsb2F0JywgJ2luc2lkZScsICdvdXRzaWRlJyBvciAnb3ZlcicsCgkJCXBvc2l0aW9uIDogJ2JvdHRvbScgLy8gJ3RvcCcgb3IgJ2JvdHRvbScKCQl9LAoKCQliZWZvcmVTaG93OiBmdW5jdGlvbiAob3B0cykgewoJCQl2YXIgY3VycmVudCA9IEYuY3VycmVudCwKCQkJCXRleHQgICAgPSBjdXJyZW50LnRpdGxlLAoJCQkJdHlwZSAgICA9IG9wdHMudHlwZSwKCQkJCXRpdGxlLAoJCQkJdGFyZ2V0OwoKCQkJaWYgKCQuaXNGdW5jdGlvbih0ZXh0KSkgewoJCQkJdGV4dCA9IHRleHQuY2FsbChjdXJyZW50LmVsZW1lbnQsIGN1cnJlbnQpOwoJCQl9CgoJCQlpZiAoIWlzU3RyaW5nKHRleHQpIHx8ICQudHJpbSh0ZXh0KSA9PT0gJycpIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJdGl0bGUgPSAkKCc8ZGl2IGNsYXNzPSJmYW5jeWJveC10aXRsZSBmYW5jeWJveC10aXRsZS0nICsgdHlwZSArICctd3JhcCI+JyArIHRleHQgKyAnPC9kaXY+Jyk7CgoJCQlzd2l0Y2ggKHR5cGUpIHsKCQkJCWNhc2UgJ2luc2lkZSc6CgkJCQkJdGFyZ2V0ID0gRi5za2luOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnb3V0c2lkZSc6CgkJCQkJdGFyZ2V0ID0gRi53cmFwOwoJCQkJYnJlYWs7CgoJCQkJY2FzZSAnb3Zlcic6CgkJCQkJdGFyZ2V0ID0gRi5pbm5lcjsKCQkJCWJyZWFrOwoKCQkJCWRlZmF1bHQ6IC8vICdmbG9hdCcKCQkJCQl0YXJnZXQgPSBGLnNraW47CgoJCQkJCXRpdGxlLmFwcGVuZFRvKCdib2R5Jyk7CgoJCQkJCWlmICgkLmJyb3dzZXIubXNpZSkgewoJCQkJCQl0aXRsZS53aWR0aCggdGl0bGUud2lkdGgoKSApOwoJCQkJCX0KCgkJCQkJdGl0bGUud3JhcElubmVyKCc8c3BhbiBjbGFzcz0iY2hpbGQiPjwvc3Bhbj4nKTsKCgkJCQkJLy9JbmNyZWFzZSBib3R0b20gbWFyZ2luIHNvIHRoaXMgdGl0bGUgd2lsbCBhbHNvIGZpdCBpbnRvIHZpZXdwb3J0CgkJCQkJRi5jdXJyZW50Lm1hcmdpblsyXSArPSBNYXRoLmFicyggZ2V0U2NhbGFyKHRpdGxlLmNzcygnbWFyZ2luLWJvdHRvbScpKSApOwoJCQkJYnJlYWs7CgkJCX0KCgkJCXRpdGxlWyAob3B0cy5wb3NpdGlvbiA9PT0gJ3RvcCcgPyAncHJlcGVuZFRvJyAgOiAnYXBwZW5kVG8nKSBdKHRhcmdldCk7CgkJfQoJfTsKCgkvLyBqUXVlcnkgcGx1Z2luIGluaXRpYWxpemF0aW9uCgkkLmZuLmZhbmN5Ym94ID0gZnVuY3Rpb24gKG9wdGlvbnMpIHsKCQl2YXIgaW5kZXgsCgkJCXRoYXQgICAgID0gJCh0aGlzKSwKCQkJc2VsZWN0b3IgPSB0aGlzLnNlbGVjdG9yIHx8ICcnLAoJCQlydW4gICAgICA9IGZ1bmN0aW9uKGUpIHsKCQkJCXZhciB3aGF0ID0gJCh0aGlzKS5ibHVyKCksIGlkeCA9IGluZGV4LCByZWxUeXBlLCByZWxWYWw7CgoJCQkJaWYgKCEoZS5jdHJsS2V5IHx8IGUuYWx0S2V5IHx8IGUuc2hpZnRLZXkgfHwgZS5tZXRhS2V5KSAmJiAhd2hhdC5pcygnLmZhbmN5Ym94LXdyYXAnKSkgewoJCQkJCXJlbFR5cGUgPSBvcHRpb25zLmdyb3VwQXR0ciB8fCAnZGF0YS1mYW5jeWJveC1ncm91cCc7CgkJCQkJcmVsVmFsICA9IHdoYXQuYXR0cihyZWxUeXBlKTsKCgkJCQkJaWYgKCFyZWxWYWwpIHsKCQkJCQkJcmVsVHlwZSA9ICdyZWwnOwoJCQkJCQlyZWxWYWwgID0gd2hhdC5nZXQoMClbIHJlbFR5cGUgXTsKCQkJCQl9CgoJCQkJCWlmIChyZWxWYWwgJiYgcmVsVmFsICE9PSAnJyAmJiByZWxWYWwgIT09ICdub2ZvbGxvdycpIHsKCQkJCQkJd2hhdCA9IHNlbGVjdG9yLmxlbmd0aCA/ICQoc2VsZWN0b3IpIDogdGhhdDsKCQkJCQkJd2hhdCA9IHdoYXQuZmlsdGVyKCdbJyArIHJlbFR5cGUgKyAnPSInICsgcmVsVmFsICsgJyJdJyk7CgkJCQkJCWlkeCAgPSB3aGF0LmluZGV4KHRoaXMpOwoJCQkJCX0KCgkJCQkJb3B0aW9ucy5pbmRleCA9IGlkeDsKCgkJCQkJLy8gU3RvcCBhbiBldmVudCBmcm9tIGJ1YmJsaW5nIGlmIGV2ZXJ5dGhpbmcgaXMgZmluZQoJCQkJCWlmIChGLm9wZW4od2hhdCwgb3B0aW9ucykgIT09IGZhbHNlKSB7CgkJCQkJCWUucHJldmVudERlZmF1bHQoKTsKCQkJCQl9CgkJCQl9CgkJCX07CgoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWluZGV4ICAgPSBvcHRpb25zLmluZGV4IHx8IDA7CgoJCWlmICghc2VsZWN0b3IgfHwgb3B0aW9ucy5saXZlID09PSBmYWxzZSkgewoJCQl0aGF0LnVuYmluZCgnY2xpY2suZmItc3RhcnQnKS5iaW5kKCdjbGljay5mYi1zdGFydCcsIHJ1bik7CgoJCX0gZWxzZSB7CgkJCUQudW5kZWxlZ2F0ZShzZWxlY3RvciwgJ2NsaWNrLmZiLXN0YXJ0JykuZGVsZWdhdGUoc2VsZWN0b3IgKyAiOm5vdCgnLmZhbmN5Ym94LWl0ZW0sIC5mYW5jeWJveC1uYXYnKSIsICdjbGljay5mYi1zdGFydCcsIHJ1bik7CgkJfQoKCQl0aGlzLmZpbHRlcignW2RhdGEtZmFuY3lib3gtc3RhcnQ9MV0nKS50cmlnZ2VyKCdjbGljaycpOwoKCQlyZXR1cm4gdGhpczsKCX07CgoJLy8gVGVzdHMgdGhhdCBuZWVkIGEgYm9keSBhdCBkb2MgcmVhZHkKCUQucmVhZHkoZnVuY3Rpb24oKSB7CgkJaWYgKCAkLnNjcm9sbGJhcldpZHRoID09PSB1bmRlZmluZWQgKSB7CgkJCS8vIGh0dHA6Ly9iZW5hbG1hbi5jb20vcHJvamVjdHMvanF1ZXJ5LW1pc2MtcGx1Z2lucy8jc2Nyb2xsYmFyd2lkdGgKCQkJJC5zY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uKCkgewoJCQkJdmFyIHBhcmVudCA9ICQoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0byI+PGRpdi8+PC9kaXY+JykuYXBwZW5kVG8oJ2JvZHknKSwKCQkJCQljaGlsZCAgPSBwYXJlbnQuY2hpbGRyZW4oKSwKCQkJCQl3aWR0aCAgPSBjaGlsZC5pbm5lcldpZHRoKCkgLSBjaGlsZC5oZWlnaHQoIDk5ICkuaW5uZXJXaWR0aCgpOwoKCQkJCXBhcmVudC5yZW1vdmUoKTsKCgkJCQlyZXR1cm4gd2lkdGg7CgkJCX07CgkJfQoKCQlpZiAoICQuc3VwcG9ydC5maXhlZFBvc2l0aW9uID09PSB1bmRlZmluZWQgKSB7CgkJCSQuc3VwcG9ydC5maXhlZFBvc2l0aW9uID0gKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGVsZW0gID0gJCgnPGRpdiBzdHlsZT0icG9zaXRpb246Zml4ZWQ7dG9wOjIwcHg7Ij48L2Rpdj4nKS5hcHBlbmRUbygnYm9keScpLAoJCQkJCWZpeGVkID0gKCBlbGVtWzBdLm9mZnNldFRvcCA9PT0gMjAgfHwgZWxlbVswXS5vZmZzZXRUb3AgPT09IDE1ICk7CgoJCQkJZWxlbS5yZW1vdmUoKTsKCgkJCQlyZXR1cm4gZml4ZWQ7CgkJCX0oKSk7CgkJfQoKCQkkLmV4dGVuZChGLmRlZmF1bHRzLCB7CgkJCXNjcm9sbGJhcldpZHRoIDogJC5zY3JvbGxiYXJXaWR0aCgpLAoJCQlmaXhlZCAgOiAkLnN1cHBvcnQuZml4ZWRQb3NpdGlvbiwKCQkJcGFyZW50IDogJCgnYm9keScpCgkJfSk7Cgl9KTsKCn0od2luZG93LCBkb2N1bWVudCwgalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.fancybox.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGZhbmN5Qm94IHYyLjEuMyBmYW5jeWFwcHMuY29tIHwgZmFuY3lhcHBzLmNvbS9mYW5jeWJveC8jbGljZW5zZSAqLwooZnVuY3Rpb24oQix4LGYscSl7dmFyIHI9ZihCKSxtPWYoeCksYj1mLmZhbmN5Ym94PWZ1bmN0aW9uKCl7Yi5vcGVuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sdT1udWxsLG49eC5jcmVhdGVUb3VjaCE9PXEscz1mdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5oYXNPd25Qcm9wZXJ0eSYmYSBpbnN0YW5jZW9mIGZ9LHA9ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJiJzdHJpbmciPT09Zi50eXBlKGEpfSxFPWZ1bmN0aW9uKGEpe3JldHVybiBwKGEpJiYwPGEuaW5kZXhPZigiJSIpfSxrPWZ1bmN0aW9uKGEsZCl7dmFyIGU9cGFyc2VJbnQoYSwxMCl8fDA7ZCYmRShhKSYmKGUqPWIuZ2V0Vmlld3BvcnQoKVtkXS8xMDApO3JldHVybiBNYXRoLmNlaWwoZSl9LHY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gayhhLGIpKyJweCJ9O2YuZXh0ZW5kKGIse3ZlcnNpb246IjIuMS4zIixkZWZhdWx0czp7cGFkZGluZzoxNSxtYXJnaW46MjAsd2lkdGg6ODAwLGhlaWdodDo2MDAsbWluV2lkdGg6MTAwLG1pbkhlaWdodDoxMDAsCm1heFdpZHRoOjk5OTksbWF4SGVpZ2h0Ojk5OTksYXV0b1NpemU6ITAsYXV0b0hlaWdodDohMSxhdXRvV2lkdGg6ITEsYXV0b1Jlc2l6ZTohMCxhdXRvQ2VudGVyOiFuLGZpdFRvVmlldzohMCxhc3BlY3RSYXRpbzohMSx0b3BSYXRpbzowLjUsbGVmdFJhdGlvOjAuNSxzY3JvbGxpbmc6ImF1dG8iLHdyYXBDU1M6IiIsYXJyb3dzOiEwLGNsb3NlQnRuOiEwLGNsb3NlQ2xpY2s6ITEsbmV4dENsaWNrOiExLG1vdXNlV2hlZWw6ITAsYXV0b1BsYXk6ITEscGxheVNwZWVkOjNFMyxwcmVsb2FkOjMsbW9kYWw6ITEsbG9vcDohMCxhamF4OntkYXRhVHlwZToiaHRtbCIsaGVhZGVyczp7IlgtZmFuY3lCb3giOiEwfX0saWZyYW1lOntzY3JvbGxpbmc6ImF1dG8iLHByZWxvYWQ6ITB9LHN3Zjp7d21vZGU6InRyYW5zcGFyZW50IixhbGxvd2Z1bGxzY3JlZW46InRydWUiLGFsbG93c2NyaXB0YWNjZXNzOiJhbHdheXMifSxrZXlzOntuZXh0OnsxMzoibGVmdCIsMzQ6InVwIiwzOToibGVmdCIsNDA6InVwIn0sCnByZXY6ezg6InJpZ2h0IiwzMzoiZG93biIsMzc6InJpZ2h0IiwzODoiZG93biJ9LGNsb3NlOlsyN10scGxheTpbMzJdLHRvZ2dsZTpbNzBdfSxkaXJlY3Rpb246e25leHQ6ImxlZnQiLHByZXY6InJpZ2h0In0sc2Nyb2xsT3V0c2lkZTohMCxpbmRleDowLHR5cGU6bnVsbCxocmVmOm51bGwsY29udGVudDpudWxsLHRpdGxlOm51bGwsdHBsOnt3cmFwOic8ZGl2IGNsYXNzPSJmYW5jeWJveC13cmFwIiB0YWJJbmRleD0iLTEiPjxkaXYgY2xhc3M9ImZhbmN5Ym94LXNraW4iPjxkaXYgY2xhc3M9ImZhbmN5Ym94LW91dGVyIj48ZGl2IGNsYXNzPSJmYW5jeWJveC1pbm5lciI+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+JyxpbWFnZTonPGltZyBjbGFzcz0iZmFuY3lib3gtaW1hZ2UiIHNyYz0ie2hyZWZ9IiBhbHQ9IiIgLz4nLGlmcmFtZTonPGlmcmFtZSBpZD0iZmFuY3lib3gtZnJhbWV7cm5kfSIgbmFtZT0iZmFuY3lib3gtZnJhbWV7cm5kfSIgY2xhc3M9ImZhbmN5Ym94LWlmcmFtZSIgZnJhbWVib3JkZXI9IjAiIHZzcGFjZT0iMCIgaHNwYWNlPSIwIiB3ZWJraXRBbGxvd0Z1bGxTY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93RnVsbFNjcmVlbicrCihmLmJyb3dzZXIubXNpZT8nIGFsbG93dHJhbnNwYXJlbmN5PSJ0cnVlIic6IiIpKyI+PC9pZnJhbWU+IixlcnJvcjonPHAgY2xhc3M9ImZhbmN5Ym94LWVycm9yIj5UaGUgcmVxdWVzdGVkIGNvbnRlbnQgY2Fubm90IGJlIGxvYWRlZC48YnIvPlBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuPC9wPicsY2xvc2VCdG46JzxhIHRpdGxlPSJDbG9zZSIgY2xhc3M9ImZhbmN5Ym94LWl0ZW0gZmFuY3lib3gtY2xvc2UiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PC9hPicsbmV4dDonPGEgdGl0bGU9Ik5leHQiIGNsYXNzPSJmYW5jeWJveC1uYXYgZmFuY3lib3gtbmV4dCIgaHJlZj0iamF2YXNjcmlwdDo7Ij48c3Bhbj48L3NwYW4+PC9hPicscHJldjonPGEgdGl0bGU9IlByZXZpb3VzIiBjbGFzcz0iZmFuY3lib3gtbmF2IGZhbmN5Ym94LXByZXYiIGhyZWY9ImphdmFzY3JpcHQ6OyI+PHNwYW4+PC9zcGFuPjwvYT4nfSxvcGVuRWZmZWN0OiJmYWRlIixvcGVuU3BlZWQ6MjUwLG9wZW5FYXNpbmc6InN3aW5nIiwKb3Blbk9wYWNpdHk6ITAsb3Blbk1ldGhvZDoiem9vbUluIixjbG9zZUVmZmVjdDoiZmFkZSIsY2xvc2VTcGVlZDoyNTAsY2xvc2VFYXNpbmc6InN3aW5nIixjbG9zZU9wYWNpdHk6ITAsY2xvc2VNZXRob2Q6Inpvb21PdXQiLG5leHRFZmZlY3Q6ImVsYXN0aWMiLG5leHRTcGVlZDoyNTAsbmV4dEVhc2luZzoic3dpbmciLG5leHRNZXRob2Q6ImNoYW5nZUluIixwcmV2RWZmZWN0OiJlbGFzdGljIixwcmV2U3BlZWQ6MjUwLHByZXZFYXNpbmc6InN3aW5nIixwcmV2TWV0aG9kOiJjaGFuZ2VPdXQiLGhlbHBlcnM6e292ZXJsYXk6ITAsdGl0bGU6ITB9LG9uQ2FuY2VsOmYubm9vcCxiZWZvcmVMb2FkOmYubm9vcCxhZnRlckxvYWQ6Zi5ub29wLGJlZm9yZVNob3c6Zi5ub29wLGFmdGVyU2hvdzpmLm5vb3AsYmVmb3JlQ2hhbmdlOmYubm9vcCxiZWZvcmVDbG9zZTpmLm5vb3AsYWZ0ZXJDbG9zZTpmLm5vb3B9LGdyb3VwOnt9LG9wdHM6e30scHJldmlvdXM6bnVsbCxjb21pbmc6bnVsbCxjdXJyZW50Om51bGwsCmlzQWN0aXZlOiExLGlzT3BlbjohMSxpc09wZW5lZDohMSx3cmFwOm51bGwsc2tpbjpudWxsLG91dGVyOm51bGwsaW5uZXI6bnVsbCxwbGF5ZXI6e3RpbWVyOm51bGwsaXNBY3RpdmU6ITF9LGFqYXhMb2FkOm51bGwsaW1nUHJlbG9hZDpudWxsLHRyYW5zaXRpb25zOnt9LGhlbHBlcnM6e30sb3BlbjpmdW5jdGlvbihhLGQpe2lmKGEmJihmLmlzUGxhaW5PYmplY3QoZCl8fChkPXt9KSwhMSE9PWIuY2xvc2UoITApKSlyZXR1cm4gZi5pc0FycmF5KGEpfHwoYT1zKGEpP2YoYSkuZ2V0KCk6W2FdKSxmLmVhY2goYSxmdW5jdGlvbihlLGMpe3ZhciBqPXt9LGcsaCxpLGwsazsib2JqZWN0Ij09PWYudHlwZShjKSYmKGMubm9kZVR5cGUmJihjPWYoYykpLHMoYyk/KGo9e2hyZWY6Yy5kYXRhKCJmYW5jeWJveC1ocmVmIil8fGMuYXR0cigiaHJlZiIpLHRpdGxlOmMuZGF0YSgiZmFuY3lib3gtdGl0bGUiKXx8Yy5hdHRyKCJ0aXRsZSIpLGlzRG9tOiEwLGVsZW1lbnQ6Y30sZi5tZXRhZGF0YSYmZi5leHRlbmQoITAsCmosYy5tZXRhZGF0YSgpKSk6aj1jKTtnPWQuaHJlZnx8ai5ocmVmfHwocChjKT9jOm51bGwpO2g9ZC50aXRsZSE9PXE/ZC50aXRsZTpqLnRpdGxlfHwiIjtsPShpPWQuY29udGVudHx8ai5jb250ZW50KT8iaHRtbCI6ZC50eXBlfHxqLnR5cGU7IWwmJmouaXNEb20mJihsPWMuZGF0YSgiZmFuY3lib3gtdHlwZSIpLGx8fChsPShsPWMucHJvcCgiY2xhc3MiKS5tYXRjaCgvZmFuY3lib3hcLihcdyspLykpP2xbMV06bnVsbCkpO3AoZykmJihsfHwoYi5pc0ltYWdlKGcpP2w9ImltYWdlIjpiLmlzU1dGKGcpP2w9InN3ZiI6IiMiPT09Zy5jaGFyQXQoMCk/bD0iaW5saW5lIjpwKGMpJiYobD0iaHRtbCIsaT1jKSksImFqYXgiPT09bCYmKGs9Zy5zcGxpdCgvXHMrLywyKSxnPWsuc2hpZnQoKSxrPWsuc2hpZnQoKSkpO2l8fCgiaW5saW5lIj09PWw/Zz9pPWYocChnKT9nLnJlcGxhY2UoLy4qKD89I1teXHNdKyQpLywiIik6Zyk6ai5pc0RvbSYmKGk9Yyk6Imh0bWwiPT09bD9pPWc6IWwmJighZyYmCmouaXNEb20pJiYobD0iaW5saW5lIixpPWMpKTtmLmV4dGVuZChqLHtocmVmOmcsdHlwZTpsLGNvbnRlbnQ6aSx0aXRsZTpoLHNlbGVjdG9yOmt9KTthW2VdPWp9KSxiLm9wdHM9Zi5leHRlbmQoITAse30sYi5kZWZhdWx0cyxkKSxkLmtleXMhPT1xJiYoYi5vcHRzLmtleXM9ZC5rZXlzP2YuZXh0ZW5kKHt9LGIuZGVmYXVsdHMua2V5cyxkLmtleXMpOiExKSxiLmdyb3VwPWEsYi5fc3RhcnQoYi5vcHRzLmluZGV4KX0sY2FuY2VsOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jb21pbmc7YSYmITEhPT1iLnRyaWdnZXIoIm9uQ2FuY2VsIikmJihiLmhpZGVMb2FkaW5nKCksYi5hamF4TG9hZCYmYi5hamF4TG9hZC5hYm9ydCgpLGIuYWpheExvYWQ9bnVsbCxiLmltZ1ByZWxvYWQmJihiLmltZ1ByZWxvYWQub25sb2FkPWIuaW1nUHJlbG9hZC5vbmVycm9yPW51bGwpLGEud3JhcCYmYS53cmFwLnN0b3AoITAsITApLnRyaWdnZXIoIm9uUmVzZXQiKS5yZW1vdmUoKSxiLmNvbWluZz1udWxsLGIuY3VycmVudHx8CmIuX2FmdGVyWm9vbU91dChhKSl9LGNsb3NlOmZ1bmN0aW9uKGEpe2IuY2FuY2VsKCk7ITEhPT1iLnRyaWdnZXIoImJlZm9yZUNsb3NlIikmJihiLnVuYmluZEV2ZW50cygpLGIuaXNBY3RpdmUmJighYi5pc09wZW58fCEwPT09YT8oZigiLmZhbmN5Ym94LXdyYXAiKS5zdG9wKCEwKS50cmlnZ2VyKCJvblJlc2V0IikucmVtb3ZlKCksYi5fYWZ0ZXJab29tT3V0KCkpOihiLmlzT3Blbj1iLmlzT3BlbmVkPSExLGIuaXNDbG9zaW5nPSEwLGYoIi5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2IikucmVtb3ZlKCksYi53cmFwLnN0b3AoITAsITApLnJlbW92ZUNsYXNzKCJmYW5jeWJveC1vcGVuZWQiKSxiLnRyYW5zaXRpb25zW2IuY3VycmVudC5jbG9zZU1ldGhvZF0oKSkpKX0scGxheTpmdW5jdGlvbihhKXt2YXIgZD1mdW5jdGlvbigpe2NsZWFyVGltZW91dChiLnBsYXllci50aW1lcil9LGU9ZnVuY3Rpb24oKXtkKCk7Yi5jdXJyZW50JiZiLnBsYXllci5pc0FjdGl2ZSYmKGIucGxheWVyLnRpbWVyPQpzZXRUaW1lb3V0KGIubmV4dCxiLmN1cnJlbnQucGxheVNwZWVkKSl9LGM9ZnVuY3Rpb24oKXtkKCk7ZigiYm9keSIpLnVuYmluZCgiLnBsYXllciIpO2IucGxheWVyLmlzQWN0aXZlPSExO2IudHJpZ2dlcigib25QbGF5RW5kIil9O2lmKCEwPT09YXx8IWIucGxheWVyLmlzQWN0aXZlJiYhMSE9PWEpe2lmKGIuY3VycmVudCYmKGIuY3VycmVudC5sb29wfHxiLmN1cnJlbnQuaW5kZXg8Yi5ncm91cC5sZW5ndGgtMSkpYi5wbGF5ZXIuaXNBY3RpdmU9ITAsZigiYm9keSIpLmJpbmQoeyJhZnRlclNob3cucGxheWVyIG9uVXBkYXRlLnBsYXllciI6ZSwib25DYW5jZWwucGxheWVyIGJlZm9yZUNsb3NlLnBsYXllciI6YywiYmVmb3JlTG9hZC5wbGF5ZXIiOmR9KSxlKCksYi50cmlnZ2VyKCJvblBsYXlTdGFydCIpfWVsc2UgYygpfSxuZXh0OmZ1bmN0aW9uKGEpe3ZhciBkPWIuY3VycmVudDtkJiYocChhKXx8KGE9ZC5kaXJlY3Rpb24ubmV4dCksYi5qdW1wdG8oZC5pbmRleCsxLGEsIm5leHQiKSl9LApwcmV2OmZ1bmN0aW9uKGEpe3ZhciBkPWIuY3VycmVudDtkJiYocChhKXx8KGE9ZC5kaXJlY3Rpb24ucHJldiksYi5qdW1wdG8oZC5pbmRleC0xLGEsInByZXYiKSl9LGp1bXB0bzpmdW5jdGlvbihhLGQsZSl7dmFyIGM9Yi5jdXJyZW50O2MmJihhPWsoYSksYi5kaXJlY3Rpb249ZHx8Yy5kaXJlY3Rpb25bYT49Yy5pbmRleD8ibmV4dCI6InByZXYiXSxiLnJvdXRlcj1lfHwianVtcHRvIixjLmxvb3AmJigwPmEmJihhPWMuZ3JvdXAubGVuZ3RoK2ElYy5ncm91cC5sZW5ndGgpLGElPWMuZ3JvdXAubGVuZ3RoKSxjLmdyb3VwW2FdIT09cSYmKGIuY2FuY2VsKCksYi5fc3RhcnQoYSkpKX0scmVwb3NpdGlvbjpmdW5jdGlvbihhLGQpe3ZhciBlPWIuY3VycmVudCxjPWU/ZS53cmFwOm51bGwsajtjJiYoaj1iLl9nZXRQb3NpdGlvbihkKSxhJiYic2Nyb2xsIj09PWEudHlwZT8oZGVsZXRlIGoucG9zaXRpb24sYy5zdG9wKCEwLCEwKS5hbmltYXRlKGosMjAwKSk6KGMuY3NzKGopLGUucG9zPWYuZXh0ZW5kKHt9LAplLmRpbSxqKSkpfSx1cGRhdGU6ZnVuY3Rpb24oYSl7dmFyIGQ9YSYmYS50eXBlLGU9IWR8fCJvcmllbnRhdGlvbmNoYW5nZSI9PT1kO2UmJihjbGVhclRpbWVvdXQodSksdT1udWxsKTtiLmlzT3BlbiYmIXUmJih1PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt2YXIgYz1iLmN1cnJlbnQ7YyYmIWIuaXNDbG9zaW5nJiYoYi53cmFwLnJlbW92ZUNsYXNzKCJmYW5jeWJveC10bXAiKSwoZXx8ImxvYWQiPT09ZHx8InJlc2l6ZSI9PT1kJiZjLmF1dG9SZXNpemUpJiZiLl9zZXREaW1lbnNpb24oKSwic2Nyb2xsIj09PWQmJmMuY2FuU2hyaW5rfHxiLnJlcG9zaXRpb24oYSksYi50cmlnZ2VyKCJvblVwZGF0ZSIpLHU9bnVsbCl9LGUmJiFuPzA6MzAwKSl9LHRvZ2dsZTpmdW5jdGlvbihhKXtiLmlzT3BlbiYmKGIuY3VycmVudC5maXRUb1ZpZXc9ImJvb2xlYW4iPT09Zi50eXBlKGEpP2E6IWIuY3VycmVudC5maXRUb1ZpZXcsbiYmKGIud3JhcC5yZW1vdmVBdHRyKCJzdHlsZSIpLmFkZENsYXNzKCJmYW5jeWJveC10bXAiKSwKYi50cmlnZ2VyKCJvblVwZGF0ZSIpKSxiLnVwZGF0ZSgpKX0saGlkZUxvYWRpbmc6ZnVuY3Rpb24oKXttLnVuYmluZCgiLmxvYWRpbmciKTtmKCIjZmFuY3lib3gtbG9hZGluZyIpLnJlbW92ZSgpfSxzaG93TG9hZGluZzpmdW5jdGlvbigpe3ZhciBhLGQ7Yi5oaWRlTG9hZGluZygpO2E9ZignPGRpdiBpZD0iZmFuY3lib3gtbG9hZGluZyI+PGRpdj48L2Rpdj48L2Rpdj4nKS5jbGljayhiLmNhbmNlbCkuYXBwZW5kVG8oImJvZHkiKTttLmJpbmQoImtleWRvd24ubG9hZGluZyIsZnVuY3Rpb24oYSl7aWYoMjc9PT0oYS53aGljaHx8YS5rZXlDb2RlKSlhLnByZXZlbnREZWZhdWx0KCksYi5jYW5jZWwoKX0pO2IuZGVmYXVsdHMuZml4ZWR8fChkPWIuZ2V0Vmlld3BvcnQoKSxhLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MC41KmQuaCtkLnksbGVmdDowLjUqZC53K2QueH0pKX0sZ2V0Vmlld3BvcnQ6ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQmJmIuY3VycmVudC5sb2NrZWR8fAohMSxkPXt4OnIuc2Nyb2xsTGVmdCgpLHk6ci5zY3JvbGxUb3AoKX07YT8oZC53PWFbMF0uY2xpZW50V2lkdGgsZC5oPWFbMF0uY2xpZW50SGVpZ2h0KTooZC53PW4mJkIuaW5uZXJXaWR0aD9CLmlubmVyV2lkdGg6ci53aWR0aCgpLGQuaD1uJiZCLmlubmVySGVpZ2h0P0IuaW5uZXJIZWlnaHQ6ci5oZWlnaHQoKSk7cmV0dXJuIGR9LHVuYmluZEV2ZW50czpmdW5jdGlvbigpe2Iud3JhcCYmcyhiLndyYXApJiZiLndyYXAudW5iaW5kKCIuZmIiKTttLnVuYmluZCgiLmZiIik7ci51bmJpbmQoIi5mYiIpfSxiaW5kRXZlbnRzOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jdXJyZW50LGQ7YSYmKHIuYmluZCgib3JpZW50YXRpb25jaGFuZ2UuZmIiKyhuPyIiOiIgcmVzaXplLmZiIikrKGEuYXV0b0NlbnRlciYmIWEubG9ja2VkPyIgc2Nyb2xsLmZiIjoiIiksYi51cGRhdGUpLChkPWEua2V5cykmJm0uYmluZCgia2V5ZG93bi5mYiIsZnVuY3Rpb24oZSl7dmFyIGM9ZS53aGljaHx8ZS5rZXlDb2RlLGo9CmUudGFyZ2V0fHxlLnNyY0VsZW1lbnQ7aWYoMjc9PT1jJiZiLmNvbWluZylyZXR1cm4hMTshZS5jdHJsS2V5JiYoIWUuYWx0S2V5JiYhZS5zaGlmdEtleSYmIWUubWV0YUtleSYmKCFqfHwhai50eXBlJiYhZihqKS5pcygiW2NvbnRlbnRlZGl0YWJsZV0iKSkpJiZmLmVhY2goZCxmdW5jdGlvbihkLGope2lmKDE8YS5ncm91cC5sZW5ndGgmJmpbY10hPT1xKXJldHVybiBiW2RdKGpbY10pLGUucHJldmVudERlZmF1bHQoKSwhMTtpZigtMTxmLmluQXJyYXkoYyxqKSlyZXR1cm4gYltkXSgpLGUucHJldmVudERlZmF1bHQoKSwhMX0pfSksZi5mbi5tb3VzZXdoZWVsJiZhLm1vdXNlV2hlZWwmJmIud3JhcC5iaW5kKCJtb3VzZXdoZWVsLmZiIixmdW5jdGlvbihkLGMsaixnKXtmb3IodmFyIGg9ZihkLnRhcmdldHx8bnVsbCksaT0hMTtoLmxlbmd0aCYmIWkmJiFoLmlzKCIuZmFuY3lib3gtc2tpbiIpJiYhaC5pcygiLmZhbmN5Ym94LXdyYXAiKTspaT1oWzBdJiYhKGhbMF0uc3R5bGUub3ZlcmZsb3cmJgoiaGlkZGVuIj09PWhbMF0uc3R5bGUub3ZlcmZsb3cpJiYoaFswXS5jbGllbnRXaWR0aCYmaFswXS5zY3JvbGxXaWR0aD5oWzBdLmNsaWVudFdpZHRofHxoWzBdLmNsaWVudEhlaWdodCYmaFswXS5zY3JvbGxIZWlnaHQ+aFswXS5jbGllbnRIZWlnaHQpLGg9ZihoKS5wYXJlbnQoKTtpZigwIT09YyYmIWkmJjE8Yi5ncm91cC5sZW5ndGgmJiFhLmNhblNocmluayl7aWYoMDxnfHwwPGopYi5wcmV2KDA8Zz8iZG93biI6ImxlZnQiKTtlbHNlIGlmKDA+Z3x8MD5qKWIubmV4dCgwPmc/InVwIjoicmlnaHQiKTtkLnByZXZlbnREZWZhdWx0KCl9fSkpfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsZCl7dmFyIGUsYz1kfHxiLmNvbWluZ3x8Yi5jdXJyZW50O2lmKGMpe2YuaXNGdW5jdGlvbihjW2FdKSYmKGU9Y1thXS5hcHBseShjLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSkpO2lmKCExPT09ZSlyZXR1cm4hMTtjLmhlbHBlcnMmJmYuZWFjaChjLmhlbHBlcnMsZnVuY3Rpb24oZCwKZSl7ZSYmKGIuaGVscGVyc1tkXSYmZi5pc0Z1bmN0aW9uKGIuaGVscGVyc1tkXVthXSkpJiYoZT1mLmV4dGVuZCghMCx7fSxiLmhlbHBlcnNbZF0uZGVmYXVsdHMsZSksYi5oZWxwZXJzW2RdW2FdKGUsYykpfSk7Zi5ldmVudC50cmlnZ2VyKGErIi5mYiIpfX0saXNJbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4gcChhKSYmYS5tYXRjaCgvKF5kYXRhOmltYWdlXC8uKiwpfChcLihqcChlfGd8ZWcpfGdpZnxwbmd8Ym1wfHdlYnApKChcP3wjKS4qKT8kKS9pKX0saXNTV0Y6ZnVuY3Rpb24oYSl7cmV0dXJuIHAoYSkmJmEubWF0Y2goL1wuKHN3ZikoKFw/fCMpLiopPyQvaSl9LF9zdGFydDpmdW5jdGlvbihhKXt2YXIgZD17fSxlLGMsYT1rKGEpO2U9Yi5ncm91cFthXXx8bnVsbDtpZighZSlyZXR1cm4hMTtkPWYuZXh0ZW5kKCEwLHt9LGIub3B0cyxlKTtlPWQubWFyZ2luO2M9ZC5wYWRkaW5nOyJudW1iZXIiPT09Zi50eXBlKGUpJiYoZC5tYXJnaW49W2UsZSxlLGVdKTsibnVtYmVyIj09PWYudHlwZShjKSYmCihkLnBhZGRpbmc9W2MsYyxjLGNdKTtkLm1vZGFsJiZmLmV4dGVuZCghMCxkLHtjbG9zZUJ0bjohMSxjbG9zZUNsaWNrOiExLG5leHRDbGljazohMSxhcnJvd3M6ITEsbW91c2VXaGVlbDohMSxrZXlzOm51bGwsaGVscGVyczp7b3ZlcmxheTp7Y2xvc2VDbGljazohMX19fSk7ZC5hdXRvU2l6ZSYmKGQuYXV0b1dpZHRoPWQuYXV0b0hlaWdodD0hMCk7ImF1dG8iPT09ZC53aWR0aCYmKGQuYXV0b1dpZHRoPSEwKTsiYXV0byI9PT1kLmhlaWdodCYmKGQuYXV0b0hlaWdodD0hMCk7ZC5ncm91cD1iLmdyb3VwO2QuaW5kZXg9YTtiLmNvbWluZz1kO2lmKCExPT09Yi50cmlnZ2VyKCJiZWZvcmVMb2FkIikpYi5jb21pbmc9bnVsbDtlbHNle2M9ZC50eXBlO2U9ZC5ocmVmO2lmKCFjKXJldHVybiBiLmNvbWluZz1udWxsLGIuY3VycmVudCYmYi5yb3V0ZXImJiJqdW1wdG8iIT09Yi5yb3V0ZXI/KGIuY3VycmVudC5pbmRleD1hLGJbYi5yb3V0ZXJdKGIuZGlyZWN0aW9uKSk6ITE7Yi5pc0FjdGl2ZT0KITA7aWYoImltYWdlIj09PWN8fCJzd2YiPT09YylkLmF1dG9IZWlnaHQ9ZC5hdXRvV2lkdGg9ITEsZC5zY3JvbGxpbmc9InZpc2libGUiOyJpbWFnZSI9PT1jJiYoZC5hc3BlY3RSYXRpbz0hMCk7ImlmcmFtZSI9PT1jJiZuJiYoZC5zY3JvbGxpbmc9InNjcm9sbCIpO2Qud3JhcD1mKGQudHBsLndyYXApLmFkZENsYXNzKCJmYW5jeWJveC0iKyhuPyJtb2JpbGUiOiJkZXNrdG9wIikrIiBmYW5jeWJveC10eXBlLSIrYysiIGZhbmN5Ym94LXRtcCAiK2Qud3JhcENTUykuYXBwZW5kVG8oZC5wYXJlbnR8fCJib2R5Iik7Zi5leHRlbmQoZCx7c2tpbjpmKCIuZmFuY3lib3gtc2tpbiIsZC53cmFwKSxvdXRlcjpmKCIuZmFuY3lib3gtb3V0ZXIiLGQud3JhcCksaW5uZXI6ZigiLmZhbmN5Ym94LWlubmVyIixkLndyYXApfSk7Zi5lYWNoKFsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZnVuY3Rpb24oYSxiKXtkLnNraW4uY3NzKCJwYWRkaW5nIitiLHYoZC5wYWRkaW5nW2FdKSl9KTtiLnRyaWdnZXIoIm9uUmVhZHkiKTsKaWYoImlubGluZSI9PT1jfHwiaHRtbCI9PT1jKXtpZighZC5jb250ZW50fHwhZC5jb250ZW50Lmxlbmd0aClyZXR1cm4gYi5fZXJyb3IoImNvbnRlbnQiKX1lbHNlIGlmKCFlKXJldHVybiBiLl9lcnJvcigiaHJlZiIpOyJpbWFnZSI9PT1jP2IuX2xvYWRJbWFnZSgpOiJhamF4Ij09PWM/Yi5fbG9hZEFqYXgoKToiaWZyYW1lIj09PWM/Yi5fbG9hZElmcmFtZSgpOmIuX2FmdGVyTG9hZCgpfX0sX2Vycm9yOmZ1bmN0aW9uKGEpe2YuZXh0ZW5kKGIuY29taW5nLHt0eXBlOiJodG1sIixhdXRvV2lkdGg6ITAsYXV0b0hlaWdodDohMCxtaW5XaWR0aDowLG1pbkhlaWdodDowLHNjcm9sbGluZzoibm8iLGhhc0Vycm9yOmEsY29udGVudDpiLmNvbWluZy50cGwuZXJyb3J9KTtiLl9hZnRlckxvYWQoKX0sX2xvYWRJbWFnZTpmdW5jdGlvbigpe3ZhciBhPWIuaW1nUHJlbG9hZD1uZXcgSW1hZ2U7YS5vbmxvYWQ9ZnVuY3Rpb24oKXt0aGlzLm9ubG9hZD10aGlzLm9uZXJyb3I9bnVsbDtiLmNvbWluZy53aWR0aD0KdGhpcy53aWR0aDtiLmNvbWluZy5oZWlnaHQ9dGhpcy5oZWlnaHQ7Yi5fYWZ0ZXJMb2FkKCl9O2Eub25lcnJvcj1mdW5jdGlvbigpe3RoaXMub25sb2FkPXRoaXMub25lcnJvcj1udWxsO2IuX2Vycm9yKCJpbWFnZSIpfTthLnNyYz1iLmNvbWluZy5ocmVmOyEwIT09YS5jb21wbGV0ZSYmYi5zaG93TG9hZGluZygpfSxfbG9hZEFqYXg6ZnVuY3Rpb24oKXt2YXIgYT1iLmNvbWluZztiLnNob3dMb2FkaW5nKCk7Yi5hamF4TG9hZD1mLmFqYXgoZi5leHRlbmQoe30sYS5hamF4LHt1cmw6YS5ocmVmLGVycm9yOmZ1bmN0aW9uKGEsZSl7Yi5jb21pbmcmJiJhYm9ydCIhPT1lP2IuX2Vycm9yKCJhamF4IixhKTpiLmhpZGVMb2FkaW5nKCl9LHN1Y2Nlc3M6ZnVuY3Rpb24oZCxlKXsic3VjY2VzcyI9PT1lJiYoYS5jb250ZW50PWQsYi5fYWZ0ZXJMb2FkKCkpfX0pKX0sX2xvYWRJZnJhbWU6ZnVuY3Rpb24oKXt2YXIgYT1iLmNvbWluZyxkPWYoYS50cGwuaWZyYW1lLnJlcGxhY2UoL1x7cm5kXH0vZywKKG5ldyBEYXRlKS5nZXRUaW1lKCkpKS5hdHRyKCJzY3JvbGxpbmciLG4/ImF1dG8iOmEuaWZyYW1lLnNjcm9sbGluZykuYXR0cigic3JjIixhLmhyZWYpO2YoYS53cmFwKS5iaW5kKCJvblJlc2V0IixmdW5jdGlvbigpe3RyeXtmKHRoaXMpLmZpbmQoImlmcmFtZSIpLmhpZGUoKS5hdHRyKCJzcmMiLCIvL2Fib3V0OmJsYW5rIikuZW5kKCkuZW1wdHkoKX1jYXRjaChhKXt9fSk7YS5pZnJhbWUucHJlbG9hZCYmKGIuc2hvd0xvYWRpbmcoKSxkLm9uZSgibG9hZCIsZnVuY3Rpb24oKXtmKHRoaXMpLmRhdGEoInJlYWR5IiwxKTtufHxmKHRoaXMpLmJpbmQoImxvYWQuZmIiLGIudXBkYXRlKTtmKHRoaXMpLnBhcmVudHMoIi5mYW5jeWJveC13cmFwIikud2lkdGgoIjEwMCUiKS5yZW1vdmVDbGFzcygiZmFuY3lib3gtdG1wIikuc2hvdygpO2IuX2FmdGVyTG9hZCgpfSkpO2EuY29udGVudD1kLmFwcGVuZFRvKGEuaW5uZXIpO2EuaWZyYW1lLnByZWxvYWR8fGIuX2FmdGVyTG9hZCgpfSxfcHJlbG9hZEltYWdlczpmdW5jdGlvbigpe3ZhciBhPQpiLmdyb3VwLGQ9Yi5jdXJyZW50LGU9YS5sZW5ndGgsYz1kLnByZWxvYWQ/TWF0aC5taW4oZC5wcmVsb2FkLGUtMSk6MCxmLGc7Zm9yKGc9MTtnPD1jO2crPTEpZj1hWyhkLmluZGV4K2cpJWVdLCJpbWFnZSI9PT1mLnR5cGUmJmYuaHJlZiYmKChuZXcgSW1hZ2UpLnNyYz1mLmhyZWYpfSxfYWZ0ZXJMb2FkOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jb21pbmcsZD1iLmN1cnJlbnQsZSxjLGosZyxoO2IuaGlkZUxvYWRpbmcoKTtpZihhJiYhMSE9PWIuaXNBY3RpdmUpaWYoITE9PT1iLnRyaWdnZXIoImFmdGVyTG9hZCIsYSxkKSlhLndyYXAuc3RvcCghMCkudHJpZ2dlcigib25SZXNldCIpLnJlbW92ZSgpLGIuY29taW5nPW51bGw7ZWxzZXtkJiYoYi50cmlnZ2VyKCJiZWZvcmVDaGFuZ2UiLGQpLGQud3JhcC5zdG9wKCEwKS5yZW1vdmVDbGFzcygiZmFuY3lib3gtb3BlbmVkIikuZmluZCgiLmZhbmN5Ym94LWl0ZW0sIC5mYW5jeWJveC1uYXYiKS5yZW1vdmUoKSk7Yi51bmJpbmRFdmVudHMoKTsKZT1hLmNvbnRlbnQ7Yz1hLnR5cGU7aj1hLnNjcm9sbGluZztmLmV4dGVuZChiLHt3cmFwOmEud3JhcCxza2luOmEuc2tpbixvdXRlcjphLm91dGVyLGlubmVyOmEuaW5uZXIsY3VycmVudDphLHByZXZpb3VzOmR9KTtnPWEuaHJlZjtzd2l0Y2goYyl7Y2FzZSAiaW5saW5lIjpjYXNlICJhamF4IjpjYXNlICJodG1sIjphLnNlbGVjdG9yP2U9ZigiPGRpdj4iKS5odG1sKGUpLmZpbmQoYS5zZWxlY3Rvcik6cyhlKSYmKGUuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiKXx8ZS5kYXRhKCJmYW5jeWJveC1wbGFjZWhvbGRlciIsZignPGRpdiBjbGFzcz0iZmFuY3lib3gtcGxhY2Vob2xkZXIiPjwvZGl2PicpLmluc2VydEFmdGVyKGUpLmhpZGUoKSksZT1lLnNob3coKS5kZXRhY2goKSxhLndyYXAuYmluZCgib25SZXNldCIsZnVuY3Rpb24oKXtmKHRoaXMpLmZpbmQoZSkubGVuZ3RoJiZlLmhpZGUoKS5yZXBsYWNlQWxsKGUuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiKSkuZGF0YSgiZmFuY3lib3gtcGxhY2Vob2xkZXIiLAohMSl9KSk7YnJlYWs7Y2FzZSAiaW1hZ2UiOmU9YS50cGwuaW1hZ2UucmVwbGFjZSgie2hyZWZ9IixnKTticmVhaztjYXNlICJzd2YiOmU9JzxvYmplY3QgaWQ9ImZhbmN5Ym94LXN3ZiIgY2xhc3NpZD0iY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIj48cGFyYW0gbmFtZT0ibW92aWUiIHZhbHVlPSInK2crJyI+PC9wYXJhbT4nLGg9IiIsZi5lYWNoKGEuc3dmLGZ1bmN0aW9uKGEsYil7ZSs9JzxwYXJhbSBuYW1lPSInK2ErJyIgdmFsdWU9IicrYisnIj48L3BhcmFtPic7aCs9IiAiK2ErJz0iJytiKyciJ30pLGUrPSc8ZW1iZWQgc3JjPSInK2crJyIgdHlwZT0iYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2giIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiJytoKyI+PC9lbWJlZD48L29iamVjdD4ifSghcyhlKXx8IWUucGFyZW50KCkuaXMoYS5pbm5lcikpJiZhLmlubmVyLmFwcGVuZChlKTtiLnRyaWdnZXIoImJlZm9yZVNob3ciKTsKYS5pbm5lci5jc3MoIm92ZXJmbG93IiwieWVzIj09PWo/InNjcm9sbCI6Im5vIj09PWo/ImhpZGRlbiI6aik7Yi5fc2V0RGltZW5zaW9uKCk7Yi5yZXBvc2l0aW9uKCk7Yi5pc09wZW49ITE7Yi5jb21pbmc9bnVsbDtiLmJpbmRFdmVudHMoKTtpZihiLmlzT3BlbmVkKXtpZihkLnByZXZNZXRob2QpYi50cmFuc2l0aW9uc1tkLnByZXZNZXRob2RdKCl9ZWxzZSBmKCIuZmFuY3lib3gtd3JhcCIpLm5vdChhLndyYXApLnN0b3AoITApLnRyaWdnZXIoIm9uUmVzZXQiKS5yZW1vdmUoKTtiLnRyYW5zaXRpb25zW2IuaXNPcGVuZWQ/YS5uZXh0TWV0aG9kOmEub3Blbk1ldGhvZF0oKTtiLl9wcmVsb2FkSW1hZ2VzKCl9fSxfc2V0RGltZW5zaW9uOmZ1bmN0aW9uKCl7dmFyIGE9Yi5nZXRWaWV3cG9ydCgpLGQ9MCxlPSExLGM9ITEsZT1iLndyYXAsaj1iLnNraW4sZz1iLmlubmVyLGg9Yi5jdXJyZW50LGM9aC53aWR0aCxpPWguaGVpZ2h0LGw9aC5taW5XaWR0aCx0PWgubWluSGVpZ2h0LG09aC5tYXhXaWR0aCwKbj1oLm1heEhlaWdodCxyPWguc2Nyb2xsaW5nLHA9aC5zY3JvbGxPdXRzaWRlP2guc2Nyb2xsYmFyV2lkdGg6MCx3PWgubWFyZ2luLHk9ayh3WzFdK3dbM10pLHE9ayh3WzBdK3dbMl0pLHgseixzLEMsQSxGLEIsRCx1O2UuYWRkKGopLmFkZChnKS53aWR0aCgiYXV0byIpLmhlaWdodCgiYXV0byIpLnJlbW92ZUNsYXNzKCJmYW5jeWJveC10bXAiKTt3PWsoai5vdXRlcldpZHRoKCEwKS1qLndpZHRoKCkpO3g9ayhqLm91dGVySGVpZ2h0KCEwKS1qLmhlaWdodCgpKTt6PXkrdztzPXEreDtDPUUoYyk/KGEudy16KSprKGMpLzEwMDpjO0E9RShpKT8oYS5oLXMpKmsoaSkvMTAwOmk7aWYoImlmcmFtZSI9PT1oLnR5cGUpe2lmKHU9aC5jb250ZW50LGguYXV0b0hlaWdodCYmMT09PXUuZGF0YSgicmVhZHkiKSl0cnl7dVswXS5jb250ZW50V2luZG93LmRvY3VtZW50LmxvY2F0aW9uJiYoZy53aWR0aChDKS5oZWlnaHQoOTk5OSksRj11LmNvbnRlbnRzKCkuZmluZCgiYm9keSIpLHAmJkYuY3NzKCJvdmVyZmxvdy14IiwKImhpZGRlbiIpLEE9Ri5oZWlnaHQoKSl9Y2F0Y2goRyl7fX1lbHNlIGlmKGguYXV0b1dpZHRofHxoLmF1dG9IZWlnaHQpZy5hZGRDbGFzcygiZmFuY3lib3gtdG1wIiksaC5hdXRvV2lkdGh8fGcud2lkdGgoQyksaC5hdXRvSGVpZ2h0fHxnLmhlaWdodChBKSxoLmF1dG9XaWR0aCYmKEM9Zy53aWR0aCgpKSxoLmF1dG9IZWlnaHQmJihBPWcuaGVpZ2h0KCkpLGcucmVtb3ZlQ2xhc3MoImZhbmN5Ym94LXRtcCIpO2M9ayhDKTtpPWsoQSk7RD1DL0E7bD1rKEUobCk/ayhsLCJ3IiktejpsKTttPWsoRShtKT9rKG0sInciKS16Om0pO3Q9ayhFKHQpP2sodCwiaCIpLXM6dCk7bj1rKEUobik/ayhuLCJoIiktczpuKTtGPW07Qj1uO2guZml0VG9WaWV3JiYobT1NYXRoLm1pbihhLncteixtKSxuPU1hdGgubWluKGEuaC1zLG4pKTt6PWEudy15O3E9YS5oLXE7aC5hc3BlY3RSYXRpbz8oYz5tJiYoYz1tLGk9ayhjL0QpKSxpPm4mJihpPW4sYz1rKGkqRCkpLGM8bCYmKGM9bCxpPWsoYy9EKSksaTx0JiYKKGk9dCxjPWsoaSpEKSkpOihjPU1hdGgubWF4KGwsTWF0aC5taW4oYyxtKSksaC5hdXRvSGVpZ2h0JiYiaWZyYW1lIiE9PWgudHlwZSYmKGcud2lkdGgoYyksaT1nLmhlaWdodCgpKSxpPU1hdGgubWF4KHQsTWF0aC5taW4oaSxuKSkpO2lmKGguZml0VG9WaWV3KWlmKGcud2lkdGgoYykuaGVpZ2h0KGkpLGUud2lkdGgoYyt3KSxhPWUud2lkdGgoKSx5PWUuaGVpZ2h0KCksaC5hc3BlY3RSYXRpbylmb3IoOyhhPnp8fHk+cSkmJihjPmwmJmk+dCkmJiEoMTk8ZCsrKTspaT1NYXRoLm1heCh0LE1hdGgubWluKG4saS0xMCkpLGM9ayhpKkQpLGM8bCYmKGM9bCxpPWsoYy9EKSksYz5tJiYoYz1tLGk9ayhjL0QpKSxnLndpZHRoKGMpLmhlaWdodChpKSxlLndpZHRoKGMrdyksYT1lLndpZHRoKCkseT1lLmhlaWdodCgpO2Vsc2UgYz1NYXRoLm1heChsLE1hdGgubWluKGMsYy0oYS16KSkpLGk9TWF0aC5tYXgodCxNYXRoLm1pbihpLGktKHktcSkpKTtwJiYoImF1dG8iPT09ciYmaTxBJiZjK3crCnA8eikmJihjKz1wKTtnLndpZHRoKGMpLmhlaWdodChpKTtlLndpZHRoKGMrdyk7YT1lLndpZHRoKCk7eT1lLmhlaWdodCgpO2U9KGE+enx8eT5xKSYmYz5sJiZpPnQ7Yz1oLmFzcGVjdFJhdGlvP2M8RiYmaTxCJiZjPEMmJmk8QTooYzxGfHxpPEIpJiYoYzxDfHxpPEEpO2YuZXh0ZW5kKGgse2RpbTp7d2lkdGg6dihhKSxoZWlnaHQ6dih5KX0sb3JpZ1dpZHRoOkMsb3JpZ0hlaWdodDpBLGNhblNocmluazplLGNhbkV4cGFuZDpjLHdQYWRkaW5nOncsaFBhZGRpbmc6eCx3cmFwU3BhY2U6eS1qLm91dGVySGVpZ2h0KCEwKSxza2luU3BhY2U6ai5oZWlnaHQoKS1pfSk7IXUmJihoLmF1dG9IZWlnaHQmJmk+dCYmaTxuJiYhYykmJmcuaGVpZ2h0KCJhdXRvIil9LF9nZXRQb3NpdGlvbjpmdW5jdGlvbihhKXt2YXIgZD1iLmN1cnJlbnQsZT1iLmdldFZpZXdwb3J0KCksYz1kLm1hcmdpbixmPWIud3JhcC53aWR0aCgpK2NbMV0rY1szXSxnPWIud3JhcC5oZWlnaHQoKStjWzBdK2NbMl0sYz17cG9zaXRpb246ImFic29sdXRlIiwKdG9wOmNbMF0sbGVmdDpjWzNdfTtkLmF1dG9DZW50ZXImJmQuZml4ZWQmJiFhJiZnPD1lLmgmJmY8PWUudz9jLnBvc2l0aW9uPSJmaXhlZCI6ZC5sb2NrZWR8fChjLnRvcCs9ZS55LGMubGVmdCs9ZS54KTtjLnRvcD12KE1hdGgubWF4KGMudG9wLGMudG9wKyhlLmgtZykqZC50b3BSYXRpbykpO2MubGVmdD12KE1hdGgubWF4KGMubGVmdCxjLmxlZnQrKGUudy1mKSpkLmxlZnRSYXRpbykpO3JldHVybiBjfSxfYWZ0ZXJab29tSW46ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQ7YSYmKGIuaXNPcGVuPWIuaXNPcGVuZWQ9ITAsYi53cmFwLmNzcygib3ZlcmZsb3ciLCJ2aXNpYmxlIikuYWRkQ2xhc3MoImZhbmN5Ym94LW9wZW5lZCIpLGIudXBkYXRlKCksKGEuY2xvc2VDbGlja3x8YS5uZXh0Q2xpY2smJjE8Yi5ncm91cC5sZW5ndGgpJiZiLmlubmVyLmNzcygiY3Vyc29yIiwicG9pbnRlciIpLmJpbmQoImNsaWNrLmZiIixmdW5jdGlvbihkKXshZihkLnRhcmdldCkuaXMoImEiKSYmIWYoZC50YXJnZXQpLnBhcmVudCgpLmlzKCJhIikmJgooZC5wcmV2ZW50RGVmYXVsdCgpLGJbYS5jbG9zZUNsaWNrPyJjbG9zZSI6Im5leHQiXSgpKX0pLGEuY2xvc2VCdG4mJmYoYS50cGwuY2xvc2VCdG4pLmFwcGVuZFRvKGIuc2tpbikuYmluZChuPyJ0b3VjaHN0YXJ0LmZiIjoiY2xpY2suZmIiLGZ1bmN0aW9uKGEpe2EucHJldmVudERlZmF1bHQoKTtiLmNsb3NlKCl9KSxhLmFycm93cyYmMTxiLmdyb3VwLmxlbmd0aCYmKChhLmxvb3B8fDA8YS5pbmRleCkmJmYoYS50cGwucHJldikuYXBwZW5kVG8oYi5vdXRlcikuYmluZCgiY2xpY2suZmIiLGIucHJldiksKGEubG9vcHx8YS5pbmRleDxiLmdyb3VwLmxlbmd0aC0xKSYmZihhLnRwbC5uZXh0KS5hcHBlbmRUbyhiLm91dGVyKS5iaW5kKCJjbGljay5mYiIsYi5uZXh0KSksYi50cmlnZ2VyKCJhZnRlclNob3ciKSwhYS5sb29wJiZhLmluZGV4PT09YS5ncm91cC5sZW5ndGgtMT9iLnBsYXkoITEpOmIub3B0cy5hdXRvUGxheSYmIWIucGxheWVyLmlzQWN0aXZlJiYoYi5vcHRzLmF1dG9QbGF5PQohMSxiLnBsYXkoKSkpfSxfYWZ0ZXJab29tT3V0OmZ1bmN0aW9uKGEpe2E9YXx8Yi5jdXJyZW50O2YoIi5mYW5jeWJveC13cmFwIikudHJpZ2dlcigib25SZXNldCIpLnJlbW92ZSgpO2YuZXh0ZW5kKGIse2dyb3VwOnt9LG9wdHM6e30scm91dGVyOiExLGN1cnJlbnQ6bnVsbCxpc0FjdGl2ZTohMSxpc09wZW5lZDohMSxpc09wZW46ITEsaXNDbG9zaW5nOiExLHdyYXA6bnVsbCxza2luOm51bGwsb3V0ZXI6bnVsbCxpbm5lcjpudWxsfSk7Yi50cmlnZ2VyKCJhZnRlckNsb3NlIixhKX19KTtiLnRyYW5zaXRpb25zPXtnZXRPcmlnUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQsZD1hLmVsZW1lbnQsZT1hLm9yaWcsYz17fSxmPTUwLGc9NTAsaD1hLmhQYWRkaW5nLGk9YS53UGFkZGluZyxsPWIuZ2V0Vmlld3BvcnQoKTshZSYmKGEuaXNEb20mJmQuaXMoIjp2aXNpYmxlIikpJiYoZT1kLmZpbmQoImltZzpmaXJzdCIpLGUubGVuZ3RofHwoZT1kKSk7cyhlKT8oYz1lLm9mZnNldCgpLAplLmlzKCJpbWciKSYmKGY9ZS5vdXRlcldpZHRoKCksZz1lLm91dGVySGVpZ2h0KCkpKTooYy50b3A9bC55KyhsLmgtZykqYS50b3BSYXRpbyxjLmxlZnQ9bC54KyhsLnctZikqYS5sZWZ0UmF0aW8pO2lmKCJmaXhlZCI9PT1iLndyYXAuY3NzKCJwb3NpdGlvbiIpfHxhLmxvY2tlZCljLnRvcC09bC55LGMubGVmdC09bC54O3JldHVybiBjPXt0b3A6dihjLnRvcC1oKmEudG9wUmF0aW8pLGxlZnQ6dihjLmxlZnQtaSphLmxlZnRSYXRpbyksd2lkdGg6dihmK2kpLGhlaWdodDp2KGcraCl9fSxzdGVwOmZ1bmN0aW9uKGEsZCl7dmFyIGUsYyxmPWQucHJvcDtjPWIuY3VycmVudDt2YXIgZz1jLndyYXBTcGFjZSxoPWMuc2tpblNwYWNlO2lmKCJ3aWR0aCI9PT1mfHwiaGVpZ2h0Ij09PWYpZT1kLmVuZD09PWQuc3RhcnQ/MTooYS1kLnN0YXJ0KS8oZC5lbmQtZC5zdGFydCksYi5pc0Nsb3NpbmcmJihlPTEtZSksYz0id2lkdGgiPT09Zj9jLndQYWRkaW5nOmMuaFBhZGRpbmcsYz1hLWMsYi5za2luW2ZdKGsoIndpZHRoIj09PQpmP2M6Yy1nKmUpKSxiLmlubmVyW2ZdKGsoIndpZHRoIj09PWY/YzpjLWcqZS1oKmUpKX0sem9vbUluOmZ1bmN0aW9uKCl7dmFyIGE9Yi5jdXJyZW50LGQ9YS5wb3MsZT1hLm9wZW5FZmZlY3QsYz0iZWxhc3RpYyI9PT1lLGo9Zi5leHRlbmQoe29wYWNpdHk6MX0sZCk7ZGVsZXRlIGoucG9zaXRpb247Yz8oZD10aGlzLmdldE9yaWdQb3NpdGlvbigpLGEub3Blbk9wYWNpdHkmJihkLm9wYWNpdHk9MC4xKSk6ImZhZGUiPT09ZSYmKGQub3BhY2l0eT0wLjEpO2Iud3JhcC5jc3MoZCkuYW5pbWF0ZShqLHtkdXJhdGlvbjoibm9uZSI9PT1lPzA6YS5vcGVuU3BlZWQsZWFzaW5nOmEub3BlbkVhc2luZyxzdGVwOmM/dGhpcy5zdGVwOm51bGwsY29tcGxldGU6Yi5fYWZ0ZXJab29tSW59KX0sem9vbU91dDpmdW5jdGlvbigpe3ZhciBhPWIuY3VycmVudCxkPWEuY2xvc2VFZmZlY3QsZT0iZWxhc3RpYyI9PT1kLGM9e29wYWNpdHk6MC4xfTtlJiYoYz10aGlzLmdldE9yaWdQb3NpdGlvbigpLGEuY2xvc2VPcGFjaXR5JiYKKGMub3BhY2l0eT0wLjEpKTtiLndyYXAuYW5pbWF0ZShjLHtkdXJhdGlvbjoibm9uZSI9PT1kPzA6YS5jbG9zZVNwZWVkLGVhc2luZzphLmNsb3NlRWFzaW5nLHN0ZXA6ZT90aGlzLnN0ZXA6bnVsbCxjb21wbGV0ZTpiLl9hZnRlclpvb21PdXR9KX0sY2hhbmdlSW46ZnVuY3Rpb24oKXt2YXIgYT1iLmN1cnJlbnQsZD1hLm5leHRFZmZlY3QsZT1hLnBvcyxjPXtvcGFjaXR5OjF9LGY9Yi5kaXJlY3Rpb24sZztlLm9wYWNpdHk9MC4xOyJlbGFzdGljIj09PWQmJihnPSJkb3duIj09PWZ8fCJ1cCI9PT1mPyJ0b3AiOiJsZWZ0IiwiZG93biI9PT1mfHwicmlnaHQiPT09Zj8oZVtnXT12KGsoZVtnXSktMjAwKSxjW2ddPSIrPTIwMHB4Iik6KGVbZ109dihrKGVbZ10pKzIwMCksY1tnXT0iLT0yMDBweCIpKTsibm9uZSI9PT1kP2IuX2FmdGVyWm9vbUluKCk6Yi53cmFwLmNzcyhlKS5hbmltYXRlKGMse2R1cmF0aW9uOmEubmV4dFNwZWVkLGVhc2luZzphLm5leHRFYXNpbmcsY29tcGxldGU6ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGIuX2FmdGVyWm9vbUluLAoyMCl9fSl9LGNoYW5nZU91dDpmdW5jdGlvbigpe3ZhciBhPWIucHJldmlvdXMsZD1hLnByZXZFZmZlY3QsZT17b3BhY2l0eTowLjF9LGM9Yi5kaXJlY3Rpb247ImVsYXN0aWMiPT09ZCYmKGVbImRvd24iPT09Y3x8InVwIj09PWM/InRvcCI6ImxlZnQiXT0oInVwIj09PWN8fCJsZWZ0Ij09PWM/Ii0iOiIrIikrIj0yMDBweCIpO2Eud3JhcC5hbmltYXRlKGUse2R1cmF0aW9uOiJub25lIj09PWQ/MDphLnByZXZTcGVlZCxlYXNpbmc6YS5wcmV2RWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7Zih0aGlzKS50cmlnZ2VyKCJvblJlc2V0IikucmVtb3ZlKCl9fSl9fTtiLmhlbHBlcnMub3ZlcmxheT17ZGVmYXVsdHM6e2Nsb3NlQ2xpY2s6ITAsc3BlZWRPdXQ6MjAwLHNob3dFYXJseTohMCxjc3M6e30sbG9ja2VkOiFuLGZpeGVkOiEwfSxvdmVybGF5Om51bGwsZml4ZWQ6ITEsY3JlYXRlOmZ1bmN0aW9uKGEpe2E9Zi5leHRlbmQoe30sdGhpcy5kZWZhdWx0cyxhKTt0aGlzLm92ZXJsYXkmJnRoaXMuY2xvc2UoKTsKdGhpcy5vdmVybGF5PWYoJzxkaXYgY2xhc3M9ImZhbmN5Ym94LW92ZXJsYXkiPjwvZGl2PicpLmFwcGVuZFRvKCJib2R5Iik7dGhpcy5maXhlZD0hMTthLmZpeGVkJiZiLmRlZmF1bHRzLmZpeGVkJiYodGhpcy5vdmVybGF5LmFkZENsYXNzKCJmYW5jeWJveC1vdmVybGF5LWZpeGVkIiksdGhpcy5maXhlZD0hMCl9LG9wZW46ZnVuY3Rpb24oYSl7dmFyIGQ9dGhpcyxhPWYuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsYSk7dGhpcy5vdmVybGF5P3RoaXMub3ZlcmxheS51bmJpbmQoIi5vdmVybGF5Iikud2lkdGgoImF1dG8iKS5oZWlnaHQoImF1dG8iKTp0aGlzLmNyZWF0ZShhKTt0aGlzLmZpeGVkfHwoci5iaW5kKCJyZXNpemUub3ZlcmxheSIsZi5wcm94eSh0aGlzLnVwZGF0ZSx0aGlzKSksdGhpcy51cGRhdGUoKSk7YS5jbG9zZUNsaWNrJiZ0aGlzLm92ZXJsYXkuYmluZCgiY2xpY2sub3ZlcmxheSIsZnVuY3Rpb24oYSl7ZihhLnRhcmdldCkuaGFzQ2xhc3MoImZhbmN5Ym94LW92ZXJsYXkiKSYmCihiLmlzQWN0aXZlP2IuY2xvc2UoKTpkLmNsb3NlKCkpfSk7dGhpcy5vdmVybGF5LmNzcyhhLmNzcykuc2hvdygpfSxjbG9zZTpmdW5jdGlvbigpe2YoIi5mYW5jeWJveC1vdmVybGF5IikucmVtb3ZlKCk7ci51bmJpbmQoInJlc2l6ZS5vdmVybGF5Iik7dGhpcy5vdmVybGF5PW51bGw7ITEhPT10aGlzLm1hcmdpbiYmKGYoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIsdGhpcy5tYXJnaW4pLHRoaXMubWFyZ2luPSExKTt0aGlzLmVsJiZ0aGlzLmVsLnJlbW92ZUNsYXNzKCJmYW5jeWJveC1sb2NrIil9LHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBhPSIxMDAlIixiO3RoaXMub3ZlcmxheS53aWR0aChhKS5oZWlnaHQoIjEwMCUiKTtmLmJyb3dzZXIubXNpZT8oYj1NYXRoLm1heCh4LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCx4LmJvZHkub2Zmc2V0V2lkdGgpLG0ud2lkdGgoKT5iJiYoYT1tLndpZHRoKCkpKTptLndpZHRoKCk+ci53aWR0aCgpJiYoYT1tLndpZHRoKCkpO3RoaXMub3ZlcmxheS53aWR0aChhKS5oZWlnaHQobS5oZWlnaHQoKSl9LApvblJlYWR5OmZ1bmN0aW9uKGEsYil7ZigiLmZhbmN5Ym94LW92ZXJsYXkiKS5zdG9wKCEwLCEwKTt0aGlzLm92ZXJsYXl8fCh0aGlzLm1hcmdpbj1tLmhlaWdodCgpPnIuaGVpZ2h0KCl8fCJzY3JvbGwiPT09ZigiYm9keSIpLmNzcygib3ZlcmZsb3cteSIpP2YoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIpOiExLHRoaXMuZWw9eC5hbGwmJiF4LnF1ZXJ5U2VsZWN0b3I/ZigiaHRtbCIpOmYoImJvZHkiKSx0aGlzLmNyZWF0ZShhKSk7YS5sb2NrZWQmJnRoaXMuZml4ZWQmJihiLmxvY2tlZD10aGlzLm92ZXJsYXkuYXBwZW5kKGIud3JhcCksYi5maXhlZD0hMSk7ITA9PT1hLnNob3dFYXJseSYmdGhpcy5iZWZvcmVTaG93LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYmVmb3JlU2hvdzpmdW5jdGlvbihhLGIpe2IubG9ja2VkJiYodGhpcy5lbC5hZGRDbGFzcygiZmFuY3lib3gtbG9jayIpLCExIT09dGhpcy5tYXJnaW4mJmYoImJvZHkiKS5jc3MoIm1hcmdpbi1yaWdodCIsayh0aGlzLm1hcmdpbikrCmIuc2Nyb2xsYmFyV2lkdGgpKTt0aGlzLm9wZW4oYSl9LG9uVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5maXhlZHx8dGhpcy51cGRhdGUoKX0sYWZ0ZXJDbG9zZTpmdW5jdGlvbihhKXt0aGlzLm92ZXJsYXkmJiFiLmlzQWN0aXZlJiZ0aGlzLm92ZXJsYXkuZmFkZU91dChhLnNwZWVkT3V0LGYucHJveHkodGhpcy5jbG9zZSx0aGlzKSl9fTtiLmhlbHBlcnMudGl0bGU9e2RlZmF1bHRzOnt0eXBlOiJmbG9hdCIscG9zaXRpb246ImJvdHRvbSJ9LGJlZm9yZVNob3c6ZnVuY3Rpb24oYSl7dmFyIGQ9Yi5jdXJyZW50LGU9ZC50aXRsZSxjPWEudHlwZTtmLmlzRnVuY3Rpb24oZSkmJihlPWUuY2FsbChkLmVsZW1lbnQsZCkpO2lmKHAoZSkmJiIiIT09Zi50cmltKGUpKXtkPWYoJzxkaXYgY2xhc3M9ImZhbmN5Ym94LXRpdGxlIGZhbmN5Ym94LXRpdGxlLScrYysnLXdyYXAiPicrZSsiPC9kaXY+Iik7c3dpdGNoKGMpe2Nhc2UgImluc2lkZSI6Yz1iLnNraW47YnJlYWs7Y2FzZSAib3V0c2lkZSI6Yz0KYi53cmFwO2JyZWFrO2Nhc2UgIm92ZXIiOmM9Yi5pbm5lcjticmVhaztkZWZhdWx0OmM9Yi5za2luLGQuYXBwZW5kVG8oImJvZHkiKSxmLmJyb3dzZXIubXNpZSYmZC53aWR0aChkLndpZHRoKCkpLGQud3JhcElubmVyKCc8c3BhbiBjbGFzcz0iY2hpbGQiPjwvc3Bhbj4nKSxiLmN1cnJlbnQubWFyZ2luWzJdKz1NYXRoLmFicyhrKGQuY3NzKCJtYXJnaW4tYm90dG9tIikpKX1kWyJ0b3AiPT09YS5wb3NpdGlvbj8icHJlcGVuZFRvIjoiYXBwZW5kVG8iXShjKX19fTtmLmZuLmZhbmN5Ym94PWZ1bmN0aW9uKGEpe3ZhciBkLGU9Zih0aGlzKSxjPXRoaXMuc2VsZWN0b3J8fCIiLGo9ZnVuY3Rpb24oZyl7dmFyIGg9Zih0aGlzKS5ibHVyKCksaT1kLGosazshZy5jdHJsS2V5JiYoIWcuYWx0S2V5JiYhZy5zaGlmdEtleSYmIWcubWV0YUtleSkmJiFoLmlzKCIuZmFuY3lib3gtd3JhcCIpJiYoaj1hLmdyb3VwQXR0cnx8ImRhdGEtZmFuY3lib3gtZ3JvdXAiLGs9aC5hdHRyKGopLGt8fChqPSJyZWwiLAprPWguZ2V0KDApW2pdKSxrJiYoIiIhPT1rJiYibm9mb2xsb3ciIT09aykmJihoPWMubGVuZ3RoP2YoYyk6ZSxoPWguZmlsdGVyKCJbIitqKyc9IicraysnIl0nKSxpPWguaW5kZXgodGhpcykpLGEuaW5kZXg9aSwhMSE9PWIub3BlbihoLGEpJiZnLnByZXZlbnREZWZhdWx0KCkpfSxhPWF8fHt9O2Q9YS5pbmRleHx8MDshY3x8ITE9PT1hLmxpdmU/ZS51bmJpbmQoImNsaWNrLmZiLXN0YXJ0IikuYmluZCgiY2xpY2suZmItc3RhcnQiLGopOm0udW5kZWxlZ2F0ZShjLCJjbGljay5mYi1zdGFydCIpLmRlbGVnYXRlKGMrIjpub3QoJy5mYW5jeWJveC1pdGVtLCAuZmFuY3lib3gtbmF2JykiLCJjbGljay5mYi1zdGFydCIsaik7dGhpcy5maWx0ZXIoIltkYXRhLWZhbmN5Ym94LXN0YXJ0PTFdIikudHJpZ2dlcigiY2xpY2siKTtyZXR1cm4gdGhpc307bS5yZWFkeShmdW5jdGlvbigpe2Yuc2Nyb2xsYmFyV2lkdGg9PT1xJiYoZi5zY3JvbGxiYXJXaWR0aD1mdW5jdGlvbigpe3ZhciBhPWYoJzxkaXYgc3R5bGU9IndpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6YXV0byI+PGRpdi8+PC9kaXY+JykuYXBwZW5kVG8oImJvZHkiKSwKYj1hLmNoaWxkcmVuKCksYj1iLmlubmVyV2lkdGgoKS1iLmhlaWdodCg5OSkuaW5uZXJXaWR0aCgpO2EucmVtb3ZlKCk7cmV0dXJuIGJ9KTtpZihmLnN1cHBvcnQuZml4ZWRQb3NpdGlvbj09PXEpe3ZhciBhPWYuc3VwcG9ydCxkPWYoJzxkaXYgc3R5bGU9InBvc2l0aW9uOmZpeGVkO3RvcDoyMHB4OyI+PC9kaXY+JykuYXBwZW5kVG8oImJvZHkiKSxlPTIwPT09ZFswXS5vZmZzZXRUb3B8fDE1PT09ZFswXS5vZmZzZXRUb3A7ZC5yZW1vdmUoKTthLmZpeGVkUG9zaXRpb249ZX1mLmV4dGVuZChiLmRlZmF1bHRzLHtzY3JvbGxiYXJXaWR0aDpmLnNjcm9sbGJhcldpZHRoKCksZml4ZWQ6Zi5zdXBwb3J0LmZpeGVkUG9zaXRpb24scGFyZW50OmYoImJvZHkiKX0pfSl9KSh3aW5kb3csZG9jdW1lbnQsalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/fancybox.lib/jquery.mousewheel-3.0.6.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIENvcHlyaWdodCAoYykgMjAxMSBCcmFuZG9uIEFhcm9uIChodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChMSUNFTlNFLnR4dCkuCiAqCiAqIFRoYW5rcyB0bzogaHR0cDovL2Fkb21hcy5vcmcvamF2YXNjcmlwdC1tb3VzZS13aGVlbC8gZm9yIHNvbWUgcG9pbnRlcnMuCiAqIFRoYW5rcyB0bzogTWF0aGlhcyBCYW5rKGh0dHA6Ly93d3cubWF0aGlhcy1iYW5rLmRlKSBmb3IgYSBzY29wZSBidWcgZml4LgogKiBUaGFua3MgdG86IFNlYW11cyBMZWFoeSBmb3IgYWRkaW5nIGRlbHRhWCBhbmQgZGVsdGFZCiAqCiAqIFZlcnNpb246IDMuMC42CiAqIAogKiBSZXF1aXJlczogMS4yLjIrCiAqLwooZnVuY3Rpb24oZCl7ZnVuY3Rpb24gZShhKXt2YXIgYj1hfHx3aW5kb3cuZXZlbnQsYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxmPTAsZT0wLGc9MCxhPWQuZXZlbnQuZml4KGIpO2EudHlwZT0ibW91c2V3aGVlbCI7Yi53aGVlbERlbHRhJiYoZj1iLndoZWVsRGVsdGEvMTIwKTtiLmRldGFpbCYmKGY9LWIuZGV0YWlsLzMpO2c9ZjtiLmF4aXMhPT12b2lkIDAmJmIuYXhpcz09PWIuSE9SSVpPTlRBTF9BWElTJiYoZz0wLGU9LTEqZik7Yi53aGVlbERlbHRhWSE9PXZvaWQgMCYmKGc9Yi53aGVlbERlbHRhWS8xMjApO2Iud2hlZWxEZWx0YVghPT12b2lkIDAmJihlPS0xKmIud2hlZWxEZWx0YVgvMTIwKTtjLnVuc2hpZnQoYSxmLGUsZyk7cmV0dXJuKGQuZXZlbnQuZGlzcGF0Y2h8fGQuZXZlbnQuaGFuZGxlKS5hcHBseSh0aGlzLGMpfXZhciBjPVsiRE9NTW91c2VTY3JvbGwiLCJtb3VzZXdoZWVsIl07aWYoZC5ldmVudC5maXhIb29rcylmb3IodmFyIGg9Yy5sZW5ndGg7aDspZC5ldmVudC5maXhIb29rc1tjWy0taF1dPQpkLmV2ZW50Lm1vdXNlSG9va3M7ZC5ldmVudC5zcGVjaWFsLm1vdXNld2hlZWw9e3NldHVwOmZ1bmN0aW9uKCl7aWYodGhpcy5hZGRFdmVudExpc3RlbmVyKWZvcih2YXIgYT1jLmxlbmd0aDthOyl0aGlzLmFkZEV2ZW50TGlzdGVuZXIoY1stLWFdLGUsZmFsc2UpO2Vsc2UgdGhpcy5vbm1vdXNld2hlZWw9ZX0sdGVhcmRvd246ZnVuY3Rpb24oKXtpZih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIpZm9yKHZhciBhPWMubGVuZ3RoO2E7KXRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihjWy0tYV0sZSxmYWxzZSk7ZWxzZSB0aGlzLm9ubW91c2V3aGVlbD1udWxsfX07ZC5mbi5leHRlbmQoe21vdXNld2hlZWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGE/dGhpcy5iaW5kKCJtb3VzZXdoZWVsIixhKTp0aGlzLnRyaWdnZXIoIm1vdXNld2hlZWwiKX0sdW5tb3VzZXdoZWVsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVuYmluZCgibW91c2V3aGVlbCIsYSl9fSl9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanMvanF1ZXJ5LmlmcmFtZS10cmFuc3BvcnQuanMnLCdqcy9qcXVlcnkuZmlsZXVwbG9hZC5qcycpOwokaW5mb1snZGVwZW5kcyddID0gYXJyYXkoJ2pxdWVyeScsJ3VpJyk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/jquery.postmessage-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IHBvc3RNZXNzYWdlIFRyYW5zcG9ydCBQbHVnaW4KICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQgKi8KCihmdW5jdGlvbiAoZmFjdG9yeSkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkgewogICAgICAgIC8vIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBBTUQgbW9kdWxlOgogICAgICAgIGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgICAgLy8gTm9kZS9Db21tb25KUzoKICAgICAgICBmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzOgogICAgICAgIGZhY3Rvcnkod2luZG93LmpRdWVyeSk7CiAgICB9Cn0oZnVuY3Rpb24gKCQpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICB2YXIgY291bnRlciA9IDAsCiAgICAgICAgbmFtZXMgPSBbCiAgICAgICAgICAgICdhY2NlcHRzJywKICAgICAgICAgICAgJ2NhY2hlJywKICAgICAgICAgICAgJ2NvbnRlbnRzJywKICAgICAgICAgICAgJ2NvbnRlbnRUeXBlJywKICAgICAgICAgICAgJ2Nyb3NzRG9tYWluJywKICAgICAgICAgICAgJ2RhdGEnLAogICAgICAgICAgICAnZGF0YVR5cGUnLAogICAgICAgICAgICAnaGVhZGVycycsCiAgICAgICAgICAgICdpZk1vZGlmaWVkJywKICAgICAgICAgICAgJ21pbWVUeXBlJywKICAgICAgICAgICAgJ3Bhc3N3b3JkJywKICAgICAgICAgICAgJ3Byb2Nlc3NEYXRhJywKICAgICAgICAgICAgJ3RpbWVvdXQnLAogICAgICAgICAgICAndHJhZGl0aW9uYWwnLAogICAgICAgICAgICAndHlwZScsCiAgICAgICAgICAgICd1cmwnLAogICAgICAgICAgICAndXNlcm5hbWUnCiAgICAgICAgXSwKICAgICAgICBjb252ZXJ0ID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgfTsKCiAgICAkLmFqYXhTZXR1cCh7CiAgICAgICAgY29udmVydGVyczogewogICAgICAgICAgICAncG9zdG1lc3NhZ2UgdGV4dCc6IGNvbnZlcnQsCiAgICAgICAgICAgICdwb3N0bWVzc2FnZSBqc29uJzogY29udmVydCwKICAgICAgICAgICAgJ3Bvc3RtZXNzYWdlIGh0bWwnOiBjb252ZXJ0CiAgICAgICAgfQogICAgfSk7CgogICAgJC5hamF4VHJhbnNwb3J0KCdwb3N0bWVzc2FnZScsIGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgaWYgKG9wdGlvbnMucG9zdE1lc3NhZ2UgJiYgd2luZG93LnBvc3RNZXNzYWdlKSB7CiAgICAgICAgICAgIHZhciBpZnJhbWUsCiAgICAgICAgICAgICAgICBsb2MgPSAkKCc8YT4nKS5wcm9wKCdocmVmJywgb3B0aW9ucy5wb3N0TWVzc2FnZSlbMF0sCiAgICAgICAgICAgICAgICB0YXJnZXQgPSBsb2MucHJvdG9jb2wgKyAnLy8nICsgbG9jLmhvc3QsCiAgICAgICAgICAgICAgICB4aHJVcGxvYWQgPSBvcHRpb25zLnhocigpLnVwbG9hZDsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChfLCBjb21wbGV0ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY291bnRlciArPSAxOwogICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdwb3N0bWVzc2FnZS10cmFuc3BvcnQtJyArIGNvdW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnROYW1lID0gJ21lc3NhZ2UuJyArIG1lc3NhZ2UuaWQ7CiAgICAgICAgICAgICAgICAgICAgaWZyYW1lID0gJCgKICAgICAgICAgICAgICAgICAgICAgICAgJzxpZnJhbWUgc3R5bGU9ImRpc3BsYXk6bm9uZTsiIHNyYz0iJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBvc3RNZXNzYWdlICsgJyIgbmFtZT0iJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmlkICsgJyI+PC9pZnJhbWU+JwogICAgICAgICAgICAgICAgICAgICkuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG5hbWVzLCBmdW5jdGlvbiAoaSwgbmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVtuYW1lXSA9IG9wdGlvbnNbbmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRhdGFUeXBlID0gbWVzc2FnZS5kYXRhVHlwZS5yZXBsYWNlKCdwb3N0bWVzc2FnZSAnLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQod2luZG93KS5iaW5kKGV2ZW50TmFtZSwgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlLm9yaWdpbmFsRXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGUuZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLm9yaWdpbiA9PT0gdGFyZ2V0ICYmIGRhdGEuaWQgPT09IG1lc3NhZ2UuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAncHJvZ3Jlc3MnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2LmluaXRFdmVudChkYXRhLnR5cGUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5leHRlbmQoZXYsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHJVcGxvYWQuZGlzcGF0Y2hFdmVudChldik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3Bvc3RtZXNzYWdlOiBkYXRhLnJlc3VsdH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmhlYWRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHdpbmRvdykudW5iaW5kKGV2ZW50TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWZyYW1lWzBdLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSkuYXBwZW5kVG8oZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgYWJvcnQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfSk7Cgp9KSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/cors/jquery.xdr-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IFhEb21haW5SZXF1ZXN0IFRyYW5zcG9ydCBQbHVnaW4KICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKgogKiBCYXNlZCBvbiBKdWxpYW4gQXVib3VyZydzIGFqYXhIb29rcyB4ZHIuanM6CiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qYXVib3VyZy9hamF4SG9va3MvCiAqLwoKLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93LCBYRG9tYWluUmVxdWVzdCAqLwoKKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwogICAgaWYgKHdpbmRvdy5YRG9tYWluUmVxdWVzdCAmJiAhJC5zdXBwb3J0LmNvcnMpIHsKICAgICAgICAkLmFqYXhUcmFuc3BvcnQoZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgaWYgKHMuY3Jvc3NEb21haW4gJiYgcy5hc3luYykgewogICAgICAgICAgICAgICAgaWYgKHMudGltZW91dCkgewogICAgICAgICAgICAgICAgICAgIHMueGRyVGltZW91dCA9IHMudGltZW91dDsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgcy50aW1lb3V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHhkcjsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24gKGhlYWRlcnMsIGNvbXBsZXRlQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZFBhcmFtQ2hhciA9IC9cPy8udGVzdChzLnVybCkgPyAnJicgOiAnPyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNhbGxiYWNrKHN0YXR1cywgc3RhdHVzVGV4dCwgcmVzcG9uc2VzLCByZXNwb25zZUhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmxvYWQgPSB4ZHIub25lcnJvciA9IHhkci5vbnRpbWVvdXQgPSAkLm5vb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZHIgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjayhzdGF0dXMsIHN0YXR1c1RleHQsIHJlc3BvbnNlcywgcmVzcG9uc2VIZWFkZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB4ZHIgPSBuZXcgWERvbWFpblJlcXVlc3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gWERvbWFpblJlcXVlc3Qgb25seSBzdXBwb3J0cyBHRVQgYW5kIFBPU1Q6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLnR5cGUgPT09ICdERUxFVEUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnVybCA9IHMudXJsICsgYWRkUGFyYW1DaGFyICsgJ19tZXRob2Q9REVMRVRFJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLnR5cGUgPT09ICdQVVQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnVybCA9IHMudXJsICsgYWRkUGFyYW1DaGFyICsgJ19tZXRob2Q9UFVUJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudHlwZSA9ICdQT1NUJzsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLnR5cGUgPT09ICdQQVRDSCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMudXJsID0gcy51cmwgKyBhZGRQYXJhbUNoYXIgKyAnX21ldGhvZD1QQVRDSCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnR5cGUgPSAnUE9TVCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9wZW4ocy50eXBlLCBzLnVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09LJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dGV4dDogeGRyLnJlc3BvbnNlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogJyArIHhkci5jb250ZW50VHlwZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayg0MDQsICdOb3QgRm91bmQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMueGRyVGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGRyLm9udGltZW91dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygwLCAndGltZW91dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci50aW1lb3V0ID0gcy54ZHJUaW1lb3V0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHhkci5zZW5kKChzLmhhc0NvbnRlbnQgJiYgcy5kYXRhKSB8fCBudWxsKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ZHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhkci5vbmVycm9yID0gJC5ub29wKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ZHIuYWJvcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload-process.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFByb2Nlc3NpbmcgUGx1Z2luCiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL2pRdWVyeS1GaWxlLVVwbG9hZAogKgogKiBDb3B5cmlnaHQgMjAxMiwgU2ViYXN0aWFuIFRzY2hhbgogKiBodHRwczovL2JsdWVpbXAubmV0CiAqCiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZToKICogaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQKICovCgovKiBqc2hpbnQgbm9tZW46ZmFsc2UgKi8KLyogZ2xvYmFsIGRlZmluZSwgcmVxdWlyZSwgd2luZG93ICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWwogICAgICAgICAgICAnanF1ZXJ5JywKICAgICAgICAgICAgJy4vanF1ZXJ5LmZpbGV1cGxvYWQnCiAgICAgICAgXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JykgewogICAgICAgIC8vIE5vZGUvQ29tbW9uSlM6CiAgICAgICAgZmFjdG9yeShyZXF1aXJlKCdqcXVlcnknKSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczoKICAgICAgICBmYWN0b3J5KAogICAgICAgICAgICB3aW5kb3cualF1ZXJ5CiAgICAgICAgKTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBvcmlnaW5hbEFkZCA9ICQuYmx1ZWltcC5maWxldXBsb2FkLnByb3RvdHlwZS5vcHRpb25zLmFkZDsKCiAgICAvLyBUaGUgRmlsZSBVcGxvYWQgUHJvY2Vzc2luZyBwbHVnaW4gZXh0ZW5kcyB0aGUgZmlsZXVwbG9hZCB3aWRnZXQKICAgIC8vIHdpdGggZmlsZSBwcm9jZXNzaW5nIGZ1bmN0aW9uYWxpdHk6CiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgJC5ibHVlaW1wLmZpbGV1cGxvYWQsIHsKCiAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAvLyBUaGUgbGlzdCBvZiBwcm9jZXNzaW5nIGFjdGlvbnM6CiAgICAgICAgICAgIHByb2Nlc3NRdWV1ZTogWwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdsb2cnLAogICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWJ1ZycKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICBkYXRhLnByb2Nlc3MoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGhpcy5maWxldXBsb2FkKCdwcm9jZXNzJywgZGF0YSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG9yaWdpbmFsQWRkLmNhbGwodGhpcywgZSwgZGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBwcm9jZXNzQWN0aW9uczogewogICAgICAgICAgICAvKgogICAgICAgICAgICBsb2c6IGZ1bmN0aW9uIChkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlW29wdGlvbnMudHlwZV0oCiAgICAgICAgICAgICAgICAgICAgJ1Byb2Nlc3NpbmcgIicgKyBkYXRhLmZpbGVzW2RhdGEuaW5kZXhdLm5hbWUgKyAnIicKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKi8KICAgICAgICB9LAoKICAgICAgICBfcHJvY2Vzc0ZpbGU6IGZ1bmN0aW9uIChkYXRhLCBvcmlnaW5hbERhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLnJlc29sdmVXaXRoKHRoYXQsIFtkYXRhXSksCiAgICAgICAgICAgICAgICBjaGFpbiA9IGRmZC5wcm9taXNlKCk7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ3Byb2Nlc3MnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgJC5lYWNoKGRhdGEucHJvY2Vzc1F1ZXVlLCBmdW5jdGlvbiAoaSwgc2V0dGluZ3MpIHsKICAgICAgICAgICAgICAgIHZhciBmdW5jID0gZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxEYXRhLmVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVqZWN0V2l0aCh0aGF0LCBbb3JpZ2luYWxEYXRhXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5wcm9jZXNzQWN0aW9uc1tzZXR0aW5ncy5hY3Rpb25dLmNhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjaGFpbiA9IGNoYWluLnRoZW4oZnVuYywgc2V0dGluZ3MuYWx3YXlzICYmIGZ1bmMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2hhaW4KICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzZG9uZScsIG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ3Byb2Nlc3NhbHdheXMnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuZmFpbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc2ZhaWwnLCBudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdwcm9jZXNzYWx3YXlzJywgbnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGNoYWluOwogICAgICAgIH0sCgogICAgICAgIC8vIFJlcGxhY2VzIHRoZSBzZXR0aW5ncyBvZiBlYWNoIHByb2Nlc3NRdWV1ZSBpdGVtIHRoYXQKICAgICAgICAvLyBhcmUgc3RyaW5ncyBzdGFydGluZyB3aXRoIGFuICJAIiwgdXNpbmcgdGhlIHJlbWFpbmluZwogICAgICAgIC8vIHN1YnN0cmluZyBhcyBrZXkgZm9yIHRoZSBvcHRpb24gbWFwLAogICAgICAgIC8vIGUuZy4gIkBhdXRvVXBsb2FkIiBpcyByZXBsYWNlZCB3aXRoIG9wdGlvbnMuYXV0b1VwbG9hZDoKICAgICAgICBfdHJhbnNmb3JtUHJvY2Vzc1F1ZXVlOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgcHJvY2Vzc1F1ZXVlID0gW107CiAgICAgICAgICAgICQuZWFjaChvcHRpb25zLnByb2Nlc3NRdWV1ZSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHNldHRpbmdzID0ge30sCiAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gdGhpcy5hY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gdGhpcy5wcmVmaXggPT09IHRydWUgPyBhY3Rpb24gOiB0aGlzLnByZWZpeDsKICAgICAgICAgICAgICAgICQuZWFjaCh0aGlzLCBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmICgkLnR5cGUodmFsdWUpID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuY2hhckF0KDApID09PSAnQCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IG9wdGlvbnNbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zbGljZSgxKSB8fCAocHJlZml4ID8gcHJlZml4ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc2xpY2UoMSkgOiBrZXkpCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Nba2V5XSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NRdWV1ZS5wdXNoKHNldHRpbmdzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9wdGlvbnMucHJvY2Vzc1F1ZXVlID0gcHJvY2Vzc1F1ZXVlOwogICAgICAgIH0sCgogICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlcyBjdXJyZW50bHkgaW4gdGhlIHByb2Nlc3NzaW5nIHF1ZXVlOgogICAgICAgIHByb2Nlc3Npbmc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3Npbmc7CiAgICAgICAgfSwKCiAgICAgICAgLy8gUHJvY2Vzc2VzIHRoZSBmaWxlcyBnaXZlbiBhcyBmaWxlcyBwcm9wZXJ0eSBvZiB0aGUgZGF0YSBwYXJhbWV0ZXIsCiAgICAgICAgLy8gcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IHRoYXQgYWxsb3dzIHRvIGJpbmQgY2FsbGJhY2tzOgogICAgICAgIHByb2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMucHJvY2Vzc1F1ZXVlICYmIG9wdGlvbnMucHJvY2Vzc1F1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtUHJvY2Vzc1F1ZXVlKG9wdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NpbmcgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdwcm9jZXNzc3RhcnQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQuZWFjaChkYXRhLmZpbGVzLCBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IGluZGV4ID8gJC5leHRlbmQoe30sIG9wdGlvbnMpIDogb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yVGhyb3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlamVjdFdpdGgodGhhdCwgW2RhdGFdKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fcHJvY2Vzc0ZpbGUob3B0cywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgb3B0cy5pbmRleCA9IGluZGV4OwogICAgICAgICAgICAgICAgICAgIHRoYXQuX3Byb2Nlc3NpbmcgKz0gMTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9wcm9jZXNzaW5nUXVldWUgPSB0aGF0Ll9wcm9jZXNzaW5nUXVldWUudGhlbihmdW5jLCBmdW5jKQogICAgICAgICAgICAgICAgICAgICAgICAuYWx3YXlzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3Byb2Nlc3NpbmcgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9wcm9jZXNzaW5nID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcigncHJvY2Vzc3N0b3AnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvY2Vzc2luZ1F1ZXVlOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc2luZyA9IDA7CiAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZSA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGlzKQogICAgICAgICAgICAgICAgLnByb21pc2UoKTsKICAgICAgICB9CgogICAgfSk7Cgp9KSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload-ui.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFVzZXIgSW50ZXJmYWNlIFBsdWdpbiA3LjEKICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvalF1ZXJ5LUZpbGUtVXBsb2FkCiAqCiAqIENvcHlyaWdodCAyMDEwLCBTZWJhc3RpYW4gVHNjaGFuCiAqIGh0dHBzOi8vYmx1ZWltcC5uZXQKICoKICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOgogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVAogKi8KCi8qanNsaW50IG5vbWVuOiB0cnVlLCB1bnBhcmFtOiB0cnVlLCByZWdleHA6IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIFVSTCwgd2Via2l0VVJMLCBGaWxlUmVhZGVyICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWwogICAgICAgICAgICAnanF1ZXJ5JywKICAgICAgICAgICAgJ3RtcGwnLAogICAgICAgICAgICAnbG9hZC1pbWFnZScsCiAgICAgICAgICAgICcuL2pxdWVyeS5maWxldXBsb2FkLWZwJwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSgKICAgICAgICAgICAgd2luZG93LmpRdWVyeSwKICAgICAgICAgICAgd2luZG93LnRtcGwsCiAgICAgICAgICAgIHdpbmRvdy5sb2FkSW1hZ2UKICAgICAgICApOwogICAgfQp9KGZ1bmN0aW9uICgkLCB0bXBsLCBsb2FkSW1hZ2UpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvLyBUaGUgVUkgdmVyc2lvbiBleHRlbmRzIHRoZSBmaWxlIHVwbG9hZCB3aWRnZXQKICAgIC8vIGFuZCBhZGRzIGNvbXBsZXRlIHVzZXIgaW50ZXJmYWNlIGludGVyYWN0aW9uOgogICAgJC53aWRnZXQoJ2JsdWVpbXAuZmlsZXVwbG9hZCcsICQuYmx1ZWltcC5maWxldXBsb2FkLCB7CgogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYWRkZWQgdG8gdGhlIHdpZGdldCBhcmUgdXBsb2FkZWQgYXMgc29vbgogICAgICAgICAgICAvLyBhcyB0aGUgdXNlciBjbGlja3Mgb24gdGhlIHN0YXJ0IGJ1dHRvbnMuIFRvIGVuYWJsZSBhdXRvbWF0aWMKICAgICAgICAgICAgLy8gdXBsb2Fkcywgc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIHRydWU6CiAgICAgICAgICAgIGF1dG9VcGxvYWQ6IGZhbHNlLAogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG9wdGlvbiBsaW1pdHMgdGhlIG51bWJlciBvZiBmaWxlcyB0aGF0IGFyZQogICAgICAgICAgICAvLyBhbGxvd2VkIHRvIGJlIHVwbG9hZGVkIHVzaW5nIHRoaXMgd2lkZ2V0OgogICAgICAgICAgICBtYXhOdW1iZXJPZkZpbGVzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGFsbG93ZWQgZmlsZSBzaXplOgogICAgICAgICAgICBtYXhGaWxlU2l6ZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBUaGUgbWluaW11bSBhbGxvd2VkIGZpbGUgc2l6ZToKICAgICAgICAgICAgbWluRmlsZVNpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgYWxsb3dlZCBmaWxlIHR5cGVzLCBtYXRjaGVzCiAgICAgICAgICAgIC8vIGFnYWluc3QgZWl0aGVyIGZpbGUgdHlwZSBvciBmaWxlIG5hbWU6CiAgICAgICAgICAgIGFjY2VwdEZpbGVUeXBlczogIC8uKyQvaSwKICAgICAgICAgICAgLy8gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZWZpbmUgZm9yIHdoaWNoIGZpbGVzIGEgcHJldmlldwogICAgICAgICAgICAvLyBpbWFnZSBpcyBzaG93biwgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHR5cGU6CiAgICAgICAgICAgIHByZXZpZXdTb3VyY2VGaWxlVHlwZXM6IC9eaW1hZ2VcLyhnaWZ8anBlZ3xwbmcpJC8sCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBvZiBpbWFnZXMgdGhhdCBhcmUgdG8gYmUgZGlzcGxheWVkIGFzIHByZXZpZXc6CiAgICAgICAgICAgIHByZXZpZXdTb3VyY2VNYXhGaWxlU2l6ZTogNTAwMDAwMCwgLy8gNU1CCiAgICAgICAgICAgIC8vIFRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSBwcmV2aWV3IGltYWdlczoKICAgICAgICAgICAgcHJldmlld01heFdpZHRoOiA4MCwKICAgICAgICAgICAgLy8gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBwcmV2aWV3IGltYWdlczoKICAgICAgICAgICAgcHJldmlld01heEhlaWdodDogODAsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHByZXZpZXcgaW1hZ2VzIGFyZSBkaXNwbGF5ZWQgYXMgY2FudmFzIGVsZW1lbnRzCiAgICAgICAgICAgIC8vIGlmIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlCiAgICAgICAgICAgIC8vIHRvIGFsd2F5cyBkaXNwbGF5IHByZXZpZXcgaW1hZ2VzIGFzIGltZyBlbGVtZW50czoKICAgICAgICAgICAgcHJldmlld0FzQ2FudmFzOiB0cnVlLAogICAgICAgICAgICAvLyBUaGUgSUQgb2YgdGhlIHVwbG9hZCB0ZW1wbGF0ZToKICAgICAgICAgICAgdXBsb2FkVGVtcGxhdGVJZDogJ3RlbXBsYXRlLXVwbG9hZCcsCiAgICAgICAgICAgIC8vIFRoZSBJRCBvZiB0aGUgZG93bmxvYWQgdGVtcGxhdGU6CiAgICAgICAgICAgIGRvd25sb2FkVGVtcGxhdGVJZDogJ3RlbXBsYXRlLWRvd25sb2FkJywKICAgICAgICAgICAgLy8gVGhlIGNvbnRhaW5lciBmb3IgdGhlIGxpc3Qgb2YgZmlsZXMuIElmIHVuZGVmaW5lZCwgaXQgaXMgc2V0IHRvCiAgICAgICAgICAgIC8vIGFuIGVsZW1lbnQgd2l0aCBjbGFzcyAiZmlsZXMiIGluc2lkZSBvZiB0aGUgd2lkZ2V0IGVsZW1lbnQ6CiAgICAgICAgICAgIGZpbGVzQ29udGFpbmVyOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGZpbGVzIGFyZSBhcHBlbmRlZCB0byB0aGUgZmlsZXMgY29udGFpbmVyLgogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdHJ1ZSwgdG8gcHJlcGVuZCBmaWxlcyBpbnN0ZWFkOgogICAgICAgICAgICBwcmVwZW5kRmlsZXM6IGZhbHNlLAogICAgICAgICAgICAvLyBUaGUgZXhwZWN0ZWQgZGF0YSB0eXBlIG9mIHRoZSB1cGxvYWQgcmVzcG9uc2UsIHNldHMgdGhlIGRhdGFUeXBlCiAgICAgICAgICAgIC8vIG9wdGlvbiBvZiB0aGUgJC5hamF4IHVwbG9hZCByZXF1ZXN0czoKICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKCiAgICAgICAgICAgIC8vIFRoZSBhZGQgY2FsbGJhY2sgaXMgaW52b2tlZCBhcyBzb29uIGFzIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgZmlsZXVwbG9hZAogICAgICAgICAgICAvLyB3aWRnZXQgKHZpYSBmaWxlIGlucHV0IHNlbGVjdGlvbiwgZHJhZyAmIGRyb3Agb3IgYWRkIEFQSSBjYWxsKS4KICAgICAgICAgICAgLy8gU2VlIHRoZSBiYXNpYyBmaWxlIHVwbG9hZCB3aWRnZXQgZm9yIG1vcmUgaW5mb3JtYXRpb246CiAgICAgICAgICAgIGFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoYXQub3B0aW9ucywKICAgICAgICAgICAgICAgICAgICBmaWxlcyA9IGRhdGEuZmlsZXM7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmZpbGV1cGxvYWQoJ3Byb2Nlc3MnLCBkYXRhKS5kb25lKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzKC1maWxlcy5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgIGRhdGEubWF4TnVtYmVyT2ZGaWxlc0FkanVzdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzLnZhbGlkID0gZGF0YS5pc1ZhbGlkYXRlZCA9IHRoYXQuX3ZhbGlkYXRlKGZpbGVzKTsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQgPSB0aGF0Ll9yZW5kZXJVcGxvYWQoZmlsZXMpLmRhdGEoJ2RhdGEnLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyWwogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnByZXBlbmRGaWxlcyA/ICdwcmVwZW5kJyA6ICdhcHBlbmQnCiAgICAgICAgICAgICAgICAgICAgXShkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX3JlbmRlclByZXZpZXdzKGZpbGVzLCBkYXRhLmNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2ZvcmNlUmVmbG93KGRhdGEuY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGhhdC5fdHJpZ2dlcignYWRkZWQnLCBlLCBkYXRhKSAhPT0gZmFsc2UpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zLmF1dG9VcGxvYWQgfHwgZGF0YS5hdXRvVXBsb2FkKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmF1dG9VcGxvYWQgIT09IGZhbHNlICYmIGRhdGEuaXNWYWxpZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyk7CiAgICAgICAgICAgICAgICBpZiAoIWRhdGEuaXNWYWxpZGF0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEubWF4TnVtYmVyT2ZGaWxlc0FkanVzdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoLWRhdGEuZmlsZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoYXQuX3ZhbGlkYXRlKGRhdGEuZmlsZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb250ZXh0ICYmIGRhdGEuZGF0YVR5cGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5kYXRhVHlwZS5zdWJzdHIoMCwgNikgPT09ICdpZnJhbWUnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWZyYW1lIFRyYW5zcG9ydCBkb2VzIG5vdCBzdXBwb3J0IHByb2dyZXNzIGV2ZW50cy4KICAgICAgICAgICAgICAgICAgICAvLyBJbiBsYWNrIG9mIGFuIGluZGV0ZXJtaW5hdGUgcHJvZ3Jlc3MgYmFyLCB3ZSBzZXQKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJvZ3Jlc3MgdG8gMTAwJSwgc2hvd2luZyB0aGUgZnVsbCBhbmltYXRlZCBiYXI6CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcucHJvZ3Jlc3MnKS5hZGRDbGFzcygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiAncHJvZ3Jlc3MtYW5pbWF0ZWQnCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2FyaWEtdmFsdWVub3cnLCAxMDApCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMDAlJwogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoYXQuX3RyaWdnZXIoJ3NlbnQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHN1Y2Nlc3NmdWwgdXBsb2FkczoKICAgICAgICAgICAgZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZmlsZXMgPSB0aGF0Ll9nZXRGaWxlc0Zyb21SZXNwb25zZShkYXRhKSwKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tpbmRleF0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3I6ICdFbXB0eSBmaWxlIHVwbG9hZCByZXN1bHQnfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbigkKHRoaXMpKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoYXQuX3JlbmRlckRvd25sb2FkKFtmaWxlXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24odGVtcGxhdGUpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjb21wbGV0ZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChmaWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgJiYgZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFkYXRhLm1heE51bWJlck9mRmlsZXNBZGp1c3RlZCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkanVzdE1heE51bWJlck9mRmlsZXMoLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRoYXQuX3JlbmRlckRvd25sb2FkKGZpbGVzKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8odGhhdC5vcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyh0ZW1wbGF0ZSk7CiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQgPSB0aGF0Ll9hZGRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24odGVtcGxhdGUpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjb21wbGV0ZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgdXBsb2FkczoKICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQ7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5tYXhOdW1iZXJPZkZpbGVzQWRqdXN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzKGRhdGEuZmlsZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkYXRhLmNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmNvbnRleHQuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3JUaHJvd24gIT09ICdhYm9ydCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmaWxlID0gZGF0YS5maWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLmVycm9yID0gZmlsZS5lcnJvciB8fCBkYXRhLmVycm9yVGhyb3duIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlID0gJCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0aGF0Ll9yZW5kZXJEb3dubG9hZChbZmlsZV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3codGVtcGxhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKHRlbXBsYXRlKS5kb25lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmFpbGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZmluaXNoZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkID0gdGhhdC5fYWRkRmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZhaWxlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmVycm9yVGhyb3duICE9PSAnYWJvcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0ID0gdGhhdC5fcmVuZGVyVXBsb2FkKGRhdGEuZmlsZXMpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbyh0aGF0Lm9wdGlvbnMuZmlsZXNDb250YWluZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKCdkYXRhJywgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fZm9yY2VSZWZsb3coZGF0YS5jb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZCA9IHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJhbnNpdGlvbihkYXRhLmNvbnRleHQpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY29udGV4dCA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2ZpbmlzaGVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsZWQnLCBlLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmaW5pc2hlZCcsIGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX2FkZEZpbmlzaGVkRGVmZXJyZWRzKCkucmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS5jb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gcGFyc2VJbnQoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5jb250ZXh0LmZpbmQoJy5wcm9ncmVzcycpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuYmFyJykuY3NzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBnbG9iYWwgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgcHJvZ3Jlc3NhbGw6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgIHByb2dyZXNzID0gcGFyc2VJbnQoZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsICogMTAwLCAxMCksCiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJvZ3Jlc3NOb2RlID0gJHRoaXMuZmluZCgnLmZpbGV1cGxvYWQtcHJvZ3Jlc3MnKSwKICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFByb2dyZXNzTm9kZSA9IGdsb2JhbFByb2dyZXNzTm9kZQogICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLnByb2dyZXNzLWV4dGVuZGVkJyk7CiAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kZWRQcm9ncmVzc05vZGUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRQcm9ncmVzc05vZGUuaHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuZGF0YSgnZmlsZXVwbG9hZCcpLl9yZW5kZXJFeHRlbmRlZFByb2dyZXNzKGRhdGEpCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdsb2JhbFByb2dyZXNzTm9kZQogICAgICAgICAgICAgICAgICAgIC5maW5kKCcucHJvZ3Jlc3MnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgcHJvZ3Jlc3MpCiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5iYXInKS5jc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICd3aWR0aCcsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzICsgJyUnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RhcnQsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgIHN0YXJ0OiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdmFyIHRoYXQgPSAkKHRoaXMpLmRhdGEoJ2ZpbGV1cGxvYWQnKTsKICAgICAgICAgICAgICAgIHRoYXQuX3Jlc2V0RmluaXNoZWREZWZlcnJlZHMoKTsKICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oJCh0aGlzKS5maW5kKCcuZmlsZXVwbG9hZC1wcm9ncmVzcycpKS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RhcnRlZCcsIGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciB1cGxvYWRzIHN0b3AsIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RvcCBldmVudDoKICAgICAgICAgICAgc3RvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyksCiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQgPSB0aGF0Ll9hZGRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgICAgICAgICAgJC53aGVuLmFwcGx5KCQsIHRoYXQuX2dldEZpbmlzaGVkRGVmZXJyZWRzKCkpCiAgICAgICAgICAgICAgICAgICAgLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdzdG9wcGVkJywgZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKCQodGhpcykuZmluZCgnLmZpbGV1cGxvYWQtcHJvZ3Jlc3MnKSkuZG9uZSgKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdhcmlhLXZhbHVlbm93JywgJzAnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5iYXInKS5jc3MoJ3dpZHRoJywgJzAlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgnLnByb2dyZXNzLWV4dGVuZGVkJykuaHRtbCgnJm5ic3A7Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmlsZSBkZWxldGlvbjoKICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gJCh0aGlzKS5kYXRhKCdmaWxldXBsb2FkJyk7CiAgICAgICAgICAgICAgICBpZiAoZGF0YS51cmwpIHsKICAgICAgICAgICAgICAgICAgICAkLmFqYXgoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fYWRqdXN0TWF4TnVtYmVyT2ZGaWxlcygxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoYXQuX3RyYW5zaXRpb24oZGF0YS5jb250ZXh0KS5kb25lKAogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignZGVzdHJveWVkJywgZSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9yZXNldEZpbmlzaGVkRGVmZXJyZWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkVXBsb2FkcyA9IFtdOwogICAgICAgIH0sCgogICAgICAgIF9hZGRGaW5pc2hlZERlZmVycmVkczogZnVuY3Rpb24gKGRlZmVycmVkKSB7CiAgICAgICAgICAgIGlmICghZGVmZXJyZWQpIHsKICAgICAgICAgICAgICAgIGRlZmVycmVkID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkVXBsb2Fkcy5wdXNoKGRlZmVycmVkKTsKICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgICAgIH0sCiAgICAgICAgCiAgICAgICAgX2dldEZpbmlzaGVkRGVmZXJyZWRzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maW5pc2hlZFVwbG9hZHM7CiAgICAgICAgfSwKCiAgICAgICAgX2dldEZpbGVzRnJvbVJlc3BvbnNlOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YS5yZXN1bHQgJiYgJC5pc0FycmF5KGRhdGEucmVzdWx0LmZpbGVzKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0LmZpbGVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9LAoKICAgICAgICAvLyBMaW5rIGhhbmRsZXIsIHRoYXQgYWxsb3dzIHRvIGRvd25sb2FkIGZpbGVzCiAgICAgICAgLy8gYnkgZHJhZyAmIGRyb3Agb2YgdGhlIGxpbmtzIHRvIHRoZSBkZXNrdG9wOgogICAgICAgIF9lbmFibGVEcmFnVG9EZXNrdG9wOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBsaW5rID0gJCh0aGlzKSwKICAgICAgICAgICAgICAgIHVybCA9IGxpbmsucHJvcCgnaHJlZicpLAogICAgICAgICAgICAgICAgbmFtZSA9IGxpbmsucHJvcCgnZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGUgPSAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgbGluay5iaW5kKCdkcmFnc3RhcnQnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyLnNldERhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICdEb3dubG9hZFVSTCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFt0eXBlLCBuYW1lLCB1cmxdLmpvaW4oJzonKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHt9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9hZGp1c3RNYXhOdW1iZXJPZkZpbGVzOiBmdW5jdGlvbiAob3BlcmFuZCkgewogICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5tYXhOdW1iZXJPZkZpbGVzID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgKz0gb3BlcmFuZDsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubWF4TnVtYmVyT2ZGaWxlcyA8IDEpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlRmlsZUlucHV0QnV0dG9uKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2Zvcm1hdEZpbGVTaXplOiBmdW5jdGlvbiAoYnl0ZXMpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBieXRlcyAhPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZXMgPj0gMTAwMDAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDAwMDAwMDApLnRvRml4ZWQoMikgKyAnIEdCJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnl0ZXMgPj0gMTAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChieXRlcyAvIDEwMDAwMDApLnRvRml4ZWQoMikgKyAnIE1CJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKGJ5dGVzIC8gMTAwMCkudG9GaXhlZCgyKSArICcgS0InOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRCaXRyYXRlOiBmdW5jdGlvbiAoYml0cykgewogICAgICAgICAgICBpZiAodHlwZW9mIGJpdHMgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJpdHMgPj0gMTAwMDAwMDAwMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChiaXRzIC8gMTAwMDAwMDAwMCkudG9GaXhlZCgyKSArICcgR2JpdC9zJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYml0cyA+PSAxMDAwMDAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGJpdHMgLyAxMDAwMDAwKS50b0ZpeGVkKDIpICsgJyBNYml0L3MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiaXRzID49IDEwMDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAoYml0cyAvIDEwMDApLnRvRml4ZWQoMikgKyAnIGtiaXQvcyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGJpdHMudG9GaXhlZCgyKSArICcgYml0L3MnOwogICAgICAgIH0sCgogICAgICAgIF9mb3JtYXRUaW1lOiBmdW5jdGlvbiAoc2Vjb25kcykgewogICAgICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKHNlY29uZHMgKiAxMDAwKSwKICAgICAgICAgICAgICAgIGRheXMgPSBwYXJzZUludChzZWNvbmRzIC8gODY0MDAsIDEwKTsKICAgICAgICAgICAgZGF5cyA9IGRheXMgPyBkYXlzICsgJ2QgJyA6ICcnOwogICAgICAgICAgICByZXR1cm4gZGF5cyArCiAgICAgICAgICAgICAgICAoJzAnICsgZGF0ZS5nZXRVVENIb3VycygpKS5zbGljZSgtMikgKyAnOicgKwogICAgICAgICAgICAgICAgKCcwJyArIGRhdGUuZ2V0VVRDTWludXRlcygpKS5zbGljZSgtMikgKyAnOicgKwogICAgICAgICAgICAgICAgKCcwJyArIGRhdGUuZ2V0VVRDU2Vjb25kcygpKS5zbGljZSgtMik7CiAgICAgICAgfSwKCiAgICAgICAgX2Zvcm1hdFBlcmNlbnRhZ2U6IGZ1bmN0aW9uIChmbG9hdFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAoZmxvYXRWYWx1ZSAqIDEwMCkudG9GaXhlZCgyKSArICcgJSc7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlckV4dGVuZGVkUHJvZ3Jlc3M6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JtYXRCaXRyYXRlKGRhdGEuYml0cmF0ZSkgKyAnIHwgJyArCiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtYXRUaW1lKAogICAgICAgICAgICAgICAgICAgIChkYXRhLnRvdGFsIC0gZGF0YS5sb2FkZWQpICogOCAvIGRhdGEuYml0cmF0ZQogICAgICAgICAgICAgICAgKSArICcgfCAnICsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdFBlcmNlbnRhZ2UoCiAgICAgICAgICAgICAgICAgICAgZGF0YS5sb2FkZWQgLyBkYXRhLnRvdGFsCiAgICAgICAgICAgICAgICApICsgJyB8ICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0RmlsZVNpemUoZGF0YS5sb2FkZWQpICsgJyAvICcgKwogICAgICAgICAgICAgICAgdGhpcy5fZm9ybWF0RmlsZVNpemUoZGF0YS50b3RhbCk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhc0Vycm9yOiBmdW5jdGlvbiAoZmlsZSkgewogICAgICAgICAgICBpZiAoZmlsZS5lcnJvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZpbGUuZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIG51bWJlciBvZiBhZGRlZCBmaWxlcyBpcyBzdWJ0cmFjdGVkIGZyb20KICAgICAgICAgICAgLy8gbWF4TnVtYmVyT2ZGaWxlcyBiZWZvcmUgdmFsaWRhdGlvbiwgc28gd2UgY2hlY2sgaWYKICAgICAgICAgICAgLy8gbWF4TnVtYmVyT2ZGaWxlcyBpcyBiZWxvdyAwIChpbnN0ZWFkIG9mIGJlbG93IDEpOgogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1heE51bWJlck9mRmlsZXMgPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ01heGltdW0gbnVtYmVyIG9mIGZpbGVzIGV4Y2VlZGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGaWxlcyBhcmUgYWNjZXB0ZWQgaWYgZWl0aGVyIHRoZSBmaWxlIHR5cGUgb3IgdGhlIGZpbGUgbmFtZQogICAgICAgICAgICAvLyBtYXRjaGVzIGFnYWluc3QgdGhlIGFjY2VwdEZpbGVUeXBlcyByZWd1bGFyIGV4cHJlc3Npb24sIGFzCiAgICAgICAgICAgIC8vIG9ubHkgYnJvd3NlcnMgd2l0aCBzdXBwb3J0IGZvciB0aGUgRmlsZSBBUEkgcmVwb3J0IHRoZSB0eXBlOgogICAgICAgICAgICBpZiAoISh0aGlzLm9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzLnRlc3QoZmlsZS50eXBlKSB8fAogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5hY2NlcHRGaWxlVHlwZXMudGVzdChmaWxlLm5hbWUpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxldHlwZSBub3QgYWxsb3dlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSAmJgogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA+IHRoaXMub3B0aW9ucy5tYXhGaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxlIGlzIHRvbyBiaWcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZS5zaXplID09PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICAgICAgIGZpbGUuc2l6ZSA8IHRoaXMub3B0aW9ucy5taW5GaWxlU2l6ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdGaWxlIGlzIHRvbyBzbWFsbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSwKCiAgICAgICAgX3ZhbGlkYXRlOiBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgdmFsaWQgPSAhIWZpbGVzLmxlbmd0aDsKICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgIGZpbGUuZXJyb3IgPSB0aGF0Ll9oYXNFcnJvcihmaWxlKTsKICAgICAgICAgICAgICAgIGlmIChmaWxlLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB2YWxpZDsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyVGVtcGxhdGU6IGZ1bmN0aW9uIChmdW5jLCBmaWxlcykgewogICAgICAgICAgICBpZiAoIWZ1bmMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMoewogICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLAogICAgICAgICAgICAgICAgZm9ybWF0RmlsZVNpemU6IHRoaXMuX2Zvcm1hdEZpbGVTaXplLAogICAgICAgICAgICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgJCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJCh0aGlzLm9wdGlvbnMudGVtcGxhdGVzQ29udGFpbmVyKS5odG1sKHJlc3VsdCkuY2hpbGRyZW4oKTsKICAgICAgICB9LAoKICAgICAgICBfcmVuZGVyUHJldmlldzogZnVuY3Rpb24gKGZpbGUsIG5vZGUpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgcmV0dXJuICgobG9hZEltYWdlICYmIGxvYWRJbWFnZSgKICAgICAgICAgICAgICAgIGZpbGUsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoaW1nKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5hcHBlbmQoaW1nKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9mb3JjZVJlZmxvdyhub2RlKTsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmFuc2l0aW9uKG5vZGUpLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEkLmNvbnRhaW5zKHRoYXQuZG9jdW1lbnRbMF0uYm9keSwgbm9kZVswXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbm90IHBhcnQgb2YgdGhlIERPTSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNpdGlvbiBldmVudHMgYXJlIG5vdCB0cmlnZ2VyZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gcmVzb2x2ZSBtYW51YWxseToKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IG9wdGlvbnMucHJldmlld01heFdpZHRoLAogICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogb3B0aW9ucy5wcmV2aWV3TWF4SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIGNhbnZhczogb3B0aW9ucy5wcmV2aWV3QXNDYW52YXMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKSkgfHwgZGZkLnJlc29sdmVXaXRoKG5vZGUpKSAmJiBkZmQ7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlclByZXZpZXdzOiBmdW5jdGlvbiAoZmlsZXMsIG5vZGVzKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CiAgICAgICAgICAgIG5vZGVzLmZpbmQoJy5wcmV2aWV3IHNwYW4nKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkgewogICAgICAgICAgICAgICAgdmFyIGZpbGUgPSBmaWxlc1tpbmRleF07CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzLnRlc3QoZmlsZS50eXBlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMucHJldmlld1NvdXJjZU1heEZpbGVTaXplKSAhPT0gJ251bWJlcicgfHwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplIDwgb3B0aW9ucy5wcmV2aWV3U291cmNlTWF4RmlsZVNpemUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlID0gdGhhdC5fcHJvY2Vzc2luZ1F1ZXVlLnBpcGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGZkID0gJC5EZWZlcnJlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9yZW5kZXJQcmV2aWV3KGZpbGUsICQoZWxlbWVudCkpLmRvbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKHRoYXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGZkLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzaW5nUXVldWU7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlclVwbG9hZDogZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy51cGxvYWRUZW1wbGF0ZSwKICAgICAgICAgICAgICAgIGZpbGVzCiAgICAgICAgICAgICk7CiAgICAgICAgfSwKCiAgICAgICAgX3JlbmRlckRvd25sb2FkOiBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlclRlbXBsYXRlKAogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmRvd25sb2FkVGVtcGxhdGUsCiAgICAgICAgICAgICAgICBmaWxlcwogICAgICAgICAgICApLmZpbmQoJ2FbZG93bmxvYWRdJykuZWFjaCh0aGlzLl9lbmFibGVEcmFnVG9EZXNrdG9wKS5lbmQoKTsKICAgICAgICB9LAoKICAgICAgICBfc3RhcnRIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciBidXR0b24gPSAkKGUuY3VycmVudFRhcmdldCksCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IGJ1dHRvbi5jbG9zZXN0KCcudGVtcGxhdGUtdXBsb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpOwogICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnN1Ym1pdCAmJiAhZGF0YS5qcVhIUiAmJiBkYXRhLnN1Ym1pdCgpKSB7CiAgICAgICAgICAgICAgICBidXR0b24ucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9jYW5jZWxIYW5kbGVyOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHZhciB0ZW1wbGF0ZSA9ICQoZS5jdXJyZW50VGFyZ2V0KS5jbG9zZXN0KCcudGVtcGxhdGUtdXBsb2FkJyksCiAgICAgICAgICAgICAgICBkYXRhID0gdGVtcGxhdGUuZGF0YSgnZGF0YScpIHx8IHt9OwogICAgICAgICAgICBpZiAoIWRhdGEuanFYSFIpIHsKICAgICAgICAgICAgICAgIGRhdGEuZXJyb3JUaHJvd24gPSAnYWJvcnQnOwogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZmFpbCcsIGUsIGRhdGEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGF0YS5qcVhIUi5hYm9ydCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2RlbGV0ZUhhbmRsZXI6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQoZS5jdXJyZW50VGFyZ2V0KTsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcignZGVzdHJveScsIGUsICQuZXh0ZW5kKHsKICAgICAgICAgICAgICAgIGNvbnRleHQ6IGJ1dHRvbi5jbG9zZXN0KCcudGVtcGxhdGUtZG93bmxvYWQnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdERUxFVEUnLAogICAgICAgICAgICAgICAgZGF0YVR5cGU6IHRoaXMub3B0aW9ucy5kYXRhVHlwZQogICAgICAgICAgICB9LCBidXR0b24uZGF0YSgpKSk7CiAgICAgICAgfSwKCiAgICAgICAgX2ZvcmNlUmVmbG93OiBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICByZXR1cm4gJC5zdXBwb3J0LnRyYW5zaXRpb24gJiYgbm9kZS5sZW5ndGggJiYKICAgICAgICAgICAgICAgIG5vZGVbMF0ub2Zmc2V0V2lkdGg7CiAgICAgICAgfSwKCiAgICAgICAgX3RyYW5zaXRpb246IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCk7CiAgICAgICAgICAgIGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbiAmJiBub2RlLmhhc0NsYXNzKCdmYWRlJykpIHsKICAgICAgICAgICAgICAgIG5vZGUuYmluZCgKICAgICAgICAgICAgICAgICAgICAkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHJlc3BvbmQgdG8gb3RoZXIgdHJhbnNpdGlvbnMgZXZlbnRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb250YWluZXIgZWxlbWVudCwgZS5nLiBmcm9tIGJ1dHRvbiBlbGVtZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0ID09PSBub2RlWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnVuYmluZCgkLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS50b2dnbGVDbGFzcygnaW4nKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUudG9nZ2xlQ2xhc3MoJ2luJyk7CiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZVdpdGgobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRmZDsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEJ1dHRvbkJhckV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGZpbGVVcGxvYWRCdXR0b25CYXIgPSB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGV1cGxvYWQtYnV0dG9uYmFyJyksCiAgICAgICAgICAgICAgICBmaWxlc0xpc3QgPSB0aGlzLm9wdGlvbnMuZmlsZXNDb250YWluZXI7CiAgICAgICAgICAgIHRoaXMuX29uKGZpbGVVcGxvYWRCdXR0b25CYXIuZmluZCgnLnN0YXJ0JyksIHsKICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlc0xpc3QuZmluZCgnLnN0YXJ0IGJ1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5jYW5jZWwnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuY2FuY2VsIGJ1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy5kZWxldGUnKSwgewogICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuZGVsZXRlIGlucHV0OmNoZWNrZWQnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2libGluZ3MoJ2J1dHRvbicpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgZmlsZVVwbG9hZEJ1dHRvbkJhci5maW5kKCcudG9nZ2xlJykKICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9vbihmaWxlVXBsb2FkQnV0dG9uQmFyLmZpbmQoJy50b2dnbGUnKSwgewogICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIGZpbGVzTGlzdC5maW5kKCcuZGVsZXRlIGlucHV0JykucHJvcCgKICAgICAgICAgICAgICAgICAgICAgICAgJ2NoZWNrZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAkKGUuY3VycmVudFRhcmdldCkuaXMoJzpjaGVja2VkJykKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9LAoKICAgICAgICBfZGVzdHJveUJ1dHRvbkJhckV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciBidXR0b24nKSwKICAgICAgICAgICAgICAgICdjbGljaycKICAgICAgICAgICAgKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKAogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJy5maWxldXBsb2FkLWJ1dHRvbmJhciAudG9nZ2xlJyksCiAgICAgICAgICAgICAgICAnY2hhbmdlLicKICAgICAgICAgICAgKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEV2ZW50SGFuZGxlcnM6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAnY2xpY2sgLnN0YXJ0IGJ1dHRvbic6IHRoaXMuX3N0YXJ0SGFuZGxlciwKICAgICAgICAgICAgICAgICdjbGljayAuY2FuY2VsIGJ1dHRvbic6IHRoaXMuX2NhbmNlbEhhbmRsZXIsCiAgICAgICAgICAgICAgICAnY2xpY2sgLmRlbGV0ZSBidXR0b24nOiB0aGlzLl9kZWxldGVIYW5kbGVyCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9pbml0QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgIH0sCgogICAgICAgIF9kZXN0cm95RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95QnV0dG9uQmFyRXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVzQ29udGFpbmVyLCAnY2xpY2snKTsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICB9LAoKICAgICAgICBfZW5hYmxlRmlsZUlucHV0QnV0dG9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5maW5kKCcuZmlsZWlucHV0LWJ1dHRvbiBpbnB1dCcpCiAgICAgICAgICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQuZmluZCgnLmZpbGVpbnB1dC1idXR0b24gaW5wdXQnKQogICAgICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5wYXJlbnQoKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFRlbXBsYXRlczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgb3B0aW9ucy50ZW1wbGF0ZXNDb250YWluZXIgPSB0aGlzLmRvY3VtZW50WzBdLmNyZWF0ZUVsZW1lbnQoCiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyLnByb3AoJ25vZGVOYW1lJykKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKHRtcGwpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLnVwbG9hZFRlbXBsYXRlSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZG93bmxvYWRUZW1wbGF0ZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kb3dubG9hZFRlbXBsYXRlID0gdG1wbChvcHRpb25zLmRvd25sb2FkVGVtcGxhdGVJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdEZpbGVzQ29udGFpbmVyOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlc0NvbnRhaW5lciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gdGhpcy5lbGVtZW50LmZpbmQoJy5maWxlcycpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlc0NvbnRhaW5lciBpbnN0YW5jZW9mICQpKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZpbGVzQ29udGFpbmVyID0gJChvcHRpb25zLmZpbGVzQ29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9zdHJpbmdUb1JlZ0V4cDogZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICB2YXIgcGFydHMgPSBzdHIuc3BsaXQoJy8nKSwKICAgICAgICAgICAgICAgIG1vZGlmaWVycyA9IHBhcnRzLnBvcCgpOwogICAgICAgICAgICBwYXJ0cy5zaGlmdCgpOwogICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXJ0cy5qb2luKCcvJyksIG1vZGlmaWVycyk7CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRSZWdFeHBPcHRpb25zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAoJC50eXBlKG9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzKSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuYWNjZXB0RmlsZVR5cGVzID0gdGhpcy5fc3RyaW5nVG9SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5hY2NlcHRGaWxlVHlwZXMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQudHlwZShvcHRpb25zLnByZXZpZXdTb3VyY2VGaWxlVHlwZXMpID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgb3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzID0gdGhpcy5fc3RyaW5nVG9SZWdFeHAoCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcmV2aWV3U291cmNlRmlsZVR5cGVzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2luaXRTcGVjaWFsT3B0aW9uczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9zdXBlcigpOwogICAgICAgICAgICB0aGlzLl9pbml0RmlsZXNDb250YWluZXIoKTsKICAgICAgICAgICAgdGhpcy5faW5pdFRlbXBsYXRlcygpOwogICAgICAgICAgICB0aGlzLl9pbml0UmVnRXhwT3B0aW9ucygpOwogICAgICAgIH0sCgogICAgICAgIF9jcmVhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaE9wdGlvbnNMaXN0LnB1c2goCiAgICAgICAgICAgICAgICAnZmlsZXNDb250YWluZXInLAogICAgICAgICAgICAgICAgJ3VwbG9hZFRlbXBsYXRlSWQnLAogICAgICAgICAgICAgICAgJ2Rvd25sb2FkVGVtcGxhdGVJZCcKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wcm9jZXNzaW5nUXVldWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZSA9ICQuRGVmZXJyZWQoKS5yZXNvbHZlV2l0aCh0aGlzKS5wcm9taXNlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2Nlc3NpbmdRdWV1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVzZXRGaW5pc2hlZERlZmVycmVkcygpOwogICAgICAgIH0sCgogICAgICAgIGVuYWJsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgd2FzRGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgd2FzRGlzYWJsZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgICAgIGlmICh3YXNEaXNhYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0LCBidXR0b24nKS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VuYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgZGlzYWJsZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0LCBidXR0b24nKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZUZpbGVJbnB1dEJ1dHRvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKCk7CiAgICAgICAgfQoKICAgIH0pOwoKfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.fileupload.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IEZpbGUgVXBsb2FkIFBsdWdpbgogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTAsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLyoganNoaW50IG5vbWVuOmZhbHNlICovCi8qIGdsb2JhbCBkZWZpbmUsIHJlcXVpcmUsIHdpbmRvdywgZG9jdW1lbnQsIGxvY2F0aW9uLCBCbG9iLCBGb3JtRGF0YSAqLwoKKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAndXNlIHN0cmljdCc7CiAgICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgICAgLy8gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIEFNRCBtb2R1bGU6CiAgICAgICAgZGVmaW5lKFsKICAgICAgICAgICAgJ2pxdWVyeScsCiAgICAgICAgICAgICdqcXVlcnkudWkud2lkZ2V0JwogICAgICAgIF0sIGZhY3RvcnkpOwogICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAvLyBOb2RlL0NvbW1vbkpTOgogICAgICAgIGZhY3RvcnkoCiAgICAgICAgICAgIHJlcXVpcmUoJ2pxdWVyeScpLAogICAgICAgICAgICByZXF1aXJlKCcuL3ZlbmRvci9qcXVlcnkudWkud2lkZ2V0JykKICAgICAgICApOwogICAgfSBlbHNlIHsKICAgICAgICAvLyBCcm93c2VyIGdsb2JhbHM6CiAgICAgICAgZmFjdG9yeSh3aW5kb3cualF1ZXJ5KTsKICAgIH0KfShmdW5jdGlvbiAoJCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIERldGVjdCBmaWxlIGlucHV0IHN1cHBvcnQsIGJhc2VkIG9uCiAgICAvLyBodHRwOi8vdmlsamFtaXMuY29tL2Jsb2cvMjAxMi9maWxlLXVwbG9hZC1zdXBwb3J0LW9uLW1vYmlsZS8KICAgICQuc3VwcG9ydC5maWxlSW5wdXQgPSAhKG5ldyBSZWdFeHAoCiAgICAgICAgLy8gSGFuZGxlIGRldmljZXMgd2hpY2ggZ2l2ZSBmYWxzZSBwb3NpdGl2ZXMgZm9yIHRoZSBmZWF0dXJlIGRldGVjdGlvbjoKICAgICAgICAnKEFuZHJvaWQgKDFcXC5bMDE1Nl18MlxcLlswMV0pKScgKwogICAgICAgICAgICAnfChXaW5kb3dzIFBob25lIChPUyA3fDhcXC4wKSl8KFhCTFdQKXwoWnVuZVdQKXwoV1BEZXNrdG9wKScgKwogICAgICAgICAgICAnfCh3KGViKT9PU0Jyb3dzZXIpfCh3ZWJPUyknICsKICAgICAgICAgICAgJ3woS2luZGxlLygxXFwuMHwyXFwuWzA1XXwzXFwuMCkpJwogICAgKS50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSB8fAogICAgICAgIC8vIEZlYXR1cmUgZGV0ZWN0aW9uIGZvciBhbGwgb3RoZXIgZGV2aWNlczoKICAgICAgICAkKCc8aW5wdXQgdHlwZT0iZmlsZSI+JykucHJvcCgnZGlzYWJsZWQnKSk7CgogICAgLy8gVGhlIEZpbGVSZWFkZXIgQVBJIGlzIG5vdCBhY3R1YWxseSB1c2VkLCBidXQgd29ya3MgYXMgZmVhdHVyZSBkZXRlY3Rpb24sCiAgICAvLyBhcyBzb21lIFNhZmFyaSB2ZXJzaW9ucyAoNT8pIHN1cHBvcnQgWEhSIGZpbGUgdXBsb2FkcyB2aWEgdGhlIEZvcm1EYXRhIEFQSSwKICAgIC8vIGJ1dCBub3Qgbm9uLW11bHRpcGFydCBYSFIgZmlsZSB1cGxvYWRzLgogICAgLy8gd2luZG93LlhNTEh0dHBSZXF1ZXN0VXBsb2FkIGlzIG5vdCBhdmFpbGFibGUgb24gSUUxMCwgc28gd2UgY2hlY2sgZm9yCiAgICAvLyB3aW5kb3cuUHJvZ3Jlc3NFdmVudCBpbnN0ZWFkIHRvIGRldGVjdCBYSFIyIGZpbGUgdXBsb2FkIGNhcGFiaWxpdHk6CiAgICAkLnN1cHBvcnQueGhyRmlsZVVwbG9hZCA9ICEhKHdpbmRvdy5Qcm9ncmVzc0V2ZW50ICYmIHdpbmRvdy5GaWxlUmVhZGVyKTsKICAgICQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQgPSAhIXdpbmRvdy5Gb3JtRGF0YTsKCiAgICAvLyBEZXRlY3Qgc3VwcG9ydCBmb3IgQmxvYiBzbGljaW5nIChyZXF1aXJlZCBmb3IgY2h1bmtlZCB1cGxvYWRzKToKICAgICQuc3VwcG9ydC5ibG9iU2xpY2UgPSB3aW5kb3cuQmxvYiAmJiAoQmxvYi5wcm90b3R5cGUuc2xpY2UgfHwKICAgICAgICBCbG9iLnByb3RvdHlwZS53ZWJraXRTbGljZSB8fCBCbG9iLnByb3RvdHlwZS5tb3pTbGljZSk7CgogICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBkcmFnIGhhbmRsZXJzIGZvciBkcmFnb3Zlci9kcmFnZW50ZXIvZHJhZ2xlYXZlOgogICAgZnVuY3Rpb24gZ2V0RHJhZ0hhbmRsZXIodHlwZSkgewogICAgICAgIHZhciBpc0RyYWdPdmVyID0gdHlwZSA9PT0gJ2RyYWdvdmVyJzsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIgPSBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgdmFyIGRhdGFUcmFuc2ZlciA9IGUuZGF0YVRyYW5zZmVyOwogICAgICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICYmICQuaW5BcnJheSgnRmlsZXMnLCBkYXRhVHJhbnNmZXIudHlwZXMpICE9PSAtMSAmJgogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQodHlwZSwge2RlbGVnYXRlZEV2ZW50OiBlfSkKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgaWYgKGlzRHJhZ092ZXIpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdjb3B5JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgLy8gVGhlIGZpbGV1cGxvYWQgd2lkZ2V0IGxpc3RlbnMgZm9yIGNoYW5nZSBldmVudHMgb24gZmlsZSBpbnB1dCBmaWVsZHMgZGVmaW5lZAogICAgLy8gdmlhIGZpbGVJbnB1dCBzZXR0aW5nIGFuZCBwYXN0ZSBvciBkcm9wIGV2ZW50cyBvZiB0aGUgZ2l2ZW4gZHJvcFpvbmUuCiAgICAvLyBJbiBhZGRpdGlvbiB0byB0aGUgZGVmYXVsdCBqUXVlcnkgV2lkZ2V0IG1ldGhvZHMsIHRoZSBmaWxldXBsb2FkIHdpZGdldAogICAgLy8gZXhwb3NlcyB0aGUgImFkZCIgYW5kICJzZW5kIiBtZXRob2RzLCB0byBhZGQgb3IgZGlyZWN0bHkgc2VuZCBmaWxlcyB1c2luZwogICAgLy8gdGhlIGZpbGV1cGxvYWQgQVBJLgogICAgLy8gQnkgZGVmYXVsdCwgZmlsZXMgYWRkZWQgdmlhIGZpbGUgaW5wdXQgc2VsZWN0aW9uLCBwYXN0ZSwgZHJhZyAmIGRyb3Agb3IKICAgIC8vICJhZGQiIG1ldGhvZCBhcmUgdXBsb2FkZWQgaW1tZWRpYXRlbHksIGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBvdmVycmlkZQogICAgLy8gdGhlICJhZGQiIGNhbGxiYWNrIG9wdGlvbiB0byBxdWV1ZSBmaWxlIHVwbG9hZHMuCiAgICAkLndpZGdldCgnYmx1ZWltcC5maWxldXBsb2FkJywgewoKICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgIC8vIFRoZSBkcm9wIHRhcmdldCBlbGVtZW50KHMpLCBieSB0aGUgZGVmYXVsdCB0aGUgY29tcGxldGUgZG9jdW1lbnQuCiAgICAgICAgICAgIC8vIFNldCB0byBudWxsIHRvIGRpc2FibGUgZHJhZyAmIGRyb3Agc3VwcG9ydDoKICAgICAgICAgICAgZHJvcFpvbmU6ICQoZG9jdW1lbnQpLAogICAgICAgICAgICAvLyBUaGUgcGFzdGUgdGFyZ2V0IGVsZW1lbnQocyksIGJ5IHRoZSBkZWZhdWx0IHVuZGVmaW5lZC4KICAgICAgICAgICAgLy8gU2V0IHRvIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IG9iamVjdCB0byBlbmFibGUgZmlsZSBwYXN0aW5nOgogICAgICAgICAgICBwYXN0ZVpvbmU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIGZpbGUgaW5wdXQgZmllbGQocyksIHRoYXQgYXJlIGxpc3RlbmVkIHRvIGZvciBjaGFuZ2UgZXZlbnRzLgogICAgICAgICAgICAvLyBJZiB1bmRlZmluZWQsIGl0IGlzIHNldCB0byB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgaW5zaWRlCiAgICAgICAgICAgIC8vIG9mIHRoZSB3aWRnZXQgZWxlbWVudCBvbiBwbHVnaW4gaW5pdGlhbGl6YXRpb24uCiAgICAgICAgICAgIC8vIFNldCB0byBudWxsIHRvIGRpc2FibGUgdGhlIGNoYW5nZSBsaXN0ZW5lci4KICAgICAgICAgICAgZmlsZUlucHV0OiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSBmaWxlIGlucHV0IGZpZWxkIGlzIHJlcGxhY2VkIHdpdGggYSBjbG9uZSBhZnRlcgogICAgICAgICAgICAvLyBlYWNoIGlucHV0IGZpZWxkIGNoYW5nZSBldmVudC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgaWZyYW1lIHRyYW5zcG9ydAogICAgICAgICAgICAvLyBxdWV1ZXMgYW5kIGFsbG93cyBjaGFuZ2UgZXZlbnRzIHRvIGJlIGZpcmVkIGZvciB0aGUgc2FtZSBmaWxlCiAgICAgICAgICAgIC8vIHNlbGVjdGlvbiwgYnV0IGNhbiBiZSBkaXNhYmxlZCBieSBzZXR0aW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlOgogICAgICAgICAgICByZXBsYWNlRmlsZUlucHV0OiB0cnVlLAogICAgICAgICAgICAvLyBUaGUgcGFyYW1ldGVyIG5hbWUgZm9yIHRoZSBmaWxlIGZvcm0gZGF0YSAodGhlIHJlcXVlc3QgYXJndW1lbnQgbmFtZSkuCiAgICAgICAgICAgIC8vIElmIHVuZGVmaW5lZCBvciBlbXB0eSwgdGhlIG5hbWUgcHJvcGVydHkgb2YgdGhlIGZpbGUgaW5wdXQgZmllbGQgaXMKICAgICAgICAgICAgLy8gdXNlZCwgb3IgImZpbGVzW10iIGlmIHRoZSBmaWxlIGlucHV0IG5hbWUgcHJvcGVydHkgaXMgYWxzbyBlbXB0eSwKICAgICAgICAgICAgLy8gY2FuIGJlIGEgc3RyaW5nIG9yIGFuIGFycmF5IG9mIHN0cmluZ3M6CiAgICAgICAgICAgIHBhcmFtTmFtZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBlYWNoIGZpbGUgb2YgYSBzZWxlY3Rpb24gaXMgdXBsb2FkZWQgdXNpbmcgYW4gaW5kaXZpZHVhbAogICAgICAgICAgICAvLyByZXF1ZXN0IGZvciBYSFIgdHlwZSB1cGxvYWRzLiBTZXQgdG8gZmFsc2UgdG8gdXBsb2FkIGZpbGUKICAgICAgICAgICAgLy8gc2VsZWN0aW9ucyBpbiBvbmUgcmVxdWVzdCBlYWNoOgogICAgICAgICAgICBzaW5nbGVGaWxlVXBsb2FkczogdHJ1ZSwKICAgICAgICAgICAgLy8gVG8gbGltaXQgdGhlIG51bWJlciBvZiBmaWxlcyB1cGxvYWRlZCB3aXRoIG9uZSBYSFIgcmVxdWVzdCwKICAgICAgICAgICAgLy8gc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDA6CiAgICAgICAgICAgIGxpbWl0TXVsdGlGaWxlVXBsb2FkczogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG9wdGlvbiBsaW1pdHMgdGhlIG51bWJlciBvZiBmaWxlcyB1cGxvYWRlZCB3aXRoIG9uZQogICAgICAgICAgICAvLyBYSFIgcmVxdWVzdCB0byBrZWVwIHRoZSByZXF1ZXN0IHNpemUgdW5kZXIgb3IgZXF1YWwgdG8gdGhlIGRlZmluZWQKICAgICAgICAgICAgLy8gbGltaXQgaW4gYnl0ZXM6CiAgICAgICAgICAgIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZTogdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBNdWx0aXBhcnQgZmlsZSB1cGxvYWRzIGFkZCBhIG51bWJlciBvZiBieXRlcyB0byBlYWNoIHVwbG9hZGVkIGZpbGUsCiAgICAgICAgICAgIC8vIHRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIG9wdGlvbiBhZGRzIGFuIG92ZXJoZWFkIGZvciBlYWNoIGZpbGUgdXNlZAogICAgICAgICAgICAvLyBpbiB0aGUgbGltaXRNdWx0aUZpbGVVcGxvYWRTaXplIGNvbmZpZ3VyYXRpb246CiAgICAgICAgICAgIGxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZU92ZXJoZWFkOiA1MTIsCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlIHRvIGlzc3VlIGFsbCBmaWxlIHVwbG9hZCByZXF1ZXN0cwogICAgICAgICAgICAvLyBpbiBhIHNlcXVlbnRpYWwgb3JkZXI6CiAgICAgICAgICAgIHNlcXVlbnRpYWxVcGxvYWRzOiBmYWxzZSwKICAgICAgICAgICAgLy8gVG8gbGltaXQgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHVwbG9hZHMsCiAgICAgICAgICAgIC8vIHNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiAwOgogICAgICAgICAgICBsaW1pdENvbmN1cnJlbnRVcGxvYWRzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0cnVlIHRvIGZvcmNlIGlmcmFtZSB0cmFuc3BvcnQgdXBsb2FkczoKICAgICAgICAgICAgZm9yY2VJZnJhbWVUcmFuc3BvcnQ6IGZhbHNlLAogICAgICAgICAgICAvLyBTZXQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8gdGhlIGxvY2F0aW9uIG9mIGEgcmVkaXJlY3QgdXJsIG9uIHRoZQogICAgICAgICAgICAvLyBvcmlnaW4gc2VydmVyLCBmb3IgY3Jvc3MtZG9tYWluIGlmcmFtZSB0cmFuc3BvcnQgdXBsb2FkczoKICAgICAgICAgICAgcmVkaXJlY3Q6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gVGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgcmVkaXJlY3QgdXJsLCBzZW50IGFzIHBhcnQgb2YgdGhlIGZvcm0KICAgICAgICAgICAgLy8gZGF0YSBhbmQgc2V0IHRvICdyZWRpcmVjdCcgaWYgdGhpcyBvcHRpb24gaXMgZW1wdHk6CiAgICAgICAgICAgIHJlZGlyZWN0UGFyYW1OYW1lOiB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB0aGUgbG9jYXRpb24gb2YgYSBwb3N0TWVzc2FnZSB3aW5kb3csCiAgICAgICAgICAgIC8vIHRvIGVuYWJsZSBwb3N0TWVzc2FnZSB0cmFuc3BvcnQgdXBsb2FkczoKICAgICAgICAgICAgcG9zdE1lc3NhZ2U6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgWEhSIGZpbGUgdXBsb2FkcyBhcmUgc2VudCBhcyBtdWx0aXBhcnQvZm9ybS1kYXRhLgogICAgICAgICAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBpcyBhbHdheXMgdXNpbmcgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4KICAgICAgICAgICAgLy8gU2V0IHRvIGZhbHNlIHRvIGVuYWJsZSBub24tbXVsdGlwYXJ0IFhIUiB1cGxvYWRzOgogICAgICAgICAgICBtdWx0aXBhcnQ6IHRydWUsCiAgICAgICAgICAgIC8vIFRvIHVwbG9hZCBsYXJnZSBmaWxlcyBpbiBzbWFsbGVyIGNodW5rcywgc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uCiAgICAgICAgICAgIC8vIHRvIGEgcHJlZmVycmVkIG1heGltdW0gY2h1bmsgc2l6ZS4gSWYgc2V0IHRvIDAsIG51bGwgb3IgdW5kZWZpbmVkLAogICAgICAgICAgICAvLyBvciB0aGUgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1aXJlZCBCbG9iIEFQSSwgZmlsZXMgd2lsbAogICAgICAgICAgICAvLyBiZSB1cGxvYWRlZCBhcyBhIHdob2xlLgogICAgICAgICAgICBtYXhDaHVua1NpemU6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gV2hlbiBhIG5vbi1tdWx0aXBhcnQgdXBsb2FkIG9yIGEgY2h1bmtlZCBtdWx0aXBhcnQgdXBsb2FkIGhhcyBiZWVuCiAgICAgICAgICAgIC8vIGFib3J0ZWQsIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc3VtZSB0aGUgdXBsb2FkIGJ5IHNldHRpbmcKICAgICAgICAgICAgLy8gaXQgdG8gdGhlIHNpemUgb2YgdGhlIGFscmVhZHkgdXBsb2FkZWQgYnl0ZXMuIFRoaXMgb3B0aW9uIGlzIG1vc3QKICAgICAgICAgICAgLy8gdXNlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBvcHRpb25zIG9iamVjdCBpbnNpZGUgb2YgdGhlICJhZGQiIG9yCiAgICAgICAgICAgIC8vICJzZW5kIiBjYWxsYmFja3MsIGFzIHRoZSBvcHRpb25zIGFyZSBjbG9uZWQgZm9yIGVhY2ggZmlsZSB1cGxvYWQuCiAgICAgICAgICAgIHVwbG9hZGVkQnl0ZXM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgZmlsZSB1cGxvYWRzIGFyZSByZW1vdmVkIGZyb20gdGhlCiAgICAgICAgICAgIC8vIGdsb2JhbCBwcm9ncmVzcyBjYWxjdWxhdGlvbi4gU2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIHRvIGZhbHNlIHRvCiAgICAgICAgICAgIC8vIHByZXZlbnQgcmVjYWxjdWxhdGluZyB0aGUgZ2xvYmFsIHByb2dyZXNzIGRhdGE6CiAgICAgICAgICAgIHJlY2FsY3VsYXRlUHJvZ3Jlc3M6IHRydWUsCiAgICAgICAgICAgIC8vIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBjYWxjdWxhdGUgYW5kIHRyaWdnZXIgcHJvZ3Jlc3MgZXZlbnRzOgogICAgICAgICAgICBwcm9ncmVzc0ludGVydmFsOiAxMDAsCiAgICAgICAgICAgIC8vIEludGVydmFsIGluIG1pbGxpc2Vjb25kcyB0byBjYWxjdWxhdGUgcHJvZ3Jlc3MgYml0cmF0ZToKICAgICAgICAgICAgYml0cmF0ZUludGVydmFsOiA1MDAsCiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIHVwbG9hZHMgYXJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseSB3aGVuIGFkZGluZyBmaWxlczoKICAgICAgICAgICAgYXV0b1VwbG9hZDogdHJ1ZSwKCiAgICAgICAgICAgIC8vIEVycm9yIGFuZCBpbmZvIG1lc3NhZ2VzOgogICAgICAgICAgICBtZXNzYWdlczogewogICAgICAgICAgICAgICAgdXBsb2FkZWRCeXRlczogJ1VwbG9hZGVkIGJ5dGVzIGV4Y2VlZCBmaWxlIHNpemUnCiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUcmFuc2xhdGlvbiBmdW5jdGlvbiwgZ2V0cyB0aGUgbWVzc2FnZSBrZXkgdG8gYmUgdHJhbnNsYXRlZAogICAgICAgICAgICAvLyBhbmQgYW4gb2JqZWN0IHdpdGggY29udGV4dCBzcGVjaWZpYyBkYXRhIGFzIGFyZ3VtZW50czoKICAgICAgICAgICAgaTE4bjogZnVuY3Rpb24gKG1lc3NhZ2UsIGNvbnRleHQpIHsKICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2VzW21lc3NhZ2VdIHx8IG1lc3NhZ2UudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIGlmIChjb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGNvbnRleHQsIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlLnJlcGxhY2UoJ3snICsga2V5ICsgJ30nLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8vIEFkZGl0aW9uYWwgZm9ybSBkYXRhIHRvIGJlIHNlbnQgYWxvbmcgd2l0aCB0aGUgZmlsZSB1cGxvYWRzIGNhbiBiZSBzZXQKICAgICAgICAgICAgLy8gdXNpbmcgdGhpcyBvcHRpb24sIHdoaWNoIGFjY2VwdHMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kCiAgICAgICAgICAgIC8vIHZhbHVlIHByb3BlcnRpZXMsIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHN1Y2ggYW4gYXJyYXksIGEgRm9ybURhdGEKICAgICAgICAgICAgLy8gb2JqZWN0IChmb3IgWEhSIGZpbGUgdXBsb2FkcyksIG9yIGEgc2ltcGxlIG9iamVjdC4KICAgICAgICAgICAgLy8gVGhlIGZvcm0gb2YgdGhlIGZpcnN0IGZpbGVJbnB1dCBpcyBnaXZlbiBhcyBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uOgogICAgICAgICAgICBmb3JtRGF0YTogZnVuY3Rpb24gKGZvcm0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JtLnNlcmlhbGl6ZUFycmF5KCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvLyBUaGUgYWRkIGNhbGxiYWNrIGlzIGludm9rZWQgYXMgc29vbiBhcyBmaWxlcyBhcmUgYWRkZWQgdG8gdGhlIGZpbGV1cGxvYWQKICAgICAgICAgICAgLy8gd2lkZ2V0ICh2aWEgZmlsZSBpbnB1dCBzZWxlY3Rpb24sIGRyYWcgJiBkcm9wLCBwYXN0ZSBvciBhZGQgQVBJIGNhbGwpLgogICAgICAgICAgICAvLyBJZiB0aGUgc2luZ2xlRmlsZVVwbG9hZHMgb3B0aW9uIGlzIGVuYWJsZWQsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZQogICAgICAgICAgICAvLyBjYWxsZWQgb25jZSBmb3IgZWFjaCBmaWxlIGluIHRoZSBzZWxlY3Rpb24gZm9yIFhIUiBmaWxlIHVwbG9hZHMsIGVsc2UKICAgICAgICAgICAgLy8gb25jZSBmb3IgZWFjaCBmaWxlIHNlbGVjdGlvbi4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVGhlIHVwbG9hZCBzdGFydHMgd2hlbiB0aGUgc3VibWl0IG1ldGhvZCBpcyBpbnZva2VkIG9uIHRoZSBkYXRhIHBhcmFtZXRlci4KICAgICAgICAgICAgLy8gVGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5zIGEgZmlsZXMgcHJvcGVydHkgaG9sZGluZyB0aGUgYWRkZWQgZmlsZXMKICAgICAgICAgICAgLy8gYW5kIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgcGx1Z2luIG9wdGlvbnMgYXMgd2VsbCBhcyBkZWZpbmUgYWpheCBzZXR0aW5ncy4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gTGlzdGVuZXJzIGZvciB0aGlzIGNhbGxiYWNrIGNhbiBhbHNvIGJlIGJvdW5kIHRoZSBmb2xsb3dpbmcgd2F5OgogICAgICAgICAgICAvLyAuYmluZCgnZmlsZXVwbG9hZGFkZCcsIGZ1bmMpOwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBkYXRhLnN1Ym1pdCgpIHJldHVybnMgYSBQcm9taXNlIG9iamVjdCBhbmQgYWxsb3dzIHRvIGF0dGFjaCBhZGRpdGlvbmFsCiAgICAgICAgICAgIC8vIGhhbmRsZXJzIHVzaW5nIGpRdWVyeSdzIERlZmVycmVkIGNhbGxiYWNrczoKICAgICAgICAgICAgLy8gZGF0YS5zdWJtaXQoKS5kb25lKGZ1bmMpLmZhaWwoZnVuYykuYWx3YXlzKGZ1bmMpOwogICAgICAgICAgICBhZGQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkYXRhLmF1dG9VcGxvYWQgfHwgKGRhdGEuYXV0b1VwbG9hZCAhPT0gZmFsc2UgJiYKICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5maWxldXBsb2FkKCdvcHRpb24nLCAnYXV0b1VwbG9hZCcpKSkgewogICAgICAgICAgICAgICAgICAgIGRhdGEucHJvY2VzcygpLmRvbmUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnN1Ym1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy8gT3RoZXIgY2FsbGJhY2tzOgoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdWJtaXQgZXZlbnQgb2YgZWFjaCBmaWxlIHVwbG9hZDoKICAgICAgICAgICAgLy8gc3VibWl0OiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3VibWl0JywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdGhlIHN0YXJ0IG9mIGVhY2ggZmlsZSB1cGxvYWQgcmVxdWVzdDoKICAgICAgICAgICAgLy8gc2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHNlbmQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBzdWNjZXNzZnVsIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGRvbmU6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkb25lJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZmFpbGVkIChhYm9ydCBvciBlcnJvcikgdXBsb2FkczoKICAgICAgICAgICAgLy8gZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGZhaWwnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBjb21wbGV0ZWQgKHN1Y2Nlc3MsIGFib3J0IG9yIGVycm9yKSByZXF1ZXN0czoKICAgICAgICAgICAgLy8gYWx3YXlzOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkYWx3YXlzJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkIHByb2dyZXNzIGV2ZW50czoKICAgICAgICAgICAgLy8gcHJvZ3Jlc3M6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRwcm9ncmVzcycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGdsb2JhbCB1cGxvYWQgcHJvZ3Jlc3MgZXZlbnRzOgogICAgICAgICAgICAvLyBwcm9ncmVzc2FsbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZHByb2dyZXNzYWxsJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgdXBsb2FkcyBzdGFydCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdGFydCBldmVudDoKICAgICAgICAgICAgLy8gc3RhcnQ6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRzdGFydCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHVwbG9hZHMgc3RvcCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdG9wIGV2ZW50OgogICAgICAgICAgICAvLyBzdG9wOiBmdW5jdGlvbiAoZSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2Fkc3RvcCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGNoYW5nZSBldmVudHMgb2YgdGhlIGZpbGVJbnB1dChzKToKICAgICAgICAgICAgLy8gY2hhbmdlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkY2hhbmdlJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgcGFzdGUgZXZlbnRzIHRvIHRoZSBwYXN0ZVpvbmUocyk6CiAgICAgICAgICAgIC8vIHBhc3RlOiBmdW5jdGlvbiAoZSwgZGF0YSkge30sIC8vIC5iaW5kKCdmaWxldXBsb2FkcGFzdGUnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBkcm9wIGV2ZW50cyBvZiB0aGUgZHJvcFpvbmUocyk6CiAgICAgICAgICAgIC8vIGRyb3A6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkcm9wJywgZnVuYyk7CgogICAgICAgICAgICAvLyBDYWxsYmFjayBmb3IgZHJhZ292ZXIgZXZlbnRzIG9mIHRoZSBkcm9wWm9uZShzKToKICAgICAgICAgICAgLy8gZHJhZ292ZXI6IGZ1bmN0aW9uIChlKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRkcmFnb3ZlcicsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGNodW5rIHVwbG9hZCByZXF1ZXN0OgogICAgICAgICAgICAvLyBjaHVua3NlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua3NlbmQnLCBmdW5jKTsKCiAgICAgICAgICAgIC8vIENhbGxiYWNrIGZvciBzdWNjZXNzZnVsIGNodW5rIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGNodW5rZG9uZTogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNodW5rZG9uZScsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGZhaWxlZCAoYWJvcnQgb3IgZXJyb3IpIGNodW5rIHVwbG9hZHM6CiAgICAgICAgICAgIC8vIGNodW5rZmFpbDogZnVuY3Rpb24gKGUsIGRhdGEpIHt9LCAvLyAuYmluZCgnZmlsZXVwbG9hZGNodW5rZmFpbCcsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gQ2FsbGJhY2sgZm9yIGNvbXBsZXRlZCAoc3VjY2VzcywgYWJvcnQgb3IgZXJyb3IpIGNodW5rIHVwbG9hZCByZXF1ZXN0czoKICAgICAgICAgICAgLy8gY2h1bmthbHdheXM6IGZ1bmN0aW9uIChlLCBkYXRhKSB7fSwgLy8gLmJpbmQoJ2ZpbGV1cGxvYWRjaHVua2Fsd2F5cycsIGZ1bmMpOwoKICAgICAgICAgICAgLy8gVGhlIHBsdWdpbiBvcHRpb25zIGFyZSB1c2VkIGFzIHNldHRpbmdzIG9iamVjdCBmb3IgdGhlIGFqYXggY2FsbHMuCiAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIGpRdWVyeSBhamF4IHNldHRpbmdzIHJlcXVpcmVkIGZvciB0aGUgZmlsZSB1cGxvYWRzOgogICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsCiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSwKICAgICAgICAgICAgY2FjaGU6IGZhbHNlLAogICAgICAgICAgICB0aW1lb3V0OiAwCiAgICAgICAgfSwKCiAgICAgICAgLy8gQSBsaXN0IG9mIG9wdGlvbnMgdGhhdCByZXF1aXJlIHJlaW5pdGlhbGl6aW5nIGV2ZW50IGxpc3RlbmVycyBhbmQvb3IKICAgICAgICAvLyBzcGVjaWFsIGluaXRpYWxpemF0aW9uIGNvZGU6CiAgICAgICAgX3NwZWNpYWxPcHRpb25zOiBbCiAgICAgICAgICAgICdmaWxlSW5wdXQnLAogICAgICAgICAgICAnZHJvcFpvbmUnLAogICAgICAgICAgICAncGFzdGVab25lJywKICAgICAgICAgICAgJ211bHRpcGFydCcsCiAgICAgICAgICAgICdmb3JjZUlmcmFtZVRyYW5zcG9ydCcKICAgICAgICBdLAoKICAgICAgICBfYmxvYlNsaWNlOiAkLnN1cHBvcnQuYmxvYlNsaWNlICYmIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHNsaWNlID0gdGhpcy5zbGljZSB8fCB0aGlzLndlYmtpdFNsaWNlIHx8IHRoaXMubW96U2xpY2U7CiAgICAgICAgICAgIHJldHVybiBzbGljZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0sCgogICAgICAgIF9CaXRyYXRlVGltZXI6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSAoKERhdGUubm93KSA/IERhdGUubm93KCkgOiAobmV3IERhdGUoKSkuZ2V0VGltZSgpKTsKICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSAwOwogICAgICAgICAgICB0aGlzLmJpdHJhdGUgPSAwOwogICAgICAgICAgICB0aGlzLmdldEJpdHJhdGUgPSBmdW5jdGlvbiAobm93LCBsb2FkZWQsIGludGVydmFsKSB7CiAgICAgICAgICAgICAgICB2YXIgdGltZURpZmYgPSBub3cgLSB0aGlzLnRpbWVzdGFtcDsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5iaXRyYXRlIHx8ICFpbnRlcnZhbCB8fCB0aW1lRGlmZiA+IGludGVydmFsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5iaXRyYXRlID0gKGxvYWRlZCAtIHRoaXMubG9hZGVkKSAqICgxMDAwIC8gdGltZURpZmYpICogODsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IGxvYWRlZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG5vdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJpdHJhdGU7CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgX2lzWEhSVXBsb2FkOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICByZXR1cm4gIW9wdGlvbnMuZm9yY2VJZnJhbWVUcmFuc3BvcnQgJiYKICAgICAgICAgICAgICAgICgoIW9wdGlvbnMubXVsdGlwYXJ0ICYmICQuc3VwcG9ydC54aHJGaWxlVXBsb2FkKSB8fAogICAgICAgICAgICAgICAgJC5zdXBwb3J0LnhockZvcm1EYXRhRmlsZVVwbG9hZCk7CiAgICAgICAgfSwKCiAgICAgICAgX2dldEZvcm1EYXRhOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICB2YXIgZm9ybURhdGE7CiAgICAgICAgICAgIGlmICgkLnR5cGUob3B0aW9ucy5mb3JtRGF0YSkgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZvcm1EYXRhKG9wdGlvbnMuZm9ybSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQuaXNBcnJheShvcHRpb25zLmZvcm1EYXRhKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm9ybURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCQudHlwZShvcHRpb25zLmZvcm1EYXRhKSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIGZvcm1EYXRhID0gW107CiAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5mb3JtRGF0YSwgZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JtRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKCiAgICAgICAgX2dldFRvdGFsOiBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgdmFyIHRvdGFsID0gMDsKICAgICAgICAgICAgJC5lYWNoKGZpbGVzLCBmdW5jdGlvbiAoaW5kZXgsIGZpbGUpIHsKICAgICAgICAgICAgICAgIHRvdGFsICs9IGZpbGUuc2l6ZSB8fCAxOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRvdGFsOwogICAgICAgIH0sCgogICAgICAgIF9pbml0UHJvZ3Jlc3NPYmplY3Q6IGZ1bmN0aW9uIChvYmopIHsKICAgICAgICAgICAgdmFyIHByb2dyZXNzID0gewogICAgICAgICAgICAgICAgbG9hZGVkOiAwLAogICAgICAgICAgICAgICAgdG90YWw6IDAsCiAgICAgICAgICAgICAgICBiaXRyYXRlOiAwCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChvYmouX3Byb2dyZXNzKSB7CiAgICAgICAgICAgICAgICAkLmV4dGVuZChvYmouX3Byb2dyZXNzLCBwcm9ncmVzcyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvYmouX3Byb2dyZXNzID0gcHJvZ3Jlc3M7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdFJlc3BvbnNlT2JqZWN0OiBmdW5jdGlvbiAob2JqKSB7CiAgICAgICAgICAgIHZhciBwcm9wOwogICAgICAgICAgICBpZiAob2JqLl9yZXNwb25zZSkgewogICAgICAgICAgICAgICAgZm9yIChwcm9wIGluIG9iai5fcmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAob2JqLl9yZXNwb25zZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqLl9yZXNwb25zZVtwcm9wXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvYmouX3Jlc3BvbnNlID0ge307CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfb25Qcm9ncmVzczogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgaWYgKGUubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAgICAgICAgICAgdmFyIG5vdyA9ICgoRGF0ZS5ub3cpID8gRGF0ZS5ub3coKSA6IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkpLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZDsKICAgICAgICAgICAgICAgIGlmIChkYXRhLl90aW1lICYmIGRhdGEucHJvZ3Jlc3NJbnRlcnZhbCAmJgogICAgICAgICAgICAgICAgICAgICAgICAobm93IC0gZGF0YS5fdGltZSA8IGRhdGEucHJvZ3Jlc3NJbnRlcnZhbCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgZS5sb2FkZWQgIT09IGUudG90YWwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkYXRhLl90aW1lID0gbm93OwogICAgICAgICAgICAgICAgbG9hZGVkID0gTWF0aC5mbG9vcigKICAgICAgICAgICAgICAgICAgICBlLmxvYWRlZCAvIGUudG90YWwgKiAoZGF0YS5jaHVua1NpemUgfHwgZGF0YS5fcHJvZ3Jlc3MudG90YWwpCiAgICAgICAgICAgICAgICApICsgKGRhdGEudXBsb2FkZWRCeXRlcyB8fCAwKTsKICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZGlmZmVyZW5jZSBmcm9tIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBzdGF0ZQogICAgICAgICAgICAgICAgLy8gdG8gdGhlIGdsb2JhbCBsb2FkZWQgY291bnRlcjoKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmxvYWRlZCArPSAobG9hZGVkIC0gZGF0YS5fcHJvZ3Jlc3MubG9hZGVkKTsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLmJpdHJhdGUgPSB0aGlzLl9iaXRyYXRlVGltZXIuZ2V0Qml0cmF0ZSgKICAgICAgICAgICAgICAgICAgICBub3csCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkLAogICAgICAgICAgICAgICAgICAgIGRhdGEuYml0cmF0ZUludGVydmFsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MubG9hZGVkID0gZGF0YS5sb2FkZWQgPSBsb2FkZWQ7CiAgICAgICAgICAgICAgICBkYXRhLl9wcm9ncmVzcy5iaXRyYXRlID0gZGF0YS5iaXRyYXRlID0gZGF0YS5fYml0cmF0ZVRpbWVyLmdldEJpdHJhdGUoCiAgICAgICAgICAgICAgICAgICAgbm93LAogICAgICAgICAgICAgICAgICAgIGxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBkYXRhLmJpdHJhdGVJbnRlcnZhbAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSBjdXN0b20gcHJvZ3Jlc3MgZXZlbnQgd2l0aCBhIHRvdGFsIGRhdGEgcHJvcGVydHkgc2V0CiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZmlsZSBzaXplKHMpIG9mIHRoZSBjdXJyZW50IHVwbG9hZCBhbmQgYSBsb2FkZWQgZGF0YQogICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgY2FsY3VsYXRlZCBhY2NvcmRpbmdseToKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgJ3Byb2dyZXNzJywKICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdwcm9ncmVzcycsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgZ2xvYmFsIHByb2dyZXNzIGV2ZW50IGZvciBhbGwgY3VycmVudCBmaWxlIHVwbG9hZHMsCiAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgYWpheCBjYWxscyBxdWV1ZWQgZm9yIHNlcXVlbnRpYWwgZmlsZSB1cGxvYWRzOgogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAncHJvZ3Jlc3NhbGwnLAogICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3Byb2dyZXNzYWxsJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdFByb2dyZXNzTGlzdGVuZXI6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIHhociA9IG9wdGlvbnMueGhyID8gb3B0aW9ucy54aHIoKSA6ICQuYWpheFNldHRpbmdzLnhocigpOwogICAgICAgICAgICAvLyBBY2Nlc3NzIHRvIHRoZSBuYXRpdmUgWEhSIG9iamVjdCBpcyByZXF1aXJlZCB0byBhZGQgZXZlbnQgbGlzdGVuZXJzCiAgICAgICAgICAgIC8vIGZvciB0aGUgdXBsb2FkIHByb2dyZXNzIGV2ZW50OgogICAgICAgICAgICBpZiAoeGhyLnVwbG9hZCkgewogICAgICAgICAgICAgICAgJCh4aHIudXBsb2FkKS5iaW5kKCdwcm9ncmVzcycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9lID0gZS5vcmlnaW5hbEV2ZW50OwogICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJvZ3Jlc3MgZXZlbnQgcHJvcGVydGllcyBnZXQgY29waWVkIG92ZXI6CiAgICAgICAgICAgICAgICAgICAgZS5sZW5ndGhDb21wdXRhYmxlID0gb2UubGVuZ3RoQ29tcHV0YWJsZTsKICAgICAgICAgICAgICAgICAgICBlLmxvYWRlZCA9IG9lLmxvYWRlZDsKICAgICAgICAgICAgICAgICAgICBlLnRvdGFsID0gb2UudG90YWw7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25Qcm9ncmVzcyhlLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgb3B0aW9ucy54aHIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhocjsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaXNJbnN0YW5jZU9mOiBmdW5jdGlvbiAodHlwZSwgb2JqKSB7CiAgICAgICAgICAgIC8vIENyb3NzLWZyYW1lIGluc3RhbmNlb2YgY2hlY2sKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCAnICsgdHlwZSArICddJzsKICAgICAgICB9LAoKICAgICAgICBfaW5pdFhIUkRhdGE6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGZvcm1EYXRhLAogICAgICAgICAgICAgICAgZmlsZSA9IG9wdGlvbnMuZmlsZXNbMF0sCiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgbm9uLW11bHRpcGFydCBzZXR0aW5nIGlmIG5vdCBzdXBwb3J0ZWQ6CiAgICAgICAgICAgICAgICBtdWx0aXBhcnQgPSBvcHRpb25zLm11bHRpcGFydCB8fCAhJC5zdXBwb3J0LnhockZpbGVVcGxvYWQsCiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSAkLnR5cGUob3B0aW9ucy5wYXJhbU5hbWUpID09PSAnYXJyYXknID8KICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZVswXSA6IG9wdGlvbnMucGFyYW1OYW1lOwogICAgICAgICAgICBvcHRpb25zLmhlYWRlcnMgPSAkLmV4dGVuZCh7fSwgb3B0aW9ucy5oZWFkZXJzKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFJhbmdlKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmhlYWRlcnNbJ0NvbnRlbnQtUmFuZ2UnXSA9IG9wdGlvbnMuY29udGVudFJhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghbXVsdGlwYXJ0IHx8IG9wdGlvbnMuYmxvYiB8fCAhdGhpcy5faXNJbnN0YW5jZU9mKCdGaWxlJywgZmlsZSkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQ29udGVudC1EaXNwb3NpdGlvbiddID0gJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSInICsKICAgICAgICAgICAgICAgICAgICBlbmNvZGVVUkkoZmlsZS5uYW1lKSArICciJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW11bHRpcGFydCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZW50VHlwZSA9IGZpbGUudHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZGF0YSA9IG9wdGlvbnMuYmxvYiB8fCBmaWxlOwogICAgICAgICAgICB9IGVsc2UgaWYgKCQuc3VwcG9ydC54aHJGb3JtRGF0YUZpbGVVcGxvYWQpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2luZG93LnBvc3RNZXNzYWdlIGRvZXMgbm90IGFsbG93IHNlbmRpbmcgRm9ybURhdGEKICAgICAgICAgICAgICAgICAgICAvLyBvYmplY3RzLCBzbyB3ZSBqdXN0IGFkZCB0aGUgRmlsZS9CbG9iIG9iamVjdHMgdG8KICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZm9ybURhdGEgYXJyYXkgYW5kIGxldCB0aGUgcG9zdE1lc3NhZ2Ugd2luZG93CiAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBGb3JtRGF0YSBvYmplY3Qgb3V0IG9mIHRoaXMgYXJyYXk6CiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSB0aGlzLl9nZXRGb3JtRGF0YShvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5ibG9iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG9wdGlvbnMuYmxvYgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gob3B0aW9ucy5maWxlcywgZnVuY3Rpb24gKGluZGV4LCBmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAoJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnBhcmFtTmFtZVtpbmRleF0pIHx8IHBhcmFtTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzSW5zdGFuY2VPZignRm9ybURhdGEnLCBvcHRpb25zLmZvcm1EYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YSA9IG9wdGlvbnMuZm9ybURhdGE7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHRoaXMuX2dldEZvcm1EYXRhKG9wdGlvbnMpLCBmdW5jdGlvbiAoaW5kZXgsIGZpZWxkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoZmllbGQubmFtZSwgZmllbGQudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvYikgewogICAgICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQocGFyYW1OYW1lLCBvcHRpb25zLmJsb2IsIGZpbGUubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBhbGxvd3MgdGhlIHRlc3RzIHRvIHJ1biB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW1teSBvYmplY3RzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX2lzSW5zdGFuY2VPZignRmlsZScsIGZpbGUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2lzSW5zdGFuY2VPZignQmxvYicsIGZpbGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMucGFyYW1OYW1lKSA9PT0gJ2FycmF5JyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWVbaW5kZXhdKSB8fCBwYXJhbU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUudXBsb2FkTmFtZSB8fCBmaWxlLm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEgPSBmb3JtRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCbG9iIHJlZmVyZW5jZSBpcyBub3QgbmVlZGVkIGFueW1vcmUsIGZyZWUgbWVtb3J5OgogICAgICAgICAgICBvcHRpb25zLmJsb2IgPSBudWxsOwogICAgICAgIH0sCgogICAgICAgIF9pbml0SWZyYW1lU2V0dGluZ3M6IGZ1bmN0aW9uIChvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciB0YXJnZXRIb3N0ID0gJCgnPGE+PC9hPicpLnByb3AoJ2hyZWYnLCBvcHRpb25zLnVybCkucHJvcCgnaG9zdCcpOwogICAgICAgICAgICAvLyBTZXR0aW5nIHRoZSBkYXRhVHlwZSB0byBpZnJhbWUgZW5hYmxlcyB0aGUgaWZyYW1lIHRyYW5zcG9ydDoKICAgICAgICAgICAgb3B0aW9ucy5kYXRhVHlwZSA9ICdpZnJhbWUgJyArIChvcHRpb25zLmRhdGFUeXBlIHx8ICcnKTsKICAgICAgICAgICAgLy8gVGhlIGlmcmFtZSB0cmFuc3BvcnQgYWNjZXB0cyBhIHNlcmlhbGl6ZWQgYXJyYXkgYXMgZm9ybSBkYXRhOgogICAgICAgICAgICBvcHRpb25zLmZvcm1EYXRhID0gdGhpcy5fZ2V0Rm9ybURhdGEob3B0aW9ucyk7CiAgICAgICAgICAgIC8vIEFkZCByZWRpcmVjdCB1cmwgdG8gZm9ybSBkYXRhIG9uIGNyb3NzLWRvbWFpbiB1cGxvYWRzOgogICAgICAgICAgICBpZiAob3B0aW9ucy5yZWRpcmVjdCAmJiB0YXJnZXRIb3N0ICYmIHRhcmdldEhvc3QgIT09IGxvY2F0aW9uLmhvc3QpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybURhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5yZWRpcmVjdFBhcmFtTmFtZSB8fCAncmVkaXJlY3QnLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBvcHRpb25zLnJlZGlyZWN0CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9pbml0RGF0YVNldHRpbmdzOiBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgICBpZiAodGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2h1bmtlZFVwbG9hZChvcHRpb25zLCB0cnVlKSkgewogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRYSFJEYXRhKG9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbml0UHJvZ3Jlc3NMaXN0ZW5lcihvcHRpb25zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBvc3RNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgZGF0YVR5cGUgdG8gcG9zdG1lc3NhZ2UgZW5hYmxlcyB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBwb3N0TWVzc2FnZSB0cmFuc3BvcnQ6CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5kYXRhVHlwZSA9ICdwb3N0bWVzc2FnZSAnICsgKG9wdGlvbnMuZGF0YVR5cGUgfHwgJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5faW5pdElmcmFtZVNldHRpbmdzKG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldFBhcmFtTmFtZTogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGZpbGVJbnB1dCA9ICQob3B0aW9ucy5maWxlSW5wdXQpLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gb3B0aW9ucy5wYXJhbU5hbWU7CiAgICAgICAgICAgIGlmICghcGFyYW1OYW1lKSB7CiAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBbXTsKICAgICAgICAgICAgICAgIGZpbGVJbnB1dC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHRoaXMpLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gaW5wdXQucHJvcCgnbmFtZScpIHx8ICdmaWxlc1tdJywKICAgICAgICAgICAgICAgICAgICAgICAgaSA9IChpbnB1dC5wcm9wKCdmaWxlcycpIHx8IFsxXSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZS5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpIC09IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtTmFtZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWUgPSBbZmlsZUlucHV0LnByb3AoJ25hbWUnKSB8fCAnZmlsZXNbXSddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCEkLmlzQXJyYXkocGFyYW1OYW1lKSkgewogICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gW3BhcmFtTmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtTmFtZTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdEZvcm1TZXR0aW5nczogZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgICAgICAgICAgLy8gUmV0cmlldmUgbWlzc2luZyBvcHRpb25zIGZyb20gdGhlIGlucHV0IGZpZWxkIGFuZCB0aGUKICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCBmb3JtLCBpZiBhdmFpbGFibGU6CiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtIHx8ICFvcHRpb25zLmZvcm0ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLmZvcm0gPSAkKG9wdGlvbnMuZmlsZUlucHV0LnByb3AoJ2Zvcm0nKSk7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZ2l2ZW4gZmlsZSBpbnB1dCBkb2Vzbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBmb3JtLAogICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHdpZGdldCBmaWxlIGlucHV0J3MgZm9ybToKICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZm9ybSA9ICQodGhpcy5vcHRpb25zLmZpbGVJbnB1dC5wcm9wKCdmb3JtJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG9wdGlvbnMucGFyYW1OYW1lID0gdGhpcy5fZ2V0UGFyYW1OYW1lKG9wdGlvbnMpOwogICAgICAgICAgICBpZiAoIW9wdGlvbnMudXJsKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnVybCA9IG9wdGlvbnMuZm9ybS5wcm9wKCdhY3Rpb24nKSB8fCBsb2NhdGlvbi5ocmVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSBIVFRQIHJlcXVlc3QgbWV0aG9kIG11c3QgYmUgIlBPU1QiIG9yICJQVVQiOgogICAgICAgICAgICBvcHRpb25zLnR5cGUgPSAob3B0aW9ucy50eXBlIHx8CiAgICAgICAgICAgICAgICAoJC50eXBlKG9wdGlvbnMuZm9ybS5wcm9wKCdtZXRob2QnKSkgPT09ICdzdHJpbmcnICYmCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtLnByb3AoJ21ldGhvZCcpKSB8fCAnJwogICAgICAgICAgICAgICAgKS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBpZiAob3B0aW9ucy50eXBlICE9PSAnUE9TVCcgJiYgb3B0aW9ucy50eXBlICE9PSAnUFVUJyAmJgogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudHlwZSAhPT0gJ1BBVENIJykgewogICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID0gJ1BPU1QnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5mb3JtQWNjZXB0Q2hhcnNldCA9IG9wdGlvbnMuZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcpOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2dldEFKQVhTZXR0aW5nczogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKTsKICAgICAgICAgICAgdGhpcy5faW5pdEZvcm1TZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgdGhpcy5faW5pdERhdGFTZXR0aW5ncyhvcHRpb25zKTsKICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgfSwKCiAgICAgICAgLy8galF1ZXJ5IDEuNiBkb2Vzbid0IHByb3ZpZGUgLnN0YXRlKCksCiAgICAgICAgLy8gd2hpbGUgalF1ZXJ5IDEuOCsgcmVtb3ZlZCAuaXNSZWplY3RlZCgpIGFuZCAuaXNSZXNvbHZlZCgpOgogICAgICAgIF9nZXREZWZlcnJlZFN0YXRlOiBmdW5jdGlvbiAoZGVmZXJyZWQpIHsKICAgICAgICAgICAgaWYgKGRlZmVycmVkLnN0YXRlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQuc3RhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGVmZXJyZWQuaXNSZXNvbHZlZCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3Jlc29sdmVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGVmZXJyZWQuaXNSZWplY3RlZCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3JlamVjdGVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJ3BlbmRpbmcnOwogICAgICAgIH0sCgogICAgICAgIC8vIE1hcHMganFYSFIgY2FsbGJhY2tzIHRvIHRoZSBlcXVpdmFsZW50CiAgICAgICAgLy8gbWV0aG9kcyBvZiB0aGUgZ2l2ZW4gUHJvbWlzZSBvYmplY3Q6CiAgICAgICAgX2VuaGFuY2VQcm9taXNlOiBmdW5jdGlvbiAocHJvbWlzZSkgewogICAgICAgICAgICBwcm9taXNlLnN1Y2Nlc3MgPSBwcm9taXNlLmRvbmU7CiAgICAgICAgICAgIHByb21pc2UuZXJyb3IgPSBwcm9taXNlLmZhaWw7CiAgICAgICAgICAgIHByb21pc2UuY29tcGxldGUgPSBwcm9taXNlLmFsd2F5czsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfSwKCiAgICAgICAgLy8gQ3JlYXRlcyBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2JqZWN0IGVuaGFuY2VkIHdpdGgKICAgICAgICAvLyB0aGUganFYSFIgbWV0aG9kcyBhYm9ydCwgc3VjY2VzcywgZXJyb3IgYW5kIGNvbXBsZXRlOgogICAgICAgIF9nZXRYSFJQcm9taXNlOiBmdW5jdGlvbiAocmVzb2x2ZU9yUmVqZWN0LCBjb250ZXh0LCBhcmdzKSB7CiAgICAgICAgICAgIHZhciBkZmQgPSAkLkRlZmVycmVkKCksCiAgICAgICAgICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKTsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQgfHwgdGhpcy5vcHRpb25zLmNvbnRleHQgfHwgcHJvbWlzZTsKICAgICAgICAgICAgaWYgKHJlc29sdmVPclJlamVjdCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKGNvbnRleHQsIGFyZ3MpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVPclJlamVjdCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGRmZC5yZWplY3RXaXRoKGNvbnRleHQsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHByb21pc2UuYWJvcnQgPSBkZmQucHJvbWlzZTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpOwogICAgICAgIH0sCgogICAgICAgIC8vIEFkZHMgY29udmVuaWVuY2UgbWV0aG9kcyB0byB0aGUgZGF0YSBjYWxsYmFjayBhcmd1bWVudDoKICAgICAgICBfYWRkQ29udmVuaWVuY2VNZXRob2RzOiBmdW5jdGlvbiAoZSwgZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBnZXRQcm9taXNlID0gZnVuY3Rpb24gKGFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlc29sdmVXaXRoKHRoYXQsIGFyZ3MpLnByb21pc2UoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRhdGEucHJvY2VzcyA9IGZ1bmN0aW9uIChyZXNvbHZlRnVuYywgcmVqZWN0RnVuYykgewogICAgICAgICAgICAgICAgaWYgKHJlc29sdmVGdW5jIHx8IHJlamVjdEZ1bmMpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLl9wcm9jZXNzUXVldWUgPSB0aGlzLl9wcm9jZXNzUXVldWUgPQogICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fcHJvY2Vzc1F1ZXVlIHx8IGdldFByb21pc2UoW3RoaXNdKSkudGhlbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVqZWN0V2l0aCh0aGF0LCBbZGF0YV0pLnByb21pc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldFByb21pc2UoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgKS50aGVuKHJlc29sdmVGdW5jLCByZWplY3RGdW5jKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9jZXNzUXVldWUgfHwgZ2V0UHJvbWlzZShbdGhpc10pOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLnN1Ym1pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlKCkgIT09ICdwZW5kaW5nJykgewogICAgICAgICAgICAgICAgICAgIGRhdGEuanFYSFIgPSB0aGlzLmpxWEhSID0KICAgICAgICAgICAgICAgICAgICAgICAgKHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VibWl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3N1Ym1pdCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgJiYgdGhhdC5fb25TZW5kKGUsIHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuanFYSFIgfHwgdGhhdC5fZ2V0WEhSUHJvbWlzZSgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBkYXRhLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5lcnJvclRocm93biA9ICdhYm9ydCc7CiAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdmYWlsJywgbnVsbCwgdGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhhdC5fZ2V0WEhSUHJvbWlzZShmYWxzZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRhdGEuc3RhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5qcVhIUikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKHRoaXMuanFYSFIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Byb2Nlc3NRdWV1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKHRoaXMuX3Byb2Nlc3NRdWV1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRhdGEucHJvY2Vzc2luZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5qcVhIUiAmJiB0aGlzLl9wcm9jZXNzUXVldWUgJiYgdGhhdAogICAgICAgICAgICAgICAgICAgIC5fZ2V0RGVmZXJyZWRTdGF0ZSh0aGlzLl9wcm9jZXNzUXVldWUpID09PSAncGVuZGluZyc7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRhdGEucHJvZ3Jlc3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRhdGEucmVzcG9uc2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzcG9uc2U7CiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgLy8gUGFyc2VzIHRoZSBSYW5nZSBoZWFkZXIgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlCiAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIHVwbG9hZGVkIGJ5dGVzOgogICAgICAgIF9nZXRVcGxvYWRlZEJ5dGVzOiBmdW5jdGlvbiAoanFYSFIpIHsKICAgICAgICAgICAgdmFyIHJhbmdlID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoJ1JhbmdlJyksCiAgICAgICAgICAgICAgICBwYXJ0cyA9IHJhbmdlICYmIHJhbmdlLnNwbGl0KCctJyksCiAgICAgICAgICAgICAgICB1cHBlckJ5dGVzUG9zID0gcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSAmJgogICAgICAgICAgICAgICAgICAgIHBhcnNlSW50KHBhcnRzWzFdLCAxMCk7CiAgICAgICAgICAgIHJldHVybiB1cHBlckJ5dGVzUG9zICYmIHVwcGVyQnl0ZXNQb3MgKyAxOwogICAgICAgIH0sCgogICAgICAgIC8vIFVwbG9hZHMgYSBmaWxlIGluIG11bHRpcGxlLCBzZXF1ZW50aWFsIHJlcXVlc3RzCiAgICAgICAgLy8gYnkgc3BsaXR0aW5nIHRoZSBmaWxlIHVwIGluIG11bHRpcGxlIGJsb2IgY2h1bmtzLgogICAgICAgIC8vIElmIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIHRydWUsIG9ubHkgdGVzdHMgaWYgdGhlIGZpbGUKICAgICAgICAvLyBzaG91bGQgYmUgdXBsb2FkZWQgaW4gY2h1bmtzLCBidXQgZG9lcyBub3QgaW52b2tlIGFueQogICAgICAgIC8vIHVwbG9hZCByZXF1ZXN0czoKICAgICAgICBfY2h1bmtlZFVwbG9hZDogZnVuY3Rpb24gKG9wdGlvbnMsIHRlc3RPbmx5KSB7CiAgICAgICAgICAgIG9wdGlvbnMudXBsb2FkZWRCeXRlcyA9IG9wdGlvbnMudXBsb2FkZWRCeXRlcyB8fCAwOwogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBmaWxlID0gb3B0aW9ucy5maWxlc1swXSwKICAgICAgICAgICAgICAgIGZzID0gZmlsZS5zaXplLAogICAgICAgICAgICAgICAgdWIgPSBvcHRpb25zLnVwbG9hZGVkQnl0ZXMsCiAgICAgICAgICAgICAgICBtY3MgPSBvcHRpb25zLm1heENodW5rU2l6ZSB8fCBmcywKICAgICAgICAgICAgICAgIHNsaWNlID0gdGhpcy5fYmxvYlNsaWNlLAogICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgcHJvbWlzZSA9IGRmZC5wcm9taXNlKCksCiAgICAgICAgICAgICAgICBqcVhIUiwKICAgICAgICAgICAgICAgIHVwbG9hZDsKICAgICAgICAgICAgaWYgKCEodGhpcy5faXNYSFJVcGxvYWQob3B0aW9ucykgJiYgc2xpY2UgJiYgKHViIHx8IG1jcyA8IGZzKSkgfHwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmRhdGEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVzdE9ubHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh1YiA+PSBmcykgewogICAgICAgICAgICAgICAgZmlsZS5lcnJvciA9IG9wdGlvbnMuaTE4bigndXBsb2FkZWRCeXRlcycpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFhIUlByb21pc2UoCiAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5jb250ZXh0LAogICAgICAgICAgICAgICAgICAgIFtudWxsLCAnZXJyb3InLCBmaWxlLmVycm9yXQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgY2h1bmsgdXBsb2FkIG1ldGhvZDoKICAgICAgICAgICAgdXBsb2FkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIG9wdGlvbnMgb2JqZWN0IGZvciBlYWNoIGNodW5rIHVwbG9hZDoKICAgICAgICAgICAgICAgIHZhciBvID0gJC5leHRlbmQoe30sIG9wdGlvbnMpLAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2FkZWQgPSBvLl9wcm9ncmVzcy5sb2FkZWQ7CiAgICAgICAgICAgICAgICBvLmJsb2IgPSBzbGljZS5jYWxsKAogICAgICAgICAgICAgICAgICAgIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgdWIsCiAgICAgICAgICAgICAgICAgICAgdWIgKyBtY3MsCiAgICAgICAgICAgICAgICAgICAgZmlsZS50eXBlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgY2h1bmsgc2l6ZSwgYXMgdGhlIGJsb2IgaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGRlcmVmZXJlbmNlZCBhZnRlciBkYXRhIHByb2Nlc3Npbmc6CiAgICAgICAgICAgICAgICBvLmNodW5rU2l6ZSA9IG8uYmxvYi5zaXplOwogICAgICAgICAgICAgICAgLy8gRXhwb3NlIHRoZSBjaHVuayBieXRlcyBwb3NpdGlvbiByYW5nZToKICAgICAgICAgICAgICAgIG8uY29udGVudFJhbmdlID0gJ2J5dGVzICcgKyB1YiArICctJyArCiAgICAgICAgICAgICAgICAgICAgKHViICsgby5jaHVua1NpemUgLSAxKSArICcvJyArIGZzOwogICAgICAgICAgICAgICAgLy8gUHJvY2VzcyB0aGUgdXBsb2FkIGRhdGEgKHRoZSBibG9iIGFuZCBwb3RlbnRpYWwgZm9ybSBkYXRhKToKICAgICAgICAgICAgICAgIHRoYXQuX2luaXRYSFJEYXRhKG8pOwogICAgICAgICAgICAgICAgLy8gQWRkIHByb2dyZXNzIGxpc3RlbmVycyBmb3IgdGhpcyBjaHVuayB1cGxvYWQ6CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0UHJvZ3Jlc3NMaXN0ZW5lcihvKTsKICAgICAgICAgICAgICAgIGpxWEhSID0gKCh0aGF0Ll90cmlnZ2VyKCdjaHVua3NlbmQnLCBudWxsLCBvKSAhPT0gZmFsc2UgJiYgJC5hamF4KG8pKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9nZXRYSFJQcm9taXNlKGZhbHNlLCBvLmNvbnRleHQpKQogICAgICAgICAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHViID0gdGhhdC5fZ2V0VXBsb2FkZWRCeXRlcyhqcVhIUikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1YiArIG8uY2h1bmtTaXplKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgcHJvZ3Jlc3MgZXZlbnQgaWYgbm8gZmluYWwgcHJvZ3Jlc3MgZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBsb2FkZWQgZXF1YWxpbmcgdG90YWwgaGFzIGJlZW4gdHJpZ2dlcmVkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGlzIGNodW5rOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudExvYWRlZCArIG8uY2h1bmtTaXplIC0gby5fcHJvZ3Jlc3MubG9hZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9vblByb2dyZXNzKCQuRXZlbnQoJ3Byb2dyZXNzJywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB1YiAtIG8udXBsb2FkZWRCeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbDogdWIgLSBvLnVwbG9hZGVkQnl0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBvKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZGVkQnl0ZXMgPSBvLnVwbG9hZGVkQnl0ZXMgPSB1YjsKICAgICAgICAgICAgICAgICAgICAgICAgby5yZXN1bHQgPSByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIG8udGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgICAgIG8uanFYSFIgPSBqcVhIUjsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignY2h1bmtkb25lJywgbnVsbCwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rYWx3YXlzJywgbnVsbCwgbyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1YiA8IGZzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaWxlIHVwbG9hZCBub3QgeWV0IGNvbXBsZXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgd2l0aCB0aGUgbmV4dCBjaHVuazoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmVXaXRoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5mYWlsKGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgby5qcVhIUiA9IGpxWEhSOwogICAgICAgICAgICAgICAgICAgICAgICBvLnRleHRTdGF0dXMgPSB0ZXh0U3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICBvLmVycm9yVGhyb3duID0gZXJyb3JUaHJvd247CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX3RyaWdnZXIoJ2NodW5rZmFpbCcsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll90cmlnZ2VyKCdjaHVua2Fsd2F5cycsIG51bGwsIG8pOwogICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVqZWN0V2l0aCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd25dCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpOwogICAgICAgICAgICBwcm9taXNlLmFib3J0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHVwbG9hZCgpOwogICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICB9LAoKICAgICAgICBfYmVmb3JlU2VuZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IGNhbGxiYWNrIGlzIHRyaWdnZXJlZCB3aGVuIGFuIHVwbG9hZCBzdGFydHMKICAgICAgICAgICAgICAgIC8vIGFuZCBubyBvdGhlciB1cGxvYWRzIGFyZSBjdXJyZW50bHkgcnVubmluZywKICAgICAgICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhlIGdsb2JhbCBhamF4U3RhcnQgZXZlbnQ6CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdzdGFydCcpOwogICAgICAgICAgICAgICAgLy8gU2V0IHRpbWVyIGZvciBnbG9iYWwgYml0cmF0ZSBwcm9ncmVzcyBjYWxjdWxhdGlvbjoKICAgICAgICAgICAgICAgIHRoaXMuX2JpdHJhdGVUaW1lciA9IG5ldyB0aGlzLl9CaXRyYXRlVGltZXIoKTsKICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOgogICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkID0gdGhpcy5fcHJvZ3Jlc3MudG90YWwgPSAwOwogICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MuYml0cmF0ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBjb250YWluZXIgb2JqZWN0cyBmb3IgdGhlIC5yZXNwb25zZSgpIGFuZAogICAgICAgICAgICAvLyAucHJvZ3Jlc3MoKSBtZXRob2RzIG9uIHRoZSBkYXRhIG9iamVjdCBhcmUgYXZhaWxhYmxlCiAgICAgICAgICAgIC8vIGFuZCByZXNldCB0byB0aGVpciBpbml0aWFsIHN0YXRlOgogICAgICAgICAgICB0aGlzLl9pbml0UmVzcG9uc2VPYmplY3QoZGF0YSk7CiAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc09iamVjdChkYXRhKTsKICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MubG9hZGVkID0gZGF0YS5sb2FkZWQgPSBkYXRhLnVwbG9hZGVkQnl0ZXMgfHwgMDsKICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MudG90YWwgPSBkYXRhLnRvdGFsID0gdGhpcy5fZ2V0VG90YWwoZGF0YS5maWxlcykgfHwgMTsKICAgICAgICAgICAgZGF0YS5fcHJvZ3Jlc3MuYml0cmF0ZSA9IGRhdGEuYml0cmF0ZSA9IDA7CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSArPSAxOwogICAgICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBnbG9iYWwgcHJvZ3Jlc3MgdmFsdWVzOgogICAgICAgICAgICB0aGlzLl9wcm9ncmVzcy5sb2FkZWQgKz0gZGF0YS5sb2FkZWQ7CiAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLnRvdGFsICs9IGRhdGEudG90YWw7CiAgICAgICAgfSwKCiAgICAgICAgX29uRG9uZTogZnVuY3Rpb24gKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHRvdGFsID0gb3B0aW9ucy5fcHJvZ3Jlc3MudG90YWwsCiAgICAgICAgICAgICAgICByZXNwb25zZSA9IG9wdGlvbnMuX3Jlc3BvbnNlOwogICAgICAgICAgICBpZiAob3B0aW9ucy5fcHJvZ3Jlc3MubG9hZGVkIDwgdG90YWwpIHsKICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIHByb2dyZXNzIGV2ZW50IGlmIG5vIGZpbmFsIHByb2dyZXNzIGV2ZW50CiAgICAgICAgICAgICAgICAvLyB3aXRoIGxvYWRlZCBlcXVhbGluZyB0b3RhbCBoYXMgYmVlbiB0cmlnZ2VyZWQ6CiAgICAgICAgICAgICAgICB0aGlzLl9vblByb2dyZXNzKCQuRXZlbnQoJ3Byb2dyZXNzJywgewogICAgICAgICAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiB0b3RhbCwKICAgICAgICAgICAgICAgICAgICB0b3RhbDogdG90YWwKICAgICAgICAgICAgICAgIH0pLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXNwb25zZS5yZXN1bHQgPSBvcHRpb25zLnJlc3VsdCA9IHJlc3VsdDsKICAgICAgICAgICAgcmVzcG9uc2UudGV4dFN0YXR1cyA9IG9wdGlvbnMudGV4dFN0YXR1cyA9IHRleHRTdGF0dXM7CiAgICAgICAgICAgIHJlc3BvbnNlLmpxWEhSID0gb3B0aW9ucy5qcVhIUiA9IGpxWEhSOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyKCdkb25lJywgbnVsbCwgb3B0aW9ucyk7CiAgICAgICAgfSwKCiAgICAgICAgX29uRmFpbDogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgb3B0aW9ucykgewogICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBvcHRpb25zLl9yZXNwb25zZTsKICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVjYWxjdWxhdGVQcm9ncmVzcykgewogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBmYWlsZWQgKGVycm9yIG9yIGFib3J0KSBmaWxlIHVwbG9hZCBmcm9tCiAgICAgICAgICAgICAgICAvLyB0aGUgZ2xvYmFsIHByb2dyZXNzIGNhbGN1bGF0aW9uOgogICAgICAgICAgICAgICAgdGhpcy5fcHJvZ3Jlc3MubG9hZGVkIC09IG9wdGlvbnMuX3Byb2dyZXNzLmxvYWRlZDsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb2dyZXNzLnRvdGFsIC09IG9wdGlvbnMuX3Byb2dyZXNzLnRvdGFsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3BvbnNlLmpxWEhSID0gb3B0aW9ucy5qcVhIUiA9IGpxWEhSOwogICAgICAgICAgICByZXNwb25zZS50ZXh0U3RhdHVzID0gb3B0aW9ucy50ZXh0U3RhdHVzID0gdGV4dFN0YXR1czsKICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JUaHJvd24gPSBvcHRpb25zLmVycm9yVGhyb3duID0gZXJyb3JUaHJvd247CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2ZhaWwnLCBudWxsLCBvcHRpb25zKTsKICAgICAgICB9LAoKICAgICAgICBfb25BbHdheXM6IGZ1bmN0aW9uIChqcVhIUm9yUmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUm9yRXJyb3IsIG9wdGlvbnMpIHsKICAgICAgICAgICAgLy8ganFYSFJvclJlc3VsdCwgdGV4dFN0YXR1cyBhbmQganFYSFJvckVycm9yIGFyZSBhZGRlZCB0byB0aGUKICAgICAgICAgICAgLy8gb3B0aW9ucyBvYmplY3QgdmlhIGRvbmUgYW5kIGZhaWwgY2FsbGJhY2tzCiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXIoJ2Fsd2F5cycsIG51bGwsIG9wdGlvbnMpOwogICAgICAgIH0sCgogICAgICAgIF9vblNlbmQ6IGZ1bmN0aW9uIChlLCBkYXRhKSB7CiAgICAgICAgICAgIGlmICghZGF0YS5zdWJtaXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FkZENvbnZlbmllbmNlTWV0aG9kcyhlLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICBqcVhIUiwKICAgICAgICAgICAgICAgIGFib3J0ZWQsCiAgICAgICAgICAgICAgICBzbG90LAogICAgICAgICAgICAgICAgcGlwZSwKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGF0Ll9nZXRBSkFYU2V0dGluZ3MoZGF0YSksCiAgICAgICAgICAgICAgICBzZW5kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQuX3NlbmRpbmcgKz0gMTsKICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGltZXIgZm9yIGJpdHJhdGUgcHJvZ3Jlc3MgY2FsY3VsYXRpb246CiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5fYml0cmF0ZVRpbWVyID0gbmV3IHRoYXQuX0JpdHJhdGVUaW1lcigpOwogICAgICAgICAgICAgICAgICAgIGpxWEhSID0ganFYSFIgfHwgKAogICAgICAgICAgICAgICAgICAgICAgICAoKGFib3J0ZWQgfHwgdGhhdC5fdHJpZ2dlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzZW5kJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3NlbmQnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgKSA9PT0gZmFsc2UpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2dldFhIUlByb21pc2UoZmFsc2UsIG9wdGlvbnMuY29udGV4dCwgYWJvcnRlZCkpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX2NodW5rZWRVcGxvYWQob3B0aW9ucykgfHwgJC5hamF4KG9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgKS5kb25lKGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uRG9uZShyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSLCBvcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICB9KS5mYWlsKGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25GYWlsKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfSkuYWx3YXlzKGZ1bmN0aW9uIChqcVhIUm9yUmVzdWx0LCB0ZXh0U3RhdHVzLCBqcVhIUm9yRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BbHdheXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUm9yUmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSb3JFcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fc2VuZGluZyAtPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB0aGF0Ll9hY3RpdmUgLT0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyA+IHRoYXQuX3NlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBuZXh0IHF1ZXVlZCB1cGxvYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBub3QgYmVlbiBhYm9ydGVkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0U2xvdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0Ll9nZXREZWZlcnJlZFN0YXRlKG5leHRTbG90KSA9PT0gJ3BlbmRpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTbG90LnJlc29sdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTbG90ID0gdGhhdC5fc2xvdHMuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5fYWN0aXZlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3RvcCBjYWxsYmFjayBpcyB0cmlnZ2VyZWQgd2hlbiBhbGwgdXBsb2FkcyBoYXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIGNvbXBsZXRlZCwgZXF1aXZhbGVudCB0byB0aGUgZ2xvYmFsIGFqYXhTdG9wIGV2ZW50OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5fdHJpZ2dlcignc3RvcCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fYmVmb3JlU2VuZChlLCBvcHRpb25zKTsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zZXF1ZW50aWFsVXBsb2FkcyB8fAogICAgICAgICAgICAgICAgICAgICh0aGlzLm9wdGlvbnMubGltaXRDb25jdXJyZW50VXBsb2FkcyAmJgogICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5saW1pdENvbmN1cnJlbnRVcGxvYWRzIDw9IHRoaXMuX3NlbmRpbmcpKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxpbWl0Q29uY3VycmVudFVwbG9hZHMgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgc2xvdCA9ICQuRGVmZXJyZWQoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zbG90cy5wdXNoKHNsb3QpOwogICAgICAgICAgICAgICAgICAgIHBpcGUgPSBzbG90LnRoZW4oc2VuZCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fc2VxdWVuY2UudGhlbihzZW5kLCBzZW5kKTsKICAgICAgICAgICAgICAgICAgICBwaXBlID0gdGhpcy5fc2VxdWVuY2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHBpcGVkIFByb21pc2Ugb2JqZWN0LCBlbmhhbmNlZCB3aXRoIGFuIGFib3J0IG1ldGhvZCwKICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIGRlbGVnYXRlZCB0byB0aGUganFYSFIgb2JqZWN0IG9mIHRoZSBjdXJyZW50IHVwbG9hZCwKICAgICAgICAgICAgICAgIC8vIGFuZCBqcVhIUiBjYWxsYmFja3MgbWFwcGVkIHRvIHRoZSBlcXVpdmFsZW50IFByb21pc2UgbWV0aG9kczoKICAgICAgICAgICAgICAgIHBpcGUuYWJvcnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IFt1bmRlZmluZWQsICdhYm9ydCcsICdhYm9ydCddOwogICAgICAgICAgICAgICAgICAgIGlmICghanFYSFIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QucmVqZWN0V2l0aChvcHRpb25zLmNvbnRleHQsIGFib3J0ZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZW5kKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBqcVhIUi5hYm9ydCgpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmhhbmNlUHJvbWlzZShwaXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VuZCgpOwogICAgICAgIH0sCgogICAgICAgIF9vbkFkZDogZnVuY3Rpb24gKGUsIGRhdGEpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZSwKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgdGhpcy5vcHRpb25zLCBkYXRhKSwKICAgICAgICAgICAgICAgIGZpbGVzID0gZGF0YS5maWxlcywKICAgICAgICAgICAgICAgIGZpbGVzTGVuZ3RoID0gZmlsZXMubGVuZ3RoLAogICAgICAgICAgICAgICAgbGltaXQgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkcywKICAgICAgICAgICAgICAgIGxpbWl0U2l6ZSA9IG9wdGlvbnMubGltaXRNdWx0aUZpbGVVcGxvYWRTaXplLAogICAgICAgICAgICAgICAgb3ZlcmhlYWQgPSBvcHRpb25zLmxpbWl0TXVsdGlGaWxlVXBsb2FkU2l6ZU92ZXJoZWFkLAogICAgICAgICAgICAgICAgYmF0Y2hTaXplID0gMCwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IHRoaXMuX2dldFBhcmFtTmFtZShvcHRpb25zKSwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCwKICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlLAogICAgICAgICAgICAgICAgZmlsZVNldCwKICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgaWYgKCFmaWxlc0xlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsaW1pdFNpemUgJiYgZmlsZXNbMF0uc2l6ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBsaW1pdFNpemUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEob3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyB8fCBsaW1pdCB8fCBsaW1pdFNpemUpIHx8CiAgICAgICAgICAgICAgICAgICAgIXRoaXMuX2lzWEhSVXBsb2FkKG9wdGlvbnMpKSB7CiAgICAgICAgICAgICAgICBmaWxlU2V0ID0gW2ZpbGVzXTsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCA9IFtwYXJhbU5hbWVdOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5zaW5nbGVGaWxlVXBsb2FkcyB8fCBsaW1pdFNpemUpICYmIGxpbWl0KSB7CiAgICAgICAgICAgICAgICBmaWxlU2V0ID0gW107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlc0xlbmd0aDsgaSArPSBsaW1pdCkgewogICAgICAgICAgICAgICAgICAgIGZpbGVTZXQucHVzaChmaWxlcy5zbGljZShpLCBpICsgbGltaXQpKTsKICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTbGljZSA9IHBhcmFtTmFtZS5zbGljZShpLCBpICsgbGltaXQpOwogICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1OYW1lU2xpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQucHVzaChwYXJhbU5hbWVTbGljZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9wdGlvbnMuc2luZ2xlRmlsZVVwbG9hZHMgJiYgbGltaXRTaXplKSB7CiAgICAgICAgICAgICAgICBmaWxlU2V0ID0gW107CiAgICAgICAgICAgICAgICBwYXJhbU5hbWVTZXQgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWxlc0xlbmd0aDsgaSA9IGkgKyAxKSB7CiAgICAgICAgICAgICAgICAgICAgYmF0Y2hTaXplICs9IGZpbGVzW2ldLnNpemUgKyBvdmVyaGVhZDsKICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPT09IGZpbGVzTGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJhdGNoU2l6ZSArIGZpbGVzW2kgKyAxXS5zaXplICsgb3ZlcmhlYWQpID4gbGltaXRTaXplKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbWl0ICYmIGkgKyAxIC0gaiA+PSBsaW1pdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVNldC5wdXNoKGZpbGVzLnNsaWNlKGosIGkgKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lLnNsaWNlKGosIGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbU5hbWVTbGljZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNsaWNlID0gcGFyYW1OYW1lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldC5wdXNoKHBhcmFtTmFtZVNsaWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBiYXRjaFNpemUgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcmFtTmFtZVNldCA9IHBhcmFtTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkYXRhLm9yaWdpbmFsRmlsZXMgPSBmaWxlczsKICAgICAgICAgICAgJC5lYWNoKGZpbGVTZXQgfHwgZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkgewogICAgICAgICAgICAgICAgdmFyIG5ld0RhdGEgPSAkLmV4dGVuZCh7fSwgZGF0YSk7CiAgICAgICAgICAgICAgICBuZXdEYXRhLmZpbGVzID0gZmlsZVNldCA/IGVsZW1lbnQgOiBbZWxlbWVudF07CiAgICAgICAgICAgICAgICBuZXdEYXRhLnBhcmFtTmFtZSA9IHBhcmFtTmFtZVNldFtpbmRleF07CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0UmVzcG9uc2VPYmplY3QobmV3RGF0YSk7CiAgICAgICAgICAgICAgICB0aGF0Ll9pbml0UHJvZ3Jlc3NPYmplY3QobmV3RGF0YSk7CiAgICAgICAgICAgICAgICB0aGF0Ll9hZGRDb252ZW5pZW5jZU1ldGhvZHMoZSwgbmV3RGF0YSk7CiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGF0Ll90cmlnZ2VyKAogICAgICAgICAgICAgICAgICAgICdhZGQnLAogICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ2FkZCcsIHtkZWxlZ2F0ZWRFdmVudDogZX0pLAogICAgICAgICAgICAgICAgICAgIG5ld0RhdGEKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9LAoKICAgICAgICBfcmVwbGFjZUZpbGVJbnB1dDogZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIGlucHV0ID0gZGF0YS5maWxlSW5wdXQsCiAgICAgICAgICAgICAgICBpbnB1dENsb25lID0gaW5wdXQuY2xvbmUodHJ1ZSksCiAgICAgICAgICAgICAgICByZXN0b3JlRm9jdXMgPSBpbnB1dC5pcyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTsKICAgICAgICAgICAgLy8gQWRkIGEgcmVmZXJlbmNlIGZvciB0aGUgbmV3IGNsb25lZCBmaWxlIGlucHV0IHRvIHRoZSBkYXRhIGFyZ3VtZW50OgogICAgICAgICAgICBkYXRhLmZpbGVJbnB1dENsb25lID0gaW5wdXRDbG9uZTsKICAgICAgICAgICAgJCgnPGZvcm0+PC9mb3JtPicpLmFwcGVuZChpbnB1dENsb25lKVswXS5yZXNldCgpOwogICAgICAgICAgICAvLyBEZXRhY2hpbmcgYWxsb3dzIHRvIGluc2VydCB0aGUgZmlsZUlucHV0IG9uIGFub3RoZXIgZm9ybQogICAgICAgICAgICAvLyB3aXRob3V0IGxvb3NpbmcgdGhlIGZpbGUgaW5wdXQgdmFsdWU6CiAgICAgICAgICAgIGlucHV0LmFmdGVyKGlucHV0Q2xvbmUpLmRldGFjaCgpOwogICAgICAgICAgICAvLyBJZiB0aGUgZmlsZUlucHV0IGhhZCBmb2N1cyBiZWZvcmUgaXQgd2FzIGRldGFjaGVkLAogICAgICAgICAgICAvLyByZXN0b3JlIGZvY3VzIHRvIHRoZSBpbnB1dENsb25lLgogICAgICAgICAgICBpZiAocmVzdG9yZUZvY3VzKSB7CiAgICAgICAgICAgICAgICBpbnB1dENsb25lLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXZvaWQgbWVtb3J5IGxlYWtzIHdpdGggdGhlIGRldGFjaGVkIGZpbGUgaW5wdXQ6CiAgICAgICAgICAgICQuY2xlYW5EYXRhKGlucHV0LnVuYmluZCgncmVtb3ZlJykpOwogICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBvcmlnaW5hbCBmaWxlIGlucHV0IGVsZW1lbnQgaW4gdGhlIGZpbGVJbnB1dAogICAgICAgICAgICAvLyBlbGVtZW50cyBzZXQgd2l0aCB0aGUgY2xvbmUsIHdoaWNoIGhhcyBiZWVuIGNvcGllZCBpbmNsdWRpbmcKICAgICAgICAgICAgLy8gZXZlbnQgaGFuZGxlcnM6CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5maWxlSW5wdXQgPSB0aGlzLm9wdGlvbnMuZmlsZUlucHV0Lm1hcChmdW5jdGlvbiAoaSwgZWwpIHsKICAgICAgICAgICAgICAgIGlmIChlbCA9PT0gaW5wdXRbMF0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRDbG9uZVswXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBlbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIElmIHRoZSB3aWRnZXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgb24gdGhlIGZpbGUgaW5wdXQgaXRzZWxmLAogICAgICAgICAgICAvLyBvdmVycmlkZSB0aGlzLmVsZW1lbnQgd2l0aCB0aGUgZmlsZSBpbnB1dCBjbG9uZToKICAgICAgICAgICAgaWYgKGlucHV0WzBdID09PSB0aGlzLmVsZW1lbnRbMF0pIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGlucHV0Q2xvbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaGFuZGxlRmlsZVRyZWVFbnRyeTogZnVuY3Rpb24gKGVudHJ5LCBwYXRoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIGRmZCA9ICQuRGVmZXJyZWQoKSwKICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgJiYgIWUuZW50cnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5lbnRyeSA9IGVudHJ5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSAkLndoZW4gcmV0dXJucyBpbW1lZGlhdGVseSBpZiBvbmUKICAgICAgICAgICAgICAgICAgICAvLyBEZWZlcnJlZCBpcyByZWplY3RlZCwgd2UgdXNlIHJlc29sdmUgaW5zdGVhZC4KICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB2YWxpZCBmaWxlcyBhbmQgaW52YWxpZCBpdGVtcwogICAgICAgICAgICAgICAgICAgIC8vIHRvIGJlIHJldHVybmVkIHRvZ2V0aGVyIGluIG9uZSBzZXQ6CiAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoW2VdKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBzdWNjZXNzSGFuZGxlciA9IGZ1bmN0aW9uIChlbnRyaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5faGFuZGxlRmlsZVRyZWVFbnRyaWVzKAogICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzLAogICAgICAgICAgICAgICAgICAgICAgICBwYXRoICsgZW50cnkubmFtZSArICcvJwogICAgICAgICAgICAgICAgICAgICkuZG9uZShmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoZmlsZXMpOwogICAgICAgICAgICAgICAgICAgIH0pLmZhaWwoZXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICByZWFkRW50cmllcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBkaXJSZWFkZXIucmVhZEVudHJpZXMoZnVuY3Rpb24gKHJlc3VsdHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0hhbmRsZXIoZW50cmllcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzID0gZW50cmllcy5jb25jYXQocmVzdWx0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkRW50cmllcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBkaXJSZWFkZXIsIGVudHJpZXMgPSBbXTsKICAgICAgICAgICAgcGF0aCA9IHBhdGggfHwgJyc7CiAgICAgICAgICAgIGlmIChlbnRyeS5pc0ZpbGUpIHsKICAgICAgICAgICAgICAgIGlmIChlbnRyeS5fZmlsZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIENocm9tZSBidWcgIzE0OTczNQogICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlLnJlbGF0aXZlUGF0aCA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoZW50cnkuX2ZpbGUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlbnRyeS5maWxlKGZ1bmN0aW9uIChmaWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucmVsYXRpdmVQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlc29sdmUoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgfSwgZXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0RpcmVjdG9yeSkgewogICAgICAgICAgICAgICAgZGlyUmVhZGVyID0gZW50cnkuY3JlYXRlUmVhZGVyKCk7CiAgICAgICAgICAgICAgICByZWFkRW50cmllcygpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHkgbGlzdCBmb3IgZmlsZSBzeXN0ZW0gaXRlbXMKICAgICAgICAgICAgICAgIC8vIG90aGVyIHRoYW4gZmlsZXMgb3IgZGlyZWN0b3JpZXM6CiAgICAgICAgICAgICAgICBkZmQucmVzb2x2ZShbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRmZC5wcm9taXNlKCk7CiAgICAgICAgfSwKCiAgICAgICAgX2hhbmRsZUZpbGVUcmVlRW50cmllczogZnVuY3Rpb24gKGVudHJpZXMsIHBhdGgpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KAogICAgICAgICAgICAgICAgJCwKICAgICAgICAgICAgICAgICQubWFwKGVudHJpZXMsIGZ1bmN0aW9uIChlbnRyeSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGF0Ll9oYW5kbGVGaWxlVHJlZUVudHJ5KGVudHJ5LCBwYXRoKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9nZXREcm9wcGVkRmlsZXM6IGZ1bmN0aW9uIChkYXRhVHJhbnNmZXIpIHsKICAgICAgICAgICAgZGF0YVRyYW5zZmVyID0gZGF0YVRyYW5zZmVyIHx8IHt9OwogICAgICAgICAgICB2YXIgaXRlbXMgPSBkYXRhVHJhbnNmZXIuaXRlbXM7CiAgICAgICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggJiYgKGl0ZW1zWzBdLndlYmtpdEdldEFzRW50cnkgfHwKICAgICAgICAgICAgICAgICAgICBpdGVtc1swXS5nZXRBc0VudHJ5KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZUZpbGVUcmVlRW50cmllcygKICAgICAgICAgICAgICAgICAgICAkLm1hcChpdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS53ZWJraXRHZXRBc0VudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGl0ZW0ud2Via2l0R2V0QXNFbnRyeSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgQ2hyb21lIGJ1ZyAjMTQ5NzM1OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Ll9maWxlID0gaXRlbS5nZXRBc0ZpbGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRBc0VudHJ5KCk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICQuRGVmZXJyZWQoKS5yZXNvbHZlKAogICAgICAgICAgICAgICAgJC5tYWtlQXJyYXkoZGF0YVRyYW5zZmVyLmZpbGVzKQogICAgICAgICAgICApLnByb21pc2UoKTsKICAgICAgICB9LAoKICAgICAgICBfZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXM6IGZ1bmN0aW9uIChmaWxlSW5wdXQpIHsKICAgICAgICAgICAgZmlsZUlucHV0ID0gJChmaWxlSW5wdXQpOwogICAgICAgICAgICB2YXIgZW50cmllcyA9IGZpbGVJbnB1dC5wcm9wKCd3ZWJraXRFbnRyaWVzJykgfHwKICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXQucHJvcCgnZW50cmllcycpLAogICAgICAgICAgICAgICAgZmlsZXMsCiAgICAgICAgICAgICAgICB2YWx1ZTsKICAgICAgICAgICAgaWYgKGVudHJpZXMgJiYgZW50cmllcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVGaWxlVHJlZUVudHJpZXMoZW50cmllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmlsZXMgPSAkLm1ha2VBcnJheShmaWxlSW5wdXQucHJvcCgnZmlsZXMnKSk7CiAgICAgICAgICAgIGlmICghZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IGZpbGVJbnB1dC5wcm9wKCd2YWx1ZScpOwogICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShbXSkucHJvbWlzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpbGVzIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUsIHRoZSBicm93c2VyIGRvZXMgbm90CiAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IHRoZSBGaWxlIEFQSSBhbmQgd2UgYWRkIGEgcHNldWRvIEZpbGUgb2JqZWN0IHdpdGgKICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dCB2YWx1ZSBhcyBuYW1lIHdpdGggcGF0aCBpbmZvcm1hdGlvbiByZW1vdmVkOgogICAgICAgICAgICAgICAgZmlsZXMgPSBbe25hbWU6IHZhbHVlLnJlcGxhY2UoL14uKlxcLywgJycpfV07CiAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsZXNbMF0ubmFtZSA9PT0gdW5kZWZpbmVkICYmIGZpbGVzWzBdLmZpbGVOYW1lKSB7CiAgICAgICAgICAgICAgICAvLyBGaWxlIG5vcm1hbGl6YXRpb24gZm9yIFNhZmFyaSA0IGFuZCBGaXJlZm94IDM6CiAgICAgICAgICAgICAgICAkLmVhY2goZmlsZXMsIGZ1bmN0aW9uIChpbmRleCwgZmlsZSkgewogICAgICAgICAgICAgICAgICAgIGZpbGUubmFtZSA9IGZpbGUuZmlsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgZmlsZS5zaXplID0gZmlsZS5maWxlU2l6ZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkLkRlZmVycmVkKCkucmVzb2x2ZShmaWxlcykucHJvbWlzZSgpOwogICAgICAgIH0sCgogICAgICAgIF9nZXRGaWxlSW5wdXRGaWxlczogZnVuY3Rpb24gKGZpbGVJbnB1dCkgewogICAgICAgICAgICBpZiAoIShmaWxlSW5wdXQgaW5zdGFuY2VvZiAkKSB8fCBmaWxlSW5wdXQubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMoZmlsZUlucHV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJC53aGVuLmFwcGx5KAogICAgICAgICAgICAgICAgJCwKICAgICAgICAgICAgICAgICQubWFwKGZpbGVJbnB1dCwgdGhpcy5fZ2V0U2luZ2xlRmlsZUlucHV0RmlsZXMpCiAgICAgICAgICAgICkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseSgKICAgICAgICAgICAgICAgICAgICBbXSwKICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9vbkNoYW5nZTogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBmaWxlSW5wdXQ6ICQoZS50YXJnZXQpLAogICAgICAgICAgICAgICAgICAgIGZvcm06ICQoZS50YXJnZXQuZm9ybSkKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2dldEZpbGVJbnB1dEZpbGVzKGRhdGEuZmlsZUlucHV0KS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICAgICBpZiAodGhhdC5vcHRpb25zLnJlcGxhY2VGaWxlSW5wdXQpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0Ll9yZXBsYWNlRmlsZUlucHV0KGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICdjaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdjaGFuZ2UnLCB7ZGVsZWdhdGVkRXZlbnQ6IGV9KSwKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YQogICAgICAgICAgICAgICAgICAgICkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5fb25BZGQoZSwgZGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0sCgogICAgICAgIF9vblBhc3RlOiBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICB2YXIgaXRlbXMgPSBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmNsaXBib2FyZERhdGEgJiYKICAgICAgICAgICAgICAgICAgICBlLm9yaWdpbmFsRXZlbnQuY2xpcGJvYXJkRGF0YS5pdGVtcywKICAgICAgICAgICAgICAgIGRhdGEgPSB7ZmlsZXM6IFtdfTsKICAgICAgICAgICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJC5lYWNoKGl0ZW1zLCBmdW5jdGlvbiAoaW5kZXgsIGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlICYmIGl0ZW0uZ2V0QXNGaWxlKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcy5wdXNoKGZpbGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICdwYXN0ZScsCiAgICAgICAgICAgICAgICAgICAgICAgICQuRXZlbnQoJ3Bhc3RlJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEKICAgICAgICAgICAgICAgICAgICApICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uRHJvcDogZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgZS5kYXRhVHJhbnNmZXIgPSBlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LmRhdGFUcmFuc2ZlcjsKICAgICAgICAgICAgdmFyIHRoYXQgPSB0aGlzLAogICAgICAgICAgICAgICAgZGF0YVRyYW5zZmVyID0gZS5kYXRhVHJhbnNmZXIsCiAgICAgICAgICAgICAgICBkYXRhID0ge307CiAgICAgICAgICAgIGlmIChkYXRhVHJhbnNmZXIgJiYgZGF0YVRyYW5zZmVyLmZpbGVzICYmIGRhdGFUcmFuc2Zlci5maWxlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2dldERyb3BwZWRGaWxlcyhkYXRhVHJhbnNmZXIpLmFsd2F5cyhmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gZmlsZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuX3RyaWdnZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHJvcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLkV2ZW50KCdkcm9wJywge2RlbGVnYXRlZEV2ZW50OiBlfSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICkgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKGUsIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX29uRHJhZ092ZXI6IGdldERyYWdIYW5kbGVyKCdkcmFnb3ZlcicpLAoKICAgICAgICBfb25EcmFnRW50ZXI6IGdldERyYWdIYW5kbGVyKCdkcmFnZW50ZXInKSwKCiAgICAgICAgX29uRHJhZ0xlYXZlOiBnZXREcmFnSGFuZGxlcignZHJhZ2xlYXZlJyksCgogICAgICAgIF9pbml0RXZlbnRIYW5kbGVyczogZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5faXNYSFJVcGxvYWQodGhpcy5vcHRpb25zKSkgewogICAgICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmRyb3Bab25lLCB7CiAgICAgICAgICAgICAgICAgICAgZHJhZ292ZXI6IHRoaXMuX29uRHJhZ092ZXIsCiAgICAgICAgICAgICAgICAgICAgZHJvcDogdGhpcy5fb25Ecm9wLAogICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LnByZXZlbnREZWZhdWx0KCkgb24gZHJhZ2VudGVyIGlzIHJlcXVpcmVkIGZvciBJRTEwKzoKICAgICAgICAgICAgICAgICAgICBkcmFnZW50ZXI6IHRoaXMuX29uRHJhZ0VudGVyLAogICAgICAgICAgICAgICAgICAgIC8vIGRyYWdsZWF2ZSBpcyBub3QgcmVxdWlyZWQsIGJ1dCBhZGRlZCBmb3IgY29tcGxldGVuZXNzOgogICAgICAgICAgICAgICAgICAgIGRyYWdsZWF2ZTogdGhpcy5fb25EcmFnTGVhdmUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLnBhc3RlWm9uZSwgewogICAgICAgICAgICAgICAgICAgIHBhc3RlOiB0aGlzLl9vblBhc3RlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJC5zdXBwb3J0LmZpbGVJbnB1dCkgewogICAgICAgICAgICAgICAgdGhpcy5fb24odGhpcy5vcHRpb25zLmZpbGVJbnB1dCwgewogICAgICAgICAgICAgICAgICAgIGNoYW5nZTogdGhpcy5fb25DaGFuZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgX2Rlc3Ryb3lFdmVudEhhbmRsZXJzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX29mZih0aGlzLm9wdGlvbnMuZHJvcFpvbmUsICdkcmFnZW50ZXIgZHJhZ2xlYXZlIGRyYWdvdmVyIGRyb3AnKTsKICAgICAgICAgICAgdGhpcy5fb2ZmKHRoaXMub3B0aW9ucy5wYXN0ZVpvbmUsICdwYXN0ZScpOwogICAgICAgICAgICB0aGlzLl9vZmYodGhpcy5vcHRpb25zLmZpbGVJbnB1dCwgJ2NoYW5nZScpOwogICAgICAgIH0sCgogICAgICAgIF9zZXRPcHRpb246IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIHZhciByZWluaXQgPSAkLmluQXJyYXkoa2V5LCB0aGlzLl9zcGVjaWFsT3B0aW9ucykgIT09IC0xOwogICAgICAgICAgICBpZiAocmVpbml0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXN0cm95RXZlbnRIYW5kbGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N1cGVyKGtleSwgdmFsdWUpOwogICAgICAgICAgICBpZiAocmVpbml0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0U3BlY2lhbE9wdGlvbnMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRFdmVudEhhbmRsZXJzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfaW5pdFNwZWNpYWxPcHRpb25zOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlSW5wdXQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQgPSB0aGlzLmVsZW1lbnQuaXMoJ2lucHV0W3R5cGU9ImZpbGUiXScpID8KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50IDogdGhpcy5lbGVtZW50LmZpbmQoJ2lucHV0W3R5cGU9ImZpbGUiXScpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCEob3B0aW9ucy5maWxlSW5wdXQgaW5zdGFuY2VvZiAkKSkgewogICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQgPSAkKG9wdGlvbnMuZmlsZUlucHV0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIShvcHRpb25zLmRyb3Bab25lIGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMuZHJvcFpvbmUgPSAkKG9wdGlvbnMuZHJvcFpvbmUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKG9wdGlvbnMucGFzdGVab25lIGluc3RhbmNlb2YgJCkpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMucGFzdGVab25lID0gJChvcHRpb25zLnBhc3RlWm9uZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfZ2V0UmVnRXhwOiBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgICAgIHZhciBwYXJ0cyA9IHN0ci5zcGxpdCgnLycpLAogICAgICAgICAgICAgICAgbW9kaWZpZXJzID0gcGFydHMucG9wKCk7CiAgICAgICAgICAgIHBhcnRzLnNoaWZ0KCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHBhcnRzLmpvaW4oJy8nKSwgbW9kaWZpZXJzKTsKICAgICAgICB9LAoKICAgICAgICBfaXNSZWdFeHBPcHRpb246IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBrZXkgIT09ICd1cmwnICYmICQudHlwZSh2YWx1ZSkgPT09ICdzdHJpbmcnICYmCiAgICAgICAgICAgICAgICAvXlwvLipcL1tpZ21dezAsM30kLy50ZXN0KHZhbHVlKTsKICAgICAgICB9LAoKICAgICAgICBfaW5pdERhdGFBdHRyaWJ1dGVzOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5lbGVtZW50LmRhdGEoKTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBvcHRpb25zIHNldCB2aWEgSFRNTDUgZGF0YS1hdHRyaWJ1dGVzOgogICAgICAgICAgICAkLmVhY2goCiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnRbMF0uYXR0cmlidXRlcywKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpbmRleCwgYXR0cikgewogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKC9eZGF0YS0vLnRlc3Qoa2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGh5cGhlbi1hdGVkIGtleSB0byBjYW1lbENhc2U6CiAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5zbGljZSg1KS5yZXBsYWNlKC8tW2Etel0vZywgZnVuY3Rpb24gKHN0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoMSkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0YVtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhhdC5faXNSZWdFeHBPcHRpb24oa2V5LCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhhdC5fZ2V0UmVnRXhwKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfSwKCiAgICAgICAgX2NyZWF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9pbml0RGF0YUF0dHJpYnV0ZXMoKTsKICAgICAgICAgICAgdGhpcy5faW5pdFNwZWNpYWxPcHRpb25zKCk7CiAgICAgICAgICAgIHRoaXMuX3Nsb3RzID0gW107CiAgICAgICAgICAgIHRoaXMuX3NlcXVlbmNlID0gdGhpcy5fZ2V0WEhSUHJvbWlzZSh0cnVlKTsKICAgICAgICAgICAgdGhpcy5fc2VuZGluZyA9IHRoaXMuX2FjdGl2ZSA9IDA7CiAgICAgICAgICAgIHRoaXMuX2luaXRQcm9ncmVzc09iamVjdCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5faW5pdEV2ZW50SGFuZGxlcnMoKTsKICAgICAgICB9LAoKICAgICAgICAvLyBUaGlzIG1ldGhvZCBpcyBleHBvc2VkIHRvIHRoZSB3aWRnZXQgQVBJIGFuZCBhbGxvd3MgdG8gcXVlcnkKICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIGFjdGl2ZSB1cGxvYWRzOgogICAgICAgIGFjdGl2ZTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlOwogICAgICAgIH0sCgogICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyB0byBxdWVyeQogICAgICAgIC8vIHRoZSB3aWRnZXQgdXBsb2FkIHByb2dyZXNzLgogICAgICAgIC8vIEl0IHJldHVybnMgYW4gb2JqZWN0IHdpdGggbG9hZGVkLCB0b3RhbCBhbmQgYml0cmF0ZSBwcm9wZXJ0aWVzCiAgICAgICAgLy8gZm9yIHRoZSBydW5uaW5nIHVwbG9hZHM6CiAgICAgICAgcHJvZ3Jlc3M6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyZXNzOwogICAgICAgIH0sCgogICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBhZGRpbmcgZmlsZXMKICAgICAgICAvLyB1c2luZyB0aGUgZmlsZXVwbG9hZCBBUEkuIFRoZSBkYXRhIHBhcmFtZXRlciBhY2NlcHRzIGFuIG9iamVjdCB3aGljaAogICAgICAgIC8vIG11c3QgaGF2ZSBhIGZpbGVzIHByb3BlcnR5IGFuZCBjYW4gY29udGFpbiBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgICAgLy8gLmZpbGV1cGxvYWQoJ2FkZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7CiAgICAgICAgYWRkOiBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgICAgICAgIGlmICghZGF0YSB8fCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGF0YS5maWxlSW5wdXQgJiYgIWRhdGEuZmlsZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2dldEZpbGVJbnB1dEZpbGVzKGRhdGEuZmlsZUlucHV0KS5hbHdheXMoZnVuY3Rpb24gKGZpbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgIHRoYXQuX29uQWRkKG51bGwsIGRhdGEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkYXRhLmZpbGVzID0gJC5tYWtlQXJyYXkoZGF0YS5maWxlcyk7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkFkZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgdG8gdGhlIHdpZGdldCBBUEkgYW5kIGFsbG93cyBzZW5kaW5nIGZpbGVzCiAgICAgICAgLy8gdXNpbmcgdGhlIGZpbGV1cGxvYWQgQVBJLiBUaGUgZGF0YSBwYXJhbWV0ZXIgYWNjZXB0cyBhbiBvYmplY3Qgd2hpY2gKICAgICAgICAvLyBtdXN0IGhhdmUgYSBmaWxlcyBvciBmaWxlSW5wdXQgcHJvcGVydHkgYW5kIGNhbiBjb250YWluIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgICAgICAvLyAuZmlsZXVwbG9hZCgnc2VuZCcsIHtmaWxlczogZmlsZXNMaXN0fSk7CiAgICAgICAgLy8gVGhlIG1ldGhvZCByZXR1cm5zIGEgUHJvbWlzZSBvYmplY3QgZm9yIHRoZSBmaWxlIHVwbG9hZCBjYWxsLgogICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGlmIChkYXRhICYmICF0aGlzLm9wdGlvbnMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIGlmIChkYXRhLmZpbGVJbnB1dCAmJiAhZGF0YS5maWxlcykgewogICAgICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgZGZkID0gJC5EZWZlcnJlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gZGZkLnByb21pc2UoKSwKICAgICAgICAgICAgICAgICAgICAgICAganFYSFIsCiAgICAgICAgICAgICAgICAgICAgICAgIGFib3J0ZWQ7CiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5hYm9ydCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqcVhIUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGpxWEhSLmFib3J0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZGZkLnJlamVjdChudWxsLCAnYWJvcnQnLCAnYWJvcnQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXRGaWxlSW5wdXRGaWxlcyhkYXRhLmZpbGVJbnB1dCkuYWx3YXlzKAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZmlsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYm9ydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9IGZpbGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFIgPSB0aGF0Ll9vblNlbmQobnVsbCwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcVhIUi50aGVuKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChyZXN1bHQsIHRleHRTdGF0dXMsIGpxWEhSKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmZC5yZXNvbHZlKHJlc3VsdCwgdGV4dFN0YXR1cywganFYSFIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZmQucmVqZWN0KGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuaGFuY2VQcm9taXNlKHByb21pc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGF0YS5maWxlcyA9ICQubWFrZUFycmF5KGRhdGEuZmlsZXMpOwogICAgICAgICAgICAgICAgaWYgKGRhdGEuZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uU2VuZChudWxsLCBkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0WEhSUHJvbWlzZShmYWxzZSwgZGF0YSAmJiBkYXRhLmNvbnRleHQpOwogICAgICAgIH0KCiAgICB9KTsKCn0pKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/jquery.iframe-transport.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogalF1ZXJ5IElmcmFtZSBUcmFuc3BvcnQgUGx1Z2luIDEuNQogKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9qUXVlcnktRmlsZS1VcGxvYWQKICoKICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW4KICogaHR0cHM6Ly9ibHVlaW1wLm5ldAogKgogKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6CiAqIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUCiAqLwoKLypqc2xpbnQgdW5wYXJhbTogdHJ1ZSwgbm9tZW46IHRydWUgKi8KLypnbG9iYWwgZGVmaW5lLCB3aW5kb3csIGRvY3VtZW50ICovCgooZnVuY3Rpb24gKGZhY3RvcnkpIHsKICAgICd1c2Ugc3RyaWN0JzsKICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgICAgICAvLyBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgQU1EIG1vZHVsZToKICAgICAgICBkZWZpbmUoWydqcXVlcnknXSwgZmFjdG9yeSk7CiAgICB9IGVsc2UgewogICAgICAgIC8vIEJyb3dzZXIgZ2xvYmFsczoKICAgICAgICBmYWN0b3J5KHdpbmRvdy5qUXVlcnkpOwogICAgfQp9KGZ1bmN0aW9uICgkKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLy8gSGVscGVyIHZhcmlhYmxlIHRvIGNyZWF0ZSB1bmlxdWUgbmFtZXMgZm9yIHRoZSB0cmFuc3BvcnQgaWZyYW1lczoKICAgIHZhciBjb3VudGVyID0gMDsKCiAgICAvLyBUaGUgaWZyYW1lIHRyYW5zcG9ydCBhY2NlcHRzIHRocmVlIGFkZGl0aW9uYWwgb3B0aW9uczoKICAgIC8vIG9wdGlvbnMuZmlsZUlucHV0OiBhIGpRdWVyeSBjb2xsZWN0aW9uIG9mIGZpbGUgaW5wdXQgZmllbGRzCiAgICAvLyBvcHRpb25zLnBhcmFtTmFtZTogdGhlIHBhcmFtZXRlciBuYW1lIGZvciB0aGUgZmlsZSBmb3JtIGRhdGEsCiAgICAvLyAgb3ZlcnJpZGVzIHRoZSBuYW1lIHByb3BlcnR5IG9mIHRoZSBmaWxlIGlucHV0IGZpZWxkKHMpLAogICAgLy8gIGNhbiBiZSBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLgogICAgLy8gb3B0aW9ucy5mb3JtRGF0YTogYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIG5hbWUgYW5kIHZhbHVlIHByb3BlcnRpZXMsCiAgICAvLyAgZXF1aXZhbGVudCB0byB0aGUgcmV0dXJuIGRhdGEgb2YgLnNlcmlhbGl6ZUFycmF5KCksIGUuZy46CiAgICAvLyAgW3tuYW1lOiAnYScsIHZhbHVlOiAxfSwge25hbWU6ICdiJywgdmFsdWU6IDJ9XQogICAgJC5hamF4VHJhbnNwb3J0KCdpZnJhbWUnLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgIGlmIChvcHRpb25zLmFzeW5jICYmIChvcHRpb25zLnR5cGUgPT09ICdQT1NUJyB8fCBvcHRpb25zLnR5cGUgPT09ICdHRVQnKSkgewogICAgICAgICAgICB2YXIgZm9ybSwKICAgICAgICAgICAgICAgIGlmcmFtZTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHNlbmQ6IGZ1bmN0aW9uIChfLCBjb21wbGV0ZUNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybSA9ICQoJzxmb3JtIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48L2Zvcm0+Jyk7CiAgICAgICAgICAgICAgICAgICAgZm9ybS5hdHRyKCdhY2NlcHQtY2hhcnNldCcsIG9wdGlvbnMuZm9ybUFjY2VwdENoYXJzZXQpOwogICAgICAgICAgICAgICAgICAgIC8vIGphdmFzY3JpcHQ6ZmFsc2UgYXMgaW5pdGlhbCBpZnJhbWUgc3JjCiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudHMgd2FybmluZyBwb3B1cHMgb24gSFRUUFMgaW4gSUU2LgogICAgICAgICAgICAgICAgICAgIC8vIElFIHZlcnNpb25zIGJlbG93IElFOCBjYW5ub3Qgc2V0IHRoZSBuYW1lIHByb3BlcnR5IG9mCiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgRE9NLAogICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIHNldCB0aGUgbmFtZSBhbG9uZyB3aXRoIHRoZSBpZnJhbWUgSFRNTCBtYXJrdXA6CiAgICAgICAgICAgICAgICAgICAgaWZyYW1lID0gJCgKICAgICAgICAgICAgICAgICAgICAgICAgJzxpZnJhbWUgc3JjPSJqYXZhc2NyaXB0OmZhbHNlOyIgbmFtZT0iaWZyYW1lLXRyYW5zcG9ydC0nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb3VudGVyICs9IDEpICsgJyI+PC9pZnJhbWU+JwogICAgICAgICAgICAgICAgICAgICkuYmluZCgnbG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpbGVJbnB1dENsb25lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXMgPSAkLmlzQXJyYXkob3B0aW9ucy5wYXJhbU5hbWUpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wYXJhbU5hbWUgOiBbb3B0aW9ucy5wYXJhbU5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpbmQoJ2xvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdyYXAgaW4gYSB0cnkvY2F0Y2ggYmxvY2sgdG8gY2F0Y2ggZXhjZXB0aW9ucyB0aHJvd24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgY3Jvc3MtZG9tYWluIGlmcmFtZSBjb250ZW50czoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGlmcmFtZS5jb250ZW50cygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHb29nbGUgQ2hyb21lIGFuZCBGaXJlZm94IGRvIG5vdCB0aHJvdyBhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNlcHRpb24gd2hlbiBjYWxsaW5nIGlmcmFtZS5jb250ZW50cygpIG9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyb3NzLWRvbWFpbiByZXF1ZXN0cywgc28gd2UgdW5pZnkgdGhlIHJlc3BvbnNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmxlbmd0aCB8fCAhcmVzcG9uc2VbMF0uZmlyc3RDaGlsZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29tcGxldGUgY2FsbGJhY2sgcmV0dXJucyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZnJhbWUgY29udGVudCBkb2N1bWVudCBhcyByZXNwb25zZSBvYmplY3Q6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVDYWxsYmFjaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnaWZyYW1lJzogcmVzcG9uc2V9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGaXggZm9yIElFIGVuZGxlc3MgcHJvZ3Jlc3MgYmFyIGFjdGl2aXR5IGJ1ZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChoYXBwZW5zIG9uIGZvcm0gc3VibWl0cyB0byBpZnJhbWUgdGFyZ2V0cyk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlmcmFtZSBzcmM9ImphdmFzY3JpcHQ6ZmFsc2U7Ij48L2lmcmFtZT4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgndGFyZ2V0JywgaWZyYW1lLnByb3AoJ25hbWUnKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdhY3Rpb24nLCBvcHRpb25zLnVybCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCdtZXRob2QnLCBvcHRpb25zLnR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5mb3JtRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG9wdGlvbnMuZm9ybURhdGEsIGZ1bmN0aW9uIChpbmRleCwgZmllbGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQgdHlwZT0iaGlkZGVuIi8+JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ25hbWUnLCBmaWVsZC5uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsKGZpZWxkLnZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5maWxlSW5wdXQgJiYgb3B0aW9ucy5maWxlSW5wdXQubGVuZ3RoICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy50eXBlID09PSAnUE9TVCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVJbnB1dENsb25lcyA9IG9wdGlvbnMuZmlsZUlucHV0LmNsb25lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBjbG9uZSBmb3IgZWFjaCBmaWxlIGlucHV0IGZpZWxkOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5maWxlSW5wdXQuYWZ0ZXIoZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVJbnB1dENsb25lc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcmFtTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZXNbaW5kZXhdIHx8IG9wdGlvbnMucGFyYW1OYW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmRpbmcgdGhlIGZpbGUgaW5wdXQgZmllbGRzIHRvIHRoZSBoaWRkZW4gZm9ybQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlcyB0aGVtIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChvcHRpb25zLmZpbGVJbnB1dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnZW5jdHlwZScsICdtdWx0aXBhcnQvZm9ybS1kYXRhJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbmN0eXBlIG11c3QgYmUgc2V0IGFzIGVuY29kaW5nIGZvciBJRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcCgnZW5jb2RpbmcnLCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluc2VydCB0aGUgZmlsZSBpbnB1dCBmaWVsZHMgYXQgdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnkgcmVwbGFjaW5nIHRoZSBjbG9uZXMgd2l0aCB0aGUgb3JpZ2luYWxzOgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUlucHV0Q2xvbmVzICYmIGZpbGVJbnB1dENsb25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZmlsZUlucHV0LmVhY2goZnVuY3Rpb24gKGluZGV4LCBpbnB1dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjbG9uZSA9ICQoZmlsZUlucHV0Q2xvbmVzW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChpbnB1dCkucHJvcCgnbmFtZScsIGNsb25lLnByb3AoJ25hbWUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUucmVwbGFjZVdpdGgoaW5wdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmb3JtLmFwcGVuZChpZnJhbWUpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBqYXZhc2NyaXB0OmZhbHNlIGFzIGlmcmFtZSBzcmMgYWJvcnRzIHRoZSByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBwcmV2ZW50cyB3YXJuaW5nIHBvcHVwcyBvbiBIVFRQUyBpbiBJRTYuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdCBpcyB1c2VkIHRvIGF2b2lkIHRoZSAiU2NyaXB0IFVSTCIgSlNMaW50IGVycm9yOgogICAgICAgICAgICAgICAgICAgICAgICBpZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC51bmJpbmQoJ2xvYWQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoJ3NyYycsICdqYXZhc2NyaXB0Jy5jb25jYXQoJzpmYWxzZTsnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChmb3JtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0ucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0pOwoKICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNwb3J0IHJldHVybnMgdGhlIGlmcmFtZSBjb250ZW50IGRvY3VtZW50IGFzIHJlc3BvbnNlLgogICAgLy8gVGhlIGZvbGxvd2luZyBhZGRzIGNvbnZlcnRlcnMgZnJvbSBpZnJhbWUgdG8gdGV4dCwganNvbiwgaHRtbCwgYW5kIHNjcmlwdDoKICAgICQuYWpheFNldHVwKHsKICAgICAgICBjb252ZXJ0ZXJzOiB7CiAgICAgICAgICAgICdpZnJhbWUgdGV4dCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdpZnJhbWUganNvbic6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkLnBhcnNlSlNPTigkKGlmcmFtZVswXS5ib2R5KS50ZXh0KCkpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIGh0bWwnOiBmdW5jdGlvbiAoaWZyYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJChpZnJhbWVbMF0uYm9keSkuaHRtbCgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICAnaWZyYW1lIHNjcmlwdCc6IGZ1bmN0aW9uIChpZnJhbWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkLmdsb2JhbEV2YWwoJChpZnJhbWVbMF0uYm9keSkudGV4dCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pOwoKfSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/vendor/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/fileupload.lib/js/vendor/jquery.ui.widget.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjExLjQrQ29tbW9uSlMgLSAyMDE1LTA4LTI4CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiB3aWRnZXQuanMKKiBDb3B5cmlnaHQgMjAxNSBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzOyBMaWNlbnNlZCBNSVQgKi8KCihmdW5jdGlvbiggZmFjdG9yeSApIHsKCWlmICggdHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kICkgewoKCQkvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuCgkJZGVmaW5lKFsgImpxdWVyeSIgXSwgZmFjdG9yeSApOwoKCX0gZWxzZSBpZiAoIHR5cGVvZiBleHBvcnRzID09PSAib2JqZWN0IiApIHsKCgkJLy8gTm9kZS9Db21tb25KUwoJCWZhY3RvcnkoIHJlcXVpcmUoICJqcXVlcnkiICkgKTsKCgl9IGVsc2UgewoKCQkvLyBCcm93c2VyIGdsb2JhbHMKCQlmYWN0b3J5KCBqUXVlcnkgKTsKCX0KfShmdW5jdGlvbiggJCApIHsKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS40CiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2pRdWVyeS53aWRnZXQvCiAqLwoKCnZhciB3aWRnZXRfdXVpZCA9IDAsCgl3aWRnZXRfc2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgokLmNsZWFuRGF0YSA9IChmdW5jdGlvbiggb3JpZyApIHsKCXJldHVybiBmdW5jdGlvbiggZWxlbXMgKSB7CgkJdmFyIGV2ZW50cywgZWxlbSwgaTsKCQlmb3IgKCBpID0gMDsgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkgewoJCQl0cnkgewoKCQkJCS8vIE9ubHkgdHJpZ2dlciByZW1vdmUgd2hlbiBuZWNlc3NhcnkgdG8gc2F2ZSB0aW1lCgkJCQlldmVudHMgPSAkLl9kYXRhKCBlbGVtLCAiZXZlbnRzIiApOwoJCQkJaWYgKCBldmVudHMgJiYgZXZlbnRzLnJlbW92ZSApIHsKCQkJCQkkKCBlbGVtICkudHJpZ2dlckhhbmRsZXIoICJyZW1vdmUiICk7CgkJCQl9CgoJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC84MjM1CgkJCX0gY2F0Y2ggKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoKCQkJLy8gQWxsb3cgbXVsdGlwbGUgaGFzaGVzIHRvIGJlIHBhc3NlZCBvbiBpbml0CgkJCWlmICggYXJncy5sZW5ndGggKSB7CgkJCQlvcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kLmFwcGx5KCBudWxsLCBbIG9wdGlvbnMgXS5jb25jYXQoYXJncykgKTsKCQkJfQoKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIGluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBpbnN0YW5jZSApIHsKCQkJCQlpbnN0YW5jZS5vcHRpb24oIG9wdGlvbnMgfHwge30gKTsKCQkJCQlpZiAoIGluc3RhbmNlLl9pbml0ICkgewoJCQkJCQlpbnN0YW5jZS5faW5pdCgpOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSwgbmV3IG9iamVjdCggb3B0aW9ucywgdGhpcyApICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJcmV0dXJuIHJldHVyblZhbHVlOwoJfTsKfTsKCiQuV2lkZ2V0ID0gZnVuY3Rpb24oIC8qIG9wdGlvbnMsIGVsZW1lbnQgKi8gKSB7fTsKJC5XaWRnZXQuX2NoaWxkQ29uc3RydWN0b3JzID0gW107CgokLldpZGdldC5wcm90b3R5cGUgPSB7Cgl3aWRnZXROYW1lOiAid2lkZ2V0IiwKCXdpZGdldEV2ZW50UHJlZml4OiAiIiwKCWRlZmF1bHRFbGVtZW50OiAiPGRpdj4iLAoJb3B0aW9uczogewoJCWRpc2FibGVkOiBmYWxzZSwKCgkJLy8gY2FsbGJhY2tzCgkJY3JlYXRlOiBudWxsCgl9LAoJX2NyZWF0ZVdpZGdldDogZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJZWxlbWVudCA9ICQoIGVsZW1lbnQgfHwgdGhpcy5kZWZhdWx0RWxlbWVudCB8fCB0aGlzIClbIDAgXTsKCQl0aGlzLmVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJdGhpcy51dWlkID0gd2lkZ2V0X3V1aWQrKzsKCQl0aGlzLmV2ZW50TmFtZXNwYWNlID0gIi4iICsgdGhpcy53aWRnZXROYW1lICsgdGhpcy51dWlkOwoKCQl0aGlzLmJpbmRpbmdzID0gJCgpOwoJCXRoaXMuaG92ZXJhYmxlID0gJCgpOwoJCXRoaXMuZm9jdXNhYmxlID0gJCgpOwoKCQlpZiAoIGVsZW1lbnQgIT09IHRoaXMgKSB7CgkJCSQuZGF0YSggZWxlbWVudCwgdGhpcy53aWRnZXRGdWxsTmFtZSwgdGhpcyApOwoJCQl0aGlzLl9vbiggdHJ1ZSwgdGhpcy5lbGVtZW50LCB7CgkJCQlyZW1vdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQlpZiAoIGV2ZW50LnRhcmdldCA9PT0gZWxlbWVudCApIHsKCQkJCQkJdGhpcy5kZXN0cm95KCk7CgkJCQkJfQoJCQkJfQoJCQl9KTsKCQkJdGhpcy5kb2N1bWVudCA9ICQoIGVsZW1lbnQuc3R5bGUgPwoJCQkJLy8gZWxlbWVudCB3aXRoaW4gdGhlIGRvY3VtZW50CgkJCQllbGVtZW50Lm93bmVyRG9jdW1lbnQgOgoJCQkJLy8gZWxlbWVudCBpcyB3aW5kb3cgb3IgZG9jdW1lbnQKCQkJCWVsZW1lbnQuZG9jdW1lbnQgfHwgZWxlbWVudCApOwoJCQl0aGlzLndpbmRvdyA9ICQoIHRoaXMuZG9jdW1lbnRbMF0uZGVmYXVsdFZpZXcgfHwgdGhpcy5kb2N1bWVudFswXS5wYXJlbnRXaW5kb3cgKTsKCQl9CgoJCXRoaXMub3B0aW9ucyA9ICQud2lkZ2V0LmV4dGVuZCgge30sCgkJCXRoaXMub3B0aW9ucywKCQkJdGhpcy5fZ2V0Q3JlYXRlT3B0aW9ucygpLAoJCQlvcHRpb25zICk7CgoJCXRoaXMuX2NyZWF0ZSgpOwoJCXRoaXMuX3RyaWdnZXIoICJjcmVhdGUiLCBudWxsLCB0aGlzLl9nZXRDcmVhdGVFdmVudERhdGEoKSApOwoJCXRoaXMuX2luaXQoKTsKCX0sCglfZ2V0Q3JlYXRlT3B0aW9uczogJC5ub29wLAoJX2dldENyZWF0ZUV2ZW50RGF0YTogJC5ub29wLAoJX2NyZWF0ZTogJC5ub29wLAoJX2luaXQ6ICQubm9vcCwKCglkZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLl9kZXN0cm95KCk7CgkJLy8gd2UgY2FuIHByb2JhYmx5IHJlbW92ZSB0aGUgdW5iaW5kIGNhbGxzIGluIDIuMAoJCS8vIGFsbCBldmVudCBiaW5kaW5ncyBzaG91bGQgZ28gdGhyb3VnaCB0aGlzLl9vbigpCgkJdGhpcy5lbGVtZW50CgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlRGF0YSggdGhpcy53aWRnZXRGdWxsTmFtZSApCgkJCS8vIHN1cHBvcnQ6IGpxdWVyeSA8MS42LjMKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvOTQxMwoJCQkucmVtb3ZlRGF0YSggJC5jYW1lbENhc2UoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKSApOwoJCXRoaXMud2lkZ2V0KCkKCQkJLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlQ2xhc3MoCgkJCQl0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCAiICsKCQkJCSJ1aS1zdGF0ZS1kaXNhYmxlZCIgKTsKCgkJLy8gY2xlYW4gdXAgZXZlbnRzIGFuZCBzdGF0ZXMKCQl0aGlzLmJpbmRpbmdzLnVuYmluZCggdGhpcy5ldmVudE5hbWVzcGFjZSApOwoJCXRoaXMuaG92ZXJhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCX0sCglfZGVzdHJveTogJC5ub29wLAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZWxlbWVudDsKCX0sCgoJb3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl2YXIgb3B0aW9ucyA9IGtleSwKCQkJcGFydHMsCgkJCWN1ck9wdGlvbiwKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAwICkgewoJCQkvLyBkb24ndCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGludGVybmFsIGhhc2gKCQkJcmV0dXJuICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApOwoJCX0KCgkJaWYgKCB0eXBlb2Yga2V5ID09PSAic3RyaW5nIiApIHsKCQkJLy8gaGFuZGxlIG5lc3RlZCBrZXlzLCBlLmcuLCAiZm9vLmJhciIgPT4geyBmb286IHsgYmFyOiBfX18gfSB9CgkJCW9wdGlvbnMgPSB7fTsKCQkJcGFydHMgPSBrZXkuc3BsaXQoICIuIiApOwoJCQlrZXkgPSBwYXJ0cy5zaGlmdCgpOwoJCQlpZiAoIHBhcnRzLmxlbmd0aCApIHsKCQkJCWN1ck9wdGlvbiA9IG9wdGlvbnNbIGtleSBdID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwgdGhpcy5vcHRpb25zWyBrZXkgXSApOwoJCQkJZm9yICggaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKysgKSB7CgkJCQkJY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXSB8fCB7fTsKCQkJCQljdXJPcHRpb24gPSBjdXJPcHRpb25bIHBhcnRzWyBpIF0gXTsKCQkJCX0KCQkJCWtleSA9IHBhcnRzLnBvcCgpOwoJCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoID09PSAxICkgewoJCQkJCXJldHVybiBjdXJPcHRpb25bIGtleSBdID09PSB1bmRlZmluZWQgPyBudWxsIDogY3VyT3B0aW9uWyBrZXkgXTsKCQkJCX0KCQkJCWN1ck9wdGlvblsga2V5IF0gPSB2YWx1ZTsKCQkJfSBlbHNlIHsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gdGhpcy5vcHRpb25zWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMub3B0aW9uc1sga2V5IF07CgkJCQl9CgkJCQlvcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQl9CgkJfQoKCQl0aGlzLl9zZXRPcHRpb25zKCBvcHRpb25zICk7CgoJCXJldHVybiB0aGlzOwoJfSwKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIga2V5OwoKCQlmb3IgKCBrZXkgaW4gb3B0aW9ucyApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCBrZXksIG9wdGlvbnNbIGtleSBdICk7CgkJfQoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpCgkJCQkudG9nZ2xlQ2xhc3MoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKyAiLWRpc2FibGVkIiwgISF2YWx1ZSApOwoKCQkJLy8gSWYgdGhlIHdpZGdldCBpcyBiZWNvbWluZyBkaXNhYmxlZCwgdGhlbiBub3RoaW5nIGlzIGludGVyYWN0aXZlCgkJCWlmICggdmFsdWUgKSB7CgkJCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQkJdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCWVuYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogZmFsc2UgfSk7Cgl9LAoJZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuX3NldE9wdGlvbnMoeyBkaXNhYmxlZDogdHJ1ZSB9KTsKCX0sCgoJX29uOiBmdW5jdGlvbiggc3VwcHJlc3NEaXNhYmxlZENoZWNrLCBlbGVtZW50LCBoYW5kbGVycyApIHsKCQl2YXIgZGVsZWdhdGVFbGVtZW50LAoJCQlpbnN0YW5jZSA9IHRoaXM7CgoJCS8vIG5vIHN1cHByZXNzRGlzYWJsZWRDaGVjayBmbGFnLCBzaHVmZmxlIGFyZ3VtZW50cwoJCWlmICggdHlwZW9mIHN1cHByZXNzRGlzYWJsZWRDaGVjayAhPT0gImJvb2xlYW4iICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSBzdXBwcmVzc0Rpc2FibGVkQ2hlY2s7CgkJCXN1cHByZXNzRGlzYWJsZWRDaGVjayA9IGZhbHNlOwoJCX0KCgkJLy8gbm8gZWxlbWVudCBhcmd1bWVudCwgc2h1ZmZsZSBhbmQgdXNlIHRoaXMuZWxlbWVudAoJCWlmICggIWhhbmRsZXJzICkgewoJCQloYW5kbGVycyA9IGVsZW1lbnQ7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgkJCWRlbGVnYXRlRWxlbWVudCA9IHRoaXMud2lkZ2V0KCk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudCA9IGRlbGVnYXRlRWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQkJdGhpcy5iaW5kaW5ncyA9IHRoaXMuYmluZGluZ3MuYWRkKCBlbGVtZW50ICk7CgkJfQoKCQkkLmVhY2goIGhhbmRsZXJzLCBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXIgKSB7CgkJCWZ1bmN0aW9uIGhhbmRsZXJQcm94eSgpIHsKCQkJCS8vIGFsbG93IHdpZGdldHMgdG8gY3VzdG9taXplIHRoZSBkaXNhYmxlZCBoYW5kbGluZwoJCQkJLy8gLSBkaXNhYmxlZCBhcyBhbiBhcnJheSBpbnN0ZWFkIG9mIGJvb2xlYW4KCQkJCS8vIC0gZGlzYWJsZWQgY2xhc3MgYXMgbWV0aG9kIGZvciBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYXJ0cwoJCQkJaWYgKCAhc3VwcHJlc3NEaXNhYmxlZENoZWNrICYmCgkJCQkJCSggaW5zdGFuY2Uub3B0aW9ucy5kaXNhYmxlZCA9PT0gdHJ1ZSB8fAoJCQkJCQkJJCggdGhpcyApLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkJLmFwcGx5KCBpbnN0YW5jZSwgYXJndW1lbnRzICk7CgkJCX0KCgkJCS8vIGNvcHkgdGhlIGd1aWQgc28gZGlyZWN0IHVuYmluZGluZyB3b3JrcwoJCQlpZiAoIHR5cGVvZiBoYW5kbGVyICE9PSAic3RyaW5nIiApIHsKCQkJCWhhbmRsZXJQcm94eS5ndWlkID0gaGFuZGxlci5ndWlkID0KCQkJCQloYW5kbGVyLmd1aWQgfHwgaGFuZGxlclByb3h5Lmd1aWQgfHwgJC5ndWlkKys7CgkJCX0KCgkJCXZhciBtYXRjaCA9IGV2ZW50Lm1hdGNoKCAvXihbXHc6LV0qKVxzKiguKikkLyApLAoJCQkJZXZlbnROYW1lID0gbWF0Y2hbMV0gKyBpbnN0YW5jZS5ldmVudE5hbWVzcGFjZSwKCQkJCXNlbGVjdG9yID0gbWF0Y2hbMl07CgkJCWlmICggc2VsZWN0b3IgKSB7CgkJCQlkZWxlZ2F0ZUVsZW1lbnQuZGVsZWdhdGUoIHNlbGVjdG9yLCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9IGVsc2UgewoJCQkJZWxlbWVudC5iaW5kKCBldmVudE5hbWUsIGhhbmRsZXJQcm94eSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9vZmY6IGZ1bmN0aW9uKCBlbGVtZW50LCBldmVudE5hbWUgKSB7CgkJZXZlbnROYW1lID0gKGV2ZW50TmFtZSB8fCAiIikuc3BsaXQoICIgIiApLmpvaW4oIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiICIgKSArCgkJCXRoaXMuZXZlbnROYW1lc3BhY2U7CgkJZWxlbWVudC51bmJpbmQoIGV2ZW50TmFtZSApLnVuZGVsZWdhdGUoIGV2ZW50TmFtZSApOwoKCQkvLyBDbGVhciB0aGUgc3RhY2sgdG8gYXZvaWQgbWVtb3J5IGxlYWtzICgjMTAwNTYpCgkJdGhpcy5iaW5kaW5ncyA9ICQoIHRoaXMuYmluZGluZ3Mubm90KCBlbGVtZW50ICkuZ2V0KCkgKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoIHRoaXMuZm9jdXNhYmxlLm5vdCggZWxlbWVudCApLmdldCgpICk7CgkJdGhpcy5ob3ZlcmFibGUgPSAkKCB0aGlzLmhvdmVyYWJsZS5ub3QoIGVsZW1lbnQgKS5nZXQoKSApOwoJfSwKCglfZGVsYXk6IGZ1bmN0aW9uKCBoYW5kbGVyLCBkZWxheSApIHsKCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCXJldHVybiAoIHR5cGVvZiBoYW5kbGVyID09PSAic3RyaW5nIiA/IGluc3RhbmNlWyBoYW5kbGVyIF0gOiBoYW5kbGVyICkKCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCX0KCQl2YXIgaW5zdGFuY2UgPSB0aGlzOwoJCXJldHVybiBzZXRUaW1lb3V0KCBoYW5kbGVyUHJveHksIGRlbGF5IHx8IDAgKTsKCX0sCgoJX2hvdmVyYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5ob3ZlcmFibGUgPSB0aGlzLmhvdmVyYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQltb3VzZWVudGVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJfSwKCQkJbW91c2VsZWF2ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2ZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdGhpcy5mb2N1c2FibGUgPSB0aGlzLmZvY3VzYWJsZS5hZGQoIGVsZW1lbnQgKTsKCQl0aGlzLl9vbiggZWxlbWVudCwgewoJCQlmb2N1c2luOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJZm9jdXNvdXQ6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGRhdGEgKSB7CgkJdmFyIHByb3AsIG9yaWcsCgkJCWNhbGxiYWNrID0gdGhpcy5vcHRpb25zWyB0eXBlIF07CgoJCWRhdGEgPSBkYXRhIHx8IHt9OwoJCWV2ZW50ID0gJC5FdmVudCggZXZlbnQgKTsKCQlldmVudC50eXBlID0gKCB0eXBlID09PSB0aGlzLndpZGdldEV2ZW50UHJlZml4ID8KCQkJdHlwZSA6CgkJCXRoaXMud2lkZ2V0RXZlbnRQcmVmaXggKyB0eXBlICkudG9Mb3dlckNhc2UoKTsKCQkvLyB0aGUgb3JpZ2luYWwgZXZlbnQgbWF5IGNvbWUgZnJvbSBhbnkgZWxlbWVudAoJCS8vIHNvIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRhcmdldCBvbiB0aGUgbmV3IGV2ZW50CgkJZXZlbnQudGFyZ2V0ID0gdGhpcy5lbGVtZW50WyAwIF07CgoJCS8vIGNvcHkgb3JpZ2luYWwgZXZlbnQgcHJvcGVydGllcyBvdmVyIHRvIHRoZSBuZXcgZXZlbnQKCQlvcmlnID0gZXZlbnQub3JpZ2luYWxFdmVudDsKCQlpZiAoIG9yaWcgKSB7CgkJCWZvciAoIHByb3AgaW4gb3JpZyApIHsKCQkJCWlmICggISggcHJvcCBpbiBldmVudCApICkgewoJCQkJCWV2ZW50WyBwcm9wIF0gPSBvcmlnWyBwcm9wIF07CgkJCQl9CgkJCX0KCQl9CgoJCXRoaXMuZWxlbWVudC50cmlnZ2VyKCBldmVudCwgZGF0YSApOwoJCXJldHVybiAhKCAkLmlzRnVuY3Rpb24oIGNhbGxiYWNrICkgJiYKCQkJY2FsbGJhY2suYXBwbHkoIHRoaXMuZWxlbWVudFswXSwgWyBldmVudCBdLmNvbmNhdCggZGF0YSApICkgPT09IGZhbHNlIHx8CgkJCWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICk7Cgl9Cn07CgokLmVhY2goIHsgc2hvdzogImZhZGVJbiIsIGhpZGU6ICJmYWRlT3V0IiB9LCBmdW5jdGlvbiggbWV0aG9kLCBkZWZhdWx0RWZmZWN0ICkgewoJJC5XaWRnZXQucHJvdG90eXBlWyAiXyIgKyBtZXRob2QgXSA9IGZ1bmN0aW9uKCBlbGVtZW50LCBvcHRpb25zLCBjYWxsYmFjayApIHsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiApIHsKCQkJb3B0aW9ucyA9IHsgZWZmZWN0OiBvcHRpb25zIH07CgkJfQoJCXZhciBoYXNPcHRpb25zLAoJCQllZmZlY3ROYW1lID0gIW9wdGlvbnMgPwoJCQkJbWV0aG9kIDoKCQkJCW9wdGlvbnMgPT09IHRydWUgfHwgdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiID8KCQkJCQlkZWZhdWx0RWZmZWN0IDoKCQkJCQlvcHRpb25zLmVmZmVjdCB8fCBkZWZhdWx0RWZmZWN0OwoJCW9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlvcHRpb25zID0geyBkdXJhdGlvbjogb3B0aW9ucyB9OwoJCX0KCQloYXNPcHRpb25zID0gISQuaXNFbXB0eU9iamVjdCggb3B0aW9ucyApOwoJCW9wdGlvbnMuY29tcGxldGUgPSBjYWxsYmFjazsKCQlpZiAoIG9wdGlvbnMuZGVsYXkgKSB7CgkJCWVsZW1lbnQuZGVsYXkoIG9wdGlvbnMuZGVsYXkgKTsKCQl9CgkJaWYgKCBoYXNPcHRpb25zICYmICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIG1ldGhvZCBdKCBvcHRpb25zICk7CgkJfSBlbHNlIGlmICggZWZmZWN0TmFtZSAhPT0gbWV0aG9kICYmIGVsZW1lbnRbIGVmZmVjdE5hbWUgXSApIHsKCQkJZWxlbWVudFsgZWZmZWN0TmFtZSBdKCBvcHRpb25zLmR1cmF0aW9uLCBvcHRpb25zLmVhc2luZywgY2FsbGJhY2sgKTsKCQl9IGVsc2UgewoJCQllbGVtZW50LnF1ZXVlKGZ1bmN0aW9uKCBuZXh0ICkgewoJCQkJJCggdGhpcyApWyBtZXRob2QgXSgpOwoJCQkJaWYgKCBjYWxsYmFjayApIHsKCQkJCQljYWxsYmFjay5jYWxsKCBlbGVtZW50WyAwIF0gKTsKCQkJCX0KCQkJCW5leHQoKTsKCQkJfSk7CgkJfQoJfTsKfSk7Cgp2YXIgd2lkZ2V0ID0gJC53aWRnZXQ7CgoKCn0pKTsK]]></data>
	</file>
	<file>
	  <filename>/lib/form.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/form.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmZvcm0uanMnOwokaW5mb1snZGVwZW5kcyddID0gJ2pxdWVyeSc7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/form.lib/jquery.form.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohCiAqIGpRdWVyeSBGb3JtIFBsdWdpbgogKiB2ZXJzaW9uOiAzLjIzICgxMS1ERUMtMjAxMikKICogQHJlcXVpcmVzIGpRdWVyeSB2MS41IG9yIGxhdGVyCiAqCiAqIEV4YW1wbGVzIGFuZCBkb2N1bWVudGF0aW9uIGF0OiBodHRwOi8vbWFsc3VwLmNvbS9qcXVlcnkvZm9ybS8KICogUHJvamVjdCByZXBvc2l0b3J5OiBodHRwczovL2dpdGh1Yi5jb20vbWFsc3VwL2Zvcm0KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6CiAqICAgIGh0dHA6Ly9tYWxzdXAuZ2l0aHViLmNvbS9taXQtbGljZW5zZS50eHQKICogICAgaHR0cDovL21hbHN1cC5naXRodWIuY29tL2dwbC1saWNlbnNlLXYyLnR4dAogKi8KLypnbG9iYWwgQWN0aXZlWE9iamVjdCBhbGVydCAqLwo7KGZ1bmN0aW9uKCQpIHsKInVzZSBzdHJpY3QiOwoKLyoKICAgIFVzYWdlIE5vdGU6CiAgICAtLS0tLS0tLS0tLQogICAgRG8gbm90IHVzZSBib3RoIGFqYXhTdWJtaXQgYW5kIGFqYXhGb3JtIG9uIHRoZSBzYW1lIGZvcm0uICBUaGVzZQogICAgZnVuY3Rpb25zIGFyZSBtdXR1YWxseSBleGNsdXNpdmUuICBVc2UgYWpheFN1Ym1pdCBpZiB5b3Ugd2FudAogICAgdG8gYmluZCB5b3VyIG93biBzdWJtaXQgaGFuZGxlciB0byB0aGUgZm9ybS4gIEZvciBleGFtcGxlLAoKICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgICAgICQoJyNteUZvcm0nKS5vbignc3VibWl0JywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIDwtLSBpbXBvcnRhbnQKICAgICAgICAgICAgJCh0aGlzKS5hamF4U3VibWl0KHsKICAgICAgICAgICAgICAgIHRhcmdldDogJyNvdXRwdXQnCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfSk7CgogICAgVXNlIGFqYXhGb3JtIHdoZW4geW91IHdhbnQgdGhlIHBsdWdpbiB0byBtYW5hZ2UgYWxsIHRoZSBldmVudCBiaW5kaW5nCiAgICBmb3IgeW91LiAgRm9yIGV4YW1wbGUsCgogICAgJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CiAgICAgICAgJCgnI215Rm9ybScpLmFqYXhGb3JtKHsKICAgICAgICAgICAgdGFyZ2V0OiAnI291dHB1dCcKICAgICAgICB9KTsKICAgIH0pOwogICAgCiAgICBZb3UgY2FuIGFsc28gdXNlIGFqYXhGb3JtIHdpdGggZGVsZWdhdGlvbiAocmVxdWlyZXMgalF1ZXJ5IHYxLjcrKSwgc28gdGhlCiAgICBmb3JtIGRvZXMgbm90IGhhdmUgdG8gZXhpc3Qgd2hlbiB5b3UgaW52b2tlIGFqYXhGb3JtOgoKICAgICQoJyNteUZvcm0nKS5hamF4Rm9ybSh7CiAgICAgICAgZGVsZWdhdGlvbjogdHJ1ZSwKICAgICAgICB0YXJnZXQ6ICcjb3V0cHV0JwogICAgfSk7CiAgICAKICAgIFdoZW4gdXNpbmcgYWpheEZvcm0sIHRoZSBhamF4U3VibWl0IGZ1bmN0aW9uIHdpbGwgYmUgaW52b2tlZCBmb3IgeW91CiAgICBhdCB0aGUgYXBwcm9wcmlhdGUgdGltZS4KKi8KCi8qKgogKiBGZWF0dXJlIGRldGVjdGlvbgogKi8KdmFyIGZlYXR1cmUgPSB7fTsKZmVhdHVyZS5maWxlYXBpID0gJCgiPGlucHV0IHR5cGU9J2ZpbGUnLz4iKS5nZXQoMCkuZmlsZXMgIT09IHVuZGVmaW5lZDsKZmVhdHVyZS5mb3JtZGF0YSA9IHdpbmRvdy5Gb3JtRGF0YSAhPT0gdW5kZWZpbmVkOwoKLyoqCiAqIGFqYXhTdWJtaXQoKSBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgaW1tZWRpYXRlbHkgc3VibWl0dGluZwogKiBhbiBIVE1MIGZvcm0gdXNpbmcgQUpBWC4KICovCiQuZm4uYWpheFN1Ym1pdCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIC8qanNoaW50IHNjcmlwdHVybDp0cnVlICovCgogICAgLy8gZmFzdCBmYWlsIGlmIG5vdGhpbmcgc2VsZWN0ZWQgKGh0dHA6Ly9kZXYuanF1ZXJ5LmNvbS90aWNrZXQvMjc1MikKICAgIGlmICghdGhpcy5sZW5ndGgpIHsKICAgICAgICBsb2coJ2FqYXhTdWJtaXQ6IHNraXBwaW5nIHN1Ym1pdCBwcm9jZXNzIC0gbm8gZWxlbWVudCBzZWxlY3RlZCcpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQogICAgCiAgICB2YXIgbWV0aG9kLCBhY3Rpb24sIHVybCwgJGZvcm0gPSB0aGlzOwoKICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgb3B0aW9ucyA9IHsgc3VjY2Vzczogb3B0aW9ucyB9OwogICAgfQoKICAgIG1ldGhvZCA9IHRoaXMuYXR0cignbWV0aG9kJyk7CiAgICBhY3Rpb24gPSB0aGlzLmF0dHIoJ2FjdGlvbicpOwogICAgdXJsID0gKHR5cGVvZiBhY3Rpb24gPT09ICdzdHJpbmcnKSA/ICQudHJpbShhY3Rpb24pIDogJyc7CiAgICB1cmwgPSB1cmwgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYgfHwgJyc7CiAgICBpZiAodXJsKSB7CiAgICAgICAgLy8gY2xlYW4gdXJsIChkb24ndCBpbmNsdWRlIGhhc2ggdmF1ZSkKICAgICAgICB1cmwgPSAodXJsLm1hdGNoKC9eKFteI10rKS8pfHxbXSlbMV07CiAgICB9CgogICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHRydWUsIHsKICAgICAgICB1cmw6ICB1cmwsCiAgICAgICAgc3VjY2VzczogJC5hamF4U2V0dGluZ3Muc3VjY2VzcywKICAgICAgICB0eXBlOiBtZXRob2QgfHwgJ0dFVCcsCiAgICAgICAgaWZyYW1lU3JjOiAvXmh0dHBzL2kudGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZiB8fCAnJykgPyAnamF2YXNjcmlwdDpmYWxzZScgOiAnYWJvdXQ6YmxhbmsnCiAgICB9LCBvcHRpb25zKTsKCiAgICAvLyBob29rIGZvciBtYW5pcHVsYXRpbmcgdGhlIGZvcm0gZGF0YSBiZWZvcmUgaXQgaXMgZXh0cmFjdGVkOwogICAgLy8gY29udmVuaWVudCBmb3IgdXNlIHdpdGggcmljaCBlZGl0b3JzIGxpa2UgdGlueU1DRSBvciBGQ0tFZGl0b3IKICAgIHZhciB2ZXRvID0ge307CiAgICB0aGlzLnRyaWdnZXIoJ2Zvcm0tcHJlLXNlcmlhbGl6ZScsIFt0aGlzLCBvcHRpb25zLCB2ZXRvXSk7CiAgICBpZiAodmV0by52ZXRvKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgdmV0b2VkIHZpYSBmb3JtLXByZS1zZXJpYWxpemUgdHJpZ2dlcicpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIC8vIHByb3ZpZGUgb3Bwb3J0dW5pdHkgdG8gYWx0ZXIgZm9ybSBkYXRhIGJlZm9yZSBpdCBpcyBzZXJpYWxpemVkCiAgICBpZiAob3B0aW9ucy5iZWZvcmVTZXJpYWxpemUgJiYgb3B0aW9ucy5iZWZvcmVTZXJpYWxpemUodGhpcywgb3B0aW9ucykgPT09IGZhbHNlKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgYWJvcnRlZCB2aWEgYmVmb3JlU2VyaWFsaXplIGNhbGxiYWNrJyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIHRyYWRpdGlvbmFsID0gb3B0aW9ucy50cmFkaXRpb25hbDsKICAgIGlmICggdHJhZGl0aW9uYWwgPT09IHVuZGVmaW5lZCApIHsKICAgICAgICB0cmFkaXRpb25hbCA9ICQuYWpheFNldHRpbmdzLnRyYWRpdGlvbmFsOwogICAgfQogICAgCiAgICB2YXIgZWxlbWVudHMgPSBbXTsKICAgIHZhciBxeCwgYSA9IHRoaXMuZm9ybVRvQXJyYXkob3B0aW9ucy5zZW1hbnRpYywgZWxlbWVudHMpOwogICAgaWYgKG9wdGlvbnMuZGF0YSkgewogICAgICAgIG9wdGlvbnMuZXh0cmFEYXRhID0gb3B0aW9ucy5kYXRhOwogICAgICAgIHF4ID0gJC5wYXJhbShvcHRpb25zLmRhdGEsIHRyYWRpdGlvbmFsKTsKICAgIH0KCiAgICAvLyBnaXZlIHByZS1zdWJtaXQgY2FsbGJhY2sgYW4gb3Bwb3J0dW5pdHkgdG8gYWJvcnQgdGhlIHN1Ym1pdAogICAgaWYgKG9wdGlvbnMuYmVmb3JlU3VibWl0ICYmIG9wdGlvbnMuYmVmb3JlU3VibWl0KGEsIHRoaXMsIG9wdGlvbnMpID09PSBmYWxzZSkgewogICAgICAgIGxvZygnYWpheFN1Ym1pdDogc3VibWl0IGFib3J0ZWQgdmlhIGJlZm9yZVN1Ym1pdCBjYWxsYmFjaycpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIC8vIGZpcmUgdmV0b2FibGUgJ3ZhbGlkYXRlJyBldmVudAogICAgdGhpcy50cmlnZ2VyKCdmb3JtLXN1Ym1pdC12YWxpZGF0ZScsIFthLCB0aGlzLCBvcHRpb25zLCB2ZXRvXSk7CiAgICBpZiAodmV0by52ZXRvKSB7CiAgICAgICAgbG9nKCdhamF4U3VibWl0OiBzdWJtaXQgdmV0b2VkIHZpYSBmb3JtLXN1Ym1pdC12YWxpZGF0ZSB0cmlnZ2VyJyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIHEgPSAkLnBhcmFtKGEsIHRyYWRpdGlvbmFsKTsKICAgIGlmIChxeCkgewogICAgICAgIHEgPSAoIHEgPyAocSArICcmJyArIHF4KSA6IHF4ICk7CiAgICB9ICAgIAogICAgaWYgKG9wdGlvbnMudHlwZS50b1VwcGVyQ2FzZSgpID09ICdHRVQnKSB7CiAgICAgICAgb3B0aW9ucy51cmwgKz0gKG9wdGlvbnMudXJsLmluZGV4T2YoJz8nKSA+PSAwID8gJyYnIDogJz8nKSArIHE7CiAgICAgICAgb3B0aW9ucy5kYXRhID0gbnVsbDsgIC8vIGRhdGEgaXMgbnVsbCBmb3IgJ2dldCcKICAgIH0KICAgIGVsc2UgewogICAgICAgIG9wdGlvbnMuZGF0YSA9IHE7IC8vIGRhdGEgaXMgdGhlIHF1ZXJ5IHN0cmluZyBmb3IgJ3Bvc3QnCiAgICB9CgogICAgdmFyIGNhbGxiYWNrcyA9IFtdOwogICAgaWYgKG9wdGlvbnMucmVzZXRGb3JtKSB7CiAgICAgICAgY2FsbGJhY2tzLnB1c2goZnVuY3Rpb24oKSB7ICRmb3JtLnJlc2V0Rm9ybSgpOyB9KTsKICAgIH0KICAgIGlmIChvcHRpb25zLmNsZWFyRm9ybSkgewogICAgICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKCkgeyAkZm9ybS5jbGVhckZvcm0ob3B0aW9ucy5pbmNsdWRlSGlkZGVuKTsgfSk7CiAgICB9CgogICAgLy8gcGVyZm9ybSBhIGxvYWQgb24gdGhlIHRhcmdldCBvbmx5IGlmIGRhdGFUeXBlIGlzIG5vdCBwcm92aWRlZAogICAgaWYgKCFvcHRpb25zLmRhdGFUeXBlICYmIG9wdGlvbnMudGFyZ2V0KSB7CiAgICAgICAgdmFyIG9sZFN1Y2Nlc3MgPSBvcHRpb25zLnN1Y2Nlc3MgfHwgZnVuY3Rpb24oKXt9OwogICAgICAgIGNhbGxiYWNrcy5wdXNoKGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICAgICAgdmFyIGZuID0gb3B0aW9ucy5yZXBsYWNlVGFyZ2V0ID8gJ3JlcGxhY2VXaXRoJyA6ICdodG1sJzsKICAgICAgICAgICAgJChvcHRpb25zLnRhcmdldClbZm5dKGRhdGEpLmVhY2gob2xkU3VjY2VzcywgYXJndW1lbnRzKTsKICAgICAgICB9KTsKICAgIH0KICAgIGVsc2UgaWYgKG9wdGlvbnMuc3VjY2VzcykgewogICAgICAgIGNhbGxiYWNrcy5wdXNoKG9wdGlvbnMuc3VjY2Vzcyk7CiAgICB9CgogICAgb3B0aW9ucy5zdWNjZXNzID0gZnVuY3Rpb24oZGF0YSwgc3RhdHVzLCB4aHIpIHsgLy8galF1ZXJ5IDEuNCsgcGFzc2VzIHhociBhcyAzcmQgYXJnCiAgICAgICAgdmFyIGNvbnRleHQgPSBvcHRpb25zLmNvbnRleHQgfHwgdGhpcyA7ICAgIC8vIGpRdWVyeSAxLjQrIHN1cHBvcnRzIHNjb3BlIGNvbnRleHQgCiAgICAgICAgZm9yICh2YXIgaT0wLCBtYXg9Y2FsbGJhY2tzLmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAgICAgICAgICAgIGNhbGxiYWNrc1tpXS5hcHBseShjb250ZXh0LCBbZGF0YSwgc3RhdHVzLCB4aHIgfHwgJGZvcm0sICRmb3JtXSk7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyBhcmUgdGhlcmUgZmlsZXMgdG8gdXBsb2FkPwoKICAgIC8vIFt2YWx1ZV0gKGlzc3VlICMxMTMpLCBhbHNvIHNlZSBjb21tZW50OgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21hbHN1cC9mb3JtL2NvbW1pdC81ODgzMDZhZWRiYTFkZTAxMzg4MDMyZDVmNDJhNjAxNTllZWE5MjI4I2NvbW1pdGNvbW1lbnQtMjE4MDIxOQogICAgdmFyIGZpbGVJbnB1dHMgPSAkKCdpbnB1dFt0eXBlPWZpbGVdOmVuYWJsZWRbdmFsdWUhPSIiXScsIHRoaXMpOyAKCiAgICB2YXIgaGFzRmlsZUlucHV0cyA9IGZpbGVJbnB1dHMubGVuZ3RoID4gMDsKICAgIHZhciBtcCA9ICdtdWx0aXBhcnQvZm9ybS1kYXRhJzsKICAgIHZhciBtdWx0aXBhcnQgPSAoJGZvcm0uYXR0cignZW5jdHlwZScpID09IG1wIHx8ICRmb3JtLmF0dHIoJ2VuY29kaW5nJykgPT0gbXApOwoKICAgIHZhciBmaWxlQVBJID0gZmVhdHVyZS5maWxlYXBpICYmIGZlYXR1cmUuZm9ybWRhdGE7CiAgICBsb2coImZpbGVBUEkgOiIgKyBmaWxlQVBJKTsKICAgIHZhciBzaG91bGRVc2VGcmFtZSA9IChoYXNGaWxlSW5wdXRzIHx8IG11bHRpcGFydCkgJiYgIWZpbGVBUEk7CgogICAgdmFyIGpxeGhyOwoKICAgIC8vIG9wdGlvbnMuaWZyYW1lIGFsbG93cyB1c2VyIHRvIGZvcmNlIGlmcmFtZSBtb2RlCiAgICAvLyAwNi1OT1YtMDk6IG5vdyBkZWZhdWx0aW5nIHRvIGlmcmFtZSBtb2RlIGlmIGZpbGUgaW5wdXQgaXMgZGV0ZWN0ZWQKICAgIGlmIChvcHRpb25zLmlmcmFtZSAhPT0gZmFsc2UgJiYgKG9wdGlvbnMuaWZyYW1lIHx8IHNob3VsZFVzZUZyYW1lKSkgewogICAgICAgIC8vIGhhY2sgdG8gZml4IFNhZmFyaSBoYW5nICh0aGFua3MgdG8gVGltIE1vbGVuZGlqayBmb3IgdGhpcykKICAgICAgICAvLyBzZWU6ICBodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvanF1ZXJ5LWRldi9icm93c2VfdGhyZWFkL3RocmVhZC8zNjM5NWI3YWI1MTBkZDVkCiAgICAgICAgaWYgKG9wdGlvbnMuY2xvc2VLZWVwQWxpdmUpIHsKICAgICAgICAgICAgJC5nZXQob3B0aW9ucy5jbG9zZUtlZXBBbGl2ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBqcXhociA9IGZpbGVVcGxvYWRJZnJhbWUoYSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAganF4aHIgPSBmaWxlVXBsb2FkSWZyYW1lKGEpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKChoYXNGaWxlSW5wdXRzIHx8IG11bHRpcGFydCkgJiYgZmlsZUFQSSkgewogICAgICAgIGpxeGhyID0gZmlsZVVwbG9hZFhocihhKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIGpxeGhyID0gJC5hamF4KG9wdGlvbnMpOwogICAgfQoKICAgICRmb3JtLnJlbW92ZURhdGEoJ2pxeGhyJykuZGF0YSgnanF4aHInLCBqcXhocik7CgogICAgLy8gY2xlYXIgZWxlbWVudCBhcnJheQogICAgZm9yICh2YXIgaz0wOyBrIDwgZWxlbWVudHMubGVuZ3RoOyBrKyspCiAgICAgICAgZWxlbWVudHNba10gPSBudWxsOwoKICAgIC8vIGZpcmUgJ25vdGlmeScgZXZlbnQKICAgIHRoaXMudHJpZ2dlcignZm9ybS1zdWJtaXQtbm90aWZ5JywgW3RoaXMsIG9wdGlvbnNdKTsKICAgIHJldHVybiB0aGlzOwoKICAgIC8vIHV0aWxpdHkgZm4gZm9yIGRlZXAgc2VyaWFsaXphdGlvbgogICAgZnVuY3Rpb24gZGVlcFNlcmlhbGl6ZShleHRyYURhdGEpewogICAgICAgIHZhciBzZXJpYWxpemVkID0gJC5wYXJhbShleHRyYURhdGEpLnNwbGl0KCcmJyk7CiAgICAgICAgdmFyIGxlbiA9IHNlcmlhbGl6ZWQubGVuZ3RoOwogICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICB2YXIgaSwgcGFydDsKICAgICAgICBmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIC8vICMyNTI7IHVuZG8gcGFyYW0gc3BhY2UgcmVwbGFjZW1lbnQKICAgICAgICAgICAgc2VyaWFsaXplZFtpXSA9IHNlcmlhbGl6ZWRbaV0ucmVwbGFjZSgvXCsvZywnICcpOwogICAgICAgICAgICBwYXJ0ID0gc2VyaWFsaXplZFtpXS5zcGxpdCgnPScpOwogICAgICAgICAgICByZXN1bHRbZGVjb2RlVVJJQ29tcG9uZW50KHBhcnRbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChwYXJ0WzFdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAgLy8gWE1MSHR0cFJlcXVlc3QgTGV2ZWwgMiBmaWxlIHVwbG9hZHMgKGJpZyBoYXQgdGlwIHRvIGZyYW5jb2lzMm1ldHopCiAgICBmdW5jdGlvbiBmaWxlVXBsb2FkWGhyKGEpIHsKICAgICAgICB2YXIgZm9ybWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKCiAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgYS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBmb3JtZGF0YS5hcHBlbmQoYVtpXS5uYW1lLCBhW2ldLnZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGlmIChvcHRpb25zLmV4dHJhRGF0YSkgewogICAgICAgICAgICB2YXIgc2VyaWFsaXplZERhdGEgPSBkZWVwU2VyaWFsaXplKG9wdGlvbnMuZXh0cmFEYXRhKTsKICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzZXJpYWxpemVkRGF0YSkKICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkRGF0YS5oYXNPd25Qcm9wZXJ0eShwKSkKICAgICAgICAgICAgICAgICAgICBmb3JtZGF0YS5hcHBlbmQocCwgc2VyaWFsaXplZERhdGFbcF0pOwogICAgICAgIH0KCiAgICAgICAgb3B0aW9ucy5kYXRhID0gbnVsbDsKCiAgICAgICAgdmFyIHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5hamF4U2V0dGluZ3MsIG9wdGlvbnMsIHsKICAgICAgICAgICAgY29udGVudFR5cGU6IGZhbHNlLAogICAgICAgICAgICBwcm9jZXNzRGF0YTogZmFsc2UsCiAgICAgICAgICAgIGNhY2hlOiBmYWxzZSwKICAgICAgICAgICAgdHlwZTogbWV0aG9kIHx8ICdQT1NUJwogICAgICAgIH0pOwogICAgICAgIAogICAgICAgIGlmIChvcHRpb25zLnVwbG9hZFByb2dyZXNzKSB7CiAgICAgICAgICAgIC8vIHdvcmthcm91bmQgYmVjYXVzZSBqcVhIUiBkb2VzIG5vdCBleHBvc2UgdXBsb2FkIHByb3BlcnR5CiAgICAgICAgICAgIHMueGhyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgeGhyID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIoKTsKICAgICAgICAgICAgICAgIGlmICh4aHIudXBsb2FkKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyLnVwbG9hZC5vbnByb2dyZXNzID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBlcmNlbnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBldmVudC5sb2FkZWQgfHwgZXZlbnQucG9zaXRpb247IC8qZXZlbnQucG9zaXRpb24gaXMgZGVwcmVjYXRlZCovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0b3RhbCA9IGV2ZW50LnRvdGFsOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQubGVuZ3RoQ29tcHV0YWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IE1hdGguY2VpbChwb3NpdGlvbiAvIHRvdGFsICogMTAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnVwbG9hZFByb2dyZXNzKGV2ZW50LCBwb3NpdGlvbiwgdG90YWwsIHBlcmNlbnQpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4geGhyOwogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgcy5kYXRhID0gbnVsbDsKICAgICAgICAgICAgdmFyIGJlZm9yZVNlbmQgPSBzLmJlZm9yZVNlbmQ7CiAgICAgICAgICAgIHMuYmVmb3JlU2VuZCA9IGZ1bmN0aW9uKHhociwgbykgewogICAgICAgICAgICAgICAgby5kYXRhID0gZm9ybWRhdGE7CiAgICAgICAgICAgICAgICBpZihiZWZvcmVTZW5kKQogICAgICAgICAgICAgICAgICAgIGJlZm9yZVNlbmQuY2FsbCh0aGlzLCB4aHIsIG8pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuICQuYWpheChzKTsKICAgIH0KCiAgICAvLyBwcml2YXRlIGZ1bmN0aW9uIGZvciBoYW5kbGluZyBmaWxlIHVwbG9hZHMgKGhhdCB0aXAgdG8gWUFIT08hKQogICAgZnVuY3Rpb24gZmlsZVVwbG9hZElmcmFtZShhKSB7CiAgICAgICAgdmFyIGZvcm0gPSAkZm9ybVswXSwgZWwsIGksIHMsIGcsIGlkLCAkaW8sIGlvLCB4aHIsIHN1YiwgbiwgdGltZWRPdXQsIHRpbWVvdXRIYW5kbGU7CiAgICAgICAgdmFyIHVzZVByb3AgPSAhISQuZm4ucHJvcDsKICAgICAgICB2YXIgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7CgogICAgICAgIGlmICgkKCdbbmFtZT1zdWJtaXRdLFtpZD1zdWJtaXRdJywgZm9ybSkubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlucHV0IHdpdGggYSBuYW1lIG9yIGlkIG9mICdzdWJtaXQnIHRoZW4gd2Ugd29uJ3QgYmUKICAgICAgICAgICAgLy8gYWJsZSB0byBpbnZva2UgdGhlIHN1Ym1pdCBmbiBvbiB0aGUgZm9ybSAoYXQgbGVhc3Qgbm90IHgtYnJvd3NlcikKICAgICAgICAgICAgYWxlcnQoJ0Vycm9yOiBGb3JtIGVsZW1lbnRzIG11c3Qgbm90IGhhdmUgbmFtZSBvciBpZCBvZiAic3VibWl0Ii4nKTsKICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZXZlcnkgc2VyaWFsaXplZCBpbnB1dCBpcyBzdGlsbCBlbmFibGVkCiAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGVsID0gJChlbGVtZW50c1tpXSk7CiAgICAgICAgICAgICAgICBpZiAoIHVzZVByb3AgKQogICAgICAgICAgICAgICAgICAgIGVsLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHMgPSAkLmV4dGVuZCh0cnVlLCB7fSwgJC5hamF4U2V0dGluZ3MsIG9wdGlvbnMpOwogICAgICAgIHMuY29udGV4dCA9IHMuY29udGV4dCB8fCBzOwogICAgICAgIGlkID0gJ2pxRm9ybUlPJyArIChuZXcgRGF0ZSgpLmdldFRpbWUoKSk7CiAgICAgICAgaWYgKHMuaWZyYW1lVGFyZ2V0KSB7CiAgICAgICAgICAgICRpbyA9ICQocy5pZnJhbWVUYXJnZXQpOwogICAgICAgICAgICBuID0gJGlvLmF0dHIoJ25hbWUnKTsKICAgICAgICAgICAgaWYgKCFuKQogICAgICAgICAgICAgICAgICRpby5hdHRyKCduYW1lJywgaWQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBpZCA9IG47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkaW8gPSAkKCc8aWZyYW1lIG5hbWU9IicgKyBpZCArICciIHNyYz0iJysgcy5pZnJhbWVTcmMgKyciIC8+Jyk7CiAgICAgICAgICAgICRpby5jc3MoeyBwb3NpdGlvbjogJ2Fic29sdXRlJywgdG9wOiAnLTEwMDBweCcsIGxlZnQ6ICctMTAwMHB4JyB9KTsKICAgICAgICB9CiAgICAgICAgaW8gPSAkaW9bMF07CgoKICAgICAgICB4aHIgPSB7IC8vIG1vY2sgb2JqZWN0CiAgICAgICAgICAgIGFib3J0ZWQ6IDAsCiAgICAgICAgICAgIHJlc3BvbnNlVGV4dDogbnVsbCwKICAgICAgICAgICAgcmVzcG9uc2VYTUw6IG51bGwsCiAgICAgICAgICAgIHN0YXR1czogMCwKICAgICAgICAgICAgc3RhdHVzVGV4dDogJ24vYScsCiAgICAgICAgICAgIGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7fSwKICAgICAgICAgICAgZ2V0UmVzcG9uc2VIZWFkZXI6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgIHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCkge30sCiAgICAgICAgICAgIGFib3J0OiBmdW5jdGlvbihzdGF0dXMpIHsKICAgICAgICAgICAgICAgIHZhciBlID0gKHN0YXR1cyA9PT0gJ3RpbWVvdXQnID8gJ3RpbWVvdXQnIDogJ2Fib3J0ZWQnKTsKICAgICAgICAgICAgICAgIGxvZygnYWJvcnRpbmcgdXBsb2FkLi4uICcgKyBlKTsKICAgICAgICAgICAgICAgIHRoaXMuYWJvcnRlZCA9IDE7CgogICAgICAgICAgICAgICAgdHJ5IHsgLy8gIzIxNCwgIzI1NwogICAgICAgICAgICAgICAgICAgIGlmIChpby5jb250ZW50V2luZG93LmRvY3VtZW50LmV4ZWNDb21tYW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlvLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ1N0b3AnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgY2F0Y2goaWdub3JlKSB7fQoKICAgICAgICAgICAgICAgICRpby5hdHRyKCdzcmMnLCBzLmlmcmFtZVNyYyk7IC8vIGFib3J0IG9wIGluIHByb2dyZXNzCiAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlOwogICAgICAgICAgICAgICAgaWYgKHMuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgcy5lcnJvci5jYWxsKHMuY29udGV4dCwgeGhyLCBlLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSk7CiAgICAgICAgICAgICAgICBpZiAocy5jb21wbGV0ZSkKICAgICAgICAgICAgICAgICAgICBzLmNvbXBsZXRlLmNhbGwocy5jb250ZXh0LCB4aHIsIGUpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZyA9IHMuZ2xvYmFsOwogICAgICAgIC8vIHRyaWdnZXIgYWpheCBnbG9iYWwgZXZlbnRzIHNvIHRoYXQgYWN0aXZpdHkvYmxvY2sgaW5kaWNhdG9ycyB3b3JrIGxpa2Ugbm9ybWFsCiAgICAgICAgaWYgKGcgJiYgMCA9PT0gJC5hY3RpdmUrKykgewogICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpOwogICAgICAgIH0KICAgICAgICBpZiAoZykgewogICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTZW5kIiwgW3hociwgc10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHMuYmVmb3JlU2VuZCAmJiBzLmJlZm9yZVNlbmQuY2FsbChzLmNvbnRleHQsIHhociwgcykgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGlmIChzLmdsb2JhbCkgewogICAgICAgICAgICAgICAgJC5hY3RpdmUtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoKTsKICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgICAgIH0KICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHsKICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KCk7CiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgICAgICB9CgogICAgICAgIC8vIGFkZCBzdWJtaXR0aW5nIGVsZW1lbnQgdG8gZGF0YSBpZiB3ZSBrbm93IGl0CiAgICAgICAgc3ViID0gZm9ybS5jbGs7CiAgICAgICAgaWYgKHN1YikgewogICAgICAgICAgICBuID0gc3ViLm5hbWU7CiAgICAgICAgICAgIGlmIChuICYmICFzdWIuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHMuZXh0cmFEYXRhID0gcy5leHRyYURhdGEgfHwge307CiAgICAgICAgICAgICAgICBzLmV4dHJhRGF0YVtuXSA9IHN1Yi52YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChzdWIudHlwZSA9PSAiaW1hZ2UiKSB7CiAgICAgICAgICAgICAgICAgICAgcy5leHRyYURhdGFbbisnLngnXSA9IGZvcm0uY2xrX3g7CiAgICAgICAgICAgICAgICAgICAgcy5leHRyYURhdGFbbisnLnknXSA9IGZvcm0uY2xrX3k7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgdmFyIENMSUVOVF9USU1FT1VUX0FCT1JUID0gMTsKICAgICAgICB2YXIgU0VSVkVSX0FCT1JUID0gMjsKCiAgICAgICAgZnVuY3Rpb24gZ2V0RG9jKGZyYW1lKSB7CiAgICAgICAgICAgIHZhciBkb2MgPSBmcmFtZS5jb250ZW50V2luZG93ID8gZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCA6IGZyYW1lLmNvbnRlbnREb2N1bWVudCA/IGZyYW1lLmNvbnRlbnREb2N1bWVudCA6IGZyYW1lLmRvY3VtZW50OwogICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBSYWlscyBDU1JGIGhhY2sgKHRoYW5rcyB0byBZdmFuIEJhcnRoZWxlbXkpCiAgICAgICAgdmFyIGNzcmZfdG9rZW4gPSAkKCdtZXRhW25hbWU9Y3NyZi10b2tlbl0nKS5hdHRyKCdjb250ZW50Jyk7CiAgICAgICAgdmFyIGNzcmZfcGFyYW0gPSAkKCdtZXRhW25hbWU9Y3NyZi1wYXJhbV0nKS5hdHRyKCdjb250ZW50Jyk7CiAgICAgICAgaWYgKGNzcmZfcGFyYW0gJiYgY3NyZl90b2tlbikgewogICAgICAgICAgICBzLmV4dHJhRGF0YSA9IHMuZXh0cmFEYXRhIHx8IHt9OwogICAgICAgICAgICBzLmV4dHJhRGF0YVtjc3JmX3BhcmFtXSA9IGNzcmZfdG9rZW47CiAgICAgICAgfQoKICAgICAgICAvLyB0YWtlIGEgYnJlYXRoIHNvIHRoYXQgcGVuZGluZyByZXBhaW50cyBnZXQgc29tZSBjcHUgdGltZSBiZWZvcmUgdGhlIHVwbG9hZCBzdGFydHMKICAgICAgICBmdW5jdGlvbiBkb1N1Ym1pdCgpIHsKICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGZvcm0gYXR0cnMgYXJlIHNldAogICAgICAgICAgICB2YXIgdCA9ICRmb3JtLmF0dHIoJ3RhcmdldCcpLCBhID0gJGZvcm0uYXR0cignYWN0aW9uJyk7CgogICAgICAgICAgICAvLyB1cGRhdGUgZm9ybSBhdHRycyBpbiBJRSBmcmllbmRseSB3YXkKICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsaWQpOwogICAgICAgICAgICBpZiAoIW1ldGhvZCkgewogICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ21ldGhvZCcsICdQT1NUJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGEgIT0gcy51cmwpIHsKICAgICAgICAgICAgICAgIGZvcm0uc2V0QXR0cmlidXRlKCdhY3Rpb24nLCBzLnVybCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGllIGJvcmtzIGluIHNvbWUgY2FzZXMgd2hlbiBzZXR0aW5nIGVuY29kaW5nCiAgICAgICAgICAgIGlmICghIHMuc2tpcEVuY29kaW5nT3ZlcnJpZGUgJiYgKCFtZXRob2QgfHwgL3Bvc3QvaS50ZXN0KG1ldGhvZCkpKSB7CiAgICAgICAgICAgICAgICAkZm9ybS5hdHRyKHsKICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzogJ211bHRpcGFydC9mb3JtLWRhdGEnLAogICAgICAgICAgICAgICAgICAgIGVuY3R5cGU6ICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBzdXBwb3J0IHRpbW91dAogICAgICAgICAgICBpZiAocy50aW1lb3V0KSB7CiAgICAgICAgICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdGltZWRPdXQgPSB0cnVlOyBjYihDTElFTlRfVElNRU9VVF9BQk9SVCk7IH0sIHMudGltZW91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGxvb2sgZm9yIHNlcnZlciBhYm9ydHMKICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tTdGF0ZSgpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXRlID0gZ2V0RG9jKGlvKS5yZWFkeVN0YXRlOwogICAgICAgICAgICAgICAgICAgIGxvZygnc3RhdGUgPSAnICsgc3RhdGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS50b0xvd2VyQ2FzZSgpID09ICd1bmluaXRpYWxpemVkJykKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChjaGVja1N0YXRlLDUwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoKGUpIHsKICAgICAgICAgICAgICAgICAgICBsb2coJ1NlcnZlciBhYm9ydDogJyAsIGUsICcgKCcsIGUubmFtZSwgJyknKTsKICAgICAgICAgICAgICAgICAgICBjYihTRVJWRVJfQUJPUlQpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0SGFuZGxlKQogICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgdGltZW91dEhhbmRsZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkICJleHRyYSIgZGF0YSB0byBmb3JtIGlmIHByb3ZpZGVkIGluIG9wdGlvbnMKICAgICAgICAgICAgdmFyIGV4dHJhSW5wdXRzID0gW107CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAocy5leHRyYURhdGEpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuIGluIHMuZXh0cmFEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLmV4dHJhRGF0YS5oYXNPd25Qcm9wZXJ0eShuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2luZyB0aGUgJC5wYXJhbSBmb3JtYXQgdGhhdCBhbGxvd3MgZm9yIG11bHRpcGxlIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoJC5pc1BsYWluT2JqZWN0KHMuZXh0cmFEYXRhW25dKSAmJiBzLmV4dHJhRGF0YVtuXS5oYXNPd25Qcm9wZXJ0eSgnbmFtZScpICYmIHMuZXh0cmFEYXRhW25dLmhhc093blByb3BlcnR5KCd2YWx1ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUlucHV0cy5wdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJytzLmV4dHJhRGF0YVtuXS5uYW1lKyciPicpLmF0dHIoJ3ZhbHVlJyxzLmV4dHJhRGF0YVtuXS52YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oZm9ybSlbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFJbnB1dHMucHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicrbisnIj4nKS5hdHRyKCd2YWx1ZScscy5leHRyYURhdGFbbl0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKGZvcm0pWzBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghcy5pZnJhbWVUYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaWZyYW1lIHRvIGRvYyBhbmQgc3VibWl0IHRoZSBmb3JtCiAgICAgICAgICAgICAgICAgICAgJGlvLmFwcGVuZFRvKCdib2R5Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlvLmF0dGFjaEV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICBpby5hdHRhY2hFdmVudCgnb25sb2FkJywgY2IpOwogICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgaW8uYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNiLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrU3RhdGUsMTUpOwogICAgICAgICAgICAgICAgZm9ybS5zdWJtaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIC8vIHJlc2V0IGF0dHJzIGFuZCByZW1vdmUgImV4dHJhIiBpbnB1dCBlbGVtZW50cwogICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ2FjdGlvbicsYSk7CiAgICAgICAgICAgICAgICBpZih0KSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybS5zZXRBdHRyaWJ1dGUoJ3RhcmdldCcsIHQpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZm9ybS5yZW1vdmVBdHRyKCd0YXJnZXQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICQoZXh0cmFJbnB1dHMpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocy5mb3JjZVN5bmMpIHsKICAgICAgICAgICAgZG9TdWJtaXQoKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZG9TdWJtaXQsIDEwKTsgLy8gdGhpcyBsZXRzIGRvbSB1cGRhdGVzIHJlbmRlcgogICAgICAgIH0KCiAgICAgICAgdmFyIGRhdGEsIGRvYywgZG9tQ2hlY2tDb3VudCA9IDUwLCBjYWxsYmFja1Byb2Nlc3NlZDsKCiAgICAgICAgZnVuY3Rpb24gY2IoZSkgewogICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQgfHwgY2FsbGJhY2tQcm9jZXNzZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZG9jID0gZ2V0RG9jKGlvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaChleCkgewogICAgICAgICAgICAgICAgbG9nKCdjYW5ub3QgYWNjZXNzIHJlc3BvbnNlIGRvY3VtZW50OiAnLCBleCk7CiAgICAgICAgICAgICAgICBlID0gU0VSVkVSX0FCT1JUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlID09PSBDTElFTlRfVElNRU9VVF9BQk9SVCAmJiB4aHIpIHsKICAgICAgICAgICAgICAgIHhoci5hYm9ydCgndGltZW91dCcpOwogICAgICAgICAgICAgICAgZGVmZXJyZWQucmVqZWN0KHhociwgJ3RpbWVvdXQnKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlID09IFNFUlZFUl9BQk9SVCAmJiB4aHIpIHsKICAgICAgICAgICAgICAgIHhoci5hYm9ydCgnc2VydmVyIGFib3J0Jyk7CiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoeGhyLCAnZXJyb3InLCAnc2VydmVyIGFib3J0Jyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZG9jIHx8IGRvYy5sb2NhdGlvbi5ocmVmID09IHMuaWZyYW1lU3JjKSB7CiAgICAgICAgICAgICAgICAvLyByZXNwb25zZSBub3QgcmVjZWl2ZWQgeWV0CiAgICAgICAgICAgICAgICBpZiAoIXRpbWVkT3V0KQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW8uZGV0YWNoRXZlbnQpCiAgICAgICAgICAgICAgICBpby5kZXRhY2hFdmVudCgnb25sb2FkJywgY2IpOwogICAgICAgICAgICBlbHNlICAgIAogICAgICAgICAgICAgICAgaW8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIGNiLCBmYWxzZSk7CgogICAgICAgICAgICB2YXIgc3RhdHVzID0gJ3N1Y2Nlc3MnLCBlcnJNc2c7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAodGltZWRPdXQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyAndGltZW91dCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIGlzWG1sID0gcy5kYXRhVHlwZSA9PSAneG1sJyB8fCBkb2MuWE1MRG9jdW1lbnQgfHwgJC5pc1hNTERvYyhkb2MpOwogICAgICAgICAgICAgICAgbG9nKCdpc1htbD0nK2lzWG1sKTsKICAgICAgICAgICAgICAgIGlmICghaXNYbWwgJiYgd2luZG93Lm9wZXJhICYmIChkb2MuYm9keSA9PT0gbnVsbCB8fCAhZG9jLmJvZHkuaW5uZXJIVE1MKSkgewogICAgICAgICAgICAgICAgICAgIGlmICgtLWRvbUNoZWNrQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gc29tZSBicm93c2VycyAoT3BlcmEpIHRoZSBpZnJhbWUgRE9NIGlzIG5vdCBhbHdheXMgdHJhdmVyc2FibGUgd2hlbgogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25sb2FkIGNhbGxiYWNrIGZpcmVzLCBzbyB3ZSBsb29wIGEgYml0IHRvIGFjY29tbW9kYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygncmVxdWVpbmcgb25Mb2FkIGNhbGxiYWNrLCBET00gbm90IGF2YWlsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNiLCAyNTApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGxldCB0aGlzIGZhbGwgdGhyb3VnaCBiZWNhdXNlIHNlcnZlciByZXNwb25zZSBjb3VsZCBiZSBhbiBlbXB0eSBkb2N1bWVudAogICAgICAgICAgICAgICAgICAgIC8vbG9nKCdDb3VsZCBub3QgYWNjZXNzIGlmcmFtZSBET00gYWZ0ZXIgbXV0aXBsZSB0cmllcy4nKTsKICAgICAgICAgICAgICAgICAgICAvL3Rocm93ICdET01FeGNlcHRpb246IG5vdCBhdmFpbGFibGUnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vbG9nKCdyZXNwb25zZSBkZXRlY3RlZCcpOwogICAgICAgICAgICAgICAgdmFyIGRvY1Jvb3QgPSBkb2MuYm9keSA/IGRvYy5ib2R5IDogZG9jLmRvY3VtZW50RWxlbWVudDsKICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVRleHQgPSBkb2NSb290ID8gZG9jUm9vdC5pbm5lckhUTUwgOiBudWxsOwogICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlWE1MID0gZG9jLlhNTERvY3VtZW50ID8gZG9jLlhNTERvY3VtZW50IDogZG9jOwogICAgICAgICAgICAgICAgaWYgKGlzWG1sKQogICAgICAgICAgICAgICAgICAgIHMuZGF0YVR5cGUgPSAneG1sJzsKICAgICAgICAgICAgICAgIHhoci5nZXRSZXNwb25zZUhlYWRlciA9IGZ1bmN0aW9uKGhlYWRlcil7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhlYWRlcnMgPSB7J2NvbnRlbnQtdHlwZSc6IHMuZGF0YVR5cGV9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXJzW2hlYWRlcl07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgWEhSICdzdGF0dXMnICYgJ3N0YXR1c1RleHQnIGVtdWxhdGlvbiA6CiAgICAgICAgICAgICAgICBpZiAoZG9jUm9vdCkgewogICAgICAgICAgICAgICAgICAgIHhoci5zdGF0dXMgPSBOdW1iZXIoIGRvY1Jvb3QuZ2V0QXR0cmlidXRlKCdzdGF0dXMnKSApIHx8IHhoci5zdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgeGhyLnN0YXR1c1RleHQgPSBkb2NSb290LmdldEF0dHJpYnV0ZSgnc3RhdHVzVGV4dCcpIHx8IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBkdCA9IChzLmRhdGFUeXBlIHx8ICcnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgdmFyIHNjciA9IC8oanNvbnxzY3JpcHR8dGV4dCkvLnRlc3QoZHQpOwogICAgICAgICAgICAgICAgaWYgKHNjciB8fCBzLnRleHRhcmVhKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2VlIGlmIHVzZXIgZW1iZWRkZWQgcmVzcG9uc2UgaW4gdGV4dGFyZWEKICAgICAgICAgICAgICAgICAgICB2YXIgdGEgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3RleHRhcmVhJylbMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVRleHQgPSB0YS52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBmb3IgWEhSICdzdGF0dXMnICYgJ3N0YXR1c1RleHQnIGVtdWxhdGlvbiA6CiAgICAgICAgICAgICAgICAgICAgICAgIHhoci5zdGF0dXMgPSBOdW1iZXIoIHRhLmdldEF0dHJpYnV0ZSgnc3RhdHVzJykgKSB8fCB4aHIuc3RhdHVzOwogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc3RhdHVzVGV4dCA9IHRhLmdldEF0dHJpYnV0ZSgnc3RhdHVzVGV4dCcpIHx8IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzY3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjb3VudCBmb3IgYnJvd3NlcnMgaW5qZWN0aW5nIHByZSBhcm91bmQganNvbiByZXNwb25zZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJlID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwcmUnKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dCA9IHByZS50ZXh0Q29udGVudCA/IHByZS50ZXh0Q29udGVudCA6IHByZS5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyLnJlc3BvbnNlVGV4dCA9IGIudGV4dENvbnRlbnQgPyBiLnRleHRDb250ZW50IDogYi5pbm5lclRleHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkdCA9PSAneG1sJyAmJiAheGhyLnJlc3BvbnNlWE1MICYmIHhoci5yZXNwb25zZVRleHQpIHsKICAgICAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VYTUwgPSB0b1htbCh4aHIucmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBodHRwRGF0YSh4aHIsIGR0LCBzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3BhcnNlcmVycm9yJzsKICAgICAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlcnJNc2cgPSAoZSB8fCBzdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBsb2coJ2Vycm9yIGNhdWdodDogJyxlKTsKICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdlcnJvcic7CiAgICAgICAgICAgICAgICB4aHIuZXJyb3IgPSBlcnJNc2cgPSAoZSB8fCBzdGF0dXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoeGhyLmFib3J0ZWQpIHsKICAgICAgICAgICAgICAgIGxvZygndXBsb2FkIGFib3J0ZWQnKTsKICAgICAgICAgICAgICAgIHN0YXR1cyA9IG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzKSB7IC8vIHdlJ3ZlIHNldCB4aHIuc3RhdHVzCiAgICAgICAgICAgICAgICBzdGF0dXMgPSAoeGhyLnN0YXR1cyA+PSAyMDAgJiYgeGhyLnN0YXR1cyA8IDMwMCB8fCB4aHIuc3RhdHVzID09PSAzMDQpID8gJ3N1Y2Nlc3MnIDogJ2Vycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gb3JkZXJpbmcgb2YgdGhlc2UgY2FsbGJhY2tzL3RyaWdnZXJzIGlzIG9kZCwgYnV0IHRoYXQncyBob3cgJC5hamF4IGRvZXMgaXQKICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7CiAgICAgICAgICAgICAgICBpZiAocy5zdWNjZXNzKQogICAgICAgICAgICAgICAgICAgIHMuc3VjY2Vzcy5jYWxsKHMuY29udGV4dCwgZGF0YSwgJ3N1Y2Nlc3MnLCB4aHIpOwogICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh4aHIucmVzcG9uc2VUZXh0LCAnc3VjY2VzcycsIHhocik7CiAgICAgICAgICAgICAgICBpZiAoZykKICAgICAgICAgICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhTdWNjZXNzIiwgW3hociwgc10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXR1cykgewogICAgICAgICAgICAgICAgaWYgKGVyck1zZyA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICAgICAgICAgIGVyck1zZyA9IHhoci5zdGF0dXNUZXh0OwogICAgICAgICAgICAgICAgaWYgKHMuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgcy5lcnJvci5jYWxsKHMuY29udGV4dCwgeGhyLCBzdGF0dXMsIGVyck1zZyk7CiAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZWplY3QoeGhyLCAnZXJyb3InLCBlcnJNc2cpOwogICAgICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4RXJyb3IiLCBbeGhyLCBzLCBlcnJNc2ddKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGcpCiAgICAgICAgICAgICAgICAkLmV2ZW50LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsIFt4aHIsIHNdKTsKCiAgICAgICAgICAgIGlmIChnICYmICEgLS0kLmFjdGl2ZSkgewogICAgICAgICAgICAgICAgJC5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocy5jb21wbGV0ZSkKICAgICAgICAgICAgICAgIHMuY29tcGxldGUuY2FsbChzLmNvbnRleHQsIHhociwgc3RhdHVzKTsKCiAgICAgICAgICAgIGNhbGxiYWNrUHJvY2Vzc2VkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHMudGltZW91dCkKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKTsKCiAgICAgICAgICAgIC8vIGNsZWFuIHVwCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAoIXMuaWZyYW1lVGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICRpby5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHhoci5yZXNwb25zZVhNTCA9IG51bGw7CiAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgdG9YbWwgPSAkLnBhcnNlWE1MIHx8IGZ1bmN0aW9uKHMsIGRvYykgeyAvLyB1c2UgcGFyc2VYTUwgaWYgYXZhaWxhYmxlIChqUXVlcnkgMS41KykKICAgICAgICAgICAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBkb2MgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpOwogICAgICAgICAgICAgICAgZG9jLmFzeW5jID0gJ2ZhbHNlJzsKICAgICAgICAgICAgICAgIGRvYy5sb2FkWE1MKHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZG9jID0gKG5ldyBET01QYXJzZXIoKSkucGFyc2VGcm9tU3RyaW5nKHMsICd0ZXh0L3htbCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoZG9jICYmIGRvYy5kb2N1bWVudEVsZW1lbnQgJiYgZG9jLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPSAncGFyc2VyZXJyb3InKSA/IGRvYyA6IG51bGw7CiAgICAgICAgfTsKICAgICAgICB2YXIgcGFyc2VKU09OID0gJC5wYXJzZUpTT04gfHwgZnVuY3Rpb24ocykgewogICAgICAgICAgICAvKmpzbGludCBldmlsOnRydWUgKi8KICAgICAgICAgICAgcmV0dXJuIHdpbmRvd1snZXZhbCddKCcoJyArIHMgKyAnKScpOwogICAgICAgIH07CgogICAgICAgIHZhciBodHRwRGF0YSA9IGZ1bmN0aW9uKCB4aHIsIHR5cGUsIHMgKSB7IC8vIG1vc3RseSBsaWZ0ZWQgZnJvbSBqcTEuNC40CgogICAgICAgICAgICB2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ2NvbnRlbnQtdHlwZScpIHx8ICcnLAogICAgICAgICAgICAgICAgeG1sID0gdHlwZSA9PT0gJ3htbCcgfHwgIXR5cGUgJiYgY3QuaW5kZXhPZigneG1sJykgPj0gMCwKICAgICAgICAgICAgICAgIGRhdGEgPSB4bWwgPyB4aHIucmVzcG9uc2VYTUwgOiB4aHIucmVzcG9uc2VUZXh0OwoKICAgICAgICAgICAgaWYgKHhtbCAmJiBkYXRhLmRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSA9PT0gJ3BhcnNlcmVycm9yJykgewogICAgICAgICAgICAgICAgaWYgKCQuZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgJC5lcnJvcigncGFyc2VyZXJyb3InKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocyAmJiBzLmRhdGFGaWx0ZXIpIHsKICAgICAgICAgICAgICAgIGRhdGEgPSBzLmRhdGFGaWx0ZXIoZGF0YSwgdHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdqc29uJyB8fCAhdHlwZSAmJiBjdC5pbmRleE9mKCdqc29uJykgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBwYXJzZUpTT04oZGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICJzY3JpcHQiIHx8ICF0eXBlICYmIGN0LmluZGV4T2YoImphdmFzY3JpcHQiKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJC5nbG9iYWxFdmFsKGRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBkZWZlcnJlZDsKICAgIH0KfTsKCi8qKgogKiBhamF4Rm9ybSgpIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBmdWxseSBhdXRvbWF0aW5nIGZvcm0gc3VibWlzc2lvbi4KICoKICogVGhlIGFkdmFudGFnZXMgb2YgdXNpbmcgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBhamF4U3VibWl0KCkgYXJlOgogKgogKiAxOiBUaGlzIG1ldGhvZCB3aWxsIGluY2x1ZGUgY29vcmRpbmF0ZXMgZm9yIDxpbnB1dCB0eXBlPSJpbWFnZSIgLz4gZWxlbWVudHMgKGlmIHRoZSBlbGVtZW50CiAqICAgIGlzIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtKS4KICogMi4gVGhpcyBtZXRob2Qgd2lsbCBpbmNsdWRlIHRoZSBzdWJtaXQgZWxlbWVudCdzIG5hbWUvdmFsdWUgZGF0YSAoZm9yIHRoZSBlbGVtZW50IHRoYXQgd2FzCiAqICAgIHVzZWQgdG8gc3VibWl0IHRoZSBmb3JtKS4KICogMy4gVGhpcyBtZXRob2QgYmluZHMgdGhlIHN1Ym1pdCgpIG1ldGhvZCB0byB0aGUgZm9ybSBmb3IgeW91LgogKgogKiBUaGUgb3B0aW9ucyBhcmd1bWVudCBmb3IgYWpheEZvcm0gd29ya3MgZXhhY3RseSBhcyBpdCBkb2VzIGZvciBhamF4U3VibWl0LiAgYWpheEZvcm0gbWVyZWx5CiAqIHBhc3NlcyB0aGUgb3B0aW9ucyBhcmd1bWVudCBhbG9uZyBhZnRlciBwcm9wZXJseSBiaW5kaW5nIGV2ZW50cyBmb3Igc3VibWl0IGVsZW1lbnRzIGFuZAogKiB0aGUgZm9ybSBpdHNlbGYuCiAqLwokLmZuLmFqYXhGb3JtID0gZnVuY3Rpb24ob3B0aW9ucykgewogICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICBvcHRpb25zLmRlbGVnYXRpb24gPSBvcHRpb25zLmRlbGVnYXRpb24gJiYgJC5pc0Z1bmN0aW9uKCQuZm4ub24pOwogICAgCiAgICAvLyBpbiBqUXVlcnkgMS4zKyB3ZSBjYW4gZml4IG1pc3Rha2VzIHdpdGggdGhlIHJlYWR5IHN0YXRlCiAgICBpZiAoIW9wdGlvbnMuZGVsZWdhdGlvbiAmJiB0aGlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHZhciBvID0geyBzOiB0aGlzLnNlbGVjdG9yLCBjOiB0aGlzLmNvbnRleHQgfTsKICAgICAgICBpZiAoISQuaXNSZWFkeSAmJiBvLnMpIHsKICAgICAgICAgICAgbG9nKCdET00gbm90IHJlYWR5LCBxdWV1aW5nIGFqYXhGb3JtJyk7CiAgICAgICAgICAgICQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkKG8ucyxvLmMpLmFqYXhGb3JtKG9wdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIC8vIGlzIHlvdXIgRE9NIHJlYWR5PyAgaHR0cDovL2RvY3MuanF1ZXJ5LmNvbS9UdXRvcmlhbHM6SW50cm9kdWNpbmdfJChkb2N1bWVudCkucmVhZHkoKQogICAgICAgIGxvZygndGVybWluYXRpbmc7IHplcm8gZWxlbWVudHMgZm91bmQgYnkgc2VsZWN0b3InICsgKCQuaXNSZWFkeSA/ICcnIDogJyAoRE9NIG5vdCByZWFkeSknKSk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgaWYgKCBvcHRpb25zLmRlbGVnYXRpb24gKSB7CiAgICAgICAgJChkb2N1bWVudCkKICAgICAgICAgICAgLm9mZignc3VibWl0LmZvcm0tcGx1Z2luJywgdGhpcy5zZWxlY3RvciwgZG9BamF4U3VibWl0KQogICAgICAgICAgICAub2ZmKCdjbGljay5mb3JtLXBsdWdpbicsIHRoaXMuc2VsZWN0b3IsIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudCkKICAgICAgICAgICAgLm9uKCdzdWJtaXQuZm9ybS1wbHVnaW4nLCB0aGlzLnNlbGVjdG9yLCBvcHRpb25zLCBkb0FqYXhTdWJtaXQpCiAgICAgICAgICAgIC5vbignY2xpY2suZm9ybS1wbHVnaW4nLCB0aGlzLnNlbGVjdG9yLCBvcHRpb25zLCBjYXB0dXJlU3VibWl0dGluZ0VsZW1lbnQpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIHJldHVybiB0aGlzLmFqYXhGb3JtVW5iaW5kKCkKICAgICAgICAuYmluZCgnc3VibWl0LmZvcm0tcGx1Z2luJywgb3B0aW9ucywgZG9BamF4U3VibWl0KQogICAgICAgIC5iaW5kKCdjbGljay5mb3JtLXBsdWdpbicsIG9wdGlvbnMsIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudCk7Cn07CgovLyBwcml2YXRlIGV2ZW50IGhhbmRsZXJzICAgIApmdW5jdGlvbiBkb0FqYXhTdWJtaXQoZSkgewogICAgLypqc2hpbnQgdmFsaWR0aGlzOnRydWUgKi8KICAgIHZhciBvcHRpb25zID0gZS5kYXRhOwogICAgaWYgKCFlLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7IC8vIGlmIGV2ZW50IGhhcyBiZWVuIGNhbmNlbGVkLCBkb24ndCBwcm9jZWVkCiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICQodGhpcykuYWpheFN1Ym1pdChvcHRpb25zKTsKICAgIH0KfQogICAgCmZ1bmN0aW9uIGNhcHR1cmVTdWJtaXR0aW5nRWxlbWVudChlKSB7CiAgICAvKmpzaGludCB2YWxpZHRoaXM6dHJ1ZSAqLwogICAgdmFyIHRhcmdldCA9IGUudGFyZ2V0OwogICAgdmFyICRlbCA9ICQodGFyZ2V0KTsKICAgIGlmICghKCRlbC5pcygiW3R5cGU9c3VibWl0XSxbdHlwZT1pbWFnZV0iKSkpIHsKICAgICAgICAvLyBpcyB0aGlzIGEgY2hpbGQgZWxlbWVudCBvZiB0aGUgc3VibWl0IGVsPyAgKGV4OiBhIHNwYW4gd2l0aGluIGEgYnV0dG9uKQogICAgICAgIHZhciB0ID0gJGVsLmNsb3Nlc3QoJ1t0eXBlPXN1Ym1pdF0nKTsKICAgICAgICBpZiAodC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0YXJnZXQgPSB0WzBdOwogICAgfQogICAgdmFyIGZvcm0gPSB0aGlzOwogICAgZm9ybS5jbGsgPSB0YXJnZXQ7CiAgICBpZiAodGFyZ2V0LnR5cGUgPT0gJ2ltYWdlJykgewogICAgICAgIGlmIChlLm9mZnNldFggIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBmb3JtLmNsa194ID0gZS5vZmZzZXRYOwogICAgICAgICAgICBmb3JtLmNsa195ID0gZS5vZmZzZXRZOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mICQuZm4ub2Zmc2V0ID09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdmFyIG9mZnNldCA9ICRlbC5vZmZzZXQoKTsKICAgICAgICAgICAgZm9ybS5jbGtfeCA9IGUucGFnZVggLSBvZmZzZXQubGVmdDsKICAgICAgICAgICAgZm9ybS5jbGtfeSA9IGUucGFnZVkgLSBvZmZzZXQudG9wOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvcm0uY2xrX3ggPSBlLnBhZ2VYIC0gdGFyZ2V0Lm9mZnNldExlZnQ7CiAgICAgICAgICAgIGZvcm0uY2xrX3kgPSBlLnBhZ2VZIC0gdGFyZ2V0Lm9mZnNldFRvcDsKICAgICAgICB9CiAgICB9CiAgICAvLyBjbGVhciBmb3JtIHZhcnMKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGZvcm0uY2xrID0gZm9ybS5jbGtfeCA9IGZvcm0uY2xrX3kgPSBudWxsOyB9LCAxMDApOwp9CgoKLy8gYWpheEZvcm1VbmJpbmQgdW5iaW5kcyB0aGUgZXZlbnQgaGFuZGxlcnMgdGhhdCB3ZXJlIGJvdW5kIGJ5IGFqYXhGb3JtCiQuZm4uYWpheEZvcm1VbmJpbmQgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLnVuYmluZCgnc3VibWl0LmZvcm0tcGx1Z2luIGNsaWNrLmZvcm0tcGx1Z2luJyk7Cn07CgovKioKICogZm9ybVRvQXJyYXkoKSBnYXRoZXJzIGZvcm0gZWxlbWVudCBkYXRhIGludG8gYW4gYXJyYXkgb2Ygb2JqZWN0cyB0aGF0IGNhbgogKiBiZSBwYXNzZWQgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgYWpheCBmdW5jdGlvbnM6ICQuZ2V0LCAkLnBvc3QsIG9yIGxvYWQuCiAqIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheSBoYXMgYm90aCBhICduYW1lJyBhbmQgJ3ZhbHVlJyBwcm9wZXJ0eS4gIEFuIGV4YW1wbGUgb2YKICogYW4gYXJyYXkgZm9yIGEgc2ltcGxlIGxvZ2luIGZvcm0gbWlnaHQgYmU6CiAqCiAqIFsgeyBuYW1lOiAndXNlcm5hbWUnLCB2YWx1ZTogJ2pyZXNpZycgfSwgeyBuYW1lOiAncGFzc3dvcmQnLCB2YWx1ZTogJ3NlY3JldCcgfSBdCiAqCiAqIEl0IGlzIHRoaXMgYXJyYXkgdGhhdCBpcyBwYXNzZWQgdG8gcHJlLXN1Ym1pdCBjYWxsYmFjayBmdW5jdGlvbnMgcHJvdmlkZWQgdG8gdGhlCiAqIGFqYXhTdWJtaXQoKSBhbmQgYWpheEZvcm0oKSBtZXRob2RzLgogKi8KJC5mbi5mb3JtVG9BcnJheSA9IGZ1bmN0aW9uKHNlbWFudGljLCBlbGVtZW50cykgewogICAgdmFyIGEgPSBbXTsKICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIHZhciBmb3JtID0gdGhpc1swXTsKICAgIHZhciBlbHMgPSBzZW1hbnRpYyA/IGZvcm0uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKSA6IGZvcm0uZWxlbWVudHM7CiAgICBpZiAoIWVscykgewogICAgICAgIHJldHVybiBhOwogICAgfQoKICAgIHZhciBpLGosbix2LGVsLG1heCxqbWF4OwogICAgZm9yKGk9MCwgbWF4PWVscy5sZW5ndGg7IGkgPCBtYXg7IGkrKykgewogICAgICAgIGVsID0gZWxzW2ldOwogICAgICAgIG4gPSBlbC5uYW1lOwogICAgICAgIGlmICghbikgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIGlmIChzZW1hbnRpYyAmJiBmb3JtLmNsayAmJiBlbC50eXBlID09ICJpbWFnZSIpIHsKICAgICAgICAgICAgLy8gaGFuZGxlIGltYWdlIGlucHV0cyBvbiB0aGUgZmx5IHdoZW4gc2VtYW50aWMgPT0gdHJ1ZQogICAgICAgICAgICBpZighZWwuZGlzYWJsZWQgJiYgZm9ybS5jbGsgPT0gZWwpIHsKICAgICAgICAgICAgICAgIGEucHVzaCh7bmFtZTogbiwgdmFsdWU6ICQoZWwpLnZhbCgpLCB0eXBlOiBlbC50eXBlIH0pOwogICAgICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuKycueCcsIHZhbHVlOiBmb3JtLmNsa194fSwge25hbWU6IG4rJy55JywgdmFsdWU6IGZvcm0uY2xrX3l9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CgogICAgICAgIHYgPSAkLmZpZWxkVmFsdWUoZWwsIHRydWUpOwogICAgICAgIGlmICh2ICYmIHYuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSAKICAgICAgICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWwpOwogICAgICAgICAgICBmb3Ioaj0wLCBqbWF4PXYubGVuZ3RoOyBqIDwgam1heDsgaisrKSB7CiAgICAgICAgICAgICAgICBhLnB1c2goe25hbWU6IG4sIHZhbHVlOiB2W2pdfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZmVhdHVyZS5maWxlYXBpICYmIGVsLnR5cGUgPT0gJ2ZpbGUnICYmICFlbC5kaXNhYmxlZCkgewogICAgICAgICAgICBpZiAoZWxlbWVudHMpIAogICAgICAgICAgICAgICAgZWxlbWVudHMucHVzaChlbCk7CiAgICAgICAgICAgIHZhciBmaWxlcyA9IGVsLmZpbGVzOwogICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IGZpbGVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuLCB2YWx1ZTogZmlsZXNbal0sIHR5cGU6IGVsLnR5cGV9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vICMxODAKICAgICAgICAgICAgICAgIGEucHVzaCh7IG5hbWU6IG4sIHZhbHVlOiAnJywgdHlwZTogZWwudHlwZSB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh2ICE9PSBudWxsICYmIHR5cGVvZiB2ICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIGlmIChlbGVtZW50cykgCiAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsKTsKICAgICAgICAgICAgYS5wdXNoKHtuYW1lOiBuLCB2YWx1ZTogdiwgdHlwZTogZWwudHlwZSwgcmVxdWlyZWQ6IGVsLnJlcXVpcmVkfSk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICghc2VtYW50aWMgJiYgZm9ybS5jbGspIHsKICAgICAgICAvLyBpbnB1dCB0eXBlPT0naW1hZ2UnIGFyZSBub3QgZm91bmQgaW4gZWxlbWVudHMgYXJyYXkhIGhhbmRsZSBpdCBoZXJlCiAgICAgICAgdmFyICRpbnB1dCA9ICQoZm9ybS5jbGspLCBpbnB1dCA9ICRpbnB1dFswXTsKICAgICAgICBuID0gaW5wdXQubmFtZTsKICAgICAgICBpZiAobiAmJiAhaW5wdXQuZGlzYWJsZWQgJiYgaW5wdXQudHlwZSA9PSAnaW1hZ2UnKSB7CiAgICAgICAgICAgIGEucHVzaCh7bmFtZTogbiwgdmFsdWU6ICRpbnB1dC52YWwoKX0pOwogICAgICAgICAgICBhLnB1c2goe25hbWU6IG4rJy54JywgdmFsdWU6IGZvcm0uY2xrX3h9LCB7bmFtZTogbisnLnknLCB2YWx1ZTogZm9ybS5jbGtfeX0pOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwp9OwoKLyoqCiAqIFNlcmlhbGl6ZXMgZm9ybSBkYXRhIGludG8gYSAnc3VibWl0dGFibGUnIHN0cmluZy4gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBzdHJpbmcKICogaW4gdGhlIGZvcm1hdDogbmFtZTE9dmFsdWUxJmFtcDtuYW1lMj12YWx1ZTIKICovCiQuZm4uZm9ybVNlcmlhbGl6ZSA9IGZ1bmN0aW9uKHNlbWFudGljKSB7CiAgICAvL2hhbmQgb2ZmIHRvIGpRdWVyeS5wYXJhbSBmb3IgcHJvcGVyIGVuY29kaW5nCiAgICByZXR1cm4gJC5wYXJhbSh0aGlzLmZvcm1Ub0FycmF5KHNlbWFudGljKSk7Cn07CgovKioKICogU2VyaWFsaXplcyBhbGwgZmllbGQgZWxlbWVudHMgaW4gdGhlIGpRdWVyeSBvYmplY3QgaW50byBhIHF1ZXJ5IHN0cmluZy4KICogVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYSBzdHJpbmcgaW4gdGhlIGZvcm1hdDogbmFtZTE9dmFsdWUxJmFtcDtuYW1lMj12YWx1ZTIKICovCiQuZm4uZmllbGRTZXJpYWxpemUgPSBmdW5jdGlvbihzdWNjZXNzZnVsKSB7CiAgICB2YXIgYSA9IFtdOwogICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBuID0gdGhpcy5uYW1lOwogICAgICAgIGlmICghbikgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciB2ID0gJC5maWVsZFZhbHVlKHRoaXMsIHN1Y2Nlc3NmdWwpOwogICAgICAgIGlmICh2ICYmIHYuY29uc3RydWN0b3IgPT0gQXJyYXkpIHsKICAgICAgICAgICAgZm9yICh2YXIgaT0wLG1heD12Lmxlbmd0aDsgaSA8IG1heDsgaSsrKSB7CiAgICAgICAgICAgICAgICBhLnB1c2goe25hbWU6IG4sIHZhbHVlOiB2W2ldfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodiAhPT0gbnVsbCAmJiB0eXBlb2YgdiAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBhLnB1c2goe25hbWU6IHRoaXMubmFtZSwgdmFsdWU6IHZ9KTsKICAgICAgICB9CiAgICB9KTsKICAgIC8vaGFuZCBvZmYgdG8galF1ZXJ5LnBhcmFtIGZvciBwcm9wZXIgZW5jb2RpbmcKICAgIHJldHVybiAkLnBhcmFtKGEpOwp9OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlKHMpIG9mIHRoZSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC4gIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZvcm06CiAqCiAqICA8Zm9ybT48ZmllbGRzZXQ+CiAqICAgICAgPGlucHV0IG5hbWU9IkEiIHR5cGU9InRleHQiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkEiIHR5cGU9InRleHQiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkIiIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iQjEiIC8+CiAqICAgICAgPGlucHV0IG5hbWU9IkIiIHR5cGU9ImNoZWNrYm94IiB2YWx1ZT0iQjIiLz4KICogICAgICA8aW5wdXQgbmFtZT0iQyIgdHlwZT0icmFkaW8iIHZhbHVlPSJDMSIgLz4KICogICAgICA8aW5wdXQgbmFtZT0iQyIgdHlwZT0icmFkaW8iIHZhbHVlPSJDMiIgLz4KICogIDwvZmllbGRzZXQ+PC9mb3JtPgogKgogKiAgdmFyIHYgPSAkKCdpbnB1dFt0eXBlPXRleHRdJykuZmllbGRWYWx1ZSgpOwogKiAgLy8gaWYgbm8gdmFsdWVzIGFyZSBlbnRlcmVkIGludG8gdGhlIHRleHQgaW5wdXRzCiAqICB2ID09IFsnJywnJ10KICogIC8vIGlmIHZhbHVlcyBlbnRlcmVkIGludG8gdGhlIHRleHQgaW5wdXRzIGFyZSAnZm9vJyBhbmQgJ2JhcicKICogIHYgPT0gWydmb28nLCdiYXInXQogKgogKiAgdmFyIHYgPSAkKCdpbnB1dFt0eXBlPWNoZWNrYm94XScpLmZpZWxkVmFsdWUoKTsKICogIC8vIGlmIG5laXRoZXIgY2hlY2tib3ggaXMgY2hlY2tlZAogKiAgdiA9PT0gdW5kZWZpbmVkCiAqICAvLyBpZiBib3RoIGNoZWNrYm94ZXMgYXJlIGNoZWNrZWQKICogIHYgPT0gWydCMScsICdCMiddCiAqCiAqICB2YXIgdiA9ICQoJ2lucHV0W3R5cGU9cmFkaW9dJykuZmllbGRWYWx1ZSgpOwogKiAgLy8gaWYgbmVpdGhlciByYWRpbyBpcyBjaGVja2VkCiAqICB2ID09PSB1bmRlZmluZWQKICogIC8vIGlmIGZpcnN0IHJhZGlvIGlzIGNoZWNrZWQKICogIHYgPT0gWydDMSddCiAqCiAqIFRoZSBzdWNjZXNzZnVsIGFyZ3VtZW50IGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBmaWVsZCBlbGVtZW50IG11c3QgYmUgJ3N1Y2Nlc3NmdWwnCiAqIChwZXIgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNzdWNjZXNzZnVsLWNvbnRyb2xzKS4KICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHN1Y2Nlc3NmdWwgYXJndW1lbnQgaXMgdHJ1ZS4gIElmIHRoaXMgdmFsdWUgaXMgZmFsc2UgdGhlIHZhbHVlKHMpCiAqIGZvciBlYWNoIGVsZW1lbnQgaXMgcmV0dXJuZWQuCiAqCiAqIE5vdGU6IFRoaXMgbWV0aG9kICphbHdheXMqIHJldHVybnMgYW4gYXJyYXkuICBJZiBubyB2YWxpZCB2YWx1ZSBjYW4gYmUgZGV0ZXJtaW5lZCB0aGUKICogICAgYXJyYXkgd2lsbCBiZSBlbXB0eSwgb3RoZXJ3aXNlIGl0IHdpbGwgY29udGFpbiBvbmUgb3IgbW9yZSB2YWx1ZXMuCiAqLwokLmZuLmZpZWxkVmFsdWUgPSBmdW5jdGlvbihzdWNjZXNzZnVsKSB7CiAgICBmb3IgKHZhciB2YWw9W10sIGk9MCwgbWF4PXRoaXMubGVuZ3RoOyBpIDwgbWF4OyBpKyspIHsKICAgICAgICB2YXIgZWwgPSB0aGlzW2ldOwogICAgICAgIHZhciB2ID0gJC5maWVsZFZhbHVlKGVsLCBzdWNjZXNzZnVsKTsKICAgICAgICBpZiAodiA9PT0gbnVsbCB8fCB0eXBlb2YgdiA9PSAndW5kZWZpbmVkJyB8fCAodi5jb25zdHJ1Y3RvciA9PSBBcnJheSAmJiAhdi5sZW5ndGgpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAodi5jb25zdHJ1Y3RvciA9PSBBcnJheSkKICAgICAgICAgICAgJC5tZXJnZSh2YWwsIHYpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFsLnB1c2godik7CiAgICB9CiAgICByZXR1cm4gdmFsOwp9OwoKLyoqCiAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBlbGVtZW50LgogKi8KJC5maWVsZFZhbHVlID0gZnVuY3Rpb24oZWwsIHN1Y2Nlc3NmdWwpIHsKICAgIHZhciBuID0gZWwubmFtZSwgdCA9IGVsLnR5cGUsIHRhZyA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIGlmIChzdWNjZXNzZnVsID09PSB1bmRlZmluZWQpIHsKICAgICAgICBzdWNjZXNzZnVsID0gdHJ1ZTsKICAgIH0KCiAgICBpZiAoc3VjY2Vzc2Z1bCAmJiAoIW4gfHwgZWwuZGlzYWJsZWQgfHwgdCA9PSAncmVzZXQnIHx8IHQgPT0gJ2J1dHRvbicgfHwKICAgICAgICAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgJiYgIWVsLmNoZWNrZWQgfHwKICAgICAgICAodCA9PSAnc3VibWl0JyB8fCB0ID09ICdpbWFnZScpICYmIGVsLmZvcm0gJiYgZWwuZm9ybS5jbGsgIT0gZWwgfHwKICAgICAgICB0YWcgPT0gJ3NlbGVjdCcgJiYgZWwuc2VsZWN0ZWRJbmRleCA9PSAtMSkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKHRhZyA9PSAnc2VsZWN0JykgewogICAgICAgIHZhciBpbmRleCA9IGVsLnNlbGVjdGVkSW5kZXg7CiAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIGEgPSBbXSwgb3BzID0gZWwub3B0aW9uczsKICAgICAgICB2YXIgb25lID0gKHQgPT0gJ3NlbGVjdC1vbmUnKTsKICAgICAgICB2YXIgbWF4ID0gKG9uZSA/IGluZGV4KzEgOiBvcHMubGVuZ3RoKTsKICAgICAgICBmb3IodmFyIGk9KG9uZSA/IGluZGV4IDogMCk7IGkgPCBtYXg7IGkrKykgewogICAgICAgICAgICB2YXIgb3AgPSBvcHNbaV07CiAgICAgICAgICAgIGlmIChvcC5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgdmFyIHYgPSBvcC52YWx1ZTsKICAgICAgICAgICAgICAgIGlmICghdikgeyAvLyBleHRyYSBwYWluIGZvciBJRS4uLgogICAgICAgICAgICAgICAgICAgIHYgPSAob3AuYXR0cmlidXRlcyAmJiBvcC5hdHRyaWJ1dGVzWyd2YWx1ZSddICYmICEob3AuYXR0cmlidXRlc1sndmFsdWUnXS5zcGVjaWZpZWQpKSA/IG9wLnRleHQgOiBvcC52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGEucHVzaCh2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYTsKICAgIH0KICAgIHJldHVybiAkKGVsKS52YWwoKTsKfTsKCi8qKgogKiBDbGVhcnMgdGhlIGZvcm0gZGF0YS4gIFRha2VzIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBvbiB0aGUgZm9ybSdzIGlucHV0IGZpZWxkczoKICogIC0gaW5wdXQgdGV4dCBmaWVsZHMgd2lsbCBoYXZlIHRoZWlyICd2YWx1ZScgcHJvcGVydHkgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcKICogIC0gc2VsZWN0IGVsZW1lbnRzIHdpbGwgaGF2ZSB0aGVpciAnc2VsZWN0ZWRJbmRleCcgcHJvcGVydHkgc2V0IHRvIC0xCiAqICAtIGNoZWNrYm94IGFuZCByYWRpbyBpbnB1dHMgd2lsbCBoYXZlIHRoZWlyICdjaGVja2VkJyBwcm9wZXJ0eSBzZXQgdG8gZmFsc2UKICogIC0gaW5wdXRzIG9mIHR5cGUgc3VibWl0LCBidXR0b24sIHJlc2V0LCBhbmQgaGlkZGVuIHdpbGwgKm5vdCogYmUgZWZmZWN0ZWQKICogIC0gYnV0dG9uIGVsZW1lbnRzIHdpbGwgKm5vdCogYmUgZWZmZWN0ZWQKICovCiQuZm4uY2xlYXJGb3JtID0gZnVuY3Rpb24oaW5jbHVkZUhpZGRlbikgewogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAkKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEnLCB0aGlzKS5jbGVhckZpZWxkcyhpbmNsdWRlSGlkZGVuKTsKICAgIH0pOwp9OwoKLyoqCiAqIENsZWFycyB0aGUgc2VsZWN0ZWQgZm9ybSBlbGVtZW50cy4KICovCiQuZm4uY2xlYXJGaWVsZHMgPSAkLmZuLmNsZWFySW5wdXRzID0gZnVuY3Rpb24oaW5jbHVkZUhpZGRlbikgewogICAgdmFyIHJlID0gL14oPzpjb2xvcnxkYXRlfGRhdGV0aW1lfGVtYWlsfG1vbnRofG51bWJlcnxwYXNzd29yZHxyYW5nZXxzZWFyY2h8dGVsfHRleHR8dGltZXx1cmx8d2VlaykkL2k7IC8vICdoaWRkZW4nIGlzIG5vdCBpbiB0aGlzIGxpc3QKICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHQgPSB0aGlzLnR5cGUsIHRhZyA9IHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmIChyZS50ZXN0KHQpIHx8IHRhZyA9PSAndGV4dGFyZWEnKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgewogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGFnID09ICdzZWxlY3QnKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IC0xOwogICAgICAgIH0KCQllbHNlIGlmICh0ID09ICJmaWxlIikgewoJCQlpZiAoJC5icm93c2VyLm1zaWUpIHsKCQkJCSQodGhpcykucmVwbGFjZVdpdGgoJCh0aGlzKS5jbG9uZSgpKTsKCQkJfSBlbHNlIHsKCQkJCSQodGhpcykudmFsKCcnKTsKCQkJfQoJCX0KICAgICAgICBlbHNlIGlmIChpbmNsdWRlSGlkZGVuKSB7CiAgICAgICAgICAgIC8vIGluY2x1ZGVIaWRkZW4gY2FuIGJlIHRoZSB2YWx1ZSB0cnVlLCBvciBpdCBjYW4gYmUgYSBzZWxlY3RvciBzdHJpbmcKICAgICAgICAgICAgLy8gaW5kaWNhdGluZyBhIHNwZWNpYWwgdGVzdDsgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIC8vICAkKCcjbXlGb3JtJykuY2xlYXJGb3JtKCcuc3BlY2lhbDpoaWRkZW4nKQogICAgICAgICAgICAvLyB0aGUgYWJvdmUgd291bGQgY2xlYW4gaGlkZGVuIGlucHV0cyB0aGF0IGhhdmUgdGhlIGNsYXNzIG9mICdzcGVjaWFsJwogICAgICAgICAgICBpZiAoIChpbmNsdWRlSGlkZGVuID09PSB0cnVlICYmIC9oaWRkZW4vLnRlc3QodCkpIHx8CiAgICAgICAgICAgICAgICAgKHR5cGVvZiBpbmNsdWRlSGlkZGVuID09ICdzdHJpbmcnICYmICQodGhpcykuaXMoaW5jbHVkZUhpZGRlbikpICkKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAnJzsKICAgICAgICB9CiAgICB9KTsKfTsKCi8qKgogKiBSZXNldHMgdGhlIGZvcm0gZGF0YS4gIENhdXNlcyBhbGwgZm9ybSBlbGVtZW50cyB0byBiZSByZXNldCB0byB0aGVpciBvcmlnaW5hbCB2YWx1ZS4KICovCiQuZm4ucmVzZXRGb3JtID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIC8vIGd1YXJkIGFnYWluc3QgYW4gaW5wdXQgd2l0aCB0aGUgbmFtZSBvZiAncmVzZXQnCiAgICAgICAgLy8gbm90ZSB0aGF0IElFIHJlcG9ydHMgdGhlIHJlc2V0IGZ1bmN0aW9uIGFzIGFuICdvYmplY3QnCiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnJlc2V0ID09ICdmdW5jdGlvbicgfHwgKHR5cGVvZiB0aGlzLnJlc2V0ID09ICdvYmplY3QnICYmICF0aGlzLnJlc2V0Lm5vZGVUeXBlKSkgewogICAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgfQogICAgfSk7Cn07CgovKioKICogRW5hYmxlcyBvciBkaXNhYmxlcyBhbnkgbWF0Y2hpbmcgZWxlbWVudHMuCiAqLwokLmZuLmVuYWJsZSA9IGZ1bmN0aW9uKGIpIHsKICAgIGlmIChiID09PSB1bmRlZmluZWQpIHsKICAgICAgICBiID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kaXNhYmxlZCA9ICFiOwogICAgfSk7Cn07CgovKioKICogQ2hlY2tzL3VuY2hlY2tzIGFueSBtYXRjaGluZyBjaGVja2JveGVzIG9yIHJhZGlvIGJ1dHRvbnMgYW5kCiAqIHNlbGVjdHMvZGVzZWxlY3RzIGFuZCBtYXRjaGluZyBvcHRpb24gZWxlbWVudHMuCiAqLwokLmZuLnNlbGVjdGVkID0gZnVuY3Rpb24oc2VsZWN0KSB7CiAgICBpZiAoc2VsZWN0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICBzZWxlY3QgPSB0cnVlOwogICAgfQogICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdCA9IHRoaXMudHlwZTsKICAgICAgICBpZiAodCA9PSAnY2hlY2tib3gnIHx8IHQgPT0gJ3JhZGlvJykgewogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBzZWxlY3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdvcHRpb24nKSB7CiAgICAgICAgICAgIHZhciAkc2VsID0gJCh0aGlzKS5wYXJlbnQoJ3NlbGVjdCcpOwogICAgICAgICAgICBpZiAoc2VsZWN0ICYmICRzZWxbMF0gJiYgJHNlbFswXS50eXBlID09ICdzZWxlY3Qtb25lJykgewogICAgICAgICAgICAgICAgLy8gZGVzZWxlY3QgYWxsIG90aGVyIG9wdGlvbnMKICAgICAgICAgICAgICAgICRzZWwuZmluZCgnb3B0aW9uJykuc2VsZWN0ZWQoZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBzZWxlY3Q7CiAgICAgICAgfQogICAgfSk7Cn07CgovLyBleHBvc2UgZGVidWcgdmFyCiQuZm4uYWpheFN1Ym1pdC5kZWJ1ZyA9IGZhbHNlOwoKLy8gaGVscGVyIGZuIGZvciBjb25zb2xlIGxvZ2dpbmcKZnVuY3Rpb24gbG9nKCkgewogICAgaWYgKCEkLmZuLmFqYXhTdWJtaXQuZGVidWcpIAogICAgICAgIHJldHVybjsKICAgIHZhciBtc2cgPSAnW2pxdWVyeS5mb3JtXSAnICsgQXJyYXkucHJvdG90eXBlLmpvaW4uY2FsbChhcmd1bWVudHMsJycpOwogICAgaWYgKHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLmxvZykgewogICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhtc2cpOwogICAgfQogICAgZWxzZSBpZiAod2luZG93Lm9wZXJhICYmIHdpbmRvdy5vcGVyYS5wb3N0RXJyb3IpIHsKICAgICAgICB3aW5kb3cub3BlcmEucG9zdEVycm9yKG1zZyk7CiAgICB9Cn0KCn0pKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/jquery.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/jquery.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LTEuMTEuMy5taW4uanMnLCdqcXVlcnktbWlncmF0ZS0xLjIuMS5taW4uanMnKTsKJGluZm9bJ2pzX25vbWluaWZ5J10gPSAxOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/jquery.lib/jquery-1.11.3.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMyIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW0udHlwZShhKXx8YS5ub2RlVHlwZXx8bS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYoay5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZtLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UobywibXMtIikucmVwbGFjZShwLHEpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cihhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShuLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihyKE9iamVjdChhKSk/bS5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXIoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9ZiksbS5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG0uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omt9KSxtLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHIoYSl7dmFyIGI9Imxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW0udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bS5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgcz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1oYSgpLHo9aGEoKSxBPWhhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj1NLnJlcGxhY2UoInciLCJ3IyIpLE89IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitOKyIpKXwpIitMKyIqXFxdIixQPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTysiKSopfC4qKVxcKXwpIixRPW5ldyBSZWdFeHAoTCsiKyIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxVPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoIl4iK04rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1ApLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYT0vWyt+XS8sYmE9Lyd8XFwvZyxjYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksZGE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGVhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2EoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3JhKG9bbF0pO3c9YWEudGVzdChhKSYmcGEoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGhhKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGphKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gaWEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYShhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Euc3VwcG9ydD17fSxmPWdhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWdhLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1nLmRvY3VtZW50RWxlbWVudCxlPWcuZGVmYXVsdFZpZXcsZSYmZSE9PWUudG9wJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixlYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGVhKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZy5nZXRFbGVtZW50c0J5TmFtZXx8IWcuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZy5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXGZdJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksamEoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZqYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUCl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGEoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xhKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdhKGEsbnVsbCxudWxsLGIpfSxnYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSwiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFwfHxyJiZyLnRlc3QoYil8fHEmJnEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGdhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGdhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZ2EuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGdhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZ2EudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1nYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzppYSxtYXRjaDpYLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2EsZGEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGNhLGRhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2EuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZ2EuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2EuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShRLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7az1xW3VdfHwocVt1XT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLG09alswXT09PXcmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3csbixtXTticmVha319ZWxzZSBpZihzJiYoaj0oYlt1XXx8KGJbdV09e30pKVthXSkmJmpbMF09PT13KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJihzJiYoKGxbdV18fChsW3VdPXt9KSlbYV09W3csbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aWEoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczppYShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGdhKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGNhLGRhKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzppYShmdW5jdGlvbihhKXtyZXR1cm4gVy50ZXN0KGF8fCIiKXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2EoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5hKGIpO2Z1bmN0aW9uIHFhKCl7fXFhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWEsZz1nYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXsoIWN8fChlPVMuZXhlYyhoKSkpJiYoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1ULmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFIsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbdV18fChiW3VdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiB0YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB1YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB2YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHdhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXdhKGQpKSxlJiYhZVt1XSYmKGU9d2EoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dWEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1zYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2EodGEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdhKGk+MSYmdGEobSksaT4xJiZyYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFIsIiQxIiksYyxlPmkmJnhhKGEuc2xpY2UoaSxlKSksZj5lJiZ4YShhPWEuc2xpY2UoZSkpLGY+ZSYmcmEoYSkpfW0ucHVzaChjKX1yZXR1cm4gdGEobSl9ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbSxvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZhKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eGEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHlhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGFhLnRlc3QoalswXS50eXBlKSYmcGEoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTttLmZpbmQ9cyxtLmV4cHI9cy5zZWxlY3RvcnMsbS5leHByWyI6Il09bS5leHByLnBzZXVkb3MsbS51bmlxdWU9cy51bmlxdWVTb3J0LG0udGV4dD1zLmdldFRleHQsbS5pc1hNTERvYz1zLmlzWE1MLG0uY29udGFpbnM9cy5jb250YWluczt2YXIgdD1tLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx2PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gdyhhLGIsYyl7aWYobS5pc0Z1bmN0aW9uKGIpKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih2LnRlc3QoYikpcmV0dXJuIG0uZmlsdGVyKGIsYSxjKTtiPW0uZmlsdGVyKGIsYSl9cmV0dXJuIG0uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBtLmluQXJyYXkoYSxiKT49MCE9PWN9KX1tLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9tLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm0uZmluZC5tYXRjaGVzKGEsbS5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxtLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobShhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobS5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyltLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9tLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhdyh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdC50ZXN0KGEpP20oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgeCx5PWEuZG9jdW1lbnQsej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bS5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YS5jaGFyQXQoMCkmJiI+Ij09PWEuY2hhckF0KGEubGVuZ3RoLTEpJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx4KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBtP2JbMF06YixtLm1lcmdlKHRoaXMsbS5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8Yjp5LCEwKSksdS50ZXN0KGNbMV0pJiZtLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiltLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31pZihkPXkuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlKXtpZihkLmlkIT09Y1syXSlyZXR1cm4geC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1kfXJldHVybiB0aGlzLmNvbnRleHQ9eSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIHgucmVhZHk/eC5yZWFkeShhKTphKG0pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG0ubWFrZUFycmF5KGEsdGhpcykpfTtBLnByb3RvdHlwZT1tLmZuLHg9bSh5KTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxDPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O20uZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9YVtiXTt3aGlsZShlJiY5IT09ZS5ub2RlVHlwZSYmKHZvaWQgMD09PWN8fDEhPT1lLm5vZGVUeXBlfHwhbShlKS5pcyhjKSkpMT09PWUubm9kZVR5cGUmJmQucHVzaChlKSxlPWVbYl07cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbS5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW0oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihtLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dC50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bShhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbS5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP20udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/bS5pbkFycmF5KHRoaXNbMF0sbShhKSk6bS5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtLnVuaXF1ZShtLm1lcmdlKHRoaXMuZ2V0KCksbShhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1tLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50Om0ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW0ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bS5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKENbYV18fChlPW0udW5pcXVlKGUpKSxCLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBtLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1tLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJpbmciPT10eXBlb2YgYT9GW2FdfHxHKGEpOm0uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYz1hLm1lbW9yeSYmbCxkPSEwLGY9Z3x8MCxnPTAsZT1oLmxlbmd0aCxiPSEwO2gmJmU+ZjtmKyspaWYoaFtmXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9Yj0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmM/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBkPWgubGVuZ3RoOyFmdW5jdGlvbiBmKGIpe20uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bS50eXBlKGMpOyJmdW5jdGlvbiI9PT1kP2EudW5pcXVlJiZrLmhhcyhjKXx8aC5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PWQmJmYoYyl9KX0oYXJndW1lbnRzKSxiP2U9aC5sZW5ndGg6YyYmKGc9ZCxqKGMpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm0uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxjKXt2YXIgZDt3aGlsZSgoZD1tLmluQXJyYXkoYyxoLGQpKT4tMSloLnNwbGljZShkLDEpLGImJihlPj1kJiZlLS0sZj49ZCYmZi0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9tLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGU9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1jPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGN8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGMpe3JldHVybiFofHxkJiYhaXx8KGM9Y3x8W10sYz1bYSxjLnNsaWNlP2Muc2xpY2UoKTpjXSxiP2kucHVzaChjKTpqKGMpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFkfX07cmV0dXJuIGt9LG0uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixtLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixtLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG0uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bS5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1tLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bS5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixtLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbS5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTptLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm0uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDttLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBtLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP20ucmVhZHlXYWl0Kys6bS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8hLS1tLnJlYWR5V2FpdDohbS5pc1JlYWR5KXtpZigheS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KG0ucmVhZHkpO20uaXNSZWFkeT0hMCxhIT09ITAmJi0tbS5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgoeSxbbV0pLG0uZm4udHJpZ2dlckhhbmRsZXImJihtKHkpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG0oeSkub2ZmKCJyZWFkeSIpKSl9fX0pO2Z1bmN0aW9uIEkoKXt5LmFkZEV2ZW50TGlzdGVuZXI/KHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSiwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixKLCExKSk6KHkuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSiksYS5kZXRhY2hFdmVudCgib25sb2FkIixKKSl9ZnVuY3Rpb24gSigpeyh5LmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWV2ZW50LnR5cGV8fCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpJiYoSSgpLG0ucmVhZHkoKSl9bS5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe2lmKCFIKWlmKEg9bS5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpc2V0VGltZW91dChtLnJlYWR5KTtlbHNlIGlmKHkuYWRkRXZlbnRMaXN0ZW5lcil5LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSk7ZWxzZXt5LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsSik7dmFyIGM9ITE7dHJ5e2M9bnVsbD09YS5mcmFtZUVsZW1lbnQmJnkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKGQpe31jJiZjLmRvU2Nyb2xsJiYhZnVuY3Rpb24gZSgpe2lmKCFtLmlzUmVhZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7cmV0dXJuIHNldFRpbWVvdXQoZSw1MCl9SSgpLG0ucmVhZHkoKX19KCl9cmV0dXJuIEgucHJvbWlzZShiKX07dmFyIEs9InVuZGVmaW5lZCIsTDtmb3IoTCBpbiBtKGspKWJyZWFrO2sub3duTGFzdD0iMCIhPT1MLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxtKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Yz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChkKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09SyYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChkKSl9KSxmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYobnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2goYil7ay5kZWxldGVFeHBhbmRvPSExfX1hPW51bGx9KCksbS5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3ZhciBiPW0ubm9EYXRhWyhhLm5vZGVOYW1lKyIgIikudG9Mb3dlckNhc2UoKV0sYz0rYS5ub2RlVHlwZXx8MTtyZXR1cm4gMSE9PWMmJjkhPT1jPyExOiFifHxiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifTt2YXIgTT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLE49LyhbQS1aXSkvZztmdW5jdGlvbiBPKGEsYixjKXtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSl7dmFyIGQ9ImRhdGEtIitiLnJlcGxhY2UoTiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZihjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk0udGVzdChjKT9tLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31tLmRhdGEoYSxiLGMpfWVsc2UgYz12b2lkIDB9cmV0dXJuIGN9ZnVuY3Rpb24gUChhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbS5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExOwoKcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpewpyZXR1cm4gbmV3IFphLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bS5Ud2Vlbj1aYSxaYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlphLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChtLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9Yj1tLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1iPWEsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmIrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYyYmYy5zZXQ/Yy5zZXQodGhpcyk6WmEucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWmEucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVphLnByb3RvdHlwZSxaYS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG51bGw9PWEuZWxlbVthLnByb3BdfHxhLmVsZW0uc3R5bGUmJm51bGwhPWEuZWxlbS5zdHlsZVthLnByb3BdPyhiPW0uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe20uZnguc3RlcFthLnByb3BdP20uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVttLmNzc1Byb3BzW2EucHJvcF1dfHxtLmNzc0hvb2tzW2EucHJvcF0pP20uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LFphLnByb3BIb29rcy5zY3JvbGxUb3A9WmEucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbS5meD1aYS5wcm90b3R5cGUuaW5pdCxtLmZ4LnN0ZXA9e307dmFyICRhLF9hLGFiPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxiYj1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrUysiKShbYS16JV0qKSQiLCJpIiksY2I9L3F1ZXVlSG9va3MkLyxkYj1baWJdLGViPXsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGQ9Yy5jdXIoKSxlPWJiLmV4ZWMoYiksZj1lJiZlWzNdfHwobS5jc3NOdW1iZXJbYV0/IiI6InB4IiksZz0obS5jc3NOdW1iZXJbYV18fCJweCIhPT1mJiYrZCkmJmJiLmV4ZWMobS5jc3MoYy5lbGVtLGEpKSxoPTEsaT0yMDtpZihnJiZnWzNdIT09Zil7Zj1mfHxnWzNdLGU9ZXx8W10sZz0rZHx8MTtkbyBoPWh8fCIuNSIsZy89aCxtLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBmYigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGE9dm9pZCAwfSksJGE9bS5ub3coKX1mdW5jdGlvbiBnYihhLGIpe3ZhciBjLGQ9e2hlaWdodDphfSxlPTA7Zm9yKGI9Yj8xOjA7ND5lO2UrPTItYiljPVRbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBoYihhLGIsYyl7Zm9yKHZhciBkLGU9KGViW2JdfHxbXSkuY29uY2F0KGViWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIGliKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixsLG49dGhpcyxvPXt9LHA9YS5zdHlsZSxxPWEubm9kZVR5cGUmJlUoYSkscj1tLl9kYXRhKGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW0uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG0ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLGo9bS5jc3MoYSwiZGlzcGxheSIpLGw9Im5vbmUiPT09aj9tLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8RmEoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWwmJiJub25lIj09PW0uY3NzKGEsImZsb2F0IikmJihrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09RmEoYS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsay5zaHJpbmtXcmFwQmxvY2tzKCl8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxhYi5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHE/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFyfHx2b2lkIDA9PT1yW2RdKWNvbnRpbnVlO3E9ITB9b1tkXT1yJiZyW2RdfHxtLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihtLmlzRW1wdHlPYmplY3QobykpImlubGluZSI9PT0oIm5vbmUiPT09aj9GYShhLm5vZGVOYW1lKTpqKSYmKHAuZGlzcGxheT1qKTtlbHNle3I/ImhpZGRlbiJpbiByJiYocT1yLmhpZGRlbik6cj1tLl9kYXRhKGEsImZ4c2hvdyIse30pLGYmJihyLmhpZGRlbj0hcSkscT9tKGEpLnNob3coKTpuLmRvbmUoZnVuY3Rpb24oKXttKGEpLmhpZGUoKX0pLG4uZG9uZShmdW5jdGlvbigpe3ZhciBiO20uX3JlbW92ZURhdGEoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbyltLnN0eWxlKGEsYixvW2JdKX0pO2ZvcihkIGluIG8pZz1oYihxP3JbZF06MCxkLG4pLGQgaW4gcnx8KHJbZF09Zy5zdGFydCxxJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIGpiKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bS5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxtLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW0uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24ga2IoYSxiLGMpe3ZhciBkLGUsZj0wLGc9ZGIubGVuZ3RoLGg9bS5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9JGF8fGZiKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm0uZXh0ZW5kKHt9LGIpLG9wdHM6bS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTokYXx8ZmIoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW0uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKGpiKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1kYltmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG0ubWFwKGssaGIsaiksbS5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbS5meC50aW1lcihtLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1tLkFuaW1hdGlvbj1tLmV4dGVuZChrYix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe20uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxlYltjXT1lYltjXXx8W10sZWJbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9kYi51bnNoaWZ0KGEpOmRiLnB1c2goYSl9fSksbS5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP20uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bS5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFtLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW0uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBtLmZ4LnNwZWVkcz9tLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTptLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bS5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZtLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoVSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5pc0VtcHR5T2JqZWN0KGEpLGY9bS5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsbS5leHRlbmQoe30sYSksZik7KGV8fG0uX2RhdGEodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1tLnRpbWVycyxnPW0uX2RhdGEodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmY2IudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZtLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1tLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1tLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbS5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxtLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bS5mbltiXTttLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ2IoYiwhMCksYSxkLGUpfX0pLG0uZWFjaCh7c2xpZGVEb3duOmdiKCJzaG93Iiksc2xpZGVVcDpnYigiaGlkZSIpLHNsaWRlVG9nZ2xlOmdiKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxtLnRpbWVycz1bXSxtLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW0udGltZXJzLGM9MDtmb3IoJGE9bS5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxtLmZ4LnN0b3AoKSwkYT12b2lkIDB9LG0uZngudGltZXI9ZnVuY3Rpb24oYSl7bS50aW1lcnMucHVzaChhKSxhKCk/bS5meC5zdGFydCgpOm0udGltZXJzLnBvcCgpfSxtLmZ4LmludGVydmFsPTEzLG0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtfYXx8KF9hPXNldEludGVydmFsKG0uZngudGljayxtLmZ4LmludGVydmFsKSl9LG0uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoX2EpLF9hPW51bGx9LG0uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG0uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1tLmZ4P20uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPXkuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZT1jLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxkLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGsuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWIuY2xhc3NOYW1lLGsuc3R5bGU9L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksay5ocmVmTm9ybWFsaXplZD0iL2EiPT09ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxrLmNoZWNrT249ISFhLnZhbHVlLGsub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCxrLmVuY3R5cGU9ISF5LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGMuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hZS5kaXNhYmxlZCxhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxrLmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBsYj0vXHIvZzttLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bS5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG0odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjptLmlzQXJyYXkoZSkmJihlPW0ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW0udmFsSG9va3NbdGhpcy50eXBlXXx8bS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW0udmFsSG9va3NbZS50eXBlXXx8bS52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UobGIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG0uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm0udHJpbShtLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZtLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bShjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW0ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxtLmluQXJyYXkobS52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uaXNBcnJheShiKT9hLmNoZWNrZWQ9bS5pbkFycmF5KG0oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBtYixuYixvYj1tLmV4cHIuYXR0ckhhbmRsZSxwYj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHFiPWsuZ2V0U2V0QXR0cmlidXRlLHJiPWsuaW5wdXQ7bS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09Sz9tLnByb3AoYSxiLGMpOigxPT09ZiYmbS5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bS5hdHRySG9va3NbYl18fChtLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP25iOm1iKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW0uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBtLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1tLnByb3BGaXhbY118fGMsbS5leHByLm1hdGNoLmJvb2wudGVzdChjKT9yYiYmcWJ8fCFwYi50ZXN0KGMpP2FbZF09ITE6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm0uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHFiP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm0ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksbmI9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9tLnJlbW92ZUF0dHIoYSxjKTpyYiYmcWJ8fCFwYi50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFxYiYmbS5wcm9wRml4W2NdfHxjLGMpOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbS5lYWNoKG0uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9b2JbYl18fG0uZmluZC5hdHRyO29iW2JdPXJiJiZxYnx8IXBiLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPW9iW2JdLG9iW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxvYltiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSkscmImJnFifHwobS5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm1iJiZtYi5zZXQoYSxiLGMpfX0pLHFifHwobWI9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxvYi5pZD1vYi5uYW1lPW9iLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG0udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bWIuc2V0fSxtLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bWIuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxtLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bS5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGsuc3R5bGV8fChtLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciBzYj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx0Yj0vXig/OmF8YXJlYSkkL2k7bS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1tLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxtLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW0uaXNYTUxEb2MoYSksZiYmKGI9bS5wcm9wRml4W2JdfHxiLGU9bS5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6c2IudGVzdChhLm5vZGVOYW1lKXx8dGIudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxrLmhyZWZOb3JtYWxpemVkfHxtLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXttLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxrLm9wdFNlbGVjdGVkfHwobS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxtLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe20ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxrLmVuY3R5cGV8fChtLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdWI9L1tcdFxyXG5cZl0vZzttLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW0udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP20udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXttKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1tKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09S3x8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjptLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHZiPW0ubm93KCksd2I9L1w/Lyx4Yj0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO20ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bS50cmltKGIrIiIpO3JldHVybiBlJiYhbS50cmltKGUucmVwbGFjZSh4YixmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTptLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG0ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHliLHpiLEFiPS8jLiokLyxCYj0vKFs/Jl0pXz1bXiZdKi8sQ2I9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxEYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxFYj0vXig/OkdFVHxIRUFEKSQvLEZiPS9eXC9cLy8sR2I9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSGI9e30sSWI9e30sSmI9IiovIi5jb25jYXQoIioiKTt0cnl7emI9bG9jYXRpb24uaHJlZn1jYXRjaChLYil7emI9eS5jcmVhdGVFbGVtZW50KCJhIiksemIuaHJlZj0iIix6Yj16Yi5ocmVmfXliPUdiLmV4ZWMoemIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIExiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihtLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SWI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxtLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBOYihhLGIpe3ZhciBjLGQsZT1tLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZtLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gT2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1tLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6emIsdHlwZToiR0VUIixpc0xvY2FsOkRiLnRlc3QoeWJbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SmIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjptLnBhcnNlSlNPTiwidGV4dCB4bWwiOm0ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP05iKE5iKGEsbS5hamF4U2V0dGluZ3MpLGIpOk5iKG0uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOkxiKEhiKSxhamF4VHJhbnNwb3J0OkxiKEliKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1tLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxuPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9tKGwpOm0uZXZlbnQsbz1tLkRlZmVycmVkKCkscD1tLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPUNiLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fHpiKSsiIikucmVwbGFjZShBYiwiIikucmVwbGFjZShGYix5YlsxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1tLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUdiLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09eWJbMV0mJmNbMl09PT15YlsyXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oeWJbM118fCgiaHR0cDoiPT09eWJbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1tLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTWIoSGIsayxiLHYpLDI9PT10KXJldHVybiB2O2g9bS5ldmVudCYmay5nbG9iYWwsaCYmMD09PW0uYWN0aXZlKysmJm0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRWIudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHdiLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUJiLnRlc3QoZSk/ZS5yZXBsYWNlKEJiLCIkMV89Iit2YisrKTplKyh3Yi50ZXN0KGUpPyImIjoiPyIpKyJfPSIrdmIrKykpLGsuaWZNb2RpZmllZCYmKG0ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixtLmxhc3RNb2RpZmllZFtlXSksbS5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG0uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0piKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1NYihJYixrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm4udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PU9iKGssdixjKSksdT1QYihrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobS5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG0uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZuLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihuLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbS5hY3RpdmV8fG0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG0uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG0uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG0uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW0oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXttKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bSh0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1tLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXttKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bS5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG0odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG0uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFrLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxtLmNzcyhhLCJkaXNwbGF5IikpfSxtLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFtLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBRYj0vJTIwL2csUmI9L1xbXF0kLyxTYj0vXHI/XG4vZyxUYj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVWI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFZiKGEsYixjLGQpe3ZhciBlO2lmKG0uaXNBcnJheShiKSltLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFJiLnRlc3QoYSk/ZChhLGUpOlZiKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1tLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilWYihhKyJbIitlKyJdIixiW2VdLGMsZCl9bS5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bS5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW0uYWpheFNldHRpbmdzJiZtLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbS5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW0uaXNQbGFpbk9iamVjdChhKSltLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVZiKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFFiLCIrIil9LG0uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW0ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP20ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW0odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZVYi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVGIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVcudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1tKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bS5pc0FycmF5KGMpP20ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShTYiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoU2IsIlxyXG4iKX19KS5nZXQoKX19KSxtLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmWmIoKXx8JGIoKX06WmI7dmFyIFdiPTAsWGI9e30sWWI9bS5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFhiKVhiW2FdKHZvaWQgMCwhMCl9KSxrLmNvcnM9ISFZYiYmIndpdGhDcmVkZW50aWFscyJpbiBZYixZYj1rLmFqYXg9ISFZYixZYiYmbS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxrLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytXYjtpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFhiW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW0ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WGJbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gWmIoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gJGIoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1tLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBtLmdsb2JhbEV2YWwoYSksYX19fSksbS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXkuaGVhZHx8bSgiaGVhZCIpWzBdfHx5LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9eS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgX2I9W10sYWM9Lyg9KVw/KD89JnwkKXxcP1w/LzttLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9X2IucG9wKCl8fG0uZXhwYW5kbysiXyIrdmIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG0uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGFjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYWMudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW0uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGFjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh3Yi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bS5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssX2IucHVzaChlKSksZyYmbS5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbS5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHk7dmFyIGQ9dS5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW0uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbShlKS5yZW1vdmUoKSxtLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgYmM9bS5mbi5sb2FkO20uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZiYylyZXR1cm4gYmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bS50cmltKGEuc2xpY2UoaCxhLmxlbmd0aCkpLGE9YS5zbGljZSgwLGgpKSxtLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZj0iUE9TVCIpLGcubGVuZ3RoPjAmJm0uYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2U9YXJndW1lbnRzLGcuaHRtbChkP20oIjxkaXY+IikuYXBwZW5kKG0ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxlfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxtLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxtLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbS5ncmVwKG0udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgY2M9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gZGMoYSl7cmV0dXJuIG0uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1tLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW0uY3NzKGEsInBvc2l0aW9uIiksbD1tKGEpLG49e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1tLmNzcyhhLCJ0b3AiKSxpPW0uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZtLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbS5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGgpKSxudWxsIT1iLnRvcCYmKG4udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG4ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG4pOmwuY3NzKG4pfX0sbS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9e3RvcDowLGxlZnQ6MH0sZT10aGlzWzBdLGY9ZSYmZS5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbS5jb250YWlucyhiLGUpPyh0eXBlb2YgZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1LJiYoZD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxjPWRjKGYpLHt0b3A6ZC50b3ArKGMucGFnZVlPZmZzZXR8fGIuc2Nyb2xsVG9wKS0oYi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhjLnBhZ2VYT2Zmc2V0fHxiLnNjcm9sbExlZnQpLShiLmNsaWVudExlZnR8fDApfSk6ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgYSxiLGM9e3RvcDowLGxlZnQ6MH0sZD10aGlzWzBdO3JldHVybiJmaXhlZCI9PT1tLmNzcyhkLCJwb3NpdGlvbiIpP2I9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxtLm5vZGVOYW1lKGFbMF0sImh0bWwiKXx8KGM9YS5vZmZzZXQoKSksYy50b3ArPW0uY3NzKGFbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksYy5sZWZ0Kz1tLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSkse3RvcDpiLnRvcC1jLnRvcC1tLmNzcyhkLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmIubGVmdC1jLmxlZnQtbS5jc3MoZCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjYzt3aGlsZShhJiYhbS5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bS5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxjY30pfX0pLG0uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO20uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9ZGMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bShmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bShmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1tiXT1MYShrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1KYShhLGIpLEhhLnRlc3QoYyk/bShhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxtLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe20uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXttLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbS5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9tLmNzcyhiLGMsZyk6bS5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxtLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG0uZm4uYW5kU2VsZj1tLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZWM9YS5qUXVlcnksZmM9YS4kO3JldHVybiBtLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW0mJihhLiQ9ZmMpLGImJmEualF1ZXJ5PT09bSYmKGEualF1ZXJ5PWVjKSxtfSx0eXBlb2YgYj09PUsmJihhLmpRdWVyeT1hLiQ9bSksbX0pOwo=]]></data>
	</file>
	<file>
	  <filename>/lib/jquery.lib/jquery-migrate-1.2.1.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBNaWdyYXRlIHYxLjIuMSB8IChjKSAyMDA1LCAyMDEzIGpRdWVyeSBGb3VuZGF0aW9uLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KalF1ZXJ5Lm1pZ3JhdGVNdXRlPT09dm9pZCAwJiYoalF1ZXJ5Lm1pZ3JhdGVNdXRlPSEwKSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihuKXt2YXIgcj10LmNvbnNvbGU7aVtuXXx8KGlbbl09ITAsZS5taWdyYXRlV2FybmluZ3MucHVzaChuKSxyJiZyLndhcm4mJiFlLm1pZ3JhdGVNdXRlJiYoci53YXJuKCJKUU1JR1JBVEU6ICIrbiksZS5taWdyYXRlVHJhY2UmJnIudHJhY2UmJnIudHJhY2UoKSkpfWZ1bmN0aW9uIGEodCxhLGksbyl7aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KXRyeXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsYSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHIobyksaX0sc2V0OmZ1bmN0aW9uKGUpe3IobyksaT1lfX0pLG59Y2F0Y2gocyl7fWUuX2RlZmluZVByb3BlcnR5QnJva2VuPSEwLHRbYV09aX12YXIgaT17fTtlLm1pZ3JhdGVXYXJuaW5ncz1bXSwhZS5taWdyYXRlTXV0ZSYmdC5jb25zb2xlJiZ0LmNvbnNvbGUubG9nJiZ0LmNvbnNvbGUubG9nKCJKUU1JR1JBVEU6IExvZ2dpbmcgaXMgYWN0aXZlIiksZS5taWdyYXRlVHJhY2U9PT1uJiYoZS5taWdyYXRlVHJhY2U9ITApLGUubWlncmF0ZVJlc2V0PWZ1bmN0aW9uKCl7aT17fSxlLm1pZ3JhdGVXYXJuaW5ncy5sZW5ndGg9MH0sIkJhY2tDb21wYXQiPT09ZG9jdW1lbnQuY29tcGF0TW9kZSYmcigialF1ZXJ5IGlzIG5vdCBjb21wYXRpYmxlIHdpdGggUXVpcmtzIE1vZGUiKTt2YXIgbz1lKCI8aW5wdXQvPiIse3NpemU6MX0pLmF0dHIoInNpemUiKSYmZS5hdHRyRm4scz1lLmF0dHIsdT1lLmF0dHJIb29rcy52YWx1ZSYmZS5hdHRySG9va3MudmFsdWUuZ2V0fHxmdW5jdGlvbigpe3JldHVybiBudWxsfSxjPWUuYXR0ckhvb2tzLnZhbHVlJiZlLmF0dHJIb29rcy52YWx1ZS5zZXR8fGZ1bmN0aW9uKCl7cmV0dXJuIG59LGw9L14oPzppbnB1dHxidXR0b24pJC9pLGQ9L15bMjM4XSQvLHA9L14oPzphdXRvZm9jdXN8YXV0b3BsYXl8YXN5bmN8Y2hlY2tlZHxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZHxzZWxlY3RlZCkkL2ksZj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pO2EoZSwiYXR0ckZuIixvfHx7fSwialF1ZXJ5LmF0dHJGbiBpcyBkZXByZWNhdGVkIiksZS5hdHRyPWZ1bmN0aW9uKHQsYSxpLHUpe3ZhciBjPWEudG9Mb3dlckNhc2UoKSxnPXQmJnQubm9kZVR5cGU7cmV0dXJuIHUmJig0PnMubGVuZ3RoJiZyKCJqUXVlcnkuZm4uYXR0ciggcHJvcHMsIHBhc3MgKSBpcyBkZXByZWNhdGVkIiksdCYmIWQudGVzdChnKSYmKG8/YSBpbiBvOmUuaXNGdW5jdGlvbihlLmZuW2FdKSkpP2UodClbYV0oaSk6KCJ0eXBlIj09PWEmJmkhPT1uJiZsLnRlc3QodC5ub2RlTmFtZSkmJnQucGFyZW50Tm9kZSYmcigiQ2FuJ3QgY2hhbmdlIHRoZSAndHlwZScgb2YgYW4gaW5wdXQgb3IgYnV0dG9uIGluIElFIDYvNy84IiksIWUuYXR0ckhvb2tzW2NdJiZwLnRlc3QoYykmJihlLmF0dHJIb29rc1tjXT17Z2V0OmZ1bmN0aW9uKHQscil7dmFyIGEsaT1lLnByb3AodCxyKTtyZXR1cm4gaT09PSEwfHwiYm9vbGVhbiIhPXR5cGVvZiBpJiYoYT10LmdldEF0dHJpYnV0ZU5vZGUocikpJiZhLm5vZGVWYWx1ZSE9PSExP3IudG9Mb3dlckNhc2UoKTpufSxzZXQ6ZnVuY3Rpb24odCxuLHIpe3ZhciBhO3JldHVybiBuPT09ITE/ZS5yZW1vdmVBdHRyKHQscik6KGE9ZS5wcm9wRml4W3JdfHxyLGEgaW4gdCYmKHRbYV09ITApLHQuc2V0QXR0cmlidXRlKHIsci50b0xvd2VyQ2FzZSgpKSkscn19LGYudGVzdChjKSYmcigialF1ZXJ5LmZuLmF0dHIoJyIrYysiJykgbWF5IHVzZSBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGF0dHJpYnV0ZSIpKSxzLmNhbGwoZSx0LGEsaSkpfSxlLmF0dHJIb29rcy52YWx1ZT17Z2V0OmZ1bmN0aW9uKGUsdCl7dmFyIG49KGUubm9kZU5hbWV8fCIiKS50b0xvd2VyQ2FzZSgpO3JldHVybiJidXR0b24iPT09bj91LmFwcGx5KHRoaXMsYXJndW1lbnRzKTooImlucHV0IiE9PW4mJiJvcHRpb24iIT09biYmcigialF1ZXJ5LmZuLmF0dHIoJ3ZhbHVlJykgbm8gbG9uZ2VyIGdldHMgcHJvcGVydGllcyIpLHQgaW4gZT9lLnZhbHVlOm51bGwpfSxzZXQ6ZnVuY3Rpb24oZSx0KXt2YXIgYT0oZS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk7cmV0dXJuImJ1dHRvbiI9PT1hP2MuYXBwbHkodGhpcyxhcmd1bWVudHMpOigiaW5wdXQiIT09YSYmIm9wdGlvbiIhPT1hJiZyKCJqUXVlcnkuZm4uYXR0cigndmFsdWUnLCB2YWwpIG5vIGxvbmdlciBzZXRzIHByb3BlcnRpZXMiKSxlLnZhbHVlPXQsbil9fTt2YXIgZyxoLHY9ZS5mbi5pbml0LG09ZS5wYXJzZUpTT04seT0vXihbXjxdKikoPFtcd1xXXSs+KShbXj5dKikkLztlLmZuLmluaXQ9ZnVuY3Rpb24odCxuLGEpe3ZhciBpO3JldHVybiB0JiYic3RyaW5nIj09dHlwZW9mIHQmJiFlLmlzUGxhaW5PYmplY3QobikmJihpPXkuZXhlYyhlLnRyaW0odCkpKSYmaVswXSYmKCI8IiE9PXQuY2hhckF0KDApJiZyKCIkKGh0bWwpIEhUTUwgc3RyaW5ncyBtdXN0IHN0YXJ0IHdpdGggJzwnIGNoYXJhY3RlciIpLGlbM10mJnIoIiQoaHRtbCkgSFRNTCB0ZXh0IGFmdGVyIGxhc3QgdGFnIGlzIGlnbm9yZWQiKSwiIyI9PT1pWzBdLmNoYXJBdCgwKSYmKHIoIkhUTUwgc3RyaW5nIGNhbm5vdCBzdGFydCB3aXRoIGEgJyMnIGNoYXJhY3RlciIpLGUuZXJyb3IoIkpRTUlHUkFURTogSW52YWxpZCBzZWxlY3RvciBzdHJpbmcgKFhTUykiKSksbiYmbi5jb250ZXh0JiYobj1uLmNvbnRleHQpLGUucGFyc2VIVE1MKT92LmNhbGwodGhpcyxlLnBhcnNlSFRNTChpWzJdLG4sITApLG4sYSk6di5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUuZm4uaW5pdC5wcm90b3R5cGU9ZS5mbixlLnBhcnNlSlNPTj1mdW5jdGlvbihlKXtyZXR1cm4gZXx8bnVsbD09PWU/bS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6KHIoImpRdWVyeS5wYXJzZUpTT04gcmVxdWlyZXMgYSB2YWxpZCBKU09OIHN0cmluZyIpLG51bGwpfSxlLnVhTWF0Y2g9ZnVuY3Rpb24oZSl7ZT1lLnRvTG93ZXJDYXNlKCk7dmFyIHQ9LyhjaHJvbWUpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8Lyh3ZWJraXQpWyBcL10oW1x3Ll0rKS8uZXhlYyhlKXx8LyhvcGVyYSkoPzouKnZlcnNpb258KVsgXC9dKFtcdy5dKykvLmV4ZWMoZSl8fC8obXNpZSkgKFtcdy5dKykvLmV4ZWMoZSl8fDA+ZS5pbmRleE9mKCJjb21wYXRpYmxlIikmJi8obW96aWxsYSkoPzouKj8gcnY6KFtcdy5dKyl8KS8uZXhlYyhlKXx8W107cmV0dXJue2Jyb3dzZXI6dFsxXXx8IiIsdmVyc2lvbjp0WzJdfHwiMCJ9fSxlLmJyb3dzZXJ8fChnPWUudWFNYXRjaChuYXZpZ2F0b3IudXNlckFnZW50KSxoPXt9LGcuYnJvd3NlciYmKGhbZy5icm93c2VyXT0hMCxoLnZlcnNpb249Zy52ZXJzaW9uKSxoLmNocm9tZT9oLndlYmtpdD0hMDpoLndlYmtpdCYmKGguc2FmYXJpPSEwKSxlLmJyb3dzZXI9aCksYShlLCJicm93c2VyIixlLmJyb3dzZXIsImpRdWVyeS5icm93c2VyIGlzIGRlcHJlY2F0ZWQiKSxlLnN1Yj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxuKXtyZXR1cm4gbmV3IHQuZm4uaW5pdChlLG4pfWUuZXh0ZW5kKCEwLHQsdGhpcyksdC5zdXBlcmNsYXNzPXRoaXMsdC5mbj10LnByb3RvdHlwZT10aGlzKCksdC5mbi5jb25zdHJ1Y3Rvcj10LHQuc3ViPXRoaXMuc3ViLHQuZm4uaW5pdD1mdW5jdGlvbihyLGEpe3JldHVybiBhJiZhIGluc3RhbmNlb2YgZSYmIShhIGluc3RhbmNlb2YgdCkmJihhPXQoYSkpLGUuZm4uaW5pdC5jYWxsKHRoaXMscixhLG4pfSx0LmZuLmluaXQucHJvdG90eXBlPXQuZm47dmFyIG49dChkb2N1bWVudCk7cmV0dXJuIHIoImpRdWVyeS5zdWIoKSBpcyBkZXByZWNhdGVkIiksdH0sZS5hamF4U2V0dXAoe2NvbnZlcnRlcnM6eyJ0ZXh0IGpzb24iOmUucGFyc2VKU09OfX0pO3ZhciBiPWUuZm4uZGF0YTtlLmZuLmRhdGE9ZnVuY3Rpb24odCl7dmFyIGEsaSxvPXRoaXNbMF07cmV0dXJuIW98fCJldmVudHMiIT09dHx8MSE9PWFyZ3VtZW50cy5sZW5ndGh8fChhPWUuZGF0YShvLHQpLGk9ZS5fZGF0YShvLHQpLGEhPT1uJiZhIT09aXx8aT09PW4pP2IuYXBwbHkodGhpcyxhcmd1bWVudHMpOihyKCJVc2Ugb2YgalF1ZXJ5LmZuLmRhdGEoJ2V2ZW50cycpIGlzIGRlcHJlY2F0ZWQiKSxpKX07dmFyIGo9L1wvKGphdmF8ZWNtYSlzY3JpcHQvaSx3PWUuZm4uYW5kU2VsZnx8ZS5mbi5hZGRCYWNrO2UuZm4uYW5kU2VsZj1mdW5jdGlvbigpe3JldHVybiByKCJqUXVlcnkuZm4uYW5kU2VsZigpIHJlcGxhY2VkIGJ5IGpRdWVyeS5mbi5hZGRCYWNrKCkiKSx3LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZS5jbGVhbnx8KGUuY2xlYW49ZnVuY3Rpb24odCxhLGksbyl7YT1hfHxkb2N1bWVudCxhPSFhLm5vZGVUeXBlJiZhWzBdfHxhLGE9YS5vd25lckRvY3VtZW50fHxhLHIoImpRdWVyeS5jbGVhbigpIGlzIGRlcHJlY2F0ZWQiKTt2YXIgcyx1LGMsbCxkPVtdO2lmKGUubWVyZ2UoZCxlLmJ1aWxkRnJhZ21lbnQodCxhKS5jaGlsZE5vZGVzKSxpKWZvcihjPWZ1bmN0aW9uKGUpe3JldHVybiFlLnR5cGV8fGoudGVzdChlLnR5cGUpP28/by5wdXNoKGUucGFyZW50Tm9kZT9lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk6ZSk6aS5hcHBlbmRDaGlsZChlKTpufSxzPTA7bnVsbCE9KHU9ZFtzXSk7cysrKWUubm9kZU5hbWUodSwic2NyaXB0IikmJmModSl8fChpLmFwcGVuZENoaWxkKHUpLHUuZ2V0RWxlbWVudHNCeVRhZ05hbWUhPT1uJiYobD1lLmdyZXAoZS5tZXJnZShbXSx1LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKSksYyksZC5zcGxpY2UuYXBwbHkoZCxbcysxLDBdLmNvbmNhdChsKSkscys9bC5sZW5ndGgpKTtyZXR1cm4gZH0pO3ZhciBRPWUuZXZlbnQuYWRkLHg9ZS5ldmVudC5yZW1vdmUsaz1lLmV2ZW50LnRyaWdnZXIsTj1lLmZuLnRvZ2dsZSxUPWUuZm4ubGl2ZSxNPWUuZm4uZGllLFM9ImFqYXhTdGFydHxhamF4U3RvcHxhamF4U2VuZHxhamF4Q29tcGxldGV8YWpheEVycm9yfGFqYXhTdWNjZXNzIixDPVJlZ0V4cCgiXFxiKD86IitTKyIpXFxiIiksSD0vKD86Xnxccylob3ZlcihcLlxTK3wpXGIvLEE9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0fHxlLmV2ZW50LnNwZWNpYWwuaG92ZXI/dDooSC50ZXN0KHQpJiZyKCInaG92ZXInIHBzZXVkby1ldmVudCBpcyBkZXByZWNhdGVkLCB1c2UgJ21vdXNlZW50ZXIgbW91c2VsZWF2ZSciKSx0JiZ0LnJlcGxhY2UoSCwibW91c2VlbnRlciQxIG1vdXNlbGVhdmUkMSIpKX07ZS5ldmVudC5wcm9wcyYmImF0dHJDaGFuZ2UiIT09ZS5ldmVudC5wcm9wc1swXSYmZS5ldmVudC5wcm9wcy51bnNoaWZ0KCJhdHRyQ2hhbmdlIiwiYXR0ck5hbWUiLCJyZWxhdGVkTm9kZSIsInNyY0VsZW1lbnQiKSxlLmV2ZW50LmRpc3BhdGNoJiZhKGUuZXZlbnQsImhhbmRsZSIsZS5ldmVudC5kaXNwYXRjaCwialF1ZXJ5LmV2ZW50LmhhbmRsZSBpcyB1bmRvY3VtZW50ZWQgYW5kIGRlcHJlY2F0ZWQiKSxlLmV2ZW50LmFkZD1mdW5jdGlvbihlLHQsbixhLGkpe2UhPT1kb2N1bWVudCYmQy50ZXN0KHQpJiZyKCJBSkFYIGV2ZW50cyBzaG91bGQgYmUgYXR0YWNoZWQgdG8gZG9jdW1lbnQ6ICIrdCksUS5jYWxsKHRoaXMsZSxBKHR8fCIiKSxuLGEsaSl9LGUuZXZlbnQucmVtb3ZlPWZ1bmN0aW9uKGUsdCxuLHIsYSl7eC5jYWxsKHRoaXMsZSxBKHQpfHwiIixuLHIsYSl9LGUuZm4uZXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIHIoImpRdWVyeS5mbi5lcnJvcigpIGlzIGRlcHJlY2F0ZWQiKSxlLnNwbGljZSgwLDAsImVycm9yIiksYXJndW1lbnRzLmxlbmd0aD90aGlzLmJpbmQuYXBwbHkodGhpcyxlKToodGhpcy50cmlnZ2VySGFuZGxlci5hcHBseSh0aGlzLGUpLHRoaXMpfSxlLmZuLnRvZ2dsZT1mdW5jdGlvbih0LG4pe2lmKCFlLmlzRnVuY3Rpb24odCl8fCFlLmlzRnVuY3Rpb24obikpcmV0dXJuIE4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3IoImpRdWVyeS5mbi50b2dnbGUoaGFuZGxlciwgaGFuZGxlci4uLikgaXMgZGVwcmVjYXRlZCIpO3ZhciBhPWFyZ3VtZW50cyxpPXQuZ3VpZHx8ZS5ndWlkKyssbz0wLHM9ZnVuY3Rpb24obil7dmFyIHI9KGUuX2RhdGEodGhpcywibGFzdFRvZ2dsZSIrdC5ndWlkKXx8MCklbztyZXR1cm4gZS5fZGF0YSh0aGlzLCJsYXN0VG9nZ2xlIit0Lmd1aWQscisxKSxuLnByZXZlbnREZWZhdWx0KCksYVtyXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fCExfTtmb3Iocy5ndWlkPWk7YS5sZW5ndGg+bzspYVtvKytdLmd1aWQ9aTtyZXR1cm4gdGhpcy5jbGljayhzKX0sZS5mbi5saXZlPWZ1bmN0aW9uKHQsbixhKXtyZXR1cm4gcigialF1ZXJ5LmZuLmxpdmUoKSBpcyBkZXByZWNhdGVkIiksVD9ULmFwcGx5KHRoaXMsYXJndW1lbnRzKTooZSh0aGlzLmNvbnRleHQpLm9uKHQsdGhpcy5zZWxlY3RvcixuLGEpLHRoaXMpfSxlLmZuLmRpZT1mdW5jdGlvbih0LG4pe3JldHVybiByKCJqUXVlcnkuZm4uZGllKCkgaXMgZGVwcmVjYXRlZCIpLE0/TS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6KGUodGhpcy5jb250ZXh0KS5vZmYodCx0aGlzLnNlbGVjdG9yfHwiKioiLG4pLHRoaXMpfSxlLmV2ZW50LnRyaWdnZXI9ZnVuY3Rpb24oZSx0LG4sYSl7cmV0dXJuIG58fEMudGVzdChlKXx8cigiR2xvYmFsIGV2ZW50cyBhcmUgdW5kb2N1bWVudGVkIGFuZCBkZXByZWNhdGVkIiksay5jYWxsKHRoaXMsZSx0LG58fGRvY3VtZW50LGEpfSxlLmVhY2goUy5zcGxpdCgifCIpLGZ1bmN0aW9uKHQsbil7ZS5ldmVudC5zcGVjaWFsW25dPXtzZXR1cDpmdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHQhPT1kb2N1bWVudCYmKGUuZXZlbnQuYWRkKGRvY3VtZW50LG4rIi4iK2UuZ3VpZCxmdW5jdGlvbigpe2UuZXZlbnQudHJpZ2dlcihuLG51bGwsdCwhMCl9KSxlLl9kYXRhKHRoaXMsbixlLmd1aWQrKykpLCExfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiB0aGlzIT09ZG9jdW1lbnQmJmUuZXZlbnQucmVtb3ZlKGRvY3VtZW50LG4rIi4iK2UuX2RhdGEodGhpcyxuKSksITF9fX0pfShqUXVlcnksd2luZG93KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2NzcyddID0gJ0pRdWVyeVRvb2xzLmNzcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAndGFibGVzb3J0ZXInOwokaW5mb1snc29ydGluZyddID0gOTk7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/jquerytools.lib/JQueryTools.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIHRhYmxlc29ydGVyICoqKioqKioqKioqKioqKiovCgp0YWJsZS50YWJsZXNvcnRlciB0aGVhZCB0ciAuaGVhZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoLi4vaW1ncy9iZy5naWYpOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGxlZnQ7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwp9Cgp0YWJsZS50YWJsZXNvcnRlciB0aGVhZCB0ciAuaGVhZGVyU29ydFVwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNzc3OwovKiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKC4uL2ltZ3MvYXNjLmdpZik7ICovCn0KCnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzc3NzsKLyogIGJhY2tncm91bmQtaW1hZ2U6IHVybCguLi9pbWdzL2Rlc2MuZ2lmKTsgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG5leHQgY3NzIHRvb2wgKioqKioqKioqKioqKioqKi8=]]></data>
	</file>
	<file>
	  <filename>/lib/json.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/json.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5Lmpzb24tMi40Lm1pbi5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2pzX25vbWluaWZ5J10gPSAxOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/json.lib/jquery.json-2.4.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBKU09OIHBsdWdpbiAyLjQuMCB8IGNvZGUuZ29vZ2xlLmNvbS9wL2pxdWVyeS1qc29uICovCihmdW5jdGlvbigkKXsndXNlIHN0cmljdCc7dmFyIGVzY2FwZT0vWyJcXFx4MDAtXHgxZlx4N2YtXHg5Zl0vZyxtZXRhPXsnXGInOidcXGInLCdcdCc6J1xcdCcsJ1xuJzonXFxuJywnXGYnOidcXGYnLCdccic6J1xccicsJyInOidcXCInLCdcXCc6J1xcXFwnfSxoYXNPd249T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTskLnRvSlNPTj10eXBlb2YgSlNPTj09PSdvYmplY3QnJiZKU09OLnN0cmluZ2lmeT9KU09OLnN0cmluZ2lmeTpmdW5jdGlvbihvKXtpZihvPT09bnVsbCl7cmV0dXJuJ251bGwnO30KdmFyIHBhaXJzLGssbmFtZSx2YWwsdHlwZT0kLnR5cGUobyk7aWYodHlwZT09PSd1bmRlZmluZWQnKXtyZXR1cm4gdW5kZWZpbmVkO30KaWYodHlwZT09PSdudW1iZXInfHx0eXBlPT09J2Jvb2xlYW4nKXtyZXR1cm4gU3RyaW5nKG8pO30KaWYodHlwZT09PSdzdHJpbmcnKXtyZXR1cm4gJC5xdW90ZVN0cmluZyhvKTt9CmlmKHR5cGVvZiBvLnRvSlNPTj09PSdmdW5jdGlvbicpe3JldHVybiAkLnRvSlNPTihvLnRvSlNPTigpKTt9CmlmKHR5cGU9PT0nZGF0ZScpe3ZhciBtb250aD1vLmdldFVUQ01vbnRoKCkrMSxkYXk9by5nZXRVVENEYXRlKCkseWVhcj1vLmdldFVUQ0Z1bGxZZWFyKCksaG91cnM9by5nZXRVVENIb3VycygpLG1pbnV0ZXM9by5nZXRVVENNaW51dGVzKCksc2Vjb25kcz1vLmdldFVUQ1NlY29uZHMoKSxtaWxsaT1vLmdldFVUQ01pbGxpc2Vjb25kcygpO2lmKG1vbnRoPDEwKXttb250aD0nMCcrbW9udGg7fQppZihkYXk8MTApe2RheT0nMCcrZGF5O30KaWYoaG91cnM8MTApe2hvdXJzPScwJytob3Vyczt9CmlmKG1pbnV0ZXM8MTApe21pbnV0ZXM9JzAnK21pbnV0ZXM7fQppZihzZWNvbmRzPDEwKXtzZWNvbmRzPScwJytzZWNvbmRzO30KaWYobWlsbGk8MTAwKXttaWxsaT0nMCcrbWlsbGk7fQppZihtaWxsaTwxMCl7bWlsbGk9JzAnK21pbGxpO30KcmV0dXJuJyInK3llYXIrJy0nK21vbnRoKyctJytkYXkrJ1QnKwpob3VycysnOicrbWludXRlcysnOicrc2Vjb25kcysnLicrbWlsbGkrJ1oiJzt9CnBhaXJzPVtdO2lmKCQuaXNBcnJheShvKSl7Zm9yKGs9MDtrPG8ubGVuZ3RoO2srKyl7cGFpcnMucHVzaCgkLnRvSlNPTihvW2tdKXx8J251bGwnKTt9CnJldHVybidbJytwYWlycy5qb2luKCcsJykrJ10nO30KaWYodHlwZW9mIG89PT0nb2JqZWN0Jyl7Zm9yKGsgaW4gbyl7aWYoaGFzT3duLmNhbGwobyxrKSl7dHlwZT10eXBlb2YgaztpZih0eXBlPT09J251bWJlcicpe25hbWU9JyInK2srJyInO31lbHNlIGlmKHR5cGU9PT0nc3RyaW5nJyl7bmFtZT0kLnF1b3RlU3RyaW5nKGspO31lbHNle2NvbnRpbnVlO30KdHlwZT10eXBlb2Ygb1trXTtpZih0eXBlIT09J2Z1bmN0aW9uJyYmdHlwZSE9PSd1bmRlZmluZWQnKXt2YWw9JC50b0pTT04ob1trXSk7cGFpcnMucHVzaChuYW1lKyc6Jyt2YWwpO319fQpyZXR1cm4neycrcGFpcnMuam9pbignLCcpKyd9Jzt9fTskLmV2YWxKU09OPXR5cGVvZiBKU09OPT09J29iamVjdCcmJkpTT04ucGFyc2U/SlNPTi5wYXJzZTpmdW5jdGlvbihzdHIpe3JldHVybiBldmFsKCcoJytzdHIrJyknKTt9OyQuc2VjdXJlRXZhbEpTT049dHlwZW9mIEpTT049PT0nb2JqZWN0JyYmSlNPTi5wYXJzZT9KU09OLnBhcnNlOmZ1bmN0aW9uKHN0cil7dmFyIGZpbHRlcmVkPXN0ci5yZXBsYWNlKC9cXFsiXFxcL2JmbnJ0dV0vZywnQCcpLnJlcGxhY2UoLyJbXiJcXFxuXHJdKiJ8dHJ1ZXxmYWxzZXxudWxsfC0/XGQrKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy9nLCddJykucmVwbGFjZSgvKD86Xnw6fCwpKD86XHMqXFspKy9nLCcnKTtpZigvXltcXSw6e31cc10qJC8udGVzdChmaWx0ZXJlZCkpe3JldHVybiBldmFsKCcoJytzdHIrJyknKTt9CnRocm93IG5ldyBTeW50YXhFcnJvcignRXJyb3IgcGFyc2luZyBKU09OLCBzb3VyY2UgaXMgbm90IHZhbGlkLicpO307JC5xdW90ZVN0cmluZz1mdW5jdGlvbihzdHIpe2lmKHN0ci5tYXRjaChlc2NhcGUpKXtyZXR1cm4nIicrc3RyLnJlcGxhY2UoZXNjYXBlLGZ1bmN0aW9uKGEpe3ZhciBjPW1ldGFbYV07aWYodHlwZW9mIGM9PT0nc3RyaW5nJyl7cmV0dXJuIGM7fQpjPWEuY2hhckNvZGVBdCgpO3JldHVybidcXHUwMCcrTWF0aC5mbG9vcihjLzE2KS50b1N0cmluZygxNikrKGMlMTYpLnRvU3RyaW5nKDE2KTt9KSsnIic7fQpyZXR1cm4nIicrc3RyKyciJzt9O30oalF1ZXJ5KSk7]]></data>
	</file>
	<file>
	  <filename>/lib/jsviews.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/jsviews.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanN2aWV3cy5taW4uanMnOwokaW5mb1snZGVwZW5kcyddID0gJ2pxdWVyeSc7CiRpbmZvWydqc19ub21pbmlmeSddID0gMTsKPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/jsviews.lib/jsviews.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/LyohIGpzdmlld3MuanMgdjEuMC4wLWFscGhhIHNpbmdsZS1maWxlIHZlcnNpb246CmluY2x1ZGVzIEpzUmVuZGVyLCBKc09ic2VydmFibGUgYW5kIEpzVmlld3MgIGh0dHA6Ly9naXRodWIuY29tL0JvcmlzTW9vcmUvanNyZW5kZXIgYW5kIGh0dHA6Ly9qc3ZpZXdzLmNvbS9qc3ZpZXdzCmluZm9ybWFsIHByZSBWMS4wIGNvbW1pdCBjb3VudGVyOiA1MyAoQmV0YSBDYW5kaWRhdGUpICovCihmdW5jdGlvbihuLHQsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGt0KG4pe3JldHVybiBufWZ1bmN0aW9uIGtpKG4pe3JldHVybiBufWZ1bmN0aW9uIGR0KG4pe2UuX2RiZ01vZGU9bjt5dD1uPyJVbmF2YWlsYWJsZSAobmVzdGVkIHZpZXcpOiB1c2UgI2dldEluZGV4KCkiOiIiO2QoImRiZyIsb2kuZGJnPWx0LmRiZz1uP2tpOmt0KX1mdW5jdGlvbiBndChuKXtyZXR1cm57Z2V0VGd0Om4sbWFwOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscjtpLnNyYyE9PXQmJihpLnNyYyYmaS51bm1hcCgpLHR5cGVvZiB0PT0ib2JqZWN0IiYmKHI9bi5hcHBseShpLGFyZ3VtZW50cyksaS5zcmM9dCxpLnRndD1yKSl9fX1mdW5jdGlvbiBmdChuLHQpe3QmJnQub25FcnJvciYmdC5vbkVycm9yKG4pPT09ITF8fCh0aGlzLm5hbWU9KHUubGluaz8iSnNWaWV3cyI6IkpzUmVuZGVyIikrIiBFcnJvciIsdGhpcy5tZXNzYWdlPW58fHRoaXMubmFtZSl9ZnVuY3Rpb24gZihuLHQpe3ZhciBpO249bnx8e307Zm9yKGkgaW4gdCluW2ldPXRbaV07cmV0dXJuIG59ZnVuY3Rpb24gbmkobix0LGkpe3JldHVybighaC5yVGFnfHxuKSYmKHA9bj9uLmNoYXJBdCgwKTpwLHc9bj9uLmNoYXJBdCgxKTp3LG89dD90LmNoYXJBdCgwKTpvLGE9dD90LmNoYXJBdCgxKTphLGc9aXx8ZyxuPSJcXCIrcCsiKFxcIitnKyIpP1xcIit3LHQ9IlxcIitvKyJcXCIrYSx5PSIoPzooPzooXFx3Kyg/PVtcXC9cXHNcXCIrbysiXSkpfCg/OihcXHcrKT8oOil8KD4pfCEtLSgoPzpbXi1dfC0oPyEtKSkqKS0tfChcXCopKSlcXHMqKCg/OlteXFwiK28rIl18XFwiK28rIig/IVxcIithKyIpKSo/KSIsaC5yVGFnPXkrIikiLHk9bmV3IFJlZ0V4cChuK3krIihcXC8pP3woPzpcXC8oXFx3KykpKSIrdCwiZyIpLHZ0PW5ldyBSZWdFeHAoIjwuKj58KFteXFxcXF18Xilbe31dfCIrbisiLioiK3QpKSxbcCx3LG8sYSxnXX1mdW5jdGlvbiBkaShuLHQpe3R8fCh0PW4sbj1pKTt2YXIgZSxmLG8sdSxyPXRoaXMscz0hdHx8dD09PSJyb290IjtpZihuKXtpZih1PXIudHlwZT09PXQ/cjppLCF1KWlmKGU9ci52aWV3cyxyLl8udXNlS2V5KXtmb3IoZiBpbiBlKWlmKHU9ZVtmXS5nZXQobix0KSlicmVha31lbHNlIGZvcihmPTAsbz1lLmxlbmd0aDshdSYmZjxvO2YrKyl1PWVbZl0uZ2V0KG4sdCl9ZWxzZSBpZihzKXdoaWxlKHIucGFyZW50LnBhcmVudCl1PXI9ci5wYXJlbnQ7ZWxzZSB3aGlsZShyJiYhdSl1PXIudHlwZT09PXQ/cjppLHI9ci5wYXJlbnQ7cmV0dXJuIHV9ZnVuY3Rpb24gdGkoKXt2YXIgbj10aGlzLmdldCgiaXRlbSIpO3JldHVybiBuP24uaW5kZXg6aX1mdW5jdGlvbiBpaSgpe3JldHVybiB0aGlzLmluZGV4fWZ1bmN0aW9uIGdpKHQpe3ZhciB1LGU9dGhpcyxvPWUubGlua0N0eCxyPShlLmN0eHx8e30pW3RdO3JldHVybiByPT09aSYmbyYmby5jdHgmJihyPW8uY3R4W3RdKSxyPT09aSYmKHI9b2lbdF0pLHImJmF0KHIpJiYhci5fd3JwJiYodT1mdW5jdGlvbigpe3JldHVybiByLmFwcGx5KCF0aGlzfHx0aGlzPT09bj9lOnRoaXMsYXJndW1lbnRzKX0sdS5fd3JwPTEsZih1LHIpKSx1fHxyfWZ1bmN0aW9uIG5yKG4sdCx1KXt2YXIgZixlLGgsbz0rdT09PXUmJnUscz10LmxpbmtDdHg7aWYobyYmKHU9KG89dC50bXBsLmJuZHNbby0xXSkodC5kYXRhLHQscikpLGU9dS5hcmdzWzBdLG58fG8pe2Y9cyYmcy50YWd8fHtfOntpbmxpbmU6IXMsYm5kOm99LHRhZ05hbWU6bisiOiIsZmxvdzohMCxfaXM6InRhZyJ9O2ZvcihoIGluIHUucHJvcHMpcnQudGVzdChoKSYmKGZbaF09dS5wcm9wc1toXSk7cyYmKHMudGFnPWYsZi5saW5rQ3R4PWYubGlua0N0eHx8cyx1LmN0eD1sKHUuY3R4LHMudmlldy5jdHgpKTtmLnRhZ0N0eD11O3Uudmlldz10O2YuY3R4PXUuY3R4fHx7fTtkZWxldGUgdS5jdHg7dC5fLnRhZz1mO2U9ZXQoZixmLmNvbnZlcnR8fG4hPT0idHJ1ZSImJm4pWzBdO2U9ZSE9aT9lOiIiO2U9byYmdC5fLm9uUmVuZGVyP3QuXy5vblJlbmRlcihlLHQsbyk6ZTt0Ll8udGFnPWl9cmV0dXJuIGV9ZnVuY3Rpb24gZXQobix0KXt2YXIgcj1uLnRhZ0N0eCx1PXIudmlldyxpPXIuYXJncztyZXR1cm4gdD10JiYoIiIrdD09PXQ/dS5nZXRSc2MoImNvbnZlcnRlcnMiLHQpfHx2KCJVbmtub3duIGNvbnZlcnRlcjogJyIrdCsiJyIpOnQpLGk9IWkubGVuZ3RoJiYhci5pbmRleCYmbi5hdXRvQmluZD9bdS5kYXRhXTp0P2kuc2xpY2UoKTppLHQmJih0LmRlcGVuZHMmJihuLmRlcGVuZHM9aC5nZXREZXBzKG4uZGVwZW5kcyxuLHQuZGVwZW5kcyx0KSksaVswXT10LmFwcGx5KG4saSkpLGl9ZnVuY3Rpb24gdHIobix0KXtmb3IodmFyIGYsZSx1PXRoaXM7Zj09PWkmJnU7KWU9dS50bXBsW25dLGY9ZSYmZVt0XSx1PXUucGFyZW50O3JldHVybiBmfHxyW25dW3RdfWZ1bmN0aW9uIGlyKG4sdCx1LGUsbyl7dmFyIGN0LGgsd3QsYXQsdXQsYSx2dCx3LGMsZnQsdHQsYnQsayx5dCxwdCxudCx5LHN0LGQsa3QsZz0iIixodD0rZT09PWUmJmUscD10LmxpbmtDdHh8fDAsaXQ9dC5jdHgsZHQ9dXx8dC50bXBsO2ZvcihuLl9pcz09PSJ0YWciJiYoaD1uLG49aC50YWdOYW1lKSxoPWh8fHAudGFnLGh0JiYoZT0oYnQ9ZHQuYm5kc1todC0xXSkodC5kYXRhLHQscikpLHZ0PWUubGVuZ3RoLGE9MDthPHZ0O2ErKyl7aWYoYz1lW2FdLGQ9Yy5wcm9wcyx0dD1jLnRtcGwsdHQ9Yy5jb250ZW50PXR0JiZkdC50bXBsc1t0dC0xXSx1PWMucHJvcHMudG1wbCxhfHx1JiZofHwoaz10LmdldFJzYygidGFncyIsbil8fHYoIlVua25vd24gdGFnOiB7eyIrbisifX0iKSksdT11fHwoaD9oOmspLnRlbXBsYXRlfHx0dCx1PSIiK3U9PT11P3QuZ2V0UnNjKCJ0ZW1wbGF0ZXMiLHUpfHxzKHUpOnUsZihjLHt0bXBsOnUscmVuZGVyOm90LGluZGV4OmEsdmlldzp0LGN0eDpsKGMuY3R4LGl0KX0pLCFoKXtrLl9jdHI/KGg9bmV3IGsuX2N0cix5dD0hIWguaW5pdCxoLmF0dHI9aC5hdHRyfHxrLmF0dHJ8fGkpOmg9e3JlbmRlcjprLnJlbmRlcn07aC5fPXtpbmxpbmU6IXB9O3AmJihwLmF0dHI9aC5hdHRyPXAuYXR0cnx8aC5hdHRyLHAudGFnPWgsaC5saW5rQ3R4PXApOyhoLl8uYm5kPWJ0fHxwLmZuKT9oLl8uYXJyVndzPXt9OmguZGF0YUJvdW5kT25seSYmdigie157IituKyJ9fSB0YWcgbXVzdCBiZSBkYXRhLWJvdW5kIik7aC50YWdOYW1lPW47aC5wYXJlbnQ9dXQ9aXQmJml0LnRhZztoLl9pcz0idGFnIjtoLl9kZWY9aztmb3Ioc3QgaW4gZD1jLnByb3BzKXJ0LnRlc3Qoc3QpJiYoaFtzdF09ZFtzdF0pfWMudGFnPWg7aC5tYXAmJmgudGFnQ3R4cyYmKGMubWFwPWgudGFnQ3R4c1thXS5tYXApO2guZmxvd3x8KGZ0PWMuY3R4PWMuY3R4fHx7fSx3dD1oLnBhcmVudHM9ZnQucGFyZW50VGFncz1pdCYmbChmdC5wYXJlbnRUYWdzLGl0LnBhcmVudFRhZ3MpfHx7fSx1dCYmKHd0W3V0LnRhZ05hbWVdPXV0KSxmdC50YWc9aCl9Zm9yKGgudGFnQ3R4cz1lLHQuXy50YWc9aCxoLnJlbmRlcmluZz17fSxhPTA7YTx2dDthKyspYz1oLnRhZ0N0eD1lW2FdLGQ9Yy5wcm9wcyx5PWV0KGgsaC5jb252ZXJ0KSwocHQ9ZC5tYXB8fGgpLm1hcCYmKHkubGVuZ3RofHxkLm1hcCkmJihudD1jLm1hcD1mKGMubWFwfHx7dW5tYXA6cHQudW5tYXB9LGQpLG50LnNyYyE9PXlbMF0mJihudC5zcmMmJm50LnVubWFwKCkscHQubWFwLmFwcGx5KG50LHkpKSx5PVtudC50Z3RdKSxoLmN0eD1jLmN0eCwhYSYmeXQmJihrdD1oLnRlbXBsYXRlLGguaW5pdChjLHAsaC5jdHgpLHl0PWksaC50ZW1wbGF0ZSE9PWt0JiYoaC5fLnRtcGw9aC50ZW1wbGF0ZSkpLHc9aSxjdD1oLnJlbmRlciwoY3Q9aC5yZW5kZXIpJiYodz1jdC5hcHBseShoLHkpKSx5PXkubGVuZ3RoP3k6W3RdLHc9dyE9PWk/dzpjLnJlbmRlcih5WzBdLCEwKXx8KG8/aToiIiksZz1nP2crKHd8fCIiKTp3O3JldHVybiBkZWxldGUgaC5yZW5kZXJpbmcsaC50YWdDdHg9aC50YWdDdHhzWzBdLGguY3R4PWgudGFnQ3R4LmN0eCxoLl8uaW5saW5lJiYoYXQ9aC5hdHRyKSYmYXQhPT1iJiYoZz1hdD09PSJ0ZXh0Ij9sdC5odG1sKGcpOiIiKSxodCYmdC5fLm9uUmVuZGVyP3QuXy5vblJlbmRlcihnLHQsaHQpOmd9ZnVuY3Rpb24gbnQobix0LGkscix1LGYsZSxvKXt2YXIgYSxoLGMsdj10PT09ImFycmF5IixsPXtrZXk6MCx1c2VLZXk6dj8wOjEsaWQ6IiIrYmkrKyxvblJlbmRlcjpvLGJuZHM6e319LHM9e2RhdGE6cix0bXBsOnUsY29udGVudDplLHZpZXdzOnY/W106e30scGFyZW50OmksdHlwZTp0LGdldDpkaSxnZXRJbmRleDppaSxnZXRSc2M6dHIsaGxwOmdpLF86bCxfaXM6InZpZXcifTtyZXR1cm4gaT8oYT1pLnZpZXdzLGg9aS5fLGgudXNlS2V5PyhhW2wua2V5PSJfIitoLnVzZUtleSsrXT1zLHMuaW5kZXg9eXQscy5nZXRJbmRleD10aSxjPWgudGFnLGwuYm5kPXYmJighY3x8ISFjLl8uYm5kJiZjKSk6YS5zcGxpY2UobC5rZXk9cy5pbmRleD1mLDAscykscy5jdHg9bnx8aS5jdHgpOnMuY3R4PW4sc31mdW5jdGlvbiBycihuKXt2YXIgdCxpLHIsdSxmO2Zvcih0IGluIGspaWYodT1rW3RdLChmPXUuY29tcGlsZSkmJihpPW5bdCsicyJdKSlmb3IociBpbiBpKWlbcl09ZihyLGlbcl0sbix0LHUpfWZ1bmN0aW9uIHVyKG4sdCxpKXt2YXIgdSxyO3JldHVybiBhdCh0KT90PXtkZXBlbmRzOnQuZGVwZW5kcyxyZW5kZXI6dH06KChyPXQudGVtcGxhdGUpJiYodC50ZW1wbGF0ZT0iIityPT09cj9zW3JdfHxzKHIpOnIpLHQuaW5pdCE9PSExJiYodT10Ll9jdHI9ZnVuY3Rpb24oKXt9LCh1LnByb3RvdHlwZT10KS5jb25zdHJ1Y3Rvcj11KSksaSYmKHQuX3BhcmVudFRtcGw9aSksdH1mdW5jdGlvbiByaShyLHUsZixlLG8saCl7ZnVuY3Rpb24gdihpKXtpZigiIitpPT09aXx8aS5ub2RlVHlwZT4wKXt0cnl7YT1pLm5vZGVUeXBlPjA/aTohdnQudGVzdChpKSYmdCYmdChuLmRvY3VtZW50KS5maW5kKGkpWzBdfWNhdGNoKHUpe31yZXR1cm4gYSYmKGk9YS5nZXRBdHRyaWJ1dGUoYnQpLHI9cnx8aSxpPXNbaV0saXx8KHI9cnx8Il8iK3dpKyssYS5zZXRBdHRyaWJ1dGUoYnQsciksaT1zW3JdPXJpKHIsYS5pbm5lckhUTUwsZixlLG8saCkpLGE9bnVsbCksaX19dmFyIGMsYTtyZXR1cm4gdT11fHwiIixjPXYodSksaD1ofHwodS5tYXJrdXA/dTp7fSksaC50bXBsTmFtZT1yLGYmJihoLl9wYXJlbnRUbXBsPWYpLCFjJiZ1Lm1hcmt1cCYmKGM9dih1Lm1hcmt1cCkpJiZjLmZuJiYoYy5kZWJ1ZyE9PXUuZGVidWd8fGMuYWxsb3dDb2RlIT09dS5hbGxvd0NvZGUpJiYoYz1jLm1hcmt1cCksYyE9PWk/KHImJiFmJiYodXRbcl09ZnVuY3Rpb24oKXtyZXR1cm4gdS5yZW5kZXIuYXBwbHkodSxhcmd1bWVudHMpfSksYy5mbnx8dS5mbj9jLmZuJiYodT1yJiZyIT09Yy50bXBsTmFtZT9sKGgsYyk6Yyk6KHU9dWkoYyxoKSxzdChjLnJlcGxhY2UobGksIlxcJCYiKSx1KSkscnIoaCksdSk6dm9pZCAwfWZ1bmN0aW9uIHVpKG4sdCl7dmFyIGksbz1lLndyYXBNYXB8fHt9LHI9Zih7bWFya3VwOm4sdG1wbHM6W10sbGlua3M6e30sdGFnczp7fSxibmRzOltdLF9pczoidGVtcGxhdGUiLHJlbmRlcjpvdH0sdCk7cmV0dXJuIHQuaHRtbFRhZ3x8KGk9eWkuZXhlYyhuKSxyLmh0bWxUYWc9aT9pWzFdLnRvTG93ZXJDYXNlKCk6IiIpLGk9b1tyLmh0bWxUYWddLGkmJmkhPT1vLmRpdiYmKHIubWFya3VwPXUudHJpbShyLm1hcmt1cCkpLHJ9ZnVuY3Rpb24gZnIobix0KXtmdW5jdGlvbiB1KGUsbyxzKXt2YXIgYSxjLHYsbDtpZihlJiYiIitlIT09ZSYmIWUubm9kZVR5cGUmJiFlLm1hcmt1cCl7Zm9yKHYgaW4gZSl1KHYsZVt2XSxvKTtyZXR1cm4gcn1yZXR1cm4gbz09PWkmJihvPWUsZT1pKSxlJiYiIitlIT09ZSYmKHM9byxvPWUsZT1pKSxsPXM/c1tmXT1zW2ZdfHx7fTp1LGM9dC5jb21waWxlLChhPWgub25CZWZvcmVTdG9yZUl0ZW0pJiYoYz1hKGwsZSxvLGMpfHxjKSxlP289PT1udWxsP2RlbGV0ZSBsW2VdOmxbZV09Yz9vPWMoZSxvLHMsbix0KTpvOm89YyhpLG8pLGMmJm8mJihvLl9pcz1uKSwoYT1oLm9uU3RvcmVJdGVtKSYmYShsLGUsbyxjKSxvfXZhciBmPW4rInMiO3JbZl09dTtrW25dPXR9ZnVuY3Rpb24gb3Qobix0LGYsZSxvLGgpe3ZhciB3LGV0LHR0LHksaXQscnQsdXQsayxwLGZ0LGQsb3QsYyxhPXRoaXMsc3Q9IWEuYXR0cnx8YS5hdHRyPT09YixnPSIiO2lmKCEhdD09PXQmJihmPXQsdD1pKSxvPT09ITAmJih1dD0hMCxvPTApLGEudGFnPyhrPWEsYT1hLnRhZyxmdD1hLl8sb3Q9YS50YWdOYW1lLGM9ZnQudG1wbHx8ay50bXBsLHQ9bCh0LGEuY3R4KSxwPWsuY29udGVudCxrLnByb3BzLmxpbms9PT0hMSYmKHQ9dHx8e30sdC5saW5rPSExKSxlPWV8fGsudmlldyxuPWFyZ3VtZW50cy5sZW5ndGg/bjplKTpjPWEuanF1ZXJ5JiYoYVswXXx8dignVW5rbm93biB0ZW1wbGF0ZTogIicrYS5zZWxlY3RvcisnIicpKXx8YSxjJiYoIWUmJm4mJm4uX2lzPT09InZpZXciJiYoZT1uKSxlJiYocD1wfHxlLmNvbnRlbnQsaD1ofHxlLl8ub25SZW5kZXIsbj09PWUmJihuPWUuZGF0YSksdD1sKHQsZS5jdHgpKSxlJiZlLmRhdGEhPT1pfHwoKHQ9dHx8e30pLnJvb3Q9biksYy5mbnx8KGM9c1tjXXx8cyhjKSksYykpe2lmKGg9KHQmJnQubGluaykhPT0hMSYmc3QmJmgsZD1oLGg9PT0hMCYmKGQ9aSxoPWUuXy5vblJlbmRlciksdD1jLmhlbHBlcnM/bChjLmhlbHBlcnMsdCk6dCx1LmlzQXJyYXkobikmJiFmKWZvcih5PXV0P2U6byE9PWkmJmV8fG50KHQsImFycmF5IixlLG4sYyxvLHAsaCksdz0wLGV0PW4ubGVuZ3RoO3c8ZXQ7dysrKXR0PW5bd10saXQ9bnQodCwiaXRlbSIseSx0dCxjLChvfHwwKSt3LHAsaCkscnQ9Yy5mbih0dCxpdCxyKSxnKz15Ll8ub25SZW5kZXI/eS5fLm9uUmVuZGVyKHJ0LGl0KTpydDtlbHNlIHk9dXQ/ZTpudCh0LG90fHwiZGF0YSIsZSxuLGMsbyxwLGgpLGZ0JiYhYS5mbG93JiYoeS50YWc9YSksZys9Yy5mbihuLHkscik7cmV0dXJuIGQ/ZChnLHkpOmd9cmV0dXJuIiJ9ZnVuY3Rpb24gdihuKXt0aHJvdyBuZXcgaC5FcnIobik7fWZ1bmN0aW9uIGMobil7digiU3ludGF4IGVycm9yXG4iK24pfWZ1bmN0aW9uIHN0KG4sdCxpLHIpe2Z1bmN0aW9uIHYodCl7dC09Zjt0JiZzLnB1c2gobi5zdWJzdHIoZix0KS5yZXBsYWNlKGl0LCJcXG4iKSl9ZnVuY3Rpb24gaCh0KXt0JiZjKCdVbm1hdGNoZWQgb3IgbWlzc2luZyB0YWc6ICJ7ey8nK3QrJ319IiBpbiB0ZW1wbGF0ZTpcbicrbil9ZnVuY3Rpb24gcChlLHkscCxrLGQsZyxudCx0dCx1dCxmdCxldCxvdCl7ZyYmKGQ9IjoiLGs9Yik7ZnQ9ZnR8fGk7dmFyIHB0LGx0LGF0PXkmJltdLGN0PSIiLHN0PSIiLHZ0PSIiLHl0PSFmdCYmIWQmJiFudDtwPXB8fCh1dD11dHx8IiNkYXRhIixkKTt2KG90KTtmPW90K2UubGVuZ3RoO3R0P3cmJnMucHVzaChbIioiLCJcbiIrdXQucmVwbGFjZShjaSwiJDEiKSsiXG4iXSk6cD8ocD09PSJlbHNlIiYmKHZpLnRlc3QodXQpJiZjKCdmb3IgInt7ZWxzZSBpZiBleHByfX0iIHVzZSAie3tlbHNlIGV4cHJ9fSInKSxhdD11WzZdLHVbN109bi5zdWJzdHJpbmcodVs3XSxvdCksdT1vLnBvcCgpLHM9dVszXSx5dD0hMCksdXQmJih1dD11dC5yZXBsYWNlKGl0LCIgIiksY3Q9aHQodXQsYXQsdCkucmVwbGFjZShhaSxmdW5jdGlvbihuLHQsaSl7cmV0dXJuIHQ/dnQrPWkrIiwiOnN0Kz1pKyIsIixhPWF8fHJ0LnRlc3QoaS5zcGxpdCgiOiIpWzBdKSwiIn0pKSxzdD1zdC5zbGljZSgwLC0xKSxjdD1jdC5zbGljZSgwLC0xKSxwdD1zdCYmc3QuaW5kZXhPZigibm9lcnJvcjp0cnVlIikrMSYmc3R8fCIiLGw9W3Asa3x8ISFyfHxhfHwiIixjdCx5dCYmW10sJ1xuXHRwYXJhbXM6IicrdXQrJyIsXG5cdHByb3BzOnsnK3N0KyJ9IisodnQ/IixjdHg6eyIrdnQuc2xpY2UoMCwtMSkrIn0iOiIiKSxwdCxhdHx8MF0scy5wdXNoKGwpLHl0JiYoby5wdXNoKHUpLHU9bCx1WzddPWYpKTpldCYmKGx0PXVbMF0saChldCE9PWx0JiZsdCE9PSJlbHNlIiYmZXQpLHVbN109bi5zdWJzdHJpbmcodVs3XSxvdCksdT1vLnBvcCgpKTtoKCF1JiZldCk7cz11WzNdfXZhciBsLGEsdz10JiZ0LmFsbG93Q29kZSxlPVtdLGY9MCxvPVtdLHM9ZSx1PVssLCxlXTtyZXR1cm4gaChvWzBdJiZvWzBdWzNdLnBvcCgpWzBdKSxuLnJlcGxhY2UoeSxwKSx2KG4ubGVuZ3RoKSwoZj1lW2UubGVuZ3RoLTFdKSYmaCgiIitmIT09ZiYmK2ZbN109PT1mWzddJiZmWzBdKSxmaShlLGk/bjp0LGkpfWZ1bmN0aW9uIGZpKG4saSxyKXt2YXIgYSxmLG8sbCx2LHAsaHQsY3QsbHQsYXQsZXQsdyxzLG90LHksdHQsayxydCx2dCxkLHl0LHB0LHN0LHV0LGcsaD0wLHU9IiIsbnQ9IiIsZnQ9e30sd3Q9bi5sZW5ndGg7Zm9yKCIiK2k9PT1pPyh5PXI/J2RhdGEtbGluaz0iJytpLnJlcGxhY2UoaXQsIiAiKS5zbGljZSgxLC0xKSsnIic6aSxpPTApOih5PWkudG1wbE5hbWV8fCJ1bm5hbWVkIixpLmFsbG93Q29kZSYmKGZ0LmFsbG93Q29kZT0hMCksaS5kZWJ1ZyYmKGZ0LmRlYnVnPSEwKSx3PWkuYm5kcyxvdD1pLnRtcGxzKSxhPTA7YTx3dDthKyspaWYoZj1uW2FdLCIiK2Y9PT1mKXUrPSdcbnJldCs9IicrZisnIjsnO2Vsc2UgaWYobz1mWzBdLG89PT0iKiIpdSs9IiIrZlsxXTtlbHNle2lmKGw9ZlsxXSx2PWZbMl0scnQ9ZlszXSxwPWZbNF0sbnQ9Zls1XSx2dD1mWzddLChwdD1vPT09ImVsc2UiKXx8KGg9MCx3JiYocz1mWzZdKSYmKGg9dy5wdXNoKHMpKSksKHN0PW89PT0iOiIpPyhsJiYobz1sPT09Yj8iPiI6bCtvKSxudCYmKHV0PSJwcm0iK2EsbnQ9InRyeXt2YXIgIit1dCsiPVsiK3YrIl1bMF07fWNhdGNoKGUpeyIrdXQrJz0iIjt9XG4nLHY9dXQpKToocnQmJih0dD11aSh2dCxmdCksdHQudG1wbE5hbWU9eSsiLyIrbyxmaShydCx0dCksb3QucHVzaCh0dCkpLHB0fHwoaz1vLHl0PXUsdT0iIiksZD1uW2ErMV0sZD1kJiZkWzBdPT09ImVsc2UiKSxwKz0iLFxuXHRhcmdzOlsiK3YrIl19IixzdCYmKHN8fGwmJmwhPT1iKSl7aWYoZz1uZXcgRnVuY3Rpb24oImRhdGEsdmlldyxqLHUiLCIgLy8gIit5KyIgIitoKyIgIitvKyJcbiIrbnQrInJldHVybiB7IitwKyI7IiksZy5wYXRocz1zLGcuX2N0eHM9byxyKXJldHVybiBnO2V0PTF9aWYodSs9c3Q/IlxuIisocz8iIjpudCkrKHI/InJldHVybiAiOiJyZXQrPSIpKyhldD8oZXQ9MCxhdD0hMCwnYygiJytsKyciLHZpZXcsJysocz8od1toLTFdPWcsaCk6InsiK3ApKyIpOyIpOm89PT0iPiI/KGN0PSEwLCJoKCIrdisiKTsiKToobHQ9ITAsIih2PSIrdisiKSE9Iisocj8iPSI6IiIpKyd1P3Y6IiI7JykpOihodD0hMCwie3ZpZXc6dmlldyx0bXBsOiIrKHJ0P290Lmxlbmd0aDoiMCIpKyIsIitwKyIsIiksayYmIWQpe2lmKHU9IlsiK3Uuc2xpY2UoMCwtMSkrIl0iLChyfHxzKSYmKHU9bmV3IEZ1bmN0aW9uKCJkYXRhLHZpZXcsaix1IiwiIC8vICIreSsiICIraCsiICIraysiXG5yZXR1cm4gIit1KyI7IikscyYmKCh3W2gtMV09dSkucGF0aHM9cyksdS5fY3R4cz1vLHIpKXJldHVybiB1O3U9eXQrJ1xucmV0Kz10KCInK2srJyIsdmlldyx0aGlzLCcrKGh8fHUpKyIpOyI7cz0wO2s9MH19dT0iLy8gIit5KyJcbnZhciBqPWp8fCIrKHQ/ImpRdWVyeS4iOiJqcyIpKyJ2aWV3cyIrKGx0PyIsdiI6IiIpKyhodD8iLHQ9ai5fdGFnIjoiIikrKGF0PyIsYz1qLl9jbnZ0IjoiIikrKGN0PyIsaD1qLmNvbnZlcnRlcnMuaHRtbCI6IiIpKyhyPyI7XG4iOicscmV0PSIiO1xuJykrKGUudHJ5Q2F0Y2g/InRyeXtcbiI6IiIpKyhmdC5kZWJ1Zz8iZGVidWdnZXI7IjoiIikrdSsocj8iXG4iOiJcbnJldHVybiByZXQ7XG4iKSsoZS50cnlDYXRjaD8iXG59Y2F0Y2goZSl7cmV0dXJuIGouX2VycihlKTt9IjoiIik7dHJ5e3U9bmV3IEZ1bmN0aW9uKCJkYXRhLHZpZXcsaix1Iix1KX1jYXRjaChidCl7YygiQ29tcGlsZWQgdGVtcGxhdGUgY29kZTpcblxuIit1LGJ0KX1yZXR1cm4gaSYmKGkuZm49dSksdX1mdW5jdGlvbiBodChuLHQsaSl7ZnVuY3Rpb24gYihiLGssZCxnLG50LHR0LGl0LHJ0LHV0LGZ0LGV0LG90LGN0LGx0LGF0LHZ0LHl0LHB0LHd0LGJ0KXtmdW5jdGlvbiBkdChuLGkscixmLGUsbyxjLGwpe2lmKHImJih0JiYodT09PSJsaW5rVG8iJiYocz10Ll9qc3Z0bz10Ll9qc3Z0b3x8W10scy5wdXNoKG50KSksKCF1fHxoKSYmdC5wdXNoKG50LnNsaWNlKGkubGVuZ3RoKSkpLHIhPT0iLiIpKXt2YXIgYT0oZj8ndmlldy5obHAoIicrZisnIiknOmU/InZpZXciOiJkYXRhIikrKGw/KG8/Ii4iK286Zj8iIjplPyIiOiIuIityKSsoY3x8IiIpOihsPWY/IiI6ZT9vfHwiIjpyLCIiKSk7cmV0dXJuIGE9YSsobD8iLiIrbDoiIiksaSsoYS5zbGljZSgwLDkpPT09InZpZXcuZGF0YSI/YS5zbGljZSg1KTphKX1yZXR1cm4gbn12YXIga3Q7aWYodHQ9dHR8fCIiLGQ9ZHx8a3x8b3QsbnQ9bnR8fHV0LGZ0PWZ0fHx5dHx8IiIsIWl0fHxlfHxmKXJldHVybiB0JiZ2dCYmIWUmJiFmJiYoIXV8fGh8fHMpJiYoa3Q9dltyXSxidC5sZW5ndGgtMT53dC1rdCYmKGt0PWJ0LnNsaWNlKGt0LHd0KzEpLHZ0PXcrIjoiK2t0K28sdnQ9eVt2dF09eVt2dF18fHN0KHArdnQrYSxpLCEwKSx2dC5wYXRoc3x8aHQoa3QsdnQucGF0aHM9W10saSksKHN8fHQpLnB1c2goe19qc3ZPYjp2dH0pKSksZT8oZT0hY3QsZT9iOiciJyk6Zj8oZj0hbHQsZj9iOiciJyk6KGQ/KHIrKyx2W3JdPXd0KyssZCk6IiIpKyhwdD9yPyIiOnU/KHU9aD1zPSExLCJcYiIpOiIsIjpydD8ociYmYyhuKSx1PW50LGg9ZywiXGIiK250KyI6Iik6bnQ/bnQuc3BsaXQoIl4iKS5qb2luKCIuIikucmVwbGFjZShzaSxkdCkrKGZ0PyhsWysrcl09ITAsbnQuY2hhckF0KDApIT09Ii4iJiYodltyXT13dCksZnQpOnR0KTp0dD90dDphdD8obFtyLS1dPSExLGF0KSsoZnQ/KGxbKytyXT0hMCxmdCk6IiIpOmV0PyhsW3JdfHxjKG4pLCIsIik6az8iIjooZT1jdCxmPWx0LCciJykpO2Mobil9dmFyIHUscyxoLHk9aS5saW5rcyxsPXt9LHY9ezA6LTF9LHI9MCxmPSExLGU9ITE7cmV0dXJuKG4rIiAiKS5yZXBsYWNlKC9cKVxeL2csIikuIikucmVwbGFjZShoaSxiKX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIG4mJm4hPT10P3Q/ZihmKHt9LHQpLG4pOm46dCYmZih7fSx0KX1mdW5jdGlvbiBlaShuKXtyZXR1cm4gd3Rbbl18fCh3dFtuXT0iJiMiK24uY2hhckNvZGVBdCgwKSsiOyIpfWZ1bmN0aW9uIGVyKG4pe3ZhciBpLHQscj1bXTtpZih0eXBlb2Ygbj09Im9iamVjdCIpZm9yKGkgaW4gbil0PW5baV0sdCYmdC50b0pTT04mJiF0LnRvSlNPTigpfHxhdCh0KXx8ci5wdXNoKHtrZXk6aSxwcm9wOm5baV19KTtyZXR1cm4gcn1pZigoIXR8fCF0LnZpZXdzKSYmIW4uanN2aWV3cyl7dmFyIHUsdHQseSx2dCx5dCxwPSJ7Iix3PSJ7IixvPSJ9IixhPSJ9IixnPSJeIixzaT0vXighKj8pKD86bnVsbHx0cnVlfGZhbHNlfFxkW1xkLl0qfChbXHckXSt8XC58fihbXHckXSspfCModmlld3woW1x3JF0rKSk/KShbXHckLl5dKj8pKD86Wy5bXl0oW1x3JF0rKVxdPyk/KSQvZyxoaT0vKFwoKSg/PVxzKlwoKXwoPzooWyhbXSlccyopPyg/OihcXj8pKCEqP1sjfl0/W1x3JC5eXSspP1xzKigoXCtcK3wtLSl8XCt8LXwmJnxcfFx8fD09PXwhPT18PT18IT18PD18Pj18Wzw+JSo6P1wvXXwoPSkpXHMqfCghKj9bI35dP1tcdyQuXl0rKShbKFtdKT8pfCgsXHMqKXwoXCg/KVxcPyg/OignKXwoIikpfCg/OlxzKigoWylcXV0pKD89XHMqXC58XHMqXF58XHMqJCl8WylcXV0pKFsoW10/KSl8KFxzKykvZyxpdD0vWyBcdF0qKFxyXG58XG58XHIpL2csY2k9L1xcKFsnIl0pL2csbGk9L1snIlxcXS9nLGFpPS9ceDA4KH4pPyhbXlx4MDhdKylceDA4L2csdmk9L15pZlxzLyx5aT0vPChcdyspWz5cc10vLHB0PS9bXHgwMGA+PCInJl0vZyxydD0vXm9uW0EtWl18XmNvbnZlcnQoQmFjayk/JC8scGk9cHQsd2k9MCxiaT0wLHd0PXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsIlx4MDAiOiImIzA7IiwiJyI6IiYjMzk7IiwnIic6IiYjMzQ7IiwiYCI6IiYjOTY7In0sYj0iaHRtbCIsYnQ9ImRhdGEtanN2LXRtcGwiLHV0PXt9LGs9e3RlbXBsYXRlOntjb21waWxlOnJpfSx0YWc6e2NvbXBpbGU6dXJ9LGhlbHBlcjp7fSxjb252ZXJ0ZXI6e319LHI9e2pzdmlld3M6InYxLjAuMC1iZXRhIixyZW5kZXI6dXQsc2V0dGluZ3M6ZnVuY3Rpb24obil7ZihlLG4pO2R0KGUuX2RiZ01vZGUpO2UuanN2JiZlLmpzdigpfSxzdWI6e1ZpZXc6bnQsRXJyOmZ0LHRtcGxGbjpzdCxjdnQ6ZXQscGFyc2U6aHQsZXh0ZW5kOmYsZXJyOnYsc3ludGF4RXJyOmMsaXNGbjpmdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiJ9LERhdGFNYXA6Z3R9LF9jbnZ0Om5yLF90YWc6aXIsX2VycjpmdW5jdGlvbihuKXtyZXR1cm4gZS5fZGJnTW9kZT8iRXJyb3I6ICIrKG4ubWVzc2FnZXx8bikrIi4gIjoiIn19OyhmdC5wcm90b3R5cGU9bmV3IEVycm9yKS5jb25zdHJ1Y3Rvcj1mdDt0aS5kZXBlbmRzPWZ1bmN0aW9uKCl7cmV0dXJuW3RoaXMuZ2V0KCJpdGVtIiksImluZGV4Il19O2lpLmRlcGVuZHM9ZnVuY3Rpb24oKXtyZXR1cm5bImluZGV4Il19O2Zvcih0dCBpbiBrKWZyKHR0LGtbdHRdKTt2YXIgY3Qscz1yLnRlbXBsYXRlcyxsdD1yLmNvbnZlcnRlcnMsb2k9ci5oZWxwZXJzLGQ9ci50YWdzLGg9ci5zdWIsYXQ9aC5pc0ZuLGU9ci5zZXR0aW5nczt0Pyh1PXQsdS5mbi5yZW5kZXI9b3QsKGN0PXUub2JzZXJ2YWJsZSkmJihmKGgsY3Quc3ViKSxkZWxldGUgY3Quc3ViKSk6KHU9bi5qc3ZpZXdzPXt9LHUuaXNBcnJheT1BcnJheSYmQXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24obil7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChuKT09PSJbb2JqZWN0IEFycmF5XSJ9KTt1LnJlbmRlcj11dDt1LnZpZXdzPXI7dS50ZW1wbGF0ZXM9cz1yLnRlbXBsYXRlcztlKHtkZWJ1Z01vZGU6ZHQsZGVsaW1pdGVyczpuaSxfZGJnTW9kZTohMCx0cnlDYXRjaDohMH0pO2QoeyJlbHNlIjpmdW5jdGlvbigpe30sImlmIjp7cmVuZGVyOmZ1bmN0aW9uKG4pe3ZhciB0PXRoaXM7cmV0dXJuIHQucmVuZGVyaW5nLmRvbmV8fCFuJiYoYXJndW1lbnRzLmxlbmd0aHx8IXQudGFnQ3R4LmluZGV4KT8iIjoodC5yZW5kZXJpbmcuZG9uZT0hMCx0LnNlbGVjdGVkPXQudGFnQ3R4LmluZGV4LHQudGFnQ3R4LnJlbmRlcih0LnRhZ0N0eC52aWV3LCEwKSl9LG9uVXBkYXRlOmZ1bmN0aW9uKG4sdCxpKXtmb3IodmFyIHIsZix1PTA7KHI9dGhpcy50YWdDdHhzW3VdKSYmci5hcmdzLmxlbmd0aDt1KyspaWYocj1yLmFyZ3NbMF0sZj0hciE9IWlbdV0uYXJnc1swXSwhdGhpcy5jb252ZXJ0JiYhIXJ8fGYpcmV0dXJuIGY7cmV0dXJuITF9LGZsb3c6ITB9LCJmb3IiOntyZW5kZXI6ZnVuY3Rpb24obil7dmFyIGYsdD10aGlzLHI9dC50YWdDdHgsZT0iIixvPTA7cmV0dXJuIHQucmVuZGVyaW5nLmRvbmV8fCgoZj0hYXJndW1lbnRzLmxlbmd0aCkmJihuPXIudmlldy5kYXRhKSxuIT09aSYmKGUrPXIucmVuZGVyKG4sZiksbys9dS5pc0FycmF5KG4pP24ubGVuZ3RoOjEpLCh0LnJlbmRlcmluZy5kb25lPW8pJiYodC5zZWxlY3RlZD1yLmluZGV4KSksZX0sZmxvdzohMCxhdXRvQmluZDohMH0saW5jbHVkZTp7ZmxvdzohMCxhdXRvQmluZDohMH0sIioiOntyZW5kZXI6a3QsZmxvdzohMH19KTtkKHtwcm9wczpmKGYoe30sZFsiZm9yIl0pLGd0KGVyKSl9KTtkLnByb3BzLmF1dG9CaW5kPSEwO2x0KHtodG1sOmZ1bmN0aW9uKG4pe3JldHVybiBuIT1pP1N0cmluZyhuKS5yZXBsYWNlKHBpLGVpKToiIn0sYXR0cjpmdW5jdGlvbihuKXtyZXR1cm4gbiE9aT9TdHJpbmcobikucmVwbGFjZShwdCxlaSk6bj09PW51bGw/bjoiIn0sdXJsOmZ1bmN0aW9uKG4pe3JldHVybiBuIT1pP2VuY29kZVVSSShTdHJpbmcobikpOm49PT1udWxsP246IiJ9fSk7bmkoKX19KSh0aGlzLHRoaXMualF1ZXJ5KSxmdW5jdGlvbihuLHQsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYobil7cmV0dXJuIHIobik/bmV3IGsobik6bmV3IGIobil9ZnVuY3Rpb24gYihuKXtyZXR1cm4gdGhpcy5fZGF0YT1uLHRoaXN9ZnVuY3Rpb24gayhuKXtyZXR1cm4gdGhpcy5fZGF0YT1uLHRoaXN9ZnVuY3Rpb24gY3Qobil7cmV0dXJuIHIobik/W25dOm59ZnVuY3Rpb24gcnQobix0KXtuPXIobik/bjpbbl07Zm9yKHZhciBpLGU9dCxvPWUsaD1uLmxlbmd0aCxmPVtdLHM9MDtzPGg7cysrKXtpZihpPW5bc10sdShpKSl7Zj1mLmNvbmNhdChydChpLmNhbGwodCx0KSx0KSk7Y29udGludWV9ZWxzZSBpZigiIitpIT09aSl7dD1vPWk7byE9PWUmJmYucHVzaChlPW8pO2NvbnRpbnVlfW8hPT1lJiZmLnB1c2goZT1vKTtmLnB1c2goaSl9cmV0dXJuIGZ9ZnVuY3Rpb24gdXQobix0KXt2YXIgcixpO2ZvcihyIGluIG4pe2k9ITA7YnJlYWt9aXx8ZGVsZXRlIHlbdF19ZnVuY3Rpb24gZChuLHQpe2lmKCEobi5kYXRhJiZuLmRhdGEub2ZmKSl7dmFyIHYseSxwLGY9dC5vbGRWYWx1ZSxvPXQudmFsdWUsdT1uLmRhdGEsaD11Lm9ic2VydmVBbGwsYz0hdS5jYi5ub0FycmF5LGE9dS5wYXRocztuLnR5cGU9PT1sPyh1LmNiLmFycmF5fHx1LmNiKS5jYWxsKHUsbix0KToodS5wcm9wPT09dC5wYXRofHx1LnByb3A9PT0iKiIpJiYoZj10eXBlb2YgZj09PXMmJihhWzBdfHxjJiZyKGYpKSYmZixvPXR5cGVvZihvPXQudmFsdWUpPT09cyYmKGFbMF18fGMmJnIobykpJiZvLGg/KHY9aC5fcGF0aCsiLiIrdC5wYXRoLHk9aC5maWx0ZXIscD1baC5wYXJlbnRzKCkuc2xpY2UoKV0sZiYmZShjLGgubnMsW2ZdLGEsdS5jYiwhMCx5LHAsdiksbyYmZShjLGgubnMsW29dLGEsdS5jYixpLHkscCx2KSk6KGYmJmUoYyxbZl0sYSx1LmNiLCEwKSxvJiZlKGMsW29dLGEsdS5jYikpLHUuY2Iobix0KSl9fWZ1bmN0aW9uIGEoKXtmdW5jdGlvbiBkdChpLHIsdSxmKXt2YXIgcyxlLHk9aXQobikscD1jdChuKTtpZihpPWF0P2krIi4iK2F0OmksZ3x8Zil5JiZ0KHApLm9mZihpLGQpO2Vsc2V7aWYobz15JiZ0Ll9kYXRhKG4pKWZvcihvPW8mJm8uZXZlbnRzLG89byYmb1t1P2w6Y10sa3Q9byYmby5sZW5ndGg7a3QtLTspaWYoKG50PW9ba3RdLmRhdGEpJiZudC5jYi5fY0lkPT09aC5fY0lkJiZudC5ucz09PWF0KXtpZih1KXJldHVybjsocj09PSIqIiYmbnQucHJvcCE9PXJ8fG50LnByb3A9PT12KSYmdChuKS5vZmYoaSxkKX1lPXU/e306e2Z1bGxQYXRoOmEscGF0aHM6cj9bcl06W10scHJvcDp2fTtlLm5zPWF0O2UuY2I9aDtsdCYmKGUub2JzZXJ2ZUFsbD17X3BhdGg6bHQscGF0aDpmdW5jdGlvbigpe3JldHVybiBzPWlpLmxlbmd0aCxsdC5yZXBsYWNlKC9bWy5dL2csZnVuY3Rpb24obil7cmV0dXJuIHMtLSxuPT09IlsiPyJbIit0LmluQXJyYXkoaWlbcy0xXSxpaVtzXSk6Ii4ifSl9LHBhcmVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gaWl9LGZpbHRlcjplaSxuczphdH0pO3QocCkub24oaSxudWxsLGUsZCk7bmkmJihuaVt0LmRhdGEobiwib2JJZCIpfHx0LmRhdGEobiwib2JJZCIsaHQrKyldPW4pfX1mdW5jdGlvbiB2aShuLHQpe24uX29iPXl0KG4sZnQpO3ZhciBpPWZ0O3JldHVybiBmdW5jdGlvbih1LGYpe3ZhciBvPW4uX29iLGM9dC5sZW5ndGg7dHlwZW9mIG89PT1zJiYoZ3QobywhMCksKGN8fHZ0JiZyKG8pKSYmZSh2dCxbb10sdCxoLHl0LCEwKSk7bz1uLl9vYj15dChuLGkpO3R5cGVvZiBvPT09cyYmKGd0KG8pLChjfHx2dCYmcihvKSkmJmUodnQsW29dLHQsaCx5dCxbaV0pKTtoKHUsZil9fWZ1bmN0aW9uIGd0KHQsdSxlLG8pe2lmKHZ0KXt2YXIgcz1uLGM9bHQ7bj10O28mJihuPXRbb10sbHQrPSIuIitvLGVpJiYobj1mLl9mbHRyKG8sdCxsdCxlaSkpKTtuJiYoZXx8cihuKSkmJmR0KGwrIi5vYnNlcnZlIisoaD8iLm9icyIrKGJ0PWguX2NJZD1oLl9jSWR8fHcrKyk6IiIpLGksITAsdSk7bj1zO2x0PWN9fXZhciB3dCx1aSxvaSxldCx2LGEsZmksZyxoLGJ0LGt0LG50LG8seXQsc2ksbmksdGksaGksaWksbHQsZWksYXQsY2ksbGksdnQ9dGhpcyE9ITEsYWk9MSxyaT1zdCxiPUFycmF5LmFwcGx5KDAsYXJndW1lbnRzKSxrPWIucG9wKCksZnQ9Yi5zaGlmdCgpLHB0PWZ0LG49cHQsdHQ9Yi5sZW5ndGg7Zm9yKGZ0KyIiPT09ZnQmJnZ0JiYoYXQ9ZnQsZnQ9bj1wdD1iLnNoaWZ0KCksdHQtLSksdShrKT9oPWs6KGsrIiI9PT1rJiYobHQ9ayxpaT1iLnBvcCgpLGVpPWIucG9wKCksaz1iLnBvcCgpLHR0PXR0LTMpLGs9PT0hMD9nPWs6ayYmKGZ0PWssYWk9MCksaz1iW3R0LTFdLCh0dCYmaz09PWl8fHUoaykpJiYoaD1iLnBvcCgpLHR0LS0pKSx0dCYmdShiW3R0LTFdKSYmKHl0PWgsaD1iLnBvcCgpLHR0LS0pLHJpKz1nP2g/Ii5vYnMiK2guX2NJZDoiIjoiLm9icyIrKGJ0PWguX2NJZD1oLl9jSWR8fHcrKyksZ3x8KG5pPXlbYnRdPXlbYnRdfHx7fSksY2k9YXQmJmF0Lm1hdGNoKG90KXx8WyIiXSxsaT1jaS5sZW5ndGg7bGktLTspZm9yKGF0PWNpW2xpXSxyKHB0KT9ndChwdCxnLCEwKTpnJiZ0dD09PTAmJnB0JiZkdChyaSwiIiksdGk9MCx3dD0wO3d0PHR0O3d0KyspaWYoYT1iW3d0XSxhIT09IiIpe2lmKG49cHQsIiIrYT09PWEpe2lmKGV0PWEuc3BsaXQoIl4iKSxldFsxXSYmKHRpPWV0WzBdLnNwbGl0KCIuIikubGVuZ3RoLGE9ZXQuam9pbigiLiIpLHRpPWEuc3BsaXQoIi4iKS5sZW5ndGgtdGkpLHl0JiYoc2k9eXQoYSxwdCkpKXt0dCs9c2kubGVuZ3RoLTE7cC5hcHBseShiLFt3dC0tLDFdLmNvbmNhdChzaSkpO2NvbnRpbnVlfWV0PWEuc3BsaXQoIi4iKX1lbHNlIGFpJiYhdShhKSYmKGEuX2pzdk9iJiYoYS5fY2I9aGk9dmkoYSxiLnNsaWNlKHd0KzEpKSxoaS5ub0FycmF5PXZ0PT09ITEsaGkuX2NJZD1oLl9jSWQsZSh2dCxbZnRdLGIuc2xpY2UoMCx3dCksYS5fY2IseXQpLGE9YS5fb2IpLG49YSkscHQ9YSxldD1bcHRdO3doaWxlKG4mJih2PWV0LnNoaWZ0KCkpIT09aSlpZih0eXBlb2Ygbj09PXMpe2lmKCIiK3Y9PT12KXtpZih2PT09IiIpY29udGludWU7aWYoZXQubGVuZ3RoPHRpKzEmJiFuLm5vZGVUeXBlKXtpZighZyYmKG89aXQobikmJnQuX2RhdGEobikpKXtmb3Iobz1vLmV2ZW50cyxvPW8mJm9bY10sa3Q9byYmby5sZW5ndGgsb2k9MDtrdC0tOyludD1vW2t0XS5kYXRhLG50JiZudC5jYj09PWgmJm50Lm5zPT09YXQmJihudC5wcm9wPT09dnx8bnQucHJvcD09PSIqIikmJigodWk9ZXQuam9pbigiLiIpKSYmbnQucGF0aHMucHVzaCh1aSksb2krKyk7aWYob2kpe249blt2XTtjb250aW51ZX19aWYodj09PSIqIil7IWcmJm8mJm8ubGVuZ3RoJiZkdChyaSwiIiwhMSwhMCk7dShuKT8oZmk9bi5kZXBlbmRzKSYmZSh2dCxbZmldLGgsZ3x8ZnQpOmR0KHJpLCIiKTtmb3IodWkgaW4gbilndChuLGcsaSx1aSk7YnJlYWt9ZWxzZSB2JiZkdChyaSsiLiIrdixldC5qb2luKCIuIikpfWx0JiYobHQrPSIuIit2KTt2PW5bdl19aWYodSh2KSl7KGZpPXYuZGVwZW5kcykmJmUodnQsW25dLHJ0KGZpLG4pLGgseXQsZ3x8W2Z0XSk7YnJlYWt9bj12fWd0KG4sZyl9cmV0dXJuIGJ0JiZ1dChuaSxidCkse2NiSWQ6YnQsYm5kOm5pLGxlYWY6bn19ZnVuY3Rpb24gbHQoKXtyZXR1cm5bXS5wdXNoLmNhbGwoYXJndW1lbnRzLCEwKSxhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBlKCl7dmFyIG49W10uY29uY2F0LmFwcGx5KFtdLGFyZ3VtZW50cyk7cmV0dXJuIGEuYXBwbHkobi5zaGlmdCgpLG4pfWZ1bmN0aW9uIGZ0KG4sdCxpKXtyZXR1cm4gaS5pbmRleE9mKCIuIik8MCYmaS5pbmRleE9mKCJbIik8MCYmdFtuXX1mdW5jdGlvbiBhdChuLHIsdSxmLGUpe3JldHVybiBmPWZ8fGZ0LGU9ZXx8ZnQse2dldFRndDpuLG9ic1NyYzpyLG9ic1RndDp1LG1hcDpmdW5jdGlvbihpKXt2YXIgbz10aGlzLGgsYztyZXR1cm4gby5zcmMhPT1pJiYoby5zcmMmJm8udW5tYXAoKSx0eXBlb2YgaT09PXMmJihjPW4uYXBwbHkobyxhcmd1bWVudHMpLHQub2JzZXJ2YWJsZSYmKHQub2JzZXJ2YWJsZShpKS5vYnNlcnZlQWxsKG8ub2JzPWZ1bmN0aW9uKG4sdCl7IWgmJnImJihoPSEwLHIuY2FsbChvLGksYyxuLHQpLGg9ITEpfSxmKSx0Lm9ic2VydmFibGUoYykub2JzZXJ2ZUFsbChvLm9idD1mdW5jdGlvbihuLHQpeyFoJiZ1JiYoaD0hMCx1LmNhbGwobyxpLGMsbix0KSxoPSExKX0sZSkpLG8uc3JjPWksby50Z3Q9YykpLG99LHVubWFwOmZ1bmN0aW9uKCl7aWYodC5vYnNlcnZhYmxlKXt2YXIgbj10aGlzO24uc3JjJiYodC5vYnNlcnZhYmxlKG4uc3JjKS51bm9ic2VydmVBbGwobi5vYnMsZiksdC5vYnNlcnZhYmxlKG4udGd0KS51bm9ic2VydmVBbGwobi5vYnQsZSksbi5zcmM9bi50Z3Q9aSl9fX19ZnVuY3Rpb24gZyhuLHQsaSxyKXtuKyIiIT09biYmKGk9dCx0PW4sbj0iIik7dihuLHRoaXMuX2RhdGEsdCxpLFtdLCJyb290IixyKX1mdW5jdGlvbiBldChuLHQsaSl7Zy5jYWxsKHRoaXMsbix0LGksITApfWZ1bmN0aW9uIHYobix0LHUsZSxvLGgsYyl7ZnVuY3Rpb24gcCh0LGkpe2Zvcih5PXQubGVuZ3RoLGw9aCsiW10iO3ktLTspKGs9Zi5fZmx0cih5LHQsbCxlKSkmJnYobixrLHUsZXx8IiIsby5zbGljZSgpLGwsaSl9ZnVuY3Rpb24gZCh0LGkpe2g9dC5kYXRhLm9ic2VydmVBbGwuX3BhdGg7dmFyIHI9bztvWzBdIT09dC50YXJnZXQmJihvPW8uc2xpY2UoKSxvLnVuc2hpZnQodC50YXJnZXQpKTtzd2l0Y2goaS5jaGFuZ2Upe2Nhc2UiaW5zZXJ0IjpwKGkuaXRlbXMpO2JyZWFrO2Nhc2UicmVtb3ZlIjpwKGkuaXRlbXMsITApO2JyZWFrO2Nhc2UicmVmcmVzaCI6cChpLm9sZEl0ZW1zLCEwKTtwKHQudGFyZ2V0KTticmVhaztjYXNlInNldCI6bD1oKyIuIitpLnBhdGg7dihuLGkub2xkVmFsdWUsdSwwLG8uc2xpY2UoKSxsLCEwKTt2KG4saS52YWx1ZSx1LDAsby5zbGljZSgpLGwpfXUuYXBwbHkodGhpcyxhcmd1bWVudHMpO289cn12YXIgeSxiLGwsaztpZih0eXBlb2YgdD09PXMpaWYoYj1yKHQpPyIiOiIqIixvLnVuc2hpZnQodCksdT8oYnx8ZSE9PTApJiYoZC5fY0lkPXUuX2NJZD11Ll9jSWR8fHcrKyxhKG4sdCxiLGQsYyxlLG8uc2xpY2UoKSxoKSk6YShuLHQsYixpLGMsZSxvLnNsaWNlKCksaCksYilmb3IoeSBpbiB0KXkuY2hhckF0KDApIT09Il8iJiZ5IT09dHQmJihsPWgrIi4iK3ksKGs9Zi5fZmx0cih5LHQsbCxlKSkmJnYobixrLHUsZXx8MCxvLnNsaWNlKCksbCxjKSk7ZWxzZSBwKHQsYyl9aWYoIXQpdGhyb3cianNWaWV3cy9qc09ic2VydmFibGUgcmVxdWlyZSBqUXVlcnkiO2lmKCF0Lm9ic2VydmFibGUpe3ZhciBudD10LmV2ZW50LnNwZWNpYWwsbz10LnZpZXdzP3Qudmlld3Muc3ViOmYuc3ViPXt9LHA9W10uc3BsaWNlLHI9dC5pc0FycmF5LHR0PXQuZXhwYW5kbyxzPSJvYmplY3QiLGg9cGFyc2VJbnQsb3Q9L1xTKy9nLGM9by5wcm9wQ2huZz1vLnByb3BDaG5nfHwicHJvcGVydHlDaGFuZ2UiLGw9by5hcnJDaG5nPW8uYXJyQ2huZ3x8ImFycmF5Q2hhbmdlIix5PW8uX2NiQm5kcz1vLl9jYkJuZHN8fHt9LHN0PWMrIi5vYnNlcnZlIix1PW8uaXNGbixodD0xLHc9MSxpdD10Lmhhc0RhdGE7by5nZXREZXBzPWZ1bmN0aW9uKCl7dmFyIG49YXJndW1lbnRzO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgaSx0LHI9W10sZj1uLmxlbmd0aDtmLS07KWk9bltmLS1dLHQ9bltmXSx0JiYocj1yLmNvbmNhdCh1KHQpP3QoaSxpKTp0KSk7cmV0dXJuIHJ9fTtvLkRhdGFNYXA9YXQ7dC5vYnNlcnZhYmxlPWY7Zi5fZmx0cj1mdW5jdGlvbihuLHQsaSxyKXt2YXIgZj1yJiZ1KHIpP3Iobix0LGkpOnRbbl07cmV0dXJuIGYmJihmPXUoZik/Zi5zZXQmJmYuY2FsbCh0KTpmKSx0eXBlb2YgZj09PXMmJmZ9O2YuT2JqZWN0PWI7Zi5BcnJheT1rO3Qub2JzZXJ2ZT1mLm9ic2VydmU9YTt0LnVub2JzZXJ2ZT1mLnVub2JzZXJ2ZT1sdDtmLl9hcHBseT1lO2IucHJvdG90eXBlPXtfZGF0YTpudWxsLG9ic2VydmVBbGw6Zyx1bm9ic2VydmVBbGw6ZXQsZGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxzZXRQcm9wZXJ0eTpmdW5jdGlvbihuLHQsdSl7dmFyIGYsaCxzLGU9dGhpcyxvPWUuX2RhdGE7aWYobj1ufHwiIixvKWlmKHIobikpZm9yKGY9bi5sZW5ndGg7Zi0tOyloPW5bZl0sZS5zZXRQcm9wZXJ0eShoLm5hbWUsaC52YWx1ZSx1PT09aXx8dSk7ZWxzZSBpZigiIituIT09bilmb3IoZiBpbiBuKWUuc2V0UHJvcGVydHkoZixuW2ZdLHQpO2Vsc2UgaWYobiE9PXR0KXtmb3Iocz1uLnNwbGl0KCIuIik7byYmcy5sZW5ndGg+MTspbz1vW3Muc2hpZnQoKV07ZS5fc2V0UHJvcGVydHkobyxzLmpvaW4oIi4iKSx0LHUpfXJldHVybiBlfSxfc2V0UHJvcGVydHk6ZnVuY3Rpb24obix0LGkscil7dmFyIGUsbyxmPXQ/blt0XTpuO3UoZikmJmYuc2V0JiYobz1mLGU9Zi5zZXQ9PT0hMD9mOmYuc2V0LGY9Zi5jYWxsKG4pKTsoZiE9PWl8fHImJmYhPWkpJiYoIShmIGluc3RhbmNlb2YgRGF0ZSl8fGY+aXx8ZjxpKSYmKGU/KGUuY2FsbChuLGkpLGk9by5jYWxsKG4pKTp0JiYoblt0XT1pKSx0aGlzLl90cmlnZ2VyKG4se2NoYW5nZToic2V0IixwYXRoOnQsdmFsdWU6aSxvbGRWYWx1ZTpmfSkpfSxfdHJpZ2dlcjpmdW5jdGlvbihuLGkpe3QobikudHJpZ2dlckhhbmRsZXIoYyxpKX19O2sucHJvdG90eXBlPXtfZGF0YTpudWxsLG9ic2VydmVBbGw6Zyx1bm9ic2VydmVBbGw6ZXQsZGF0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfSxpbnNlcnQ6ZnVuY3Rpb24obix0KXt2YXIgaT10aGlzLl9kYXRhO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09MSYmKHQ9bixuPWkubGVuZ3RoKSxuPWgobiksbj4tMSYmbjw9aS5sZW5ndGgmJih0PXIodCk/dDpbdF0sdC5sZW5ndGgmJnRoaXMuX2luc2VydChuLHQpKSx0aGlzfSxfaW5zZXJ0OmZ1bmN0aW9uKG4sdCl7dmFyIGk9dGhpcy5fZGF0YSxyPWkubGVuZ3RoO3AuYXBwbHkoaSxbbiwwXS5jb25jYXQodCkpO3RoaXMuX3RyaWdnZXIoe2NoYW5nZToiaW5zZXJ0IixpbmRleDpuLGl0ZW1zOnR9LHIpfSxyZW1vdmU6ZnVuY3Rpb24obix0KXt2YXIgcix1PXRoaXMuX2RhdGE7cmV0dXJuIG49PT1pJiYobj11Lmxlbmd0aC0xKSxuPWgobiksdD10P2godCk6dD09PTA/MDoxLHQ+LTEmJm4+LTEmJihyPXUuc2xpY2UobixuK3QpLHQ9ci5sZW5ndGgsdCYmdGhpcy5fcmVtb3ZlKG4sdCxyKSksdGhpc30sX3JlbW92ZTpmdW5jdGlvbihuLHQsaSl7dmFyIHI9dGhpcy5fZGF0YSx1PXIubGVuZ3RoO3Iuc3BsaWNlKG4sdCk7dGhpcy5fdHJpZ2dlcih7Y2hhbmdlOiJyZW1vdmUiLGluZGV4Om4saXRlbXM6aX0sdSl9LG1vdmU6ZnVuY3Rpb24obix0LGkpe2lmKGk9aT9oKGkpOmk9PT0wPzA6MSxuPWgobiksdD1oKHQpLGk+MCYmbj4tMSYmdD4tMSYmbiE9PXQpe3ZhciByPXRoaXMuX2RhdGEuc2xpY2UobixuK2kpO2k9ci5sZW5ndGg7aSYmdGhpcy5fbW92ZShuLHQsaSxyKX1yZXR1cm4gdGhpc30sX21vdmU6ZnVuY3Rpb24obix0LGkscil7dmFyIHU9dGhpcy5fZGF0YSxmPXUubGVuZ3RoO3Uuc3BsaWNlKG4saSk7dS5zcGxpY2UuYXBwbHkodSxbdCwwXS5jb25jYXQocikpO3RoaXMuX3RyaWdnZXIoe2NoYW5nZToibW92ZSIsb2xkSW5kZXg6bixpbmRleDp0LGl0ZW1zOnJ9LGYpfSxyZWZyZXNoOmZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuX2RhdGEuc2xpY2UoKTtyZXR1cm4gdGhpcy5fcmVmcmVzaCh0LG4pLHRoaXN9LF9yZWZyZXNoOmZ1bmN0aW9uKG4sdCl7dmFyIGk9dGhpcy5fZGF0YSxyPWkubGVuZ3RoO3AuYXBwbHkoaSxbMCxpLmxlbmd0aF0uY29uY2F0KHQpKTt0aGlzLl90cmlnZ2VyKHtjaGFuZ2U6InJlZnJlc2giLG9sZEl0ZW1zOm59LHIpfSxfdHJpZ2dlcjpmdW5jdGlvbihuLGkpe3ZhciByPXRoaXMuX2RhdGEsdT1yLmxlbmd0aCxmPXQoW3JdKTtmLnRyaWdnZXJIYW5kbGVyKGwsbik7dSE9PWkmJmYudHJpZ2dlckhhbmRsZXIoYyx7Y2hhbmdlOiJzZXQiLHBhdGg6Imxlbmd0aCIsdmFsdWU6dSxvbGRWYWx1ZTppfSl9fTtudFtjXT1udFtsXT17cmVtb3ZlOmZ1bmN0aW9uKG4pe3ZhciByLHUsZixlLG8saT1uLmRhdGE7aWYoaSYmKGkub2ZmPTEsaT1pLmNiKSYmKHI9eVtpLl9jSWRdKSl7Zm9yKGY9dC5fZGF0YSh0aGlzKS5ldmVudHNbbi50eXBlXSxlPWYubGVuZ3RoO2UtLSYmIXU7KXU9KG89ZltlXS5kYXRhKSYmby5jYj09PWk7dXx8KGRlbGV0ZSByW3QuZGF0YSh0aGlzLCJvYklkIildLHV0KHIsaS5fY0lkKSl9fX19fSh0aGlzLHRoaXMualF1ZXJ5KSxmdW5jdGlvbihuLHQsaSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHNyKG4pe3ZhciB0PXRoaXMubGlua2VkRWxlbTt0JiZldCh7dGFyZ2V0OnRbMF19LG4pfWZ1bmN0aW9uIGV0KG4scil7dmFyIHAsbnQsaCxmLHcsbCxlLGIsbyxhLHR0LGssZyx1LHMsdix5PW4udGFyZ2V0LGl0PXkuX2pzdkJuZCx1dD0vJihcZCspXCs/L2c7aWYoaXQpd2hpbGUoYT11dC5leGVjKGl0KSlpZigoYT1jW2FbMV1dKSYmKHM9YS50bykpe2lmKGY9YS5saW5rQ3R4LG89Zi52aWV3LHU9Zi50YWcsYj10KHkpLGs9by5obHAod3QpLGc9by5obHAoYnQpLGg9b3QoeSkscD1ndFtoXSxyPT09aSYmKHI9cnQoaCk/aCh5KTpwP2JbcF0oKTpiLmF0dHIoaCkpLGw9c1sxXSxzPXNbMF0sbCYmKHc9cnQobCk/bDpvLmdldFJzYygiY29udmVydGVycyIsbCkpLHcmJihyPXcuY2FsbCh1LHIpKSx0dD1vLmxpbmtDdHgsby5saW5rQ3R4PWYsdj17Y2hhbmdlOiJjaGFuZ2UiLG9sZFZhbHVlOmYuX3ZhbCx2YWx1ZTpyfSwoIWt8fCEobnQ9ay5jYWxsKGYsbix2KT09PSExKSkmJighdXx8IXUub25CZWZvcmVDaGFuZ2V8fCEobnQ9dS5vbkJlZm9yZUNoYW5nZShuLHYpPT09ITEpKSYmciE9PWkmJihlPXNbMF0sciE9PWkmJmUpKXtpZihlPWUuX2pzdk9iP2UuX29iOmUsdSYmKHUuXy5jaGdpbmc9ITApLGQoZSkuc2V0UHJvcGVydHkoc1syXXx8c1sxXSxyKSxnJiZnLmNhbGwoZixuLHYpLHUpe2lmKHUub25BZnRlckNoYW5nZSl1Lm9uQWZ0ZXJDaGFuZ2Uobix2KTtkZWxldGUgdS5fLmNoZ2luZ31mLl92YWw9cn1vLmxpbmtDdHg9dHR9fWZ1bmN0aW9uIHl1KG4sdCx1KXt2YXIgYyxzLGYsZT10aGlzLHk9ZS5kYXRhLGE9ZS5lbGVtLGw9ZS5jb252ZXJ0LHA9YS5wYXJlbnROb2RlLGI9cCxvPWUudmlldyxrPW8uY3R4LHc9by5saW5rQ3R4LHY9by5obHAod3QpO2lmKG8ubGlua0N0eD1lLHAmJighdnx8ISh0JiZ2LmNhbGwoZSxuLHQpPT09ITEpKSYmISh0JiZuLmRhdGEucHJvcCE9PSIqIiYmbi5kYXRhLnByb3AhPT10LnBhdGgpKXtpZih0JiYoZS5ldmVudEFyZ3M9dCksdHx8ZS5faW5pdFZhbCl7aWYoZGVsZXRlIGUuX2luaXRWYWwscz11LmNhbGwoby50bXBsLHksbyxyKSxjPXB1KHMsZSxmLGUuYXR0cnx8b3QoYSwhMCxsIT09aSkpLGY9ZS50YWcpe2lmKHQmJmYub25VcGRhdGUmJmYub25VcGRhdGUobix0LHM9c1swXT9zOltzXSk9PT0hMXx8Yz09PSJub25lIil7Zi50YWdDdHhzPXM7Zi50YWdDdHg9c1swXTtjPT09aCYmZi5vbkJlZm9yZUxpbmsmJmYub25CZWZvcmVMaW5rKCk7Y3QoZixmLnRhZ0N0eCk7b2koZSx5LGEpO28ubGlua0N0eD13O3JldHVybn1pZihmLl8uY2hnaW5nKXJldHVybjtzPWYudGFnTmFtZS5zbGljZSgtMSk9PT0iOiI/ci5fY252dChmLnRhZ05hbWUuc2xpY2UoMCwtMSksbyxzKTpyLl90YWcoZixvLG8udG1wbCxzLCEwKX1lbHNlIHUuX2N0eHMmJihsPWw9PT0iIj8idHJ1ZSI6bCxzPWw/ci5fY252dChsLG8scyk6ci5fdGFnKHUuX2N0eHMsbyxvLnRtcGwscywhMCksZj1vLl8udGFnLGM9ZS5hdHRyfHxjKTtocihzLGUsYyxmKSYmdCYmKHY9by5obHAoYnQpKSYmdi5jYWxsKGUsbix0KX1mJiYoZi5jb250ZW50cz1jaSxmLm5vZGVzPWxpLGYuY2hpbGRUYWdzPWFpLGYuY3VycmVudEN0eHM9d3IsZi51cGRhdGU9c3IsZi5yZWZyZXNoPWtyLGN0KGYsZi50YWdDdHgpKTtvaShlLHksYSk7by5saW5rQ3R4PXd9fWZ1bmN0aW9uIHB1KG4scix1LGYpe3ZhciBlLGgsYyxvLHM9dSYmdS5wYXJlbnRFbGVtfHxyLmVsZW07aWYobiE9PWkpe2lmKG89dChzKSxmPXUmJnUuYXR0cnx8ZixydChuKSYmaXQoci5leHByKyI6IG1pc3NpbmcgcGFyZW5zIiksZj09PSJ2aXNpYmxlIiYmKGY9ImNzcy1kaXNwbGF5IiksYz0vXmNzcy0vLnRlc3QoZikmJmYuc2xpY2UoNCkpZT10LnN0eWxlKHMsYyksK249PT1uJiYoZT1wYXJzZUludChlKSksZT10LnN0eWxlKHMsYyk7ZWxzZSBpZihmIT09ImxpbmsiKXtpZihmPT09InZhbHVlIilzLnR5cGU9PT1rdCYmKGU9by5wcm9wKGY9cCkpO2Vsc2UgaWYoZj09PWZ0KWlmKHMudmFsdWU9PT0iIituKWU9by5wcm9wKHApO2Vsc2UgcmV0dXJuIGY7ZT09PWkmJihoPWd0W2ZdLGU9aD9vW2hdKCk6by5hdHRyKGYpKX1yLl92YWw9ZX1yZXR1cm4gZn1mdW5jdGlvbiBocihuLHIsdSxmKXt2YXIgdHQsbyxjLGssaXQsdyxhLGIsdix5LGQ9biE9PWkscnQ9ci5kYXRhLGU9ZiYmZi5wYXJlbnRFbGVtfHxyLmVsZW0sZz10KGUpLHM9ci52aWV3LG50PXIuX3ZhbCx1dD1zLmN0eCxldD1zLmxpbmtDdHgsbD1mfHx1PT09aDtpZihmJiYoZi5wYXJlbnRFbGVtPWYucGFyZW50RWxlbXx8ci5leHByfHxmLl9lbENudD9lOmUucGFyZW50Tm9kZSxvPWYuX3BydixjPWYuX254dCksIWQpe3U9PT1oJiZmJiZmLm9uQmVmb3JlTGluayYmZi5vbkJlZm9yZUxpbmsoKTtyZXR1cm59aWYoL15jc3MtLy50ZXN0KHUpKXIuYXR0cj09PSJ2aXNpYmxlIiYmKG49bj93dShlKToibm9uZSIpLChsPWx8fG50IT09bikmJnQuc3R5bGUoZSx1LnNsaWNlKDQpLG4pO2Vsc2UgaWYodSE9PSJsaW5rIil7aWYodT09PXApdz0xLG49biYmbiE9PSJmYWxzZSI7ZWxzZSBpZih1PT09ZnQpaWYoZS52YWx1ZT09PSIiK24pbj0hMCx3PTEsdT1wO2Vsc2V7b2kocixydCxlKTtyZXR1cm59ZWxzZSh1PT09InNlbGVjdGVkInx8dT09PSJkaXNhYmxlZCJ8fHU9PT0ibXVsdGlwbGUifHx1PT09InJlYWRvbmx5IikmJihuPW4mJm4hPT0iZmFsc2UiP3U6bnVsbCk7KHR0PWd0W3VdKT91PT09aD8ocy5saW5rQ3R4PXIscy5jdHg9ci5jdHgsZiYmZi5fLmlubGluZT8oaXQ9Zi5ub2RlcyghMCksZi5fZWxDbnQmJihvJiZvIT09Yz9waShvLGMsZSxmLl90Z0lkLCJeIiwhMCk6KGE9ZS5fZGZyKSYmKGI9Zi5fdGdJZCsiXiIsdj1hLmluZGV4T2YoIiMiK2IpKzEseT1hLmluZGV4T2YoIi8iK2IpLHYmJnk+MCYmKHYrPWIubGVuZ3RoLHk+diYmKGUuX2Rmcj1hLnNsaWNlKDAsdikrYS5zbGljZSh5KSxncihhLnNsaWNlKHYseSkpKSkpLG89bz9vLnByZXZpb3VzU2libGluZzpjP2MucHJldmlvdXNTaWJsaW5nOmUubGFzdENoaWxkKSx0KGl0KS5yZW1vdmUoKSxmJiZmLm9uQmVmb3JlTGluayYmZi5vbkJlZm9yZUxpbmsoKSxrPXMubGluayhzLmRhdGEsZSxvLGMsbixmJiZ7dGFnOmYuX3RnSWQsbGF6eUxpbms6Zi50YWdDdHgucHJvcHMubGF6eUxpbmt9KSk6KGQmJmcuZW1wdHkoKSxmJiZmLm9uQmVmb3JlTGluayYmZi5vbkJlZm9yZUxpbmsoKSxkJiYoaz1zLmxpbmsocnQsZSxvLGMsbixmJiZ7dGFnOmYuX3RnSWR9KSkpLHMubGlua0N0eD1ldCxzLmN0eD11dCk6KGw9bHx8bnQhPT1uKSYmKHU9PT0idGV4dCImJmUuY2hpbGRyZW4mJiFlLmNoaWxkcmVuWzBdP2UudGV4dENvbnRlbnQhPT1pP2UudGV4dENvbnRlbnQ9bjplLmlubmVyVGV4dD1uPT09bnVsbD8iIjpuOmdbdHRdKG4pKToobD1sfHxudCE9PW4pJiZnW3c/InByb3AiOiJhdHRyIl0odSxuPT09aSYmIXc/bnVsbDpuKTtyLl92YWw9bn1yZXR1cm4ga3x8bH1mdW5jdGlvbiBjcihuLHQpe3ZhciBpPXRoaXMscj1pLmhscCh3dCksdT1pLmhscChidCk7aWYoIXJ8fHIuY2FsbCh0aGlzLG4sdCkhPT0hMSl7aWYodCl7dmFyIG89dC5jaGFuZ2UsZj10LmluZGV4LGU9dC5pdGVtcztzd2l0Y2gobyl7Y2FzZSJpbnNlcnQiOmkuYWRkVmlld3MoZixlKTticmVhaztjYXNlInJlbW92ZSI6aS5yZW1vdmVWaWV3cyhmLGUubGVuZ3RoKTticmVhaztjYXNlIm1vdmUiOmkucmVmcmVzaCgpO2JyZWFrO2Nhc2UicmVmcmVzaCI6aS5yZWZyZXNoKCl9fXUmJnUuY2FsbCh0aGlzLG4sdCl9fWZ1bmN0aW9uIHd1KHQpe3ZhciBpLHUsZj1uLmdldENvbXB1dGVkU3R5bGUscj0odC5jdXJyZW50U3R5bGV8fGYuY2FsbChuLHQsIiIpKS5kaXNwbGF5O3JldHVybiByIT09Im5vbmUifHwocj1mclt1PXQubm9kZU5hbWVdKXx8KGk9ZS5jcmVhdGVFbGVtZW50KHUpLGUuYm9keS5hcHBlbmRDaGlsZChpKSxyPShmP2YuY2FsbChuLGksIiIpOmkuY3VycmVudFN0eWxlKS5kaXNwbGF5LGZyW3VdPXIsZS5ib2R5LnJlbW92ZUNoaWxkKGkpKSxyfWZ1bmN0aW9uIGZpKG4pe3ZhciBmLGUsdT1uLmRhdGEscj1uLl8uYm5kO2lmKCFuLl8udXNlS2V5JiZyKWlmKChlPW4uXy5ibmRBcnIpJiYodChbZVsxXV0pLm9mZihwdCxlWzBdKSxuLl8uYm5kQXJyPWkpLHIhPT0hIXImJnIuXy5pbmxpbmUpdT9yLl8uYXJyVndzW24uXy5pZF09bjpkZWxldGUgci5fLmFyclZ3c1tuLl8uaWRdO2Vsc2UgaWYodSl7Zj1mdW5jdGlvbih0KXt0LmRhdGEmJnQuZGF0YS5vZmZ8fGNyLmFwcGx5KG4sYXJndW1lbnRzKX07dChbdV0pLm9uKHB0LGYpO24uXy5ibmRBcnI9W2YsdV19fWZ1bmN0aW9uIG90KG4sdCxpKXt2YXIgdT1uLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkscj1mLm1lcmdlW3VdfHxuLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYme3RvOmgsZnJvbTpofTtyZXR1cm4gcj90P3U9PT0iaW5wdXQiJiZuLnR5cGU9PT1mdD9mdDpyLnRvOnIuZnJvbTp0P2k/InRleHQiOmg6IiJ9ZnVuY3Rpb24gbHIobixyLHUsZixlLG8scyl7dmFyIHAsYyx2LHcsYixsPW4ucGFyZW50RWxlbSxoPW4uX3BydixhPW4uX254dCx5PW4uX2VsQ250O2lmKGgmJmgucGFyZW50Tm9kZSE9PWwmJml0KCJNaXNzaW5nIHBhcmVudE5vZGUiKSxzKXt3PW4ubm9kZXMoKTt5JiZoJiZoIT09YSYmcGkoaCxhLGwsbi5fLmlkLCJfIiwhMCk7bi5yZW1vdmVWaWV3cyhpLGksITApO2M9YTt5JiYoaD1oP2gucHJldmlvdXNTaWJsaW5nOmE/YS5wcmV2aW91c1NpYmxpbmc6bC5sYXN0Q2hpbGQpO3QodykucmVtb3ZlKCk7Zm9yKGIgaW4gbi5fLmJuZHMpbHQoYil9ZWxzZXtpZihyKXtpZih2PWZbci0xXSwhdilyZXR1cm4hMTtoPXYuX254dH15PyhjPWgsaD1jP2MucHJldmlvdXNTaWJsaW5nOmwubGFzdENoaWxkKTpjPWgubmV4dFNpYmxpbmd9cD11LnJlbmRlcihlLG8sbi5fLnVzZUtleSYmcyxuLHN8fHIsITApO24ubGluayhlLGwsaCxjLHAsdil9ZnVuY3Rpb24gZWkobix0LHIpe3ZhciB1LGYsZTtyZXR1cm4gcj8oZT0iXmAiLGY9dC5fLnRhZ3x8e186e2lubGluZTohMCxibmQ6cn0sdGFnQ3R4Ont2aWV3OnR9LGZsb3c6ITB9LHU9Zi5fdGdJZCx1fHwoY1t1PWVyKytdPWYsZi5fdGdJZD0iIit1KSk6KGU9Il9gIix5W3U9dC5fLmlkXT10KSwiIyIrdStlKyhuPT09aT8iIjpuKSsiLyIrdStlfWZ1bmN0aW9uIG9pKG4sdCxyKXt2YXIgZSxsLGYsdT1uLnRhZyxhPW4uY29udmVydEJhY2ssbz1bXSxoPW4uX2JuZElkfHwiIitlcisrLHY9bi5faGRscjtpZihkZWxldGUgbi5fYm5kSWQsdSYmKG89dS5kZXBlbmRzfHxvLG89cnQobyk/dS5kZXBlbmRzKHUpOm8sZj11LmxpbmtlZEVsZW0pLCghbi5fZGVwZW5kc3x8IiIrbi5fZGVwZW5kcyE9IiIrbykmJihuLl9kZXBlbmRzJiZkLl9hcHBseSghMSxbdF0sbi5fZGVwZW5kcyx2LCEwKSxlPWQuX2FwcGx5KCExLFt0XSxuLmZuLnBhdGhzLG8sdixuLl9jdHhDYiksZS5lbGVtPXIsZS5saW5rQ3R4PW4sZS5fdGdJZD1oLHIuX2pzdkJuZD1yLl9qc3ZCbmR8fCIiLHIuX2pzdkJuZCs9IiYiK2gsbi5fZGVwZW5kcz1vLG4udmlldy5fLmJuZHNbaF09aCxjW2hdPWUsZiYmKGUudG89W1tdLGFdKSwoZnx8YSE9PWkpJiZicihlLHUmJnUuY29udmVydEJhY2t8fGEpLHUpKXtpZih1Lm9uQWZ0ZXJCaW5kKXUub25BZnRlckJpbmQoZSk7dS5mbG93fHx1Ll8uaW5saW5lfHwoci5zZXRBdHRyaWJ1dGUocywoci5nZXRBdHRyaWJ1dGUocyl8fCIiKSsiIyIraCsiXi8iK2grIl4iKSx1Ll90Z0lkPSIiK2gpfWlmKGYmJmZbMF0pZm9yKHUuXy5yYWRpbyYmKGY9Zi5jaGlsZHJlbigiaW5wdXRbdHlwZT1yYWRpb10iKSksbD1mLmxlbmd0aDtsLS07KWZbbF0uX2pzdkJuZD1mW2xdLl9qc3ZCbmR8fHIuX2pzdkJuZCsiKyIsZltsXS5fanN2TG5rZEVsPXV9ZnVuY3Rpb24gYXIobix0LGkscix1LGYsZSl7cmV0dXJuIHNpKHRoaXMsbix0LGkscix1LGYsZSl9ZnVuY3Rpb24gc2kobixyLHUsbyxzLGgsYyxhKXtpZihuJiZyKXtpZihyPXIuanF1ZXJ5P3I6dChyKSwhdyl7dz1lLmJvZHk7dCh3KS5vbihucixldCkub24oImJsdXIiLCJbY29udGVudGVkaXRhYmxlXSIsZnVuY3Rpb24obil7dmFyIHQ9Zi5ub1ZhbGlkYXRlO2Yubm9WYWxpZGF0ZT0hMDtldChuKTtmLm5vVmFsaWRhdGU9dH0pfWZvcih2YXIgayxudCx0dCxnLHAsZCx2LGl0LHJ0PWVpLGZ0PW8mJm8udGFyZ2V0PT09InJlcGxhY2UiLHV0PXIubGVuZ3RoO3V0LS07KWlmKHY9clt1dF0sIiIrbj09PW4pcD1iKHYpLGl0PXAuY3R4LHAuY3R4PW8sc3Qobix2LHAsdSkscC5jdHg9aXQ7ZWxzZXtpZihoPWh8fGIodiksbi5tYXJrdXAhPT1pKWgubGluaz09PSExJiYobz1vfHx7fSxvLmxpbms9cnQ9ITEpLGZ0JiYoZD12LnBhcmVudE5vZGUpLHR0PW4ucmVuZGVyKHUsbyxzLGgsaSxydCksZD8oYz12LnByZXZpb3VzU2libGluZyxhPXYubmV4dFNpYmxpbmcsdC5jbGVhbkRhdGEoW3ZdLCEwKSxkLnJlbW92ZUNoaWxkKHYpLHY9ZCk6KGM9YT1pLHQodikuZW1wdHkoKSk7ZWxzZSBpZihuIT09ITApYnJlYWs7aWYodi5fZGZyJiYhYSl7Zm9yKGc9bCh2Ll9kZnIsMSxvciksaz0wLG50PWcubGVuZ3RoO2s8bnQ7aysrKXA9Z1trXSwocD15W3AuaWRdKSYmcC5kYXRhIT09aSYmcC5wYXJlbnQucmVtb3ZlVmlld3MocC5fLmtleSxpLCEwKTt2Ll9kZnI9IiJ9aC5saW5rKHUsdixjLGEsdHQsaSxvKX19cmV0dXJuIHJ9ZnVuY3Rpb24gYnUobixyLHUsaCx2LHAsdyxkKXtmdW5jdGlvbiB5dShuLHQscix1LGUsbyxoLGMsbCxhLHkscCx3KXt2YXIgYixrPSIiO3JldHVybiB3PyhoaT0wLG4pOihnPWN8fGx8fCIiLHU9dXx8YSxyPXJ8fHAscGkmJiFyJiYodXx8Z3x8bykmJihwaT1pLHV0PWd0LnNoaWZ0KCkpLHU9dXx8cix1JiYoaGk9MCxwaT1pLGYubm9WYWxpZGF0ZXx8KHJ8fHA/dWlbdXRdfHwoYj0iJzwiK3V0KyIuLi4vIik6dWlbdV0/Yj0iJzxcLyIrdTpndC5sZW5ndGgmJnU9PT11dHx8KGI9Ik1pc21hdGNoOiAnPFwvIit1KSxiJiZ0aShiKyI+JyBpbjpcbiIrdikpLGVyPWZ0LHV0PWd0LnNoaWZ0KCksZnQ9cmlbdXRdLGE9YT8iPFwvIithKyI+IjoiIixlciYmKGF0Kz1wdCxwdD0iIixmdD9hdCs9Ii0iOihrPWEraXIrIkAiK2F0K3RyKyh5fHwiIiksYXQ9bHUuc2hpZnQoKSkpKSxmdD8obz9wdCs9bzp0PWF8fHB8fCIiLGcmJih0Kz1nLHB0JiYodCs9IiAiK3MrJz0iJytwdCsnIicscHQ9IiIpKSk6dD1vP3QraytlK2lyK28rdHIraCtnOmt8fG4saGkmJm8mJnRpKCIgTm8ge157IHRhZ3Mgd2l0aGluIGVsZW0gbWFya3VwICgiK2hpKycgKS4gVXNlIGRhdGEtbGluaz0iLi4uIicpLGcmJihoaT1nLGd0LnVuc2hpZnQodXQpLHV0PWcuc2xpY2UoMSksZ3RbMF0mJmd0WzBdPT09b3VbdXRdJiZpdCgiUGFyZW50IG9mIDx0cj4gbXVzdCBiZSA8dGJvZHk+IikscGk9dWlbdXRdLChmdD1yaVt1dF0pJiYhZXImJihsdS51bnNoaWZ0KGF0KSxhdD0iIiksZXI9ZnQsYXQmJmZ0JiYoYXQrPSIrIikpLHQpfWZ1bmN0aW9uIGJpKG4sdCl7dmFyIG8sbCx1LGUsZixhLHMsaD1bXTtpZihuKXtmb3Iobi5fdGtucy5jaGFyQXQoMCk9PT0iQCImJih0PW50LnByZXZpb3VzU2libGluZyxudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG50KSxudD1udWxsKSxidD1uLmxlbmd0aDtidC0tOyl7aWYob3Q9bltidF0sdT1vdC5jaCxvPW90LnBhdGgpZm9yKGV0PW8ubGVuZ3RoLTE7bD1vLmNoYXJBdChldC0tKTspbD09PSIrIj9vLmNoYXJBdChldCk9PT0iLSI/KGV0LS0sdD10LnByZXZpb3VzU2libGluZyk6dD10LnBhcmVudE5vZGU6dD10Lmxhc3RDaGlsZDt1PT09Il4iPyhnPWNbZj1vdC5pZF0pJiYocz10JiYoIW50fHxudC5wYXJlbnROb2RlIT09dCksKCFudHx8cykmJihnLnBhcmVudEVsZW09dCksb3QuZWxDbnQmJnMmJih0Ll9kZnI9KG90Lm9wZW4/IiMiOiIvIikrZit1Kyh0Ll9kZnJ8fCIiKSksaC5wdXNoKFtzP251bGw6bnQsb3RdKSk6KHJ0PXlbZj1vdC5pZF0pJiYocnQubGlua3x8KHJ0LnBhcmVudEVsZW09dHx8bnQmJm50LnBhcmVudE5vZGV8fHIsayhydCx2dCkscnQuXy5vblJlbmRlcj1laSxydC5fLm9uQXJyYXlDaGFuZ2U9Y3IsZmkocnQpKSxlPXJ0LnBhcmVudEVsZW0sb3Qub3Blbj8ocnQuX2VsQ250PW90LmVsQ250LHQ/dC5fZGZyPSIjIitmK3UrKHQuX2Rmcnx8IiIpOihydC5fcHJ2fHwoZS5fZGZyPWh0KGUuX2RmciwiIyIrZit1KSkscnQuX3Bydj1udCkpOih0JiYoIW50fHxudC5wYXJlbnROb2RlIT09dCk/KHQuX2Rmcj0iLyIrZit1Kyh0Ll9kZnJ8fCIiKSxydC5fbnh0PWkpOm50JiYocnQuX254dHx8KGUuX2Rmcj1odChlLl9kZnIsIi8iK2YrdSkpLHJ0Ll9ueHQ9bnQpLHZpPXJ0LmxpbmtDdHgsKGE9cnQuY3R4JiZydC5jdHgub25BZnRlckNyZWF0ZXx8d3UpJiZhLmNhbGwodmkscnQpKSl9Zm9yKGJ0PWgubGVuZ3RoO2J0LS07KWhyLnB1c2goaFtidF0pfXJldHVybiFufHxuLmVsQ250fWZ1bmN0aW9uIHB1KG4pe3ZhciB0LGk7aWYobilmb3IoYnQ9bi5sZW5ndGgsZXQ9MDtldDxidDtldCsrKWlmKG90PW5bZXRdLHl0LmlkKXl0LmlkPXl0LmlkIT09b3QuaWQmJnl0LmlkO2Vsc2UgaWYoaT1nPWNbb3QuaWRdLmxpbmtDdHgudGFnLCFnLmZsb3cpe2lmKCFicil7Zm9yKHQ9MTtpPWkucGFyZW50Oyl0Kys7cnI9cnJ8fHR9KGJyfHx0PT09cnIpJiYoIWRyfHxnLnRhZ05hbWU9PT1kcikmJnZyLnB1c2goZyl9fWZ1bmN0aW9uIHJ1KCl7Zm9yKGxyPWlpP3IucXVlcnlTZWxlY3RvckFsbCh0dCk6dCh0dCxyKS5nZXQoKSxuaT1sci5sZW5ndGgsdSYmdS5pbm5lckhUTUwmJihraT1paT91LnF1ZXJ5U2VsZWN0b3JBbGwodHQpOnQodHQsdSkuZ2V0KCksdT1raS5sZW5ndGg/a2lba2kubGVuZ3RoLTFdOnUpLHJyPTAsd3Q9MDt3dDxuaTt3dCsrKWlmKG50PWxyW3d0XSx1JiYhc3Upc3U9bnQ9PT11O2Vsc2UgaWYoaCYmbnQ9PT1oKWJyZWFrO2Vsc2UgbnQucGFyZW50Tm9kZSYmdnUobChudCxpLHZyJiZhdSkpJiYheXQmJm50LmdldEF0dHJpYnV0ZShhKSYmaHIucHVzaChbbnRdKTtpZih5cih1LGZ0KSx5cihoLGZ0KSx5dCl7a3QmJmt0LnJlc29sdmUoKTtyZXR1cm59Zm9yKGZ0JiZhdCtwdCYmKG50PWgsYXQmJihoP2JpKGwoYXQrIisiLDEpLGgpOmJpKGwoYXQsMSkscikpLGJpKGwocHQsMSksciksaCYmKGx0PWguZ2V0QXR0cmlidXRlKHMpLChuaT1sdC5pbmRleE9mKG9yKSsxKSYmKGx0PWx0LnNsaWNlKG5pK29yLmxlbmd0aC0xKSksaC5zZXRBdHRyaWJ1dGUocyxwdCtsdCkpKSxuaT1oci5sZW5ndGgsd3Q9MDt3dDxuaTt3dCsrKW50PWhyW3d0XSxkdD1udFsxXSxudD1udFswXSxkdD8oZz1jW2R0LmlkXSkmJigodmk9Zy5saW5rQ3R4KSYmKGc9dmkudGFnLGcubGlua0N0eD12aSksZHQub3Blbj8obnQmJihnLnBhcmVudEVsZW09bnQucGFyZW50Tm9kZSxnLl9wcnY9bnQpLGcuX2VsQ250PWR0LmVsQ250LCFnfHxnLm9uQmVmb3JlTGluayYmZy5vbkJlZm9yZUxpbmsoKT09PSExfHxnLl8uYm91bmR8fChnLl8uYm91bmQ9ITAscnQ9Zy50YWdDdHgudmlldyxzdChpLGcuX3BydixydCxuLGR0LmlkKSksZy5fLmxpbmtpbmc9ITApOihnLl9ueHQ9bnQsZy5fLmxpbmtpbmcmJihncj1nLnRhZ0N0eCxydD1nci52aWV3LGcuY29udGVudHM9Y2ksZy5ub2Rlcz1saSxnLmNoaWxkVGFncz1haSxnLmN1cnJlbnRDdHhzPXdyLGcudXBkYXRlPXNyLGcucmVmcmVzaD1rcixkZWxldGUgZy5fLmxpbmtpbmcsZy5fLmJvdW5kfHwoZy5fLmJvdW5kPSEwLHN0KGksZy5fcHJ2LHJ0LG4sZHQuaWQpKSxjdChnLGdyKSkpKToocnQ9YihudCksc3QobnQuZ2V0QXR0cmlidXRlKGEpLG50LHJ0LG4saSx3KSk7a3QmJmt0LnJlc29sdmUoKX12YXIgaGksdmksZyx3dCxuaSxldCxidCxscixudCxydCxvdCxkdCxraSxnaSxhcixucixvaSx2cixicixkcixncixycix5dCx1dSxudSxldSx5aSx1dCxwaSx3aSxmcixsdCxmdCxlcixzaSxwdCxvcixzdSxrdCx0dT10aGlzLGN1PXR1Ll8uaWQrIl8iLGF0PSIiLGhyPVtdLGd0PVtdLGx1PVtdLHd1PXR1LmhscChpdSksdnU9Ymk7aWYocCYmKGt0PXAubGF6eUxpbmsmJnQuRGVmZXJyZWQoKSxwLnRtcGw/YXI9Ii8iK3AuXy5pZCsiXyI6KHl0PXAuZ2V0LHAudGFnJiYoY3U9cC50YWcrIl4iLHA9ITApKSxwPXA9PT0hMCkseXQmJih2dT1wdSx2cj15dC50YWdzLGJyPXl0LmRlZXAsZHI9eXQubmFtZSkscj1yPyIiK3I9PT1yP3QocilbMF06ci5qcXVlcnk/clswXTpyOnR1LnBhcmVudEVsZW18fGUuYm9keSx1dD1yLnRhZ05hbWUudG9Mb3dlckNhc2UoKSxmdD0hIXJpW3V0XSx1PXUmJnByKHUsZnQpLGg9aCYmcHIoaCxmdCl8fG51bGwsdiE9PWkpe2lmKGZyPWUuY3JlYXRlRWxlbWVudCgiZGl2Iiksd2k9ZnIsb3I9cHQ9IiIsc2k9ci5uYW1lc3BhY2VVUkk9PT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPyJzdmdfbnMiOih5aT1mdS5leGVjKHYpKSYmeWlbMV18fCIiLGRpJiZ5aSYmeWlbMl0mJml0KCJVbnN1cHBvcnRlZDogIit5aVsyXSksZnQpe2ZvcihvaT1oO29pJiYhKG5yPWwob2kpKTspb2k9b2kubmV4dFNpYmxpbmc7KGx0PW5yP25yLl90a25zOnIuX2RmcikmJihnaT1hcnx8IiIsKHB8fCFhcikmJihnaSs9IiMiK2N1KSxldD1sdC5pbmRleE9mKGdpKSxldCsxJiYoZXQrPWdpLmxlbmd0aCxvcj1wdD1sdC5zbGljZSgwLGV0KSxsdD1sdC5zbGljZShldCksbnI/b2kuc2V0QXR0cmlidXRlKHMsbHQpOnIuX2Rmcj1sdCkpfWlmKHBpPWksdj0oIiIrdikucmVwbGFjZShodSx5dSksIWYubm9WYWxpZGF0ZSYmZ3QubGVuZ3RoJiZ0aSgiTWlzbWF0Y2hlZCAnPCIrdXQrIi4uLj4nIGluOlxuIit2KSxkKXJldHVybjtmb3IodXIuYXBwZW5kQ2hpbGQoZnIpLHNpPW9bc2ldfHxvLmRpdix1dT1zaVswXSx3aS5pbm5lckhUTUw9c2lbMV0rditzaVsyXTt1dS0tOyl3aT13aS5sYXN0Q2hpbGQ7Zm9yKHVyLnJlbW92ZUNoaWxkKGZyKSxudT1lLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtldT13aS5maXJzdENoaWxkOyludS5hcHBlbmRDaGlsZChldSk7ci5pbnNlcnRCZWZvcmUobnUsaCl9cmV0dXJuIGt0P3NldFRpbWVvdXQocnUsMCk6cnUoKSxrdCYma3QucHJvbWlzZSgpfWZ1bmN0aW9uIHN0KG4sdCxyLGYsZSxvKXt2YXIgdyx2LGIsbCxrLGQseSxwLGEscyx0dDtpZihmPXIuZGF0YT09PWk/Znx8e306ci5kYXRhLGUpcz1jW2VdLHM9cy5saW5rQ3R4P3MubGlua0N0eC50YWc6cyxhPXMubGlua0N0eHx8e2RhdGE6ZixlbGVtOnMuX2VsQ250P3MucGFyZW50RWxlbTp0LHZpZXc6cixjdHg6ci5jdHgsYXR0cjpoLGZuOnMuXy5ibmQsdGFnOnMsX2JuZElkOmV9LHZyKGEsYS5mbik7ZWxzZSBpZihuJiZ0KWZvcih3PXIudG1wbCxuPWt1KG4sb3QodCkpLGcubGFzdEluZGV4PTA7dj1nLmV4ZWMobik7KXR0PWcubGFzdEluZGV4LGI9ZT9oOnZbMV0seT12WzNdLGs9dlsxMF0sbD1pLGE9e2RhdGE6ZixlbGVtOnMmJnMuX2VsQ250P3MucGFyZW50RWxlbTp0LHZpZXc6cixjdHg6b3x8ci5jdHgsYXR0cjpiLF9pbml0VmFsOiF2WzJdfSx2WzZdJiYoIWImJihsPS86KFtcdyRdKikkLy5leGVjKGspKSYmKGw9bFsxXSxsIT09aSYmKGQ9LWwubGVuZ3RoLTEseT15LnNsaWNlKDAsZC0xKStudCxrPWsuc2xpY2UoMCxkKSkpLGw9PT1udWxsJiYobD1pKSxhLmNvbnZlcnQ9dls1XXx8IiIpLGEuZXhwcj1iK3kscD13LmxpbmtzW3ldLHB8fCh3LmxpbmtzW3ldPXA9dS50bXBsRm4od2kreStiaSx3LCEwLGwpLHUucGFyc2UoayxwLnBhdGhzPVtdLHcpKSxhLmZuPXAsYnx8bD09PWl8fChhLmNvbnZlcnRCYWNrPWwpLHZyKGEscCksZy5sYXN0SW5kZXg9dHR9ZnVuY3Rpb24gdnIobix0KXtmdW5jdGlvbiBpKGkscil7eXUuY2FsbChuLGkscix0KX1pLm5vQXJyYXk9ITA7bi5fY3R4Q2I9ZHUobi52aWV3KTtuLl9oZGxyPWk7aSghMCl9ZnVuY3Rpb24gaHQobix0KXt2YXIgaTtyZXR1cm4gbj8oaT1uLmluZGV4T2YodCksaSsxP24uc2xpY2UoMCxpKStuLnNsaWNlKGkrdC5sZW5ndGgpOm4pOiIifWZ1bmN0aW9uIGhpKG4pe3JldHVybiBuJiYoIiIrbj09PW4/bjpuLnRhZ05hbWU9PT0iU0NSSVBUIj9uLnR5cGUuc2xpY2UoMyk6bi5ub2RlVHlwZT09PTEmJm4uZ2V0QXR0cmlidXRlKHMpfHwiIil9ZnVuY3Rpb24gbChuLHQsaSl7ZnVuY3Rpb24gZShuLHQsaSxyLGUsbyl7dS5wdXNoKHtlbENudDpmLGlkOnIsY2g6ZSxvcGVuOnQsY2xvc2U6aSxwYXRoOm8sdG9rZW46bn0pfXZhciBmLHIsdT1bXTtpZihyPXQ/bjpoaShuKSlyZXR1cm4gdS5lbENudD0hbi50eXBlLGY9ci5jaGFyQXQoMCk9PT0iQCJ8fCFuLnR5cGUsdS5fdGtucz1yLHIucmVwbGFjZShpfHx2dSxlKSx1fWZ1bmN0aW9uIHlyKG4sdCl7biYmKG4udHlwZT09PSJqc3YiP24ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTp0JiZuLmdldEF0dHJpYnV0ZShhKT09PSIiJiZuLnJlbW92ZUF0dHJpYnV0ZShhKSl9ZnVuY3Rpb24gcHIobix0KXtmb3IodmFyIGk9bjt0JiZpJiZpLm5vZGVUeXBlIT09MTspaT1pLnByZXZpb3VzU2libGluZztyZXR1cm4gaSYmKGkubm9kZVR5cGUhPT0xPyhpPWUuY3JlYXRlRWxlbWVudCgiU0NSSVBUIiksaS50eXBlPSJqc3YiLG4ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxuKSk6aGkoaSl8fGkuZ2V0QXR0cmlidXRlKGEpfHxpLnNldEF0dHJpYnV0ZShhLCIiKSksaX1mdW5jdGlvbiBrdShuLGkpe3JldHVybiBuPXQudHJpbShuKS5yZXBsYWNlKGV1LCJcXCQmIiksbi5zbGljZSgtMSkhPT1udD9uPXl0KyI6IituKyhpPyI6IjoiIikrbnQ6bn1mdW5jdGlvbiBjaShuLHIpe24hPT0hIW4mJihyPW4sbj1pKTt2YXIgZix1PXQodGhpcy5ub2RlcygpKTtyZXR1cm4gdVswXSYmKGY9cj91LmZpbHRlcihyKTp1LHU9biYmcj9mLmFkZCh1LmZpbmQocikpOmYpLHV9ZnVuY3Rpb24gbGkobix0LGkpe3ZhciByLHU9dGhpcyxmPXUuX2VsQ250LG89IXQmJmYsZT1bXTtmb3IodD10fHx1Ll9wcnYsaT1pfHx1Ll9ueHQscj1vP3Q9PT11Ll9ueHQ/dS5wYXJlbnRFbGVtLmxhc3RTaWJsaW5nOnQ6dS5fLmlubGluZT09PSExP3R8fHUubGlua0N0eC5lbGVtLmZpcnN0Q2hpbGQ6dCYmdC5uZXh0U2libGluZztyJiYoIWl8fHIhPT1pKTspKG58fGZ8fHIudGFnTmFtZSE9PSJTQ1JJUFQiKSYmZS5wdXNoKHIpLHI9ci5uZXh0U2libGluZztyZXR1cm4gZX1mdW5jdGlvbiBhaShuLHQpe24hPT0hIW4mJih0PW4sbj1pKTt2YXIgcj10aGlzLG89ci5saW5rP3I6ci50YWdDdHgudmlldyx1PXIuX3BydixmPXIuX2VsQ250LGU9W107cmV0dXJuIHUmJm8ubGluayhpLHIucGFyZW50RWxlbSxmP3UucHJldmlvdXNTaWJsaW5nOnUsci5fbnh0LGkse2dldDp7dGFnczplLGRlZXA6bixuYW1lOnQsaWQ6ZiYmci5fdGdJZH19KSxlfWZ1bmN0aW9uIHdyKCl7dmFyIG49dGhpcy50YWdDdHgudmlldztyZXR1cm4gdGhpcy5fLmJuZC5jYWxsKG4udG1wbCxuLmRhdGEsbixyKX1mdW5jdGlvbiBjdChuLHQpe3ZhciBmLHIscyxlLG8sYSx2LGwseT10LnZpZXcsaD1uLmxpbmtDdHg9bi5saW5rQ3R4fHx7dGFnOm4sZGF0YTp5LmRhdGEsdmlldzp5LGN0eDp5LmN0eH07aWYobi5vbkFmdGVyTGluayluLm9uQWZ0ZXJMaW5rKHQsaCk7aWYoZj1uLnRhcmdldFRhZz9uLnRhcmdldFRhZy5saW5rZWRFbGVtOm4ubGlua2VkRWxlbSxmJiYocj1mWzBdKSYmKChzPW4uXy5yYWRpbykmJihmPWYuY2hpbGRyZW4oImlucHV0W3R5cGU9cmFkaW9dIikpLHN8fCFuLl8uY2hnaW5nKSl7aWYoZT11LmN2dChuLG4uY29udmVydClbMF0sc3x8ciE9PWguZWxlbSl7Zm9yKHY9Zi5sZW5ndGg7di0tOyl7aWYocj1mW3ZdLGw9ci5fanN2TG5rZEVsLG4uXy5pbmxpbmUmJighbHx8bCE9PW4mJmwudGFyZ2V0VGFnIT09bikpZm9yKHIuX2pzdkxua2RFbD1uLG89aC5lbGVtP2guZWxlbS5fanN2Qm5kOm4uX3Bydi5fanN2Qm5kLHIuX2pzdkJuZD1vKyIrIixvPW8uc2xpY2UoMSkuc3BsaXQoIiYiKSxhPW8ubGVuZ3RoO2EtLTspYnIoY1tvW2FdXSxuLmNvbnZlcnRCYWNrKTtzJiYocltwXT1lPT09ci52YWx1ZSl9aC5fdmFsPWV9c3x8ci52YWx1ZT09PWl8fGU9PT1pfHwoci50eXBlPT09a3Q/cltwXT1lJiZlIT09ImZhbHNlIjpmLnZhbChlKSl9fWZ1bmN0aW9uIGJyKG4sdCl7dmFyIGUsZixzLGksbyxyPW4ubGlua0N0eCxoPXIuZGF0YSx1PXIuZm4ucGF0aHM7aWYobil7Zm9yKChlPXUuX2pzdnRvKSYmKHU9ZSksZj11Lmxlbmd0aDtmJiYiIisoaT11Wy0tZl0pIT09aTspO2kmJighci50YWd8fHIudGFnLnRhZ0N0eC5hcmdzLmxlbmd0aCk/KGk9aS5zcGxpdCgiXiIpLmpvaW4oIi4iKSxuLnRvPWkuY2hhckF0KDApPT09Ii4iP1tbbz11W2YtMV0saS5zbGljZSgxKV0sdF06W3IuX2N0eENiKHM9Zj91WzBdLnNwbGl0KCJeIikuam9pbigiLiIpOmkpfHxbaCxzXSx0XSxlJiZvJiYobi50b1swXVswXT1yLl9jdHhDYihvLGgpKSk6bi50bz1bW10sdF19fWZ1bmN0aW9uIGtyKG4pe3ZhciB1LGYsdD10aGlzLGU9dC5saW5rQ3R4LG89dC50YWdDdHgudmlldztyZXR1cm4gdC5kaXNwb3NlZCYmaXQoIlJlbW92ZWQgdGFnIiksbj09PWkmJihuPXIuX3RhZyh0LG8sby50bXBsLHQuY3VycmVudEN0eHM/dC5jdXJyZW50Q3R4cygpOnQudGFnQ3R4cywhMCkpLG4rIiI9PT1uJiYoZj10Ll8uaW5saW5lP2g6ZS5hdHRyfHxvdCh0LnBhcmVudEVsZW0sITApLHU9aHIobixlLGYsdCkpLGN0KHQsdC50YWdDdHgpLHV8fHR9ZnVuY3Rpb24gdmkobil7Zm9yKHZhciB1LHQsaSxmPVtdLGU9bi5sZW5ndGgscj1lO3ItLTspZi5wdXNoKG5bcl0pO2ZvcihyPWU7ci0tOylpZih0PWZbcl0sdC5wYXJlbnROb2RlKXtpZihpPXQuX2pzdkJuZClmb3IoaT1pLnNsaWNlKDEpLnNwbGl0KCImIiksdC5fanN2Qm5kPSIiLHU9aS5sZW5ndGg7dS0tOylsdChpW3VdLHQuX2pzdkxua2RFbCx0KTtncihoaSh0KSsodC5fZGZyfHwiIikpfX1mdW5jdGlvbiBsdChuLGkscil7dmFyIGgsbCxmLG8scyxhLHYseSxlPWNbbl07aWYoaSlyPT09aS5saW5rZWRFbGVtWzBdJiYoZGVsZXRlIHIuX2pzdkxua2RFbCxkZWxldGUgaS5saW5rZWRFbGVtKTtlbHNlIGlmKGUpe2ZvcihoIGluIGUuYm5kKW89ZS5ibmRbaF0scz0iLm9icyIrZS5jYklkLHQuaXNBcnJheShvKT90KFtvXSkub2ZmKHB0K3MpLm9mZihnaStzKTp0KG8pLm9mZihnaStzKSxkZWxldGUgZS5ibmRbaF07aWYobD1lLmxpbmtDdHgpe2lmKGY9bC50YWcpe2lmKGE9Zi50YWdDdHhzKWZvcih2PWEubGVuZ3RoO3YtLTspKHk9YVt2XS5tYXApJiZ5LnVubWFwKCk7Zi5vbkRpc3Bvc2UmJmYub25EaXNwb3NlKCk7Zi5fZWxDbnR8fChmLl9wcnYmJmYuX3Bydi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYuX3BydiksZi5fbnh0JiZmLl9ueHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmLl9ueHQpKTtmLmRpc3Bvc2VkPSEwfWRlbGV0ZSBsLnZpZXcuXy5ibmRzW25dfWRlbGV0ZSBjW25dO2RlbGV0ZSB1Ll9jYkJuZHNbZS5jYklkXX19ZnVuY3Rpb24geWkobixyKXtyZXR1cm4gbj09PWk/KHcmJih0KHcpLm9mZihucixldCksdz1pKSxuPSEwLHYucmVtb3ZlVmlld3MoKSx2aShlLmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKSkpOnImJihyPXIuanF1ZXJ5P3I6dChyKSxuPT09ITAmJnIuZWFjaChmdW5jdGlvbigpe2Zvcih2YXIgbjsobj1iKHRoaXMsITApKSYmbi5wYXJlbnQ7KW4ucGFyZW50LnJlbW92ZVZpZXdzKG4uXy5rZXksaSwhMCk7dmkodGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpKX0pKSxyfWZ1bmN0aW9uIGRyKG4sdCl7cmV0dXJuIHlpKHRoaXMsbix0KX1mdW5jdGlvbiBkdShuKXtyZXR1cm4gbj1ufHx0LnZpZXcoKSxmdW5jdGlvbih0LGkpe3ZhciBmLHUsZT1baV07aWYobiYmdCl7aWYodC5fanN2T2IpcmV0dXJuIHQuX2pzdk9iLmNhbGwobi50bXBsLGksbixyKTtpZih0LmNoYXJBdCgwKT09PSJ+IilyZXR1cm4gdC5zbGljZSgwLDQpPT09In50YWciJiYodT1uLmN0eCx0LmNoYXJBdCg0KT09PSIuIiYmKGY9dC5zbGljZSg1KS5zcGxpdCgiLiIpLHU9dS50YWcpLGYpP3U/W3UsZi5qb2luKCIuIiksaV06W106KHQ9dC5zbGljZSgxKS5zcGxpdCgiLiIpLChpPW4uaGxwKHQuc2hpZnQoKSkpJiYodC5sZW5ndGgmJmUudW5zaGlmdCh0LmpvaW4oIi4iKSksZS51bnNoaWZ0KGkpKSxpP2U6W10pO2lmKHQuY2hhckF0KDApPT09IiMiKXJldHVybiB0PT09IiNkYXRhIj9bXTpbbix0LnJlcGxhY2Uoc3UsIiIpLGldfX19ZnVuY3Rpb24gZ3Uobil7cmV0dXJuIG4udHlwZT09PWt0P25bcF06bi52YWx1ZX1mdW5jdGlvbiBwaShuLHQsaSxyLHUsZil7dmFyIHYsaCxwLG8sYixhLGUsdz0wLGs9bj09PXQ7aWYobil7Zm9yKHA9bChuKXx8W10sdj0wLGg9cC5sZW5ndGg7djxoO3YrKyl7aWYobz1wW3ZdLGE9by5pZCxhPT09ciYmby5jaD09PXUpaWYoZiloPTA7ZWxzZSBicmVhaztrfHwoYj1vLmNoPT09Il8iP3lbYV06Y1thXS5saW5rQ3R4LnRhZyxvLm9wZW4/Yi5fcHJ2PXQ6by5jbG9zZSYmKGIuX254dD10KSk7dys9YS5sZW5ndGgrMn13JiZuLnNldEF0dHJpYnV0ZShzLG4uZ2V0QXR0cmlidXRlKHMpLnNsaWNlKHcpKTtlPXQ/dC5nZXRBdHRyaWJ1dGUocyk6aS5fZGZyOyhoPWUuaW5kZXhPZigiLyIrcit1KSsxKSYmKGU9cC5fdGtucy5zbGljZSgwLHcpK2Uuc2xpY2UoaCsoZj8tMTpyLmxlbmd0aCsxKSkpO2UmJih0P3Quc2V0QXR0cmlidXRlKHMsZSk6aS5fZGZyPWUpfWVsc2UgaS5fZGZyPWh0KGkuX2RmciwiIyIrcit1KSxmfHx0fHwoaS5fZGZyPWh0KGkuX2RmciwiLyIrcit1KSl9ZnVuY3Rpb24gZ3Iobil7dmFyIHIsZix0LHU7aWYodT1sKG4sMSxjdSkpZm9yKHI9MCxmPXUubGVuZ3RoO3I8ZjtyKyspdD11W3JdLHQuY2g9PT0iXyI/KHQ9eVt0LmlkXSkmJnQuZGF0YSE9PWkmJnQucGFyZW50LnJlbW92ZVZpZXdzKHQuXy5rZXksaSwhMCk6bHQodC5pZCl9ZnVuY3Rpb24gbmYobixpLHIsdSl7c3dpdGNoKHUuY2hhbmdlKXtjYXNlInNldCI6Zm9yKHZhciBmPWkubGVuZ3RoO2YtLTspaWYoaVtmXS5rZXk9PT11LnBhdGgpYnJlYWs7Zj09PS0xP3UucGF0aCYmdC5vYnNlcnZhYmxlKGkpLmluc2VydCh7a2V5OnUucGF0aCxwcm9wOnUudmFsdWV9KTp1LnZhbHVlPT09bnVsbD8oZGVsZXRlIG5bdS5wYXRoXSx0Lm9ic2VydmFibGUoaSkucmVtb3ZlKGYpKTp0Lm9ic2VydmFibGUoaVtmXSkuc2V0UHJvcGVydHkoInByb3AiLHUudmFsdWUpfX1mdW5jdGlvbiB0ZihuLGkscix1KXt2YXIgZjtzd2l0Y2godS5jaGFuZ2Upe2Nhc2Uic2V0Ijp1LnBhdGg9PT0icHJvcCI/dC5vYnNlcnZhYmxlKG4pLnNldFByb3BlcnR5KHIudGFyZ2V0LmtleSx1LnZhbHVlKToodC5vYnNlcnZhYmxlKG4pLnNldFByb3BlcnR5KHUub2xkVmFsdWUsbnVsbCksZGVsZXRlIG5bdS5vbGRWYWx1ZV0sdC5vYnNlcnZhYmxlKG4pLnNldFByb3BlcnR5KHUudmFsdWUsci50YXJnZXQucHJvcCkpO2JyZWFrO2Nhc2UicmVtb3ZlIjpmPXUuaXRlbXNbMF07dC5vYnNlcnZhYmxlKG4pLnNldFByb3BlcnR5KGYua2V5LG51bGwpO2RlbGV0ZSBuW2Yua2V5XTticmVhaztjYXNlImluc2VydCI6Zj11Lml0ZW1zWzBdO2Yua2V5JiZ0Lm9ic2VydmFibGUobikuc2V0UHJvcGVydHkoZi5rZXksZi5wcm9wKX19ZnVuY3Rpb24gcmYobix0LGkpe3JldHVybiBpLmluZGV4T2YoIi4iKTwwJiZ0W25dfXZhciBhdD0iSnNWaWV3cyByZXF1aXJlcyAiLHZ0LHcsYixnLHdpLHl0LG50LGJpLGtpLGRpLGEsdHQsbyxlPW4uZG9jdW1lbnQscj10LnZpZXdzLHU9ci5zdWIsZj1yLnNldHRpbmdzLGs9dS5leHRlbmQsdj11LlZpZXcoaSwidG9wIikscnQ9dS5pc0ZuLG51PXIudGVtcGxhdGVzLHR1PXIuY29udmVydGVycyxkPXQub2JzZXJ2YWJsZSx1dD1kLm9ic2VydmUscz0iZGF0YS1qc3YiLGdpPXUucHJvcENobmc9dS5wcm9wQ2huZ3x8InByb3BlcnR5Q2hhbmdlIixwdD11LmFyckNobmc9dS5hcnJDaG5nfHwiYXJyYXlDaGFuZ2UiLHVmPXUuX2NiQm5kcz11Ll9jYkJuZHN8fHt9LG5yPSJjaGFuZ2UuanN2Iix3dD0ib25CZWZvcmVDaGFuZ2UiLGJ0PSJvbkFmdGVyQ2hhbmdlIixpdT0ib25BZnRlckNyZWF0ZSIscD0iY2hlY2tlZCIsa3Q9ImNoZWNrYm94IixmdD0icmFkaW8iLHRyPSciPjxcL3NjcmlwdD4nLGlyPSc8c2NyaXB0IHR5cGU9ImpzdicsZHQ9InNjcmlwdCxbIitzKyJdIixoPSJodG1sIixndD17dmFsdWU6InZhbCIsaW5wdXQ6InZhbCIsaHRtbDpoLHRleHQ6InRleHQifSxycj17ZnJvbToidmFsdWUiLHRvOiJ2YWx1ZSJ9LG5pPTAscnU9dC5jbGVhbkRhdGEsdXU9Zi5kZWxpbWl0ZXJzLGl0PXUuZXJyLHRpPXUuc3ludGF4RXJyLGZ1PS88KD8hc2NyaXB0KShcdyspKD86W14+XSoob25cdyspXHMqPSk/W14+XSo+LyxldT0vWyciXFxdL2csdXI9ZS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksaWk9ZS5xdWVyeVNlbGVjdG9yLHJpPXtvbDoxLHVsOjEsdGFibGU6MSx0Ym9keToxLHRoZWFkOjEsdGZvb3Q6MSx0cjoxLGNvbGdyb3VwOjEsZGw6MSxzZWxlY3Q6MSxvcHRncm91cDoxLHN2ZzoxLHN2Z19uczoxfSxvdT17dHI6InRhYmxlIn0sdWk9e2JyOjEsaW1nOjEsaW5wdXQ6MSxocjoxLGFyZWE6MSxiYXNlOjEsY29sOjEsbGluazoxLG1ldGE6MSxjb21tYW5kOjEsZW1iZWQ6MSxrZXlnZW46MSxwYXJhbToxLHNvdXJjZToxLHRyYWNrOjEsd2JyOjF9LGZyPXt9LHk9ezA6dn0sYz17fSxlcj0xLHN1PS9eIyh2aWV3XC4/KT8vLGh1PS8oXnwoXC8+KXw8XC8oXHcrKT58KShccyopKFsjXC9dXGQrW19eXSlgKFxzKikoPFx3Kyg/PVtcc1wvPl0pKT98XHMqKD86KDxcdysoPz1bXHNcLz5dKSl8PFwvKFx3Kyk+KFxzKil8KFwvPilccyp8KD4pKS9nLG9yPS8oIykoKShcZCspKF8pL2csY3U9LygjKSgpKFxkKykoW19eXSkvZyxsdT0vKD86KCMpfChcLykpKFxkKykoXykvZyxhdT0vKCMpKCkoXGQrKShcXikvZyx2dT0vKD86KCMpfChcLykpKFxkKykoW19eXSkoWy0rQFxkXSspPy9nO2lmKCF0KXRocm93IGF0KyJqUXVlcnkiO2lmKCF0LnZpZXdzKXRocm93IGF0KyJKc1JlbmRlciI7aWYoIXQub2JzZXJ2YWJsZSl0aHJvdyBhdCsianF1ZXJ5Lm9ic2VydmFibGUiO3QubGlua3x8KHUub25TdG9yZUl0ZW09ZnVuY3Rpb24obixpLHIpe3ImJm49PT1udSYmKHIubGluaz1hcixyLnVubGluaz1kcixpJiYodC5saW5rW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIGFyLmFwcGx5KHIsYXJndW1lbnRzKX0sdC51bmxpbmtbaV09ZnVuY3Rpb24oKXtyZXR1cm4gZHIuYXBwbHkocixhcmd1bWVudHMpfSkpfSwoZi5kZWxpbWl0ZXJzPWZ1bmN0aW9uKCl7dmFyIG49dXUuYXBwbHkocixhcmd1bWVudHMpO3JldHVybiB3aT1uWzBdLHl0PW5bMV0sbnQ9blsyXSxiaT1uWzNdLGtpPW5bNF0sZz1uZXcgUmVnRXhwKCIoPzpefFxccyopKFtcXHctXSopKFxcIitraSsiKT8oXFwiK3l0K3UuclRhZysiXFwiK250KyIpIiwiZyIpLHRoaXN9KSgpLHUudmlld0luZm9zPWwsdnQ9e2FkZFZpZXdzOmZ1bmN0aW9uKG4sdCxpKXt2YXIgdSxvLHI9dGhpcyxmPXQubGVuZ3RoLGU9ci52aWV3cztpZighci5fLnVzZUtleSYmZiYmKGk9ci50bXBsKSYmKG89ZS5sZW5ndGgrZixscihyLG4saSxlLHQsci5jdHgpIT09ITEpKWZvcih1PW4rZjt1PG87dSsrKWQoZVt1XSkuc2V0UHJvcGVydHkoImluZGV4Iix1KTtyZXR1cm4gcn0scmVtb3ZlVmlld3M6ZnVuY3Rpb24obixyLHUpe2Z1bmN0aW9uIG8obil7dmFyIHMsaCxjLGUsbyxsLHI9ZltuXTtpZihyJiZyLmxpbmspe2lmKHM9ci5fLmlkLHV8fChsPXIubm9kZXMoKSksci5yZW1vdmVWaWV3cyhpLGksITApLHIuZGF0YT1pLGU9ci5fcHJ2LG89ci5fbnh0LGM9ci5wYXJlbnRFbGVtLHV8fChyLl9lbENudCYmcGkoZSxvLGMscywiXyIpLHQobCkucmVtb3ZlKCkpLCFyLl9lbENudCl0cnl7ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpO28ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvKX1jYXRjaChhKXt9Zmkocik7Zm9yKGggaW4gci5fLmJuZHMpbHQoaCk7ZGVsZXRlIHlbc119fXZhciBlLGwscyxoPXRoaXMsYz0haC5fLnVzZUtleSxmPWgudmlld3M7aWYoYyYmKHM9Zi5sZW5ndGgpLG49PT1pKWlmKGMpe2ZvcihlPXM7ZS0tOylvKGUpO2gudmlld3M9W119ZWxzZXtmb3IobCBpbiBmKW8obCk7aC52aWV3cz17fX1lbHNlIGlmKHI9PT1pJiYoYz9yPTE6KG8obiksZGVsZXRlIGZbbl0pKSxjJiZyKXtmb3IoZT1uK3I7ZS0tPm47KW8oZSk7aWYoZi5zcGxpY2UobixyKSxzPWYubGVuZ3RoKXdoaWxlKG48cylkKGZbbl0pLnNldFByb3BlcnR5KCJpbmRleCIsbisrKX1yZXR1cm4gdGhpc30scmVmcmVzaDpmdW5jdGlvbihuKXt2YXIgdD10aGlzLGk9dC5wYXJlbnQ7cmV0dXJuIGkmJihscih0LHQuaW5kZXgsdC50bXBsLGkudmlld3MsdC5kYXRhLG4sITApLGZpKHQpKSx0fSxub2RlczpsaSxjb250ZW50czpjaSxjaGlsZFRhZ3M6YWksbGluazpidX0sdHUubWVyZ2U9ZnVuY3Rpb24obil7dmFyIHQsaT10aGlzLmxpbmtDdHguX3ZhbHx8IiIscj10aGlzLnRhZ0N0eC5wcm9wcy50b2dnbGU7cmV0dXJuIHImJih0PXIucmVwbGFjZSgvW1xcXiQufD8qKygpW3tdL2csIlxcJCYiKSx0PSIoXFxzKD89Iit0KyIkKXwoXFxzKXxeKSgiK3QrIihcXHN8JCkpIixpPWkucmVwbGFjZShuZXcgUmVnRXhwKHQpLCIkMiIpLG49aSsobj8oaSYmIiAiKStyOiIiKSksbn0sci50YWdzKCJvbiIse2F0dHI6Im5vbmUiLG9uQWZ0ZXJMaW5rOmZ1bmN0aW9uKG4scil7dmFyIG89dGhpcyxzPXQoci5lbGVtKSxmPW4uYXJncyx1PW4ucHJvcHMuZGF0YSxlPWYucG9wKCksaD1mWzFdfHxudWxsLGM9bi5wcm9wcy5jb250ZXh0O2lmKHU9dSE9PWk/dTpudWxsLGUmJmUuY2FsbClzLm9uKGZbMF18fCJjbGljayIsaCx1LGZ1bmN0aW9uKG4pe2UuY2FsbChjfHxvLmxlYWYsbix7Y2hhbmdlOm4udHlwZSx2aWV3OnIudmlldyxsaW5rQ3R4OnJ9KX0pfSxvbkFmdGVyQmluZDpmdW5jdGlvbihuKXt0aGlzLmxlYWY9bi5sZWFmfSxmbG93OiEwfSksayhyLnRhZ3NbImZvciJdLHtvbkFycmF5Q2hhbmdlOmZ1bmN0aW9uKG4sdCl7dmFyIGkscj10aGlzLHU9dC5jaGFuZ2U7aWYoci50YWdDdHhzWzFdJiYodT09PSJpbnNlcnQiJiZuLnRhcmdldC5sZW5ndGg9PT10Lml0ZW1zLmxlbmd0aHx8dT09PSJyZW1vdmUiJiYhbi50YXJnZXQubGVuZ3RofHx1PT09InJlZnJlc2giJiYhdC5vbGRJdGVtcy5sZW5ndGghPSFuLnRhcmdldC5sZW5ndGgpKXIucmVmcmVzaCgpO2Vsc2UgZm9yKGkgaW4gci5fLmFyclZ3cylpPXIuXy5hcnJWd3NbaV0saS5kYXRhPT09bi50YXJnZXQmJmkuXy5vbkFycmF5Q2hhbmdlLmFwcGx5KGksYXJndW1lbnRzKTtuLmRvbmU9ITB9LG9uQWZ0ZXJMaW5rOmZ1bmN0aW9uKCl7Zm9yKHZhciB1LG8saSxmLGU9dGhpcyxyPWUuX2Fyc3x8e30scz1lLnRhZ0N0eHMsYz1zLmxlbmd0aCxoPWUuc2VsZWN0ZWR8fDAsbj0wO248PWg7bisrKXU9c1tuXSxmPXUubWFwP3UubWFwLnRndDp1LmFyZ3MubGVuZ3RoP3UuYXJnc1swXTp1LnZpZXcuZGF0YSwoaT1yW25dKSYmZiE9PWlbMF0mJih1dChpWzBdLGlbMV0sITApLGRlbGV0ZSByW25dKSwhcltuXSYmdC5pc0FycmF5KGYpJiYodXQoZixvPWZ1bmN0aW9uKG4sdCl7ZS5vbkFycmF5Q2hhbmdlKG4sdCl9KSxyW25dPVtmLG9dKTtmb3Iobj1oKzE7bjxjO24rKykoaT1yW25dKSYmKHV0KGlbMF0saVsxXSwhMCksZGVsZXRlIHJbbl0pO2UuX2Fycz1yfSxvbkRpc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgbix0PXRoaXM7Zm9yKG4gaW4gdC5fYXJzKXV0KHQuX2Fyc1tuXVswXSx0Ll9hcnNbbl1bMV0sITApfX0pLHIudGFncyh7cHJvcHM6dC5leHRlbmQoe30sci50YWdzWyJmb3IiXSx1LkRhdGFNYXAoci50YWdzLnByb3BzLmdldFRndCxuZix0ZixpLHJmKSl9KSxrKHQse3ZpZXc6ci52aWV3PWI9ZnVuY3Rpb24obixyLHUpe3IhPT0hIXImJih1PXIscj1pKTt2YXIgZixvLGgsYyx3LHMsYixhLHA9MCxrPWUuYm9keTtpZihuJiZuIT09ayYmdi5fLnVzZUtleT4xJiYobj0iIituPT09bj90KG4pWzBdOm4uanF1ZXJ5P25bMF06bixuKSlpZihyKXtmb3IoYT1paT9uLnF1ZXJ5U2VsZWN0b3JBbGwoZHQpOnQoZHQsbikuZ2V0KCkscz1hLmxlbmd0aCxoPTA7aDxzO2grKylmb3IoYj1hW2hdLG89bChiLGksb3IpLGM9MCx3PW8ubGVuZ3RoO2M8dztjKyspaWYoZj1vW2NdLChmPXlbZi5pZF0pJiYoZj1mJiZ1P2YuZ2V0KCEwLHUpOmYsZikpcmV0dXJuIGZ9ZWxzZSB3aGlsZShuKXtpZihvPWwobixpLGx1KSlmb3Iocz1vLmxlbmd0aDtzLS07KWlmKGY9b1tzXSxmLm9wZW4pe2lmKHA8MSlyZXR1cm4gZj15W2YuaWRdLGYmJnU/Zi5nZXQodSk6Znx8djtwLS19ZWxzZSBwKys7bj1uLnByZXZpb3VzU2libGluZ3x8bi5wYXJlbnROb2RlfXJldHVybiByP2k6dn0sbGluazpyLmxpbms9c2ksdW5saW5rOnIudW5saW5rPXlpLGNsZWFuRGF0YTpmdW5jdGlvbihuKXtuLmxlbmd0aCYmbmkmJnZpKG4pO3J1LmFwcGx5KHQsYXJndW1lbnRzKX19KSxyLnV0aWxpdHk9e3ZhbGlkYXRlOmZ1bmN0aW9uKG4pe3RyeXt2LmxpbmsoaSxlLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGksaSxuLGksaSwxKX1jYXRjaCh0KXtyZXR1cm4gdC5tZXNzYWdlfX19LGsodC5mbix7bGluazpmdW5jdGlvbihuLHQsaSxyLHUsZixlKXtyZXR1cm4gc2kobix0aGlzLHQsaSxyLHUsZixlKX0sdW5saW5rOmZ1bmN0aW9uKG4pe3JldHVybiB5aShuLHRoaXMpfSx2aWV3OmZ1bmN0aW9uKG4pe3JldHVybiBiKHRoaXNbMF0sbil9fSksdC5lYWNoKFtoLCJyZXBsYWNlV2l0aCIsImVtcHR5IiwicmVtb3ZlIl0sZnVuY3Rpb24obixpKXt2YXIgcix1PXQuZm5baV07dC5mbltpXT1mdW5jdGlvbigpe25pPTE7dHJ5e3I9dS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZmluYWxseXtuaT0wfXJldHVybiByfX0pLGsodix7dG1wbDp7bGlua3M6e30sdGFnczp7fX19KSxrKHYsdnQpLHYuXy5vblJlbmRlcj1laSxmKHt3cmFwTWFwOm89e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjxcL3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8XC9maWVsZHNldD4iXSxhcmVhOlsxLCI8bWFwPiIsIjxcL21hcD4iXSxwYXJhbTpbMSwiPG9iamVjdD4iLCI8XC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8XC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8XC90Ym9keT48XC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPFwvdHI+PFwvdGJvZHk+PFwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjxcL3Rib2R5Pjxjb2xncm91cD4iLCI8XC9jb2xncm91cD48XC90YWJsZT4iXSxzdmdfbnM6WzEsIjxzdmc+IiwiPFwvc3ZnPiJdLGRpdjpqUXVlcnkuc3VwcG9ydC5odG1sU2VyaWFsaXplP1swLCIiLCIiXTpbMSwiWDxkaXY+IiwiPFwvZGl2PiJdfSxsaW5rQXR0cjphPSJkYXRhLWxpbmsiLG1lcmdlOntpbnB1dDp7ZnJvbTpndSx0bzoidmFsdWUifSx0ZXh0YXJlYTpycixzZWxlY3Q6cnIsb3B0Z3JvdXA6e3RvOiJsYWJlbCJ9fSxqc3JEYmdNb2RlOmYuZGVidWdNb2RlLGRlYnVnTW9kZTpmdW5jdGlvbih0KXtmLmpzckRiZ01vZGUodCk7dD9uLl9qc3Y9e3ZpZXdzOnksYmluZGluZ3M6Y306ZGVsZXRlIG4uX2pzdn0sanN2OmZ1bmN0aW9uKCl7Zi5kZWJ1Z01vZGUoZi5fZGJnTW9kZSk7YT1mLmxpbmtBdHRyO3R0PWR0KyIsWyIrYSsiXSI7ZGk9Zi5ub0RvbUxldmVsMDtvLm9wdGdyb3VwPW8ub3B0aW9uO28udGJvZHk9by50Zm9vdD1vLmNvbGdyb3VwPW8uY2FwdGlvbj1vLnRoZWFkO28udGg9by50ZH19KSl9KHRoaXMsdGhpcy5qUXVlcnkpOwovKgovLyMgc291cmNlTWFwcGluZ1VSTD1qc3ZpZXdzLm1pbi5qcy5tYXAKKi8=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/css/jquery.lightbox-0.5.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmNzcw0KICogQGF1dGhvciBMZWFuZHJvIFZpZWlyYSBQaW5obyAtIGh0dHA6Ly9sZWFuZHJvdmllaXJhLmNvbQ0KICogQHZlcnNpb24gMC41DQogKiBAZGF0ZSBBcHJpbCAxMSwgMjAwOA0KICogQGNhdGVnb3J5IGpRdWVyeSBwbHVnaW4NCiAqIEBjb3B5cmlnaHQgKGMpIDIwMDggTGVhbmRybyBWaWVpcmEgUGluaG8gKGxlYW5kcm92aWVpcmEuY29tKQ0KICogQGxpY2Vuc2UgQ0NBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDIuNSBCcmF6aWwgLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS8yLjUvYnIvZGVlZC5lbl9VUw0KICogQGV4YW1wbGUgVmlzaXQgaHR0cDovL2xlYW5kcm92aWVpcmEuY29tL3Byb2plY3RzL2pxdWVyeS9saWdodGJveC8gZm9yIG1vcmUgaW5mb3JtYXRpb25zIGFib3V0IHRoaXMgalF1ZXJ5IHBsdWdpbg0KICovDQojanF1ZXJ5LW92ZXJsYXkgew0KCXBvc2l0aW9uOiBhYnNvbHV0ZTsNCgl0b3A6IDA7DQoJbGVmdDogMDsNCgl6LWluZGV4OiA5MDsNCgl3aWR0aDogMTAwJTsNCgloZWlnaHQ6IDUwMHB4Ow0KfQ0KI2pxdWVyeS1saWdodGJveCB7DQoJcG9zaXRpb246IGFic29sdXRlOw0KCXRvcDogMDsNCglsZWZ0OiAwOw0KCXdpZHRoOiAxMDAlOw0KCXotaW5kZXg6IDEwMDsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQoJbGluZS1oZWlnaHQ6IDA7DQp9DQojanF1ZXJ5LWxpZ2h0Ym94IGEgaW1nIHsgYm9yZGVyOiBub25lOyB9DQojbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCB7DQoJcG9zaXRpb246IHJlbGF0aXZlOw0KCWJhY2tncm91bmQtY29sb3I6ICNmZmY7DQoJd2lkdGg6IDI1MHB4Ow0KCWhlaWdodDogMjUwcHg7DQoJbWFyZ2luOiAwIGF1dG87DQp9DQojbGlnaHRib3gtY29udGFpbmVyLWltYWdlIHsgcGFkZGluZzogMTBweDsgfQ0KI2xpZ2h0Ym94LWxvYWRpbmcgew0KCXBvc2l0aW9uOiBhYnNvbHV0ZTsNCgl0b3A6IDQwJTsNCglsZWZ0OiAwJTsNCgloZWlnaHQ6IDI1JTsNCgl3aWR0aDogMTAwJTsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQoJbGluZS1oZWlnaHQ6IDA7DQp9DQojbGlnaHRib3gtbmF2IHsNCglwb3NpdGlvbjogYWJzb2x1dGU7DQoJdG9wOiAwOw0KCWxlZnQ6IDA7DQoJaGVpZ2h0OiAxMDAlOw0KCXdpZHRoOiAxMDAlOw0KCXotaW5kZXg6IDEwOw0KfQ0KI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3ggPiAjbGlnaHRib3gtbmF2IHsgbGVmdDogMDsgfQ0KI2xpZ2h0Ym94LW5hdiBhIHsgb3V0bGluZTogbm9uZTt9DQojbGlnaHRib3gtbmF2LWJ0blByZXYsICNsaWdodGJveC1uYXYtYnRuTmV4dCB7DQoJd2lkdGg6IDQ5JTsNCgloZWlnaHQ6IDEwMCU7DQoJem9vbTogMTsNCglkaXNwbGF5OiBibG9jazsNCn0NCiNsaWdodGJveC1uYXYtYnRuUHJldiB7IA0KCWxlZnQ6IDA7IA0KCWZsb2F0OiBsZWZ0Ow0KfQ0KI2xpZ2h0Ym94LW5hdi1idG5OZXh0IHsgDQoJcmlnaHQ6IDA7IA0KCWZsb2F0OiByaWdodDsNCn0NCiNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YS1ib3ggew0KCWZvbnQ6IDEwcHggVmVyZGFuYSwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOw0KCWJhY2tncm91bmQtY29sb3I6ICNmZmY7DQoJbWFyZ2luOiAwIGF1dG87DQoJbGluZS1oZWlnaHQ6IDEuNGVtOw0KCW92ZXJmbG93OiBhdXRvOw0KCXdpZHRoOiAxMDAlOw0KCXBhZGRpbmc6IDAgMTBweCAwOw0KfQ0KI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhIHsNCglwYWRkaW5nOiAwIDEwcHg7IA0KCWNvbG9yOiAjNjY2OyANCn0NCiNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSAjbGlnaHRib3gtaW1hZ2UtZGV0YWlscyB7IA0KCXdpZHRoOiA3MCU7IA0KCWZsb2F0OiBsZWZ0OyANCgl0ZXh0LWFsaWduOiBsZWZ0OyANCn0JDQojbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jYXB0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIgew0KCWRpc3BsYXk6IGJsb2NrOyANCgljbGVhcjogbGVmdDsgDQoJcGFkZGluZy1ib3R0b206IDEuMGVtOwkNCn0JCQkNCiNsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2Ugew0KCXdpZHRoOiA2NnB4OyANCglmbG9hdDogcmlnaHQ7DQoJcGFkZGluZy1ib3R0b206IDAuN2VtOwkNCn0=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-blank.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-close.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhQgAWANUAAP////39/fr6+vj4+PX19fDw8Ovr6+np6ebm5uTk5N/f39zc3Nra2tfX19XV1dLS0svLy8jIyL6+vre3t7S0tLKysq+vr6ioqKOjo56enpubm5aWlpGRkY+Pj4yMjIeHh4KCgoCAgH19fXZ2dnNzc3FxcW5ubmlpaWdnZ2RkZGJiYl9fX11dXVpaWlVVVVNTU1BQUE5OTktLS0lJSUZGRgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAAHAP8ALAAAAABCABYAAAb/QIBwSCwaj8ikcslsOp/QqLQZmFqvRAHngYxsBEaCw3EYHhwE5IFykZSLZ7RQPK4PBxzaimGEtGgcaXMZL4UvH0IXLw5HEoaFF0MEIo8RAA6PhUMWNC8xKw1EES0xLzQYQ5QfY2yJi0YRh2UKlBRCHC8XDhEZZZgcdYxCBiQzLzIqC0KjpTMhBUIULxlHisJEKCiCAAQoLEIvJEaYkUcGIzKeKAt+pTQgA0Pe20TWRQrTRYSMLyjjuUnOGYOBgtQxENsOHEJij4g0S6IA4gpEBJOICxjfEDmXDgaMYx/iDSHH8FU9kyMBTnrBguKlTNeIFCjx0ZMGMBUBVkPpKubL2XKXKLFQ8HNJgRM1Y3Qwgo9DSZ+ObBFxJKGIIxFFkywwUcrjMQ1ViLDwt9OnQkREcGkcQuJF1iMLUKSLkWLFRxlgTwK91NMIJaJC8GE14u1tkQUr0skgkSCCV7xhubUF5gCXJUUcMGJkpIAFCwkOKHgGnCHDmA/5LGoGyiCxCxkjDAiZ8DjvHEqFWFADoChTOQcoDKEADAC1od2YMglhwEIxCdlDKsjwSKMCnDFQFJAxEqdJgQ4yZjw3UiGGjBN8sKjP4mH8EQsnEKyfP0QAvSIB5NPfz7+/+iAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-next.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhPwAgAOYAAP////39/fv7+/n5+ff39/X19fPz8/Hx8e/v7+3t7evr6+np6efn5+bm5uTk5OLi4uDg4N7e3tzc3NjY2NbW1tLS0tDQ0M7OzsrKysjIyMbGxsLCwsDAwLy8vLq6ura2trS0tLOzs7Gxsa+vr62traurq6mpqaenp6WlpaOjo52dnZubm5mZmZGRkY+Pj42NjYuLi4eHh4WFhYODg4GBgYCAgH5+fnp6enh4eHZ2dnR0dHBwcG5ubmxsbGpqamhoaGZmZmRkZGJiYmBgYF5eXlxcXFpaWlhYWFZWVlRUVFJSUlBQUE5OTk1NTUtLS0lJSUdHR0VFRUNDQ////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAFMALAAAAAA/ACAAAAf/gFNTAISFhoeIiYqLjIiDjZCRkpOUlZaXmJmam5ydnp+goaKjpKWmp6igARomF4UCHCIABiAlJrcnDxQoroQKJRsOKSYlIyUnIASeAS5PQxGEAzZFAAxCSUFCQkUXDD1GEADMTRgWSEJGSkNDOAfLLUlMMsoDNUQAC0UzCQz9yhhNYATIwGRFgAENFqh4UmHBggDLXPx4wQQEAAE07i0w8iIRCyUhdvBAYKgElAWhmPlogOOIAwAZ8Q3hUQJFChIFCBG4scRIhUMmoDRIKZHAhCTzYi4IYkSHyBruxM14UiScoaBDVUk8ECBFkxIxhuArIgNBAgUKIAIQoeSEkBtRiQlhJfqDZIEeRYIAwWekBaIIR2oA+PDkxFWhdEkCMLfkBz4iOTpI9vBgAA0kEgAMuJFkQqG5qlrsiJtCSQ98QJpAWS3lhAgnhglRODJabpSsoAgQUCtOt7gDCMwmSFDgQFpDBxYIIFRAwfJU0CkFEBCgunXr0TXxzs69u/fv4MOLdzRekqDykAIBADs=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-btn-prev.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhPwAgAOYAAP////39/fv7+/n5+fj4+Pb29vT09PLy8vDw8O7u7urq6unp6efn5+Xl5ePj4+Hh4d/f393d3dvb29ra2tjY2NbW1tTU1NDQ0M7OzszMzMvLy8nJycfHx8XFxcPDw8HBwb+/v729vby8vLq6uri4uLa2trKysq6urq2traurq6mpqaenp6Ojo6GhoZ+fn56enpycnJqampiYmJSUlJCQkI+Pj42NjYWFhYODg4GBgYCAgHx8fHp6enh4eHZ2dnR0dHJycnFxcW9vb21tbWtra2lpaWVlZWNjY2JiYmBgYF5eXlxcXFpaWlhYWFZWVlRUVFNTU1FRUU9PT01NTUtLS0lJSUdHR0JCQkBAQP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEHAFkALAAAAAA/ACAAAAf/gACCg4SFhoeIiYqGWVmLj5CRj46SlZaXmJmam5ydnp+goaKjpKWmp6ipmwMYICAfFQSCE64hGQuCBx4fvLwMGhwBgwMbG6IFOVFJyzsQAC1QSkpIRikAEUtOS0xMShc1URKDE0o2xzpCBQclVDYCLUsSAxFBTRQOUjQQFPwBH1MuBqmoguEcEAEAAjDxYYCFkgaCVkT5wGDKikIIiAwpAKCAjyDCQhXQEQRBgRJWbARgsUTEhBBHkkBw8ARHiBEkPCCM8UQDAAtVRIwqgCOKkiVJekwAwAKKkSVPgHQAIGGJkiJGjuAYAGDCFBkAZCRhMDSHEQ8dKMh6tkQDCiojnQRJiDLDAYQIDkLuEALhyAyE534YcpFEgQAfSA5QnWLNEIcpN5IUHKoDCFdCLpQ4ACCCyotrUWhUGG0hgaAEQ6rwCHmMB5HLg2A8cWagR5UND55YucIbiwlBAWBcOVEqwIIGrAUpkLBWQYUFAyRMmD4dwaADFDiq2n6JwIABAsIL+E4gOfdEAgKoX7/+vPv38OPLn0+//iVK9hU1CgQAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/images/lightbox-ico-loading.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhIAAgAOYAAP////39/fr6+vj4+PX19fPz8/Dw8O7u7uvr6+np6ebm5uTk5OHh4d/f39zc3Nra2tfX19XV1dLS0s3NzcvLy8jIyMbGxsPDw8HBwb6+vry8vLm5ube3t7S0tLKysq+vr62traqqqqioqKWlpZ6enpaWlpSUlJGRkY+Pj4yMjIqKioeHh4WFhYKCgoCAgH19fXt7e3h4eHZ2dnNzc3FxcWxsbGlpaWJiYl9fX1paWlhYWFVVVU5OTktLS0REREFBQT8/Pzw8PDc3NzIyMjAwMC0tLSsrKygoKCYmJiMjIyEhIR4eHhwcHBkZGRcXFxISEg8PDw0NDQoKCggICAUFBf4BAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFCgBVACwAAAAAIAAgAAAH/4AAgoOEhYaHiImKi4yNjQGGBAgCjoYIEhcRCIMCGywSlYQPKzxAPCsQkAQnPxuhgggwSlS0STAIAQEQHJuECA0EiZ1BtMVCG5AAub4uOR/BhwQkR8W1JNCGEkJQNQeIBCNF1VRHIZSHCM3PiAESPFHVPBTJ6A/YhwciPk1PTD4jBV4VClDgAYgVMlJo8CZwEAELKmSo2MDgwDlHyzht6NEEir8KryCQIMFgEIMa42bcW4TgxZIkKRhK8DHOR69GDHLQqtErAo9xPG4yKlACiA8RAQEcWLGkGJMTFxsdoECBoTIINYQkESKjZMOBDDaE2ADB4tdoFUic4EUvUUZ2FpV2IFkSxIRQQwEokLiQFJ0MJ8V+YHC7AQgTIdcQNdghpdgREckIFMB2QAYUWjYcIEJQ4zKtIBoACJiA4kWIXgVWOJkCxcbdQQE2NmlChAUDXTmcQCFCwlu7HEBydIhaiIAnGCQaBACHpFiOB4ICPMgQYaUhAQgQQAOXhBaU54TahpKQezeJvmdFX2Axg2T6QgIOaHcUCAAh+QQFCgBVACwAAAAAHwAgAAAH/4BVgoOEhAgODgiFi4yMBBYvOzsuFQSNl4sXOU1UVE05FpiiVQguS52dSy+Ko4USCAIQOVOonTkQrYQ7PDEZFDm1VFC3uQyETTsfL6eoTKuDCAG5VUsqVTtOnU86GIQvDACNI4syCBMtPDwsEpakNjYQ4YweQoRKJ5YECAjtgrEQAuQtYjCDUxUnPCwIZASg4SUCFV7w6FFjQ4GF06oUiICBAgQJrwhgnFbgQw4fO0jAGpkRQw8onYSEkDbtURUJAQmYYFYFigyR0xrkOFIDAQACJ3j6BJrrgQ0kMsBVydCzShQhIAKwvHSBBE55H3CgVLn1EgCtAjdikHDAYcZGAJEEBBBQoN9bRgc2oLhpt5G+voU++BBkYwLNRghIyBCBqcagJCUAE/JABAqQDFttDFqCogChgIMCiEhSZUgHlgVOFDnoYwPoCCNGRAANoMGMHi6kMkJw4t2HtoSTKLHhQB4ABK/KBijAYGWVAByICCLC4XBDt2bdAsAQRFAQDNbvCuI98YRR8YvMTTiPftH1VoEAACH5BAUKAFUALAAAAAAeAB8AAAf/gFWCg4SEAAABAIWLjIuICBMXEASKjZaEARAuPkA5IgiXoQAML0qCUD8gBIIEBauWBAxVsgIaP4RNMAwFFCQnIRCNBR81OjUcCCBDhTZVITpFSUI1FQOFtT5QUFU8Gxk9iyM9UFTlTDUOhQcrTYQnECtJgz0fKknl+D4bhggvToNNVFRBQCJHFRgXELhogq+cEBCFCIRYJijIhwBVMA4iUOIevig/NBQCgGCFDyI9TshidGHHE3xJYDQYSQBBBhAYEGhcNCwHkSNCZlB4VeVQq0QBEl0iEOHDCA4rBQEoIGHEiAgCQhEiQHSQgAw6jiDJYUHryAAErAFY165KkxZmmA09KPGhKAIZ2wTViDsIQMuNJIbkJcFXKoINQ+2eMDircKMACB445ntocqNDBQ4oFVX5sQQULjR0ZURSwoKdhhrYaOJEXygCJ4DMiGrIgpBBJUIhqOGkxwTSEHQ4gWKxbyxQXj/YKIF8EYG6OUisnCrCxgsJWxEU0ArhQF8I4JKc2G65bwQeUMSTL1/0wAjr2Nn3LSBr9KJAACH5BAUKAFUALAAAAQAgAB4AAAf/gFWCg4SFVR0ZDIaLjIUEIzpCPy4SjZaFARQ8UFVURioIggCjl1UABAYEowQgRoNQNhACCBMWEKqNAAwgKiOyBB9FhhIrPD42IAgAjAgrQk1ELw0BDzdOVVBCJBUxSYJQPR0EiwATPoNAG6cZNT48JA8cQIRNL6GGABXzgkIeowEIGjAgIAAEEUKwHpBDUCMJlCQ2KokiBSCDD06CkrC4ZyhAhRU5XGQYt4hBi4NVnOzYQBIfQAgIWhoSAOFEDh41fMXEt6yUqAIQLnw44ULFB0WiDAiUWSqAhRpEmCT5geIegxM6coA44FMQAhlMqIilImREFQEdgqTkIaFnKQlAsMaKdVKjCgESR/hpcHtJAhG5VKDgqBLgwo4lSWpA6FoFQo8ocusN4rDiBAWmlgicICJlLg8MgwggOBCAsaAHKXwQEWLjA1fTzIR2kFCAEUXYlgAgiKCg9CUAAnznauDCRw2JuSCgYGkpwIchVYyQ+L3Bx4rXjAJo6NFkEYLahHZREJAbAQgZIzgK+EiCo6ngpU7tHHRgRZIeF4TjdkQCSES++w2iywYVgBcgPsEByEggACH5BAUKAFUALAAAAAAgAB8AAAf/gFWCg4SFhoeIiYMUEASKj4YcNj01HAWQmBE5TlVONhMBmIehVQEaQoM/HAJVBA0TmBAjJBSOARU9UFVQPBcCBxs1PJANMURINhahCCY/Rj4kCAQYOk2dPooYg0QkjgAIGyQZCAAFJkiDSiyKuVVCId5VAAEA9QcnSYNMLwyJJDs9VjQgZYgABx+6oAQZcQkRAgoXGNBD9I0EDyE9UgxUFIAeAEUCEFTwwEECgwIERR2aB04QCQmOBs2bqJIAiB35itSQQIoABRIeyKlskEOXoCQqEAiCUMPIwpiYLBAhBCVHg1IWsDFZoVQUBVSDoNhwIOjBCyA8OkCFxMCGNUFGqFA0FNBAQ4UDH1VuwDHkSJAXEQgGEJAS0gEIFkCUMAECgoC8KgcRkHDCxo4aJCCghBx5aYwiVKg48TGiK6IGFRQRICFkSmjRNiRAQmG60IEWTV6HDuIhkQQdS2o04DwIgYvcuoF0SIRgxAxLnFG2IjFEd5McsCgSkEb85UcIL4g8gdKkR2lF9Tiv3vGBVITKOWqEqK2yQmbICCBEONl5kAACNPUnoCGBAAAh+QQFCgBVACwCAAEAHgAfAAAH/4BVgoOEggABBAMAhYyNjAAFFSMdDAKOl4wBFzlEPycMmI0Ai4MEJUlVUDoUhocBpKIBAqOCBCRIgjkSVYcMFRQIAaIHFx8QllUCEzRBPIYBEjM+PSwQwoUCGzpBLw+kBBAdFoYIKLhVQiMFjAUrS1U+GtePDDVQhAiMBCA9RDW7jgAgWIGqyhAS+Rp9IHGBACYCFmxUARIDYCMC60JVIWCRACyNmAKIJEBgFshLo8B9CFHhAK8ABRA4PMlLQMQhRHiQqBIAwQgWGWjyYvDi3SALBDDsQAID1EkAEnbcq0KFSAioNaqUSAgSAAQbU6cE4bAxQhWnT33+aOKkCIwGQrAJHSLwgIQNGykmzBQKQAADDSJAXKgigWvcABBU+CASZEbDgK9QIiAhZNCRF3AfIeAgYa+BCL8YDIhgwwmhHhgaCcDAQ0UCQQxM8BgSpMaGDFILBc0EAcWgyUKoCF+SY8QMJYQkOppXxYJU4cKRqACBI0mTuByAQBfuJEYVDClqvOhAM0OPKdubsJCJoIFhjRBmMIEuJQiIvXEJZMiRBIqTICtkFlcpFahgwwwjCHhJIAAh+QQFCgBVACwCAAEAHgAfAAAH/4BVgoOEhACHhYmKigIIDQgBi5KLESo1JAgAk5uDJEJNOxaRnJxFUD4Xo1UFDAwEkgAFCq+ELzklmYIIJDY1H5CKBx8tHAWEDBEIAoIBFzxOTDkUy4UAEjlJNRCTBCJHgkActIYMKz0oDJPNPExJNhOqhAIQG9uTAMIyL8WSAdSbAAi0IqCJlMEqiA7eE8jggCoAAQoqRDDChg0TDyIRgGAh10ECH344qSKkxAEADFLYyBCPEwIVTARBseGgCoIQKSS03HTAxLcqTGYgQFgAwTiDASrYIFJkBwhjCqsRsGDiBAePghhoEPFBwoF7AAQIIIDAaCEIK3wMEWLjw1dFAL8QTNjQMWIhBCiIQKFCpUmOC3ARiMgBhMeJBi0v7ODL+MgJSAYWGA24ocdIKEIwESLQAYgUxn1jQLiwIsclCAhK/KzSZEaDQhh4gKaixEUHbFCgDFlBgQQRQjBeE3rwIskUvqdIqEBCyAeIDUChOPmhiAAGG0OWHOlRAoOMJoSKkGDQwcaOHOMVFejN4kSHViyUEBIC4pWECxKGSipqlgAHH3tVoYQNEkgUVVwk6CAEEDVgcFRURFHwwQYNPKhIIAAh+QQFCgBVACwAAAIAIAAeAAAH/4BVgoOEhQEDAYWKi4yCBBIaDYmNlIoAEC87JQiVnYMAFDtHMAyFBwQAnYeTgggkLxwFhCArIAipjQINGgysVQgMsoVJPBuojQckOiDCjR9DVUIjx4wEGSkUBJURNT0yEr6LBQjalY8aEtSL5Z6DAgG4hQUQGh4Xpe2UBBgxPT87KR7kExSgQIF3gijYUEKFCpQiJzi1e0TihAZOrog03NiDQrtLMYok0WGMAQwmGxsO2dAuAAYfgoyYOIBgRZKUVIJkaCkhRxMoQaYR+NADykYnNQS2QyDCxg4VEBI1QAFkiRMkPDo06wQAAYULDdg1CLEixgoSGiIgEPAxALxCBMg4hYChw8YJCWwZCUDQYG0jAhVsJIHiZEiLBtUopKihIhsjBCduDvrRQRuAy6kCQIgxOEmNCOGqdH3RhFAREggQQJDgAJUADTAF+eDAjhACFZIFCREBYYRTGBkK7CtaBYoPDbUHEdjAo3QVzxlE+HDy3EYFAg1WCEkixMWD0KIRgLDRg4eMDRIKDSFxKgIJFyTSNQqAQMKGDBBUz3BehUiJA6kA41clAhSYSEZTFNcDbQOtE4ELP1TBAwkMxNNgIQ18MMIv4BUSCAA7]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LmxpZ2h0Ym94LTAuNS5taW4uanMnOwokaW5mb1snY3NzJ10gPSAnY3NzL2pxdWVyeS5saWdodGJveC0wLjUuY3NzJzsKJGluZm9bJ2RlcGVuZHMnXSA9ICdqcXVlcnknOwokaW5mb1snanNfbm9taW5pZnknXSA9IDE7Cj8+Cg==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCg0KLy8gT2ZmZXJpbmcgYSBDdXN0b20gQWxpYXMgc3Vwb3J0IC0gTW9yZSBpbmZvOiBodHRwOi8vZG9jcy5qcXVlcnkuY29tL1BsdWdpbnMvQXV0aG9yaW5nI0N1c3RvbV9BbGlhcw0KKGZ1bmN0aW9uKCQpIHsNCgkvKioNCgkgKiAkIGlzIGFuIGFsaWFzIHRvIGpRdWVyeSBvYmplY3QNCgkgKg0KCSAqLw0KCSQuZm4ubGlnaHRCb3ggPSBmdW5jdGlvbihzZXR0aW5ncykgew0KCQkvLyBTZXR0aW5ncyB0byBjb25maWd1cmUgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4gaG93IHlvdSBsaWtlDQoJCXNldHRpbmdzID0galF1ZXJ5LmV4dGVuZCh7DQoJCQkvLyBDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gb3ZlcmxheQ0KCQkJb3ZlcmxheUJnQ29sb3I6IAkJJyMwMDAnLAkJLy8gKHN0cmluZykgQmFja2dyb3VuZCBjb2xvciB0byBvdmVybGF5OyBpbmZvcm0gYSBoZXhhZGVjaW1hbCB2YWx1ZSBsaWtlOiAjUlJHR0JCLiBXaGVyZSBSUiwgR0csIGFuZCBCQiBhcmUgdGhlIGhleGFkZWNpbWFsIHZhbHVlcyBmb3IgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIHZhbHVlcyBvZiB0aGUgY29sb3IuDQoJCQlvdmVybGF5T3BhY2l0eToJCQkwLjgsCQkvLyAoaW50ZWdlcikgT3BhY2l0eSB2YWx1ZSB0byBvdmVybGF5OyBpbmZvcm06IDAuWC4gV2hlcmUgWCBhcmUgbnVtYmVyIGZyb20gMCB0byA5DQoJCQkvLyBDb25maWd1cmF0aW9uIHJlbGF0ZWQgdG8gbmF2aWdhdGlvbg0KCQkJZml4ZWROYXZpZ2F0aW9uOgkJZmFsc2UsCQkvLyAoYm9vbGVhbikgQm9vbGVhbiB0aGF0IGluZm9ybXMgaWYgdGhlIG5hdmlnYXRpb24gKG5leHQgYW5kIHByZXYgYnV0dG9uKSB3aWxsIGJlIGZpeGVkIG9yIG5vdCBpbiB0aGUgaW50ZXJmYWNlLg0KCQkJLy8gQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIGltYWdlcw0KCQkJaW1hZ2VMb2FkaW5nOgkJCSdpbWFnZXMvbGlnaHRib3gtaWNvLWxvYWRpbmcuZ2lmJywJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBsb2FkaW5nIGljb24NCgkJCWltYWdlQnRuUHJldjoJCQknaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1wcmV2LmdpZicsCQkJLy8gKHN0cmluZykgUGF0aCBhbmQgdGhlIG5hbWUgb2YgdGhlIHByZXYgYnV0dG9uIGltYWdlDQoJCQlpbWFnZUJ0bk5leHQ6CQkJJ2ltYWdlcy9saWdodGJveC1idG4tbmV4dC5naWYnLAkJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIHRoZSBuZXh0IGJ1dHRvbiBpbWFnZQ0KCQkJaW1hZ2VCdG5DbG9zZToJCQknaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1jbG9zZS5naWYnLAkJLy8gKHN0cmluZykgUGF0aCBhbmQgdGhlIG5hbWUgb2YgdGhlIGNsb3NlIGJ0bg0KCQkJaW1hZ2VCbGFuazoJCQkJJ2ltYWdlcy9saWdodGJveC1ibGFuay5naWYnLAkJCS8vIChzdHJpbmcpIFBhdGggYW5kIHRoZSBuYW1lIG9mIGEgYmxhbmsgaW1hZ2UgKG9uZSBwaXhlbCkNCgkJCS8vIENvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byBjb250YWluZXIgaW1hZ2UgYm94DQoJCQljb250YWluZXJCb3JkZXJTaXplOgkxMCwJCQkvLyAoaW50ZWdlcikgSWYgeW91IGFkanVzdCB0aGUgcGFkZGluZyBpbiB0aGUgQ1NTIGZvciB0aGUgY29udGFpbmVyLCAjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhpcyB2YWx1ZQ0KCQkJY29udGFpbmVyUmVzaXplU3BlZWQ6CTQwMCwJCS8vIChpbnRlZ2VyKSBTcGVjaWZ5IHRoZSByZXNpemUgZHVyYXRpb24gb2YgY29udGFpbmVyIGltYWdlLiBUaGVzZSBudW1iZXIgYXJlIG1pbGlzZWNvbmRzLiA0MDAgaXMgZGVmYXVsdC4NCgkJCS8vIENvbmZpZ3VyYXRpb24gcmVsYXRlZCB0byB0ZXh0cyBpbiBjYXB0aW9uLiBGb3IgZXhhbXBsZTogSW1hZ2UgMiBvZiA4LiBZb3UgY2FuIGFsdGVyIGVpdGhlciAiSW1hZ2UiIGFuZCAib2YiIHRleHRzLg0KCQkJdHh0SW1hZ2U6CQkJCSdJbWFnZScsCS8vIChzdHJpbmcpIFNwZWNpZnkgdGV4dCAiSW1hZ2UiDQoJCQl0eHRPZjoJCQkJCSdvZicsCQkvLyAoc3RyaW5nKSBTcGVjaWZ5IHRleHQgIm9mIg0KCQkJLy8gQ29uZmlndXJhdGlvbiByZWxhdGVkIHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJCWtleVRvQ2xvc2U6CQkJCSdjJywJCS8vIChzdHJpbmcpIChjID0gY2xvc2UpIExldHRlciB0byBjbG9zZSB0aGUgalF1ZXJ5IGxpZ2h0Qm94IGludGVyZmFjZS4gQmV5b25kIHRoaXMgbGV0dGVyLCB0aGUgbGV0dGVyIFggYW5kIHRoZSBTQ0FQRSBrZXkgaXMgdXNlZCB0by4NCgkJCWtleVRvUHJldjoJCQkJJ3AnLAkJLy8gKHN0cmluZykgKHAgPSBwcmV2aW91cykgTGV0dGVyIHRvIHNob3cgdGhlIHByZXZpb3VzIGltYWdlDQoJCQlrZXlUb05leHQ6CQkJCSduJywJCS8vIChzdHJpbmcpIChuID0gbmV4dCkgTGV0dGVyIHRvIHNob3cgdGhlIG5leHQgaW1hZ2UuDQoJCQkvLyBEb260dCBhbHRlciB0aGVzZSB2YXJpYWJsZXMgaW4gYW55IHdheQ0KCQkJaW1hZ2VBcnJheToJCQkJW10sDQoJCQlhY3RpdmVJbWFnZToJCQkwDQoJCX0sc2V0dGluZ3MpOw0KCQkvLyBDYWNoaW5nIHRoZSBqUXVlcnkgb2JqZWN0IHdpdGggYWxsIGVsZW1lbnRzIG1hdGNoZWQNCgkJdmFyIGpRdWVyeU1hdGNoZWRPYmogPSB0aGlzOyAvLyBUaGlzLCBpbiB0aGlzIGNvbnRleHQsIHJlZmVyIHRvIGpRdWVyeSBvYmplY3QNCgkJLyoqDQoJCSAqIEluaXRpYWxpemluZyB0aGUgcGx1Z2luIGNhbGxpbmcgdGhlIHN0YXJ0IGZ1bmN0aW9uDQoJCSAqDQoJCSAqIEByZXR1cm4gYm9vbGVhbiBmYWxzZQ0KCQkgKi8NCgkJZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7DQoJCQlfc3RhcnQodGhpcyxqUXVlcnlNYXRjaGVkT2JqKTsgLy8gVGhpcywgaW4gdGhpcyBjb250ZXh0LCByZWZlciB0byBvYmplY3QgKGxpbmspIHdoaWNoIHRoZSB1c2VyIGhhdmUgY2xpY2tlZA0KCQkJcmV0dXJuIGZhbHNlOyAvLyBBdm9pZCB0aGUgYnJvd3NlciBmb2xsb3dpbmcgdGhlIGxpbmsNCgkJfQ0KCQkvKioNCgkJICogU3RhcnQgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4NCgkJICoNCgkJICogQHBhcmFtIG9iamVjdCBvYmpDbGlja2VkIFRoZSBvYmplY3QgKGxpbmspIHdoaWNrIHRoZSB1c2VyIGhhdmUgY2xpY2tlZA0KCQkgKiBAcGFyYW0gb2JqZWN0IGpRdWVyeU1hdGNoZWRPYmogVGhlIGpRdWVyeSBvYmplY3Qgd2l0aCBhbGwgZWxlbWVudHMgbWF0Y2hlZA0KCQkgKi8NCgkJZnVuY3Rpb24gX3N0YXJ0KG9iakNsaWNrZWQsalF1ZXJ5TWF0Y2hlZE9iaikgew0KCQkJLy8gSGltZSBzb21lIGVsZW1lbnRzIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggb3ZlcmxheSBpbiBJRS4gVGhlc2UgZWxlbWVudHMgYXBwZWFyIGFib3ZlIHRoZSBvdmVybGF5Lg0KCQkJJCgnZW1iZWQsIG9iamVjdCwgc2VsZWN0JykuY3NzKHsgJ3Zpc2liaWxpdHknIDogJ2hpZGRlbicgfSk7DQoJCQkvLyBDYWxsIHRoZSBmdW5jdGlvbiB0byBjcmVhdGUgdGhlIG1hcmt1cCBzdHJ1Y3R1cmU7IHN0eWxlIHNvbWUgZWxlbWVudHM7IGFzc2lnbiBldmVudHMgaW4gc29tZSBlbGVtZW50cy4NCgkJCV9zZXRfaW50ZXJmYWNlKCk7DQoJCQkvLyBVbnNldCB0b3RhbCBpbWFnZXMgaW4gaW1hZ2VBcnJheQ0KCQkJc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggPSAwOw0KCQkJLy8gVW5zZXQgaW1hZ2UgYWN0aXZlIGluZm9ybWF0aW9uDQoJCQlzZXR0aW5ncy5hY3RpdmVJbWFnZSA9IDA7DQoJCQkvLyBXZSBoYXZlIGFuIGltYWdlIHNldD8gT3IganVzdCBhbiBpbWFnZT8gTGV0tHMgc2VlIGl0Lg0KCQkJaWYgKCBqUXVlcnlNYXRjaGVkT2JqLmxlbmd0aCA9PSAxICkgew0KCQkJCXNldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkob2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxvYmpDbGlja2VkLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBBZGQgYW4gQXJyYXkgKGFzIG1hbnkgYXMgd2UgaGF2ZSksIHdpdGggaHJlZiBhbmQgdGl0bGUgYXRyaWJ1dGVzLCBpbnNpZGUgdGhlIEFycmF5IHRoYXQgc3RvcmFnZSB0aGUgaW1hZ2VzIHJlZmVyZW5jZXMJCQ0KCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGpRdWVyeU1hdGNoZWRPYmoubGVuZ3RoOyBpKysgKSB7DQoJCQkJCXNldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkoalF1ZXJ5TWF0Y2hlZE9ialtpXS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxqUXVlcnlNYXRjaGVkT2JqW2ldLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpOw0KCQkJCX0NCgkJCX0NCgkJCXdoaWxlICggc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMF0gIT0gb2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSApIHsNCgkJCQlzZXR0aW5ncy5hY3RpdmVJbWFnZSsrOw0KCQkJfQ0KCQkJLy8gQ2FsbCB0aGUgZnVuY3Rpb24gdGhhdCBwcmVwYXJlcyBpbWFnZSBleGliaXRpb24NCgkJCV9zZXRfaW1hZ2VfdG9fdmlldygpOw0KCQl9DQoJCS8qKg0KCQkgKiBDcmVhdGUgdGhlIGpRdWVyeSBsaWdodEJveCBwbHVnaW4gaW50ZXJmYWNlDQoJCSAqDQoJCSAqIFRoZSBIVE1MIG1hcmt1cCB3aWxsIGJlIGxpa2UgdGhhdDoNCgkJCTxkaXYgaWQ9ImpxdWVyeS1vdmVybGF5Ij48L2Rpdj4NCgkJCTxkaXYgaWQ9ImpxdWVyeS1saWdodGJveCI+DQoJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCI+DQoJCQkJCTxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZSI+DQoJCQkJCQk8aW1nIHNyYz0iLi4vZm90b3MvWFguanBnIiBpZD0ibGlnaHRib3gtaW1hZ2UiPg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtbmF2Ij4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtbmF2LWJ0blByZXYiPjwvYT4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtbmF2LWJ0bk5leHQiPjwvYT4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtbG9hZGluZyI+DQoJCQkJCQkJPGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LWxvYWRpbmctbGluayI+DQoJCQkJCQkJCTxpbWcgc3JjPSIuLi9pbWFnZXMvbGlnaHRib3gtaWNvLWxvYWRpbmcuZ2lmIj4NCgkJCQkJCQk8L2E+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij4NCgkJCQkJPGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEiPg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+DQoJCQkJCQkJPHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPg0KCQkJCQkJCTxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj4NCgkJCQkJCTwvZGl2Pg0KCQkJCQkJPGRpdiBpZD0ibGlnaHRib3gtc2VjTmF2Ij4NCgkJCQkJCQk8YSBocmVmPSIjIiBpZD0ibGlnaHRib3gtc2VjTmF2LWJ0bkNsb3NlIj4NCgkJCQkJCQkJPGltZyBzcmM9Ii4uL2ltYWdlcy9saWdodGJveC1idG4tY2xvc2UuZ2lmIj4NCgkJCQkJCQk8L2E+DQoJCQkJCQk8L2Rpdj4NCgkJCQkJPC9kaXY+DQoJCQkJPC9kaXY+DQoJCQk8L2Rpdj4NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfaW50ZXJmYWNlKCkgew0KCQkJLy8gQXBwbHkgdGhlIEhUTUwgbWFya3VwIGludG8gYm9keSB0YWcNCgkJCSQoJ2JvZHknKS5hcHBlbmQoJzxkaXYgaWQ9ImpxdWVyeS1vdmVybGF5Ij48L2Rpdj48ZGl2IGlkPSJqcXVlcnktbGlnaHRib3giPjxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3giPjxkaXYgaWQ9ImxpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZSI+PGltZyBpZD0ibGlnaHRib3gtaW1hZ2UiPjxkaXYgc3R5bGU9IiIgaWQ9ImxpZ2h0Ym94LW5hdiI+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LW5hdi1idG5QcmV2Ij48L2E+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LW5hdi1idG5OZXh0Ij48L2E+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtbG9hZGluZyI+PGEgaHJlZj0iIyIgaWQ9ImxpZ2h0Ym94LWxvYWRpbmctbGluayI+PGltZyBzcmM9IicgKyBzZXR0aW5ncy5pbWFnZUxvYWRpbmcgKyAnIj48L2E+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSI+PGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+PHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPjxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj48L2Rpdj48ZGl2IGlkPSJsaWdodGJveC1zZWNOYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UiPjxpbWcgc3JjPSInICsgc2V0dGluZ3MuaW1hZ2VCdG5DbG9zZSArICciPjwvYT48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj4nKTsJDQoJCQkvLyBHZXQgcGFnZSBzaXplcw0KCQkJdmFyIGFyclBhZ2VTaXplcyA9IF9fX2dldFBhZ2VTaXplKCk7DQoJCQkvLyBTdHlsZSBvdmVybGF5IGFuZCBzaG93IGl0DQoJCQkkKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moew0KCQkJCWJhY2tncm91bmRDb2xvcjoJc2V0dGluZ3Mub3ZlcmxheUJnQ29sb3IsDQoJCQkJb3BhY2l0eToJCQlzZXR0aW5ncy5vdmVybGF5T3BhY2l0eSwNCgkJCQl3aWR0aDoJCQkJYXJyUGFnZVNpemVzWzBdLA0KCQkJCWhlaWdodDoJCQkJYXJyUGFnZVNpemVzWzFdDQoJCQl9KS5mYWRlSW4oKTsNCgkJCS8vIEdldCBwYWdlIHNjcm9sbA0KCQkJdmFyIGFyclBhZ2VTY3JvbGwgPSBfX19nZXRQYWdlU2Nyb2xsKCk7DQoJCQkvLyBDYWxjdWxhdGUgdG9wIGFuZCBsZWZ0IG9mZnNldCBmb3IgdGhlIGpxdWVyeS1saWdodGJveCBkaXYgb2JqZWN0IGFuZCBzaG93IGl0DQoJCQkkKCcjanF1ZXJ5LWxpZ2h0Ym94JykuY3NzKHsNCgkJCQl0b3A6CWFyclBhZ2VTY3JvbGxbMV0gKyAoYXJyUGFnZVNpemVzWzNdIC8gMTApLA0KCQkJCWxlZnQ6CWFyclBhZ2VTY3JvbGxbMF0NCgkJCX0pLnNob3coKTsNCgkJCS8vIEFzc2lnbmluZyBjbGljayBldmVudHMgaW4gZWxlbWVudHMgdG8gY2xvc2Ugb3ZlcmxheQ0KCQkJJCgnI2pxdWVyeS1vdmVybGF5LCNqcXVlcnktbGlnaHRib3gnKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQlfZmluaXNoKCk7CQkJCQkJCQkJDQoJCQl9KTsNCgkJCS8vIEFzc2lnbiB0aGUgX2ZpbmlzaCBmdW5jdGlvbiB0byBsaWdodGJveC1sb2FkaW5nLWxpbmsgYW5kIGxpZ2h0Ym94LXNlY05hdi1idG5DbG9zZSBvYmplY3RzDQoJCQkkKCcjbGlnaHRib3gtbG9hZGluZy1saW5rLCNsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UnKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQlfZmluaXNoKCk7DQoJCQkJcmV0dXJuIGZhbHNlOw0KCQkJfSk7DQoJCQkvLyBJZiB3aW5kb3cgd2FzIHJlc2l6ZWQsIGNhbGN1bGF0ZSB0aGUgbmV3IG92ZXJsYXkgZGltZW5zaW9ucw0KCQkJJCh3aW5kb3cpLnJlc2l6ZShmdW5jdGlvbigpIHsNCgkJCQkvLyBHZXQgcGFnZSBzaXplcw0KCQkJCXZhciBhcnJQYWdlU2l6ZXMgPSBfX19nZXRQYWdlU2l6ZSgpOw0KCQkJCS8vIFN0eWxlIG92ZXJsYXkgYW5kIHNob3cgaXQNCgkJCQkkKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moew0KCQkJCQl3aWR0aDoJCWFyclBhZ2VTaXplc1swXSwNCgkJCQkJaGVpZ2h0OgkJYXJyUGFnZVNpemVzWzFdDQoJCQkJfSk7DQoJCQkJLy8gR2V0IHBhZ2Ugc2Nyb2xsDQoJCQkJdmFyIGFyclBhZ2VTY3JvbGwgPSBfX19nZXRQYWdlU2Nyb2xsKCk7DQoJCQkJLy8gQ2FsY3VsYXRlIHRvcCBhbmQgbGVmdCBvZmZzZXQgZm9yIHRoZSBqcXVlcnktbGlnaHRib3ggZGl2IG9iamVjdCBhbmQgc2hvdyBpdA0KCQkJCSQoJyNqcXVlcnktbGlnaHRib3gnKS5jc3Moew0KCQkJCQl0b3A6CWFyclBhZ2VTY3JvbGxbMV0gKyAoYXJyUGFnZVNpemVzWzNdIC8gMTApLA0KCQkJCQlsZWZ0OglhcnJQYWdlU2Nyb2xsWzBdDQoJCQkJfSk7DQoJCQl9KTsNCgkJfQ0KCQkvKioNCgkJICogUHJlcGFyZXMgaW1hZ2UgZXhpYml0aW9uOyBkb2luZyBhIGltYWdltHMgcHJlbG9hZGVyIHRvIGNhbGN1bGF0ZSBpdLRzIHNpemUNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfaW1hZ2VfdG9fdmlldygpIHsgLy8gc2hvdyB0aGUgbG9hZGluZw0KCQkJLy8gU2hvdyB0aGUgbG9hZGluZw0KCQkJJCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5zaG93KCk7DQoJCQlpZiAoIHNldHRpbmdzLmZpeGVkTmF2aWdhdGlvbiApIHsNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpOw0KCQkJfSBlbHNlIHsNCgkJCQkvLyBIaWRlIHNvbWUgZWxlbWVudHMNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LW5hdiwjbGlnaHRib3gtbmF2LWJ0blByZXYsI2xpZ2h0Ym94LW5hdi1idG5OZXh0LCNsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YS1ib3gsI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY3VycmVudE51bWJlcicpLmhpZGUoKTsNCgkJCX0NCgkJCS8vIEltYWdlIHByZWxvYWQgcHJvY2Vzcw0KCQkJdmFyIG9iakltYWdlUHJlbG9hZGVyID0gbmV3IEltYWdlKCk7DQoJCQlvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQgPSBmdW5jdGlvbigpIHsNCgkJCQkkKCcjbGlnaHRib3gtaW1hZ2UnKS5hdHRyKCdzcmMnLHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdKTsNCgkJCQkvLyBQZXJmb21hbmNlIGFuIGVmZmVjdCBpbiB0aGUgaW1hZ2UgY29udGFpbmVyIHJlc2l6aW5nIGl0DQoJCQkJX3Jlc2l6ZV9jb250YWluZXJfaW1hZ2VfYm94KG9iakltYWdlUHJlbG9hZGVyLndpZHRoLG9iakltYWdlUHJlbG9hZGVyLmhlaWdodCk7DQoJCQkJLy8JY2xlYXIgb25Mb2FkLCBJRSBiZWhhdmVzIGlycmF0aWNhbGx5IHdpdGggYW5pbWF0ZWQgZ2lmcyBvdGhlcndpc2UNCgkJCQlvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXt9Ow0KCQkJfTsNCgkJCW9iakltYWdlUHJlbG9hZGVyLnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdOw0KCQl9Ow0KCQkvKioNCgkJICogUGVyZm9tYW5jZSBhbiBlZmZlY3QgaW4gdGhlIGltYWdlIGNvbnRhaW5lciByZXNpemluZyBpdA0KCQkgKg0KCQkgKiBAcGFyYW0gaW50ZWdlciBpbnRJbWFnZVdpZHRoIFRoZSBpbWFnZbRzIHdpZHRoIHRoYXQgd2lsbCBiZSBzaG93ZWQNCgkJICogQHBhcmFtIGludGVnZXIgaW50SW1hZ2VIZWlnaHQgVGhlIGltYWdltHMgaGVpZ2h0IHRoYXQgd2lsbCBiZSBzaG93ZWQNCgkJICovDQoJCWZ1bmN0aW9uIF9yZXNpemVfY29udGFpbmVyX2ltYWdlX2JveChpbnRJbWFnZVdpZHRoLGludEltYWdlSGVpZ2h0KSB7DQoJCQkvLyBHZXQgY3VycmVudCB3aWR0aCBhbmQgaGVpZ2h0DQoJCQl2YXIgaW50Q3VycmVudFdpZHRoID0gJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS53aWR0aCgpOw0KCQkJdmFyIGludEN1cnJlbnRIZWlnaHQgPSAkKCcjbGlnaHRib3gtY29udGFpbmVyLWltYWdlLWJveCcpLmhlaWdodCgpOw0KCQkJLy8gR2V0IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBzZWxlY3RlZCBpbWFnZSBwbHVzIHRoZSBwYWRkaW5nDQoJCQl2YXIgaW50V2lkdGggPSAoaW50SW1hZ2VXaWR0aCArIChzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplICogMikpOyAvLyBQbHVzIHRoZSBpbWFnZbRzIHdpZHRoIGFuZCB0aGUgbGVmdCBhbmQgcmlnaHQgcGFkZGluZyB2YWx1ZQ0KCQkJdmFyIGludEhlaWdodCA9IChpbnRJbWFnZUhlaWdodCArIChzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplICogMikpOyAvLyBQbHVzIHRoZSBpbWFnZbRzIGhlaWdodCBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0IHBhZGRpbmcgdmFsdWUNCgkJCS8vIERpZmVyZW5jZXMNCgkJCXZhciBpbnREaWZmVyA9IGludEN1cnJlbnRXaWR0aCAtIGludFdpZHRoOw0KCQkJdmFyIGludERpZmZIID0gaW50Q3VycmVudEhlaWdodCAtIGludEhlaWdodDsNCgkJCS8vIFBlcmZvbWFuY2UgdGhlIGVmZmVjdA0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS5hbmltYXRlKHsgd2lkdGg6IGludFdpZHRoLCBoZWlnaHQ6IGludEhlaWdodCB9LHNldHRpbmdzLmNvbnRhaW5lclJlc2l6ZVNwZWVkLGZ1bmN0aW9uKCkgeyBfc2hvd19pbWFnZSgpOyB9KTsNCgkJCWlmICggKCBpbnREaWZmVyA9PSAwICkgJiYgKCBpbnREaWZmSCA9PSAwICkgKSB7DQoJCQkJaWYgKCAkLmJyb3dzZXIubXNpZSApIHsNCgkJCQkJX19fcGF1c2UoMjUwKTsNCgkJCQl9IGVsc2Ugew0KCQkJCQlfX19wYXVzZSgxMDApOwkNCgkJCQl9DQoJCQl9IA0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLmNzcyh7IHdpZHRoOiBpbnRJbWFnZVdpZHRoIH0pOw0KCQkJJCgnI2xpZ2h0Ym94LW5hdi1idG5QcmV2LCNsaWdodGJveC1uYXYtYnRuTmV4dCcpLmNzcyh7IGhlaWdodDogaW50SW1hZ2VIZWlnaHQgKyAoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSAqIDIpIH0pOw0KCQl9Ow0KCQkvKioNCgkJICogU2hvdyB0aGUgcHJlcGFyZWQgaW1hZ2UNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zaG93X2ltYWdlKCkgew0KCQkJJCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5oaWRlKCk7DQoJCQkkKCcjbGlnaHRib3gtaW1hZ2UnKS5mYWRlSW4oZnVuY3Rpb24oKSB7DQoJCQkJX3Nob3dfaW1hZ2VfZGF0YSgpOw0KCQkJCV9zZXRfbmF2aWdhdGlvbigpOw0KCQkJfSk7DQoJCQlfcHJlbG9hZF9uZWlnaGJvcl9pbWFnZXMoKTsNCgkJfTsNCgkJLyoqDQoJCSAqIFNob3cgdGhlIGltYWdlIGluZm9ybWF0aW9uDQoJCSAqDQoJCSAqLw0KCQlmdW5jdGlvbiBfc2hvd19pbWFnZV9kYXRhKCkgew0KCQkJJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLnNsaWRlRG93bignZmFzdCcpOw0KCQkJJCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbicpLmhpZGUoKTsNCgkJCWlmICggc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0gKSB7DQoJCQkJJCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbicpLmh0bWwoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0pLnNob3coKTsNCgkJCX0NCgkJCS8vIElmIHdlIGhhdmUgYSBpbWFnZSBzZXQsIGRpc3BsYXkgJ0ltYWdlIFggb2YgWCcNCgkJCWlmICggc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggPiAxICkgew0KCQkJCSQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXInKS5odG1sKHNldHRpbmdzLnR4dEltYWdlICsgJyAnICsgKCBzZXR0aW5ncy5hY3RpdmVJbWFnZSArIDEgKSArICcgJyArIHNldHRpbmdzLnR4dE9mICsgJyAnICsgc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGgpLnNob3coKTsNCgkJCX0JCQ0KCQl9DQoJCS8qKg0KCQkgKiBEaXNwbGF5IHRoZSBidXR0b24gbmF2aWdhdGlvbnMNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9zZXRfbmF2aWdhdGlvbigpIHsNCgkJCSQoJyNsaWdodGJveC1uYXYnKS5zaG93KCk7DQoNCgkJCS8vIEluc3RlYWQgdG8gZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBpbiBDU1MgZmlsZSwgd2UgZGVmaW5lIGhlcmUuIEFuZCBpdLRzIG5lZWQgdG8gSUUuIEp1c3QuDQoJCQkkKCcjbGlnaHRib3gtbmF2LWJ0blByZXYsI2xpZ2h0Ym94LW5hdi1idG5OZXh0JykuY3NzKHsgJ2JhY2tncm91bmQnIDogJ3RyYW5zcGFyZW50IHVybCgnICsgc2V0dGluZ3MuaW1hZ2VCbGFuayArICcpIG5vLXJlcGVhdCcgfSk7DQoJCQkNCgkJCS8vIFNob3cgdGhlIHByZXYgYnV0dG9uLCBpZiBub3QgdGhlIGZpcnN0IGltYWdlIGluIHNldA0KCQkJaWYgKCBzZXR0aW5ncy5hY3RpdmVJbWFnZSAhPSAwICkgew0KCQkJCWlmICggc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uICkgew0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0blByZXYgKyAnKSBsZWZ0IDE1JSBuby1yZXBlYXQnIH0pDQoJCQkJCQkudW5iaW5kKCkNCgkJCQkJCS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKSB7DQoJCQkJCQkJc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPSBzZXR0aW5ncy5hY3RpdmVJbWFnZSAtIDE7DQoJCQkJCQkJX3NldF9pbWFnZV90b192aWV3KCk7DQoJCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQkJfSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJLy8gU2hvdyB0aGUgaW1hZ2VzIGJ1dHRvbiBmb3IgTmV4dCBidXR0b25zDQoJCQkJCSQoJyNsaWdodGJveC1uYXYtYnRuUHJldicpLnVuYmluZCgpLmhvdmVyKGZ1bmN0aW9uKCkgew0KCQkJCQkJJCh0aGlzKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0blByZXYgKyAnKSBsZWZ0IDE1JSBuby1yZXBlYXQnIH0pOw0KCQkJCQl9LGZ1bmN0aW9uKCkgew0KCQkJCQkJJCh0aGlzKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndHJhbnNwYXJlbnQgdXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJsYW5rICsgJykgbm8tcmVwZWF0JyB9KTsNCgkJCQkJfSkuc2hvdygpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpIHsNCgkJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLSAxOw0KCQkJCQkJX3NldF9pbWFnZV90b192aWV3KCk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJLy8gU2hvdyB0aGUgbmV4dCBidXR0b24sIGlmIG5vdCB0aGUgbGFzdCBpbWFnZSBpbiBzZXQNCgkJCWlmICggc2V0dGluZ3MuYWN0aXZlSW1hZ2UgIT0gKCBzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aCAtMSApICkgew0KCQkJCWlmICggc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uICkgew0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3MoeyAnYmFja2dyb3VuZCcgOiAndXJsKCcgKyBzZXR0aW5ncy5pbWFnZUJ0bk5leHQgKyAnKSByaWdodCAxNSUgbm8tcmVwZWF0JyB9KQ0KCQkJCQkJLnVuYmluZCgpDQoJCQkJCQkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCkgew0KCQkJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxOw0KCQkJCQkJCV9zZXRfaW1hZ2VfdG9fdmlldygpOw0KCQkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJCX0pOw0KCQkJCX0gZWxzZSB7DQoJCQkJCS8vIFNob3cgdGhlIGltYWdlcyBidXR0b24gZm9yIE5leHQgYnV0dG9ucw0KCQkJCQkkKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS51bmJpbmQoKS5ob3ZlcihmdW5jdGlvbigpIHsNCgkJCQkJCSQodGhpcykuY3NzKHsgJ2JhY2tncm91bmQnIDogJ3VybCgnICsgc2V0dGluZ3MuaW1hZ2VCdG5OZXh0ICsgJykgcmlnaHQgMTUlIG5vLXJlcGVhdCcgfSk7DQoJCQkJCX0sZnVuY3Rpb24oKSB7DQoJCQkJCQkkKHRoaXMpLmNzcyh7ICdiYWNrZ3JvdW5kJyA6ICd0cmFuc3BhcmVudCB1cmwoJyArIHNldHRpbmdzLmltYWdlQmxhbmsgKyAnKSBuby1yZXBlYXQnIH0pOw0KCQkJCQl9KS5zaG93KCkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCkgew0KCQkJCQkJc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPSBzZXR0aW5ncy5hY3RpdmVJbWFnZSArIDE7DQoJCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfQ0KCQkJLy8gRW5hYmxlIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJCV9lbmFibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQl9DQoJCS8qKg0KCQkgKiBFbmFibGUgYSBzdXBwb3J0IHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9lbmFibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpIHsNCgkJCSQoZG9jdW1lbnQpLmtleWRvd24oZnVuY3Rpb24ob2JqRXZlbnQpIHsNCgkJCQlfa2V5Ym9hcmRfYWN0aW9uKG9iakV2ZW50KTsNCgkJCX0pOw0KCQl9DQoJCS8qKg0KCQkgKiBEaXNhYmxlIHRoZSBzdXBwb3J0IHRvIGtleWJvYXJkIG5hdmlnYXRpb24NCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9kaXNhYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKSB7DQoJCQkkKGRvY3VtZW50KS51bmJpbmQoKTsNCgkJfQ0KCQkvKioNCgkJICogUGVyZm9ybSB0aGUga2V5Ym9hcmQgYWN0aW9ucw0KCQkgKg0KCQkgKi8NCgkJZnVuY3Rpb24gX2tleWJvYXJkX2FjdGlvbihvYmpFdmVudCkgew0KCQkJLy8gVG8gaWUNCgkJCWlmICggb2JqRXZlbnQgPT0gbnVsbCApIHsNCgkJCQlrZXljb2RlID0gZXZlbnQua2V5Q29kZTsNCgkJCQllc2NhcGVLZXkgPSAyNzsNCgkJCS8vIFRvIE1vemlsbGENCgkJCX0gZWxzZSB7DQoJCQkJa2V5Y29kZSA9IG9iakV2ZW50LmtleUNvZGU7DQoJCQkJZXNjYXBlS2V5ID0gb2JqRXZlbnQuRE9NX1ZLX0VTQ0FQRTsNCgkJCX0NCgkJCS8vIEdldCB0aGUga2V5IGluIGxvd2VyIGNhc2UgZm9ybQ0KCQkJa2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXljb2RlKS50b0xvd2VyQ2FzZSgpOw0KCQkJLy8gVmVyaWZ5IHRoZSBrZXlzIHRvIGNsb3NlIHRoZSBsaWd0aEJveA0KCQkJaWYgKCAoIGtleSA9PSBzZXR0aW5ncy5rZXlUb0Nsb3NlICkgfHwgKCBrZXkgPT0gJ3gnICkgfHwgKCBrZXljb2RlID09IGVzY2FwZUtleSApICkgew0KCQkJCV9maW5pc2goKTsNCgkJCX0NCgkJCS8vIFZlcmlmeSB0aGUga2V5IHRvIHNob3cgdGhlIHByZXZpb3VzIGltYWdlDQoJCQlpZiAoICgga2V5ID09IHNldHRpbmdzLmtleVRvUHJldiApIHx8ICgga2V5Y29kZSA9PSAzNyApICkgew0KCQkJCS8vIElmIHdltHJlIG5vdCBzaG93aW5nIHRoZSBmaXJzdCBpbWFnZSwgY2FsbCB0aGUgcHJldmlvdXMNCgkJCQlpZiAoIHNldHRpbmdzLmFjdGl2ZUltYWdlICE9IDAgKSB7DQoJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLSAxOw0KCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJX2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQkJCX0NCgkJCX0NCgkJCS8vIFZlcmlmeSB0aGUga2V5IHRvIHNob3cgdGhlIG5leHQgaW1hZ2UNCgkJCWlmICggKCBrZXkgPT0gc2V0dGluZ3Mua2V5VG9OZXh0ICkgfHwgKCBrZXljb2RlID09IDM5ICkgKSB7DQoJCQkJLy8gSWYgd2W0cmUgbm90IHNob3dpbmcgdGhlIGxhc3QgaW1hZ2UsIGNhbGwgdGhlIG5leHQNCgkJCQlpZiAoIHNldHRpbmdzLmFjdGl2ZUltYWdlICE9ICggc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGggLSAxICkgKSB7DQoJCQkJCXNldHRpbmdzLmFjdGl2ZUltYWdlID0gc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxOw0KCQkJCQlfc2V0X2ltYWdlX3RvX3ZpZXcoKTsNCgkJCQkJX2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkvKioNCgkJICogUHJlbG9hZCBwcmV2IGFuZCBuZXh0IGltYWdlcyBiZWluZyBzaG93ZWQNCgkJICoNCgkJICovDQoJCWZ1bmN0aW9uIF9wcmVsb2FkX25laWdoYm9yX2ltYWdlcygpIHsNCgkJCWlmICggKHNldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoIC0xKSA+IHNldHRpbmdzLmFjdGl2ZUltYWdlICkgew0KCQkJCW9iak5leHQgPSBuZXcgSW1hZ2UoKTsNCgkJCQlvYmpOZXh0LnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2UgKyAxXVswXTsNCgkJCX0NCgkJCWlmICggc2V0dGluZ3MuYWN0aXZlSW1hZ2UgPiAwICkgew0KCQkJCW9ialByZXYgPSBuZXcgSW1hZ2UoKTsNCgkJCQlvYmpQcmV2LnNyYyA9IHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2UgLTFdWzBdOw0KCQkJfQ0KCQl9DQoJCS8qKg0KCQkgKiBSZW1vdmUgalF1ZXJ5IGxpZ2h0Qm94IHBsdWdpbiBIVE1MIG1hcmt1cA0KCQkgKg0KCQkgKi8NCgkJZnVuY3Rpb24gX2ZpbmlzaCgpIHsNCgkJCSQoJyNqcXVlcnktbGlnaHRib3gnKS5yZW1vdmUoKTsNCgkJCSQoJyNqcXVlcnktb3ZlcmxheScpLmZhZGVPdXQoZnVuY3Rpb24oKSB7ICQoJyNqcXVlcnktb3ZlcmxheScpLnJlbW92ZSgpOyB9KTsNCgkJCS8vIFNob3cgc29tZSBlbGVtZW50cyB0byBhdm9pZCBjb25mbGljdCB3aXRoIG92ZXJsYXkgaW4gSUUuIFRoZXNlIGVsZW1lbnRzIGFwcGVhciBhYm92ZSB0aGUgb3ZlcmxheS4NCgkJCSQoJ2VtYmVkLCBvYmplY3QsIHNlbGVjdCcpLmNzcyh7ICd2aXNpYmlsaXR5JyA6ICd2aXNpYmxlJyB9KTsNCgkJfQ0KCQkvKioNCgkJIC8gVEhJUkQgRlVOQ1RJT04NCgkJICogZ2V0UGFnZVNpemUoKSBieSBxdWlya3Ntb2RlLmNvbQ0KCQkgKg0KCQkgKiBAcmV0dXJuIEFycmF5IFJldHVybiBhbiBhcnJheSB3aXRoIHBhZ2Ugd2lkdGgsIGhlaWdodCBhbmQgd2luZG93IHdpZHRoLCBoZWlnaHQNCgkJICovDQoJCWZ1bmN0aW9uIF9fX2dldFBhZ2VTaXplKCkgew0KCQkJdmFyIHhTY3JvbGwsIHlTY3JvbGw7DQoJCQlpZiAod2luZG93LmlubmVySGVpZ2h0ICYmIHdpbmRvdy5zY3JvbGxNYXhZKSB7CQ0KCQkJCXhTY3JvbGwgPSB3aW5kb3cuaW5uZXJXaWR0aCArIHdpbmRvdy5zY3JvbGxNYXhYOw0KCQkJCXlTY3JvbGwgPSB3aW5kb3cuaW5uZXJIZWlnaHQgKyB3aW5kb3cuc2Nyb2xsTWF4WTsNCgkJCX0gZWxzZSBpZiAoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgPiBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCl7IC8vIGFsbCBidXQgRXhwbG9yZXIgTWFjDQoJCQkJeFNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsV2lkdGg7DQoJCQkJeVNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0Ow0KCQkJfSBlbHNlIHsgLy8gRXhwbG9yZXIgTWFjLi4ud291bGQgYWxzbyB3b3JrIGluIEV4cGxvcmVyIDYgU3RyaWN0LCBNb3ppbGxhIGFuZCBTYWZhcmkNCgkJCQl4U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDsNCgkJCQl5U2Nyb2xsID0gZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQ7DQoJCQl9DQoJCQl2YXIgd2luZG93V2lkdGgsIHdpbmRvd0hlaWdodDsNCgkJCWlmIChzZWxmLmlubmVySGVpZ2h0KSB7CS8vIGFsbCBleGNlcHQgRXhwbG9yZXINCgkJCQlpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgpew0KCQkJCQl3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsgDQoJCQkJfSBlbHNlIHsNCgkJCQkJd2luZG93V2lkdGggPSBzZWxmLmlubmVyV2lkdGg7DQoJCQkJfQ0KCQkJCXdpbmRvd0hlaWdodCA9IHNlbGYuaW5uZXJIZWlnaHQ7DQoJCQl9IGVsc2UgaWYgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7IC8vIEV4cGxvcmVyIDYgU3RyaWN0IE1vZGUNCgkJCQl3aW5kb3dXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsNCgkJCQl3aW5kb3dIZWlnaHQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0Ow0KCQkJfSBlbHNlIGlmIChkb2N1bWVudC5ib2R5KSB7IC8vIG90aGVyIEV4cGxvcmVycw0KCQkJCXdpbmRvd1dpZHRoID0gZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDsNCgkJCQl3aW5kb3dIZWlnaHQgPSBkb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodDsNCgkJCX0JDQoJCQkvLyBmb3Igc21hbGwgcGFnZXMgd2l0aCB0b3RhbCBoZWlnaHQgbGVzcyB0aGVuIGhlaWdodCBvZiB0aGUgdmlld3BvcnQNCgkJCWlmKHlTY3JvbGwgPCB3aW5kb3dIZWlnaHQpew0KCQkJCXBhZ2VIZWlnaHQgPSB3aW5kb3dIZWlnaHQ7DQoJCQl9IGVsc2UgeyANCgkJCQlwYWdlSGVpZ2h0ID0geVNjcm9sbDsNCgkJCX0NCgkJCS8vIGZvciBzbWFsbCBwYWdlcyB3aXRoIHRvdGFsIHdpZHRoIGxlc3MgdGhlbiB3aWR0aCBvZiB0aGUgdmlld3BvcnQNCgkJCWlmKHhTY3JvbGwgPCB3aW5kb3dXaWR0aCl7CQ0KCQkJCXBhZ2VXaWR0aCA9IHhTY3JvbGw7CQkNCgkJCX0gZWxzZSB7DQoJCQkJcGFnZVdpZHRoID0gd2luZG93V2lkdGg7DQoJCQl9DQoJCQlhcnJheVBhZ2VTaXplID0gbmV3IEFycmF5KHBhZ2VXaWR0aCxwYWdlSGVpZ2h0LHdpbmRvd1dpZHRoLHdpbmRvd0hlaWdodCk7DQoJCQlyZXR1cm4gYXJyYXlQYWdlU2l6ZTsNCgkJfTsNCgkJLyoqDQoJCSAvIFRISVJEIEZVTkNUSU9ODQoJCSAqIGdldFBhZ2VTY3JvbGwoKSBieSBxdWlya3Ntb2RlLmNvbQ0KCQkgKg0KCQkgKiBAcmV0dXJuIEFycmF5IFJldHVybiBhbiBhcnJheSB3aXRoIHgseSBwYWdlIHNjcm9sbCB2YWx1ZXMuDQoJCSAqLw0KCQlmdW5jdGlvbiBfX19nZXRQYWdlU2Nyb2xsKCkgew0KCQkJdmFyIHhTY3JvbGwsIHlTY3JvbGw7DQoJCQlpZiAoc2VsZi5wYWdlWU9mZnNldCkgew0KCQkJCXlTY3JvbGwgPSBzZWxmLnBhZ2VZT2Zmc2V0Ow0KCQkJCXhTY3JvbGwgPSBzZWxmLnBhZ2VYT2Zmc2V0Ow0KCQkJfSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCkgewkgLy8gRXhwbG9yZXIgNiBTdHJpY3QNCgkJCQl5U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsNCgkJCQl4U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7DQoJCQl9IGVsc2UgaWYgKGRvY3VtZW50LmJvZHkpIHsvLyBhbGwgb3RoZXIgRXhwbG9yZXJzDQoJCQkJeVNjcm9sbCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOw0KCQkJCXhTY3JvbGwgPSBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7CQ0KCQkJfQ0KCQkJYXJyYXlQYWdlU2Nyb2xsID0gbmV3IEFycmF5KHhTY3JvbGwseVNjcm9sbCk7DQoJCQlyZXR1cm4gYXJyYXlQYWdlU2Nyb2xsOw0KCQl9Ow0KCQkgLyoqDQoJCSAgKiBTdG9wIHRoZSBjb2RlIGV4ZWN1dGlvbiBmcm9tIGEgZXNjaWZpZWQgdGltZSBpbiBtaWxpc2Vjb25kDQoJCSAgKg0KCQkgICovDQoJCSBmdW5jdGlvbiBfX19wYXVzZShtcykgew0KCQkJdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOyANCgkJCWN1ckRhdGUgPSBudWxsOw0KCQkJZG8geyB2YXIgY3VyRGF0ZSA9IG5ldyBEYXRlKCk7IH0NCgkJCXdoaWxlICggY3VyRGF0ZSAtIGRhdGUgPCBtcyk7DQoJCSB9Ow0KCQkvLyBSZXR1cm4gdGhlIGpRdWVyeSBvYmplY3QgZm9yIGNoYWluaW5nLiBUaGUgdW5iaW5kIG1ldGhvZCBpcyB1c2VkIHRvIGF2b2lkIGNsaWNrIGNvbmZsaWN0IHdoZW4gdGhlIHBsdWdpbiBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UNCgkJcmV0dXJuIHRoaXMudW5iaW5kKCdjbGljaycpLmNsaWNrKF9pbml0aWFsaXplKTsNCgl9Ow0KfSkoalF1ZXJ5KTsgLy8gQ2FsbCBhbmQgZXhlY3V0ZSB0aGUgZnVuY3Rpb24gaW1tZWRpYXRlbHkgcGFzc2luZyB0aGUgalF1ZXJ5IG9iamVjdA==]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCihmdW5jdGlvbigkKXskLmZuLmxpZ2h0Qm94PWZ1bmN0aW9uKHNldHRpbmdzKXtzZXR0aW5ncz1qUXVlcnkuZXh0ZW5kKHtvdmVybGF5QmdDb2xvcjonIzAwMCcsb3ZlcmxheU9wYWNpdHk6MC44LGZpeGVkTmF2aWdhdGlvbjpmYWxzZSxpbWFnZUxvYWRpbmc6J2ltYWdlcy9saWdodGJveC1pY28tbG9hZGluZy5naWYnLGltYWdlQnRuUHJldjonaW1hZ2VzL2xpZ2h0Ym94LWJ0bi1wcmV2LmdpZicsaW1hZ2VCdG5OZXh0OidpbWFnZXMvbGlnaHRib3gtYnRuLW5leHQuZ2lmJyxpbWFnZUJ0bkNsb3NlOidpbWFnZXMvbGlnaHRib3gtYnRuLWNsb3NlLmdpZicsaW1hZ2VCbGFuazonaW1hZ2VzL2xpZ2h0Ym94LWJsYW5rLmdpZicsY29udGFpbmVyQm9yZGVyU2l6ZToxMCxjb250YWluZXJSZXNpemVTcGVlZDo0MDAsdHh0SW1hZ2U6J0ltYWdlJyx0eHRPZjonb2YnLGtleVRvQ2xvc2U6J2MnLGtleVRvUHJldjoncCcsa2V5VG9OZXh0OiduJyxpbWFnZUFycmF5OltdLGFjdGl2ZUltYWdlOjB9LHNldHRpbmdzKTt2YXIgalF1ZXJ5TWF0Y2hlZE9iaj10aGlzO2Z1bmN0aW9uIF9pbml0aWFsaXplKCl7X3N0YXJ0KHRoaXMsalF1ZXJ5TWF0Y2hlZE9iaik7cmV0dXJuIGZhbHNlO30NCmZ1bmN0aW9uIF9zdGFydChvYmpDbGlja2VkLGpRdWVyeU1hdGNoZWRPYmopeyQoJ2VtYmVkLCBvYmplY3QsIHNlbGVjdCcpLmNzcyh7J3Zpc2liaWxpdHknOidoaWRkZW4nfSk7X3NldF9pbnRlcmZhY2UoKTtzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aD0wO3NldHRpbmdzLmFjdGl2ZUltYWdlPTA7aWYoalF1ZXJ5TWF0Y2hlZE9iai5sZW5ndGg9PTEpe3NldHRpbmdzLmltYWdlQXJyYXkucHVzaChuZXcgQXJyYXkob2JqQ2xpY2tlZC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSxvYmpDbGlja2VkLmdldEF0dHJpYnV0ZSgndGl0bGUnKSkpO31lbHNle2Zvcih2YXIgaT0wO2k8alF1ZXJ5TWF0Y2hlZE9iai5sZW5ndGg7aSsrKXtzZXR0aW5ncy5pbWFnZUFycmF5LnB1c2gobmV3IEFycmF5KGpRdWVyeU1hdGNoZWRPYmpbaV0uZ2V0QXR0cmlidXRlKCdocmVmJyksalF1ZXJ5TWF0Y2hlZE9ialtpXS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykpKTt9fQ0Kd2hpbGUoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMF0hPW9iakNsaWNrZWQuZ2V0QXR0cmlidXRlKCdocmVmJykpe3NldHRpbmdzLmFjdGl2ZUltYWdlKys7fQ0KX3NldF9pbWFnZV90b192aWV3KCk7fQ0KZnVuY3Rpb24gX3NldF9pbnRlcmZhY2UoKXskKCdib2R5JykuYXBwZW5kKCc8ZGl2IGlkPSJqcXVlcnktb3ZlcmxheSI+PC9kaXY+PGRpdiBpZD0ianF1ZXJ5LWxpZ2h0Ym94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UiPjxpbWcgaWQ9ImxpZ2h0Ym94LWltYWdlIj48ZGl2IHN0eWxlPSIiIGlkPSJsaWdodGJveC1uYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1uYXYtYnRuUHJldiI+PC9hPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1uYXYtYnRuTmV4dCI+PC9hPjwvZGl2PjxkaXYgaWQ9ImxpZ2h0Ym94LWxvYWRpbmciPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1sb2FkaW5nLWxpbmsiPjxpbWcgc3JjPSInK3NldHRpbmdzLmltYWdlTG9hZGluZysnIj48L2E+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBpZD0ibGlnaHRib3gtY29udGFpbmVyLWltYWdlLWRhdGEtYm94Ij48ZGl2IGlkPSJsaWdodGJveC1jb250YWluZXItaW1hZ2UtZGF0YSI+PGRpdiBpZD0ibGlnaHRib3gtaW1hZ2UtZGV0YWlscyI+PHNwYW4gaWQ9ImxpZ2h0Ym94LWltYWdlLWRldGFpbHMtY2FwdGlvbiI+PC9zcGFuPjxzcGFuIGlkPSJsaWdodGJveC1pbWFnZS1kZXRhaWxzLWN1cnJlbnROdW1iZXIiPjwvc3Bhbj48L2Rpdj48ZGl2IGlkPSJsaWdodGJveC1zZWNOYXYiPjxhIGhyZWY9IiMiIGlkPSJsaWdodGJveC1zZWNOYXYtYnRuQ2xvc2UiPjxpbWcgc3JjPSInK3NldHRpbmdzLmltYWdlQnRuQ2xvc2UrJyI+PC9hPjwvZGl2PjwvZGl2PjwvZGl2PjwvZGl2PicpO3ZhciBhcnJQYWdlU2l6ZXM9X19fZ2V0UGFnZVNpemUoKTskKCcjanF1ZXJ5LW92ZXJsYXknKS5jc3Moe2JhY2tncm91bmRDb2xvcjpzZXR0aW5ncy5vdmVybGF5QmdDb2xvcixvcGFjaXR5OnNldHRpbmdzLm92ZXJsYXlPcGFjaXR5LHdpZHRoOmFyclBhZ2VTaXplc1swXSxoZWlnaHQ6YXJyUGFnZVNpemVzWzFdfSkuZmFkZUluKCk7dmFyIGFyclBhZ2VTY3JvbGw9X19fZ2V0UGFnZVNjcm9sbCgpOyQoJyNqcXVlcnktbGlnaHRib3gnKS5jc3Moe3RvcDphcnJQYWdlU2Nyb2xsWzFdKyhhcnJQYWdlU2l6ZXNbM10vMTApLGxlZnQ6YXJyUGFnZVNjcm9sbFswXX0pLnNob3coKTskKCcjanF1ZXJ5LW92ZXJsYXksI2pxdWVyeS1saWdodGJveCcpLmNsaWNrKGZ1bmN0aW9uKCl7X2ZpbmlzaCgpO30pOyQoJyNsaWdodGJveC1sb2FkaW5nLWxpbmssI2xpZ2h0Ym94LXNlY05hdi1idG5DbG9zZScpLmNsaWNrKGZ1bmN0aW9uKCl7X2ZpbmlzaCgpO3JldHVybiBmYWxzZTt9KTskKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uKCl7dmFyIGFyclBhZ2VTaXplcz1fX19nZXRQYWdlU2l6ZSgpOyQoJyNqcXVlcnktb3ZlcmxheScpLmNzcyh7d2lkdGg6YXJyUGFnZVNpemVzWzBdLGhlaWdodDphcnJQYWdlU2l6ZXNbMV19KTt2YXIgYXJyUGFnZVNjcm9sbD1fX19nZXRQYWdlU2Nyb2xsKCk7JCgnI2pxdWVyeS1saWdodGJveCcpLmNzcyh7dG9wOmFyclBhZ2VTY3JvbGxbMV0rKGFyclBhZ2VTaXplc1szXS8xMCksbGVmdDphcnJQYWdlU2Nyb2xsWzBdfSk7fSk7fQ0KZnVuY3Rpb24gX3NldF9pbWFnZV90b192aWV3KCl7JCgnI2xpZ2h0Ym94LWxvYWRpbmcnKS5zaG93KCk7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtaW1hZ2UsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpO31lbHNleyQoJyNsaWdodGJveC1pbWFnZSwjbGlnaHRib3gtbmF2LCNsaWdodGJveC1uYXYtYnRuUHJldiwjbGlnaHRib3gtbmF2LWJ0bk5leHQsI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCwjbGlnaHRib3gtaW1hZ2UtZGV0YWlscy1jdXJyZW50TnVtYmVyJykuaGlkZSgpO30NCnZhciBvYmpJbWFnZVByZWxvYWRlcj1uZXcgSW1hZ2UoKTtvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXskKCcjbGlnaHRib3gtaW1hZ2UnKS5hdHRyKCdzcmMnLHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdKTtfcmVzaXplX2NvbnRhaW5lcl9pbWFnZV9ib3gob2JqSW1hZ2VQcmVsb2FkZXIud2lkdGgsb2JqSW1hZ2VQcmVsb2FkZXIuaGVpZ2h0KTtvYmpJbWFnZVByZWxvYWRlci5vbmxvYWQ9ZnVuY3Rpb24oKXt9O307b2JqSW1hZ2VQcmVsb2FkZXIuc3JjPXNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzBdO307ZnVuY3Rpb24gX3Jlc2l6ZV9jb250YWluZXJfaW1hZ2VfYm94KGludEltYWdlV2lkdGgsaW50SW1hZ2VIZWlnaHQpe3ZhciBpbnRDdXJyZW50V2lkdGg9JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS53aWR0aCgpO3ZhciBpbnRDdXJyZW50SGVpZ2h0PSQoJyNsaWdodGJveC1jb250YWluZXItaW1hZ2UtYm94JykuaGVpZ2h0KCk7dmFyIGludFdpZHRoPShpbnRJbWFnZVdpZHRoKyhzZXR0aW5ncy5jb250YWluZXJCb3JkZXJTaXplKjIpKTt2YXIgaW50SGVpZ2h0PShpbnRJbWFnZUhlaWdodCsoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSoyKSk7dmFyIGludERpZmZXPWludEN1cnJlbnRXaWR0aC1pbnRXaWR0aDt2YXIgaW50RGlmZkg9aW50Q3VycmVudEhlaWdodC1pbnRIZWlnaHQ7JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1ib3gnKS5hbmltYXRlKHt3aWR0aDppbnRXaWR0aCxoZWlnaHQ6aW50SGVpZ2h0fSxzZXR0aW5ncy5jb250YWluZXJSZXNpemVTcGVlZCxmdW5jdGlvbigpe19zaG93X2ltYWdlKCk7fSk7aWYoKGludERpZmZXPT0wKSYmKGludERpZmZIPT0wKSl7aWYoJC5icm93c2VyLm1zaWUpe19fX3BhdXNlKDI1MCk7fWVsc2V7X19fcGF1c2UoMTAwKTt9fQ0KJCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLmNzcyh7d2lkdGg6aW50SW1hZ2VXaWR0aH0pOyQoJyNsaWdodGJveC1uYXYtYnRuUHJldiwjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3Moe2hlaWdodDppbnRJbWFnZUhlaWdodCsoc2V0dGluZ3MuY29udGFpbmVyQm9yZGVyU2l6ZSoyKX0pO307ZnVuY3Rpb24gX3Nob3dfaW1hZ2UoKXskKCcjbGlnaHRib3gtbG9hZGluZycpLmhpZGUoKTskKCcjbGlnaHRib3gtaW1hZ2UnKS5mYWRlSW4oZnVuY3Rpb24oKXtfc2hvd19pbWFnZV9kYXRhKCk7X3NldF9uYXZpZ2F0aW9uKCk7fSk7X3ByZWxvYWRfbmVpZ2hib3JfaW1hZ2VzKCk7fTtmdW5jdGlvbiBfc2hvd19pbWFnZV9kYXRhKCl7JCgnI2xpZ2h0Ym94LWNvbnRhaW5lci1pbWFnZS1kYXRhLWJveCcpLnNsaWRlRG93bignZmFzdCcpOyQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWNhcHRpb24nKS5oaWRlKCk7aWYoc2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZV1bMV0peyQoJyNsaWdodGJveC1pbWFnZS1kZXRhaWxzLWNhcHRpb24nKS5odG1sKHNldHRpbmdzLmltYWdlQXJyYXlbc2V0dGluZ3MuYWN0aXZlSW1hZ2VdWzFdKS5zaG93KCk7fQ0KaWYoc2V0dGluZ3MuaW1hZ2VBcnJheS5sZW5ndGg+MSl7JCgnI2xpZ2h0Ym94LWltYWdlLWRldGFpbHMtY3VycmVudE51bWJlcicpLmh0bWwoc2V0dGluZ3MudHh0SW1hZ2UrJyAnKyhzZXR0aW5ncy5hY3RpdmVJbWFnZSsxKSsnICcrc2V0dGluZ3MudHh0T2YrJyAnK3NldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoKS5zaG93KCk7fX0NCmZ1bmN0aW9uIF9zZXRfbmF2aWdhdGlvbigpeyQoJyNsaWdodGJveC1uYXYnKS5zaG93KCk7JCgnI2xpZ2h0Ym94LW5hdi1idG5QcmV2LCNsaWdodGJveC1uYXYtYnRuTmV4dCcpLmNzcyh7J2JhY2tncm91bmQnOid0cmFuc3BhcmVudCB1cmwoJytzZXR0aW5ncy5pbWFnZUJsYW5rKycpIG5vLXJlcGVhdCd9KTtpZihzZXR0aW5ncy5hY3RpdmVJbWFnZSE9MCl7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS5jc3MoeydiYWNrZ3JvdW5kJzondXJsKCcrc2V0dGluZ3MuaW1hZ2VCdG5QcmV2KycpIGxlZnQgMTUlIG5vLXJlcGVhdCd9KS51bmJpbmQoKS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZS0xO19zZXRfaW1hZ2VfdG9fdmlldygpO3JldHVybiBmYWxzZTt9KTt9ZWxzZXskKCcjbGlnaHRib3gtbmF2LWJ0blByZXYnKS51bmJpbmQoKS5ob3ZlcihmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnYmFja2dyb3VuZCc6J3VybCgnK3NldHRpbmdzLmltYWdlQnRuUHJldisnKSBsZWZ0IDE1JSBuby1yZXBlYXQnfSk7fSxmdW5jdGlvbigpeyQodGhpcykuY3NzKHsnYmFja2dyb3VuZCc6J3RyYW5zcGFyZW50IHVybCgnK3NldHRpbmdzLmltYWdlQmxhbmsrJykgbm8tcmVwZWF0J30pO30pLnNob3coKS5iaW5kKCdjbGljaycsZnVuY3Rpb24oKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZS0xO19zZXRfaW1hZ2VfdG9fdmlldygpO3JldHVybiBmYWxzZTt9KTt9fQ0KaWYoc2V0dGluZ3MuYWN0aXZlSW1hZ2UhPShzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aC0xKSl7aWYoc2V0dGluZ3MuZml4ZWROYXZpZ2F0aW9uKXskKCcjbGlnaHRib3gtbmF2LWJ0bk5leHQnKS5jc3MoeydiYWNrZ3JvdW5kJzondXJsKCcrc2V0dGluZ3MuaW1hZ2VCdG5OZXh0KycpIHJpZ2h0IDE1JSBuby1yZXBlYXQnfSkudW5iaW5kKCkuYmluZCgnY2xpY2snLGZ1bmN0aW9uKCl7c2V0dGluZ3MuYWN0aXZlSW1hZ2U9c2V0dGluZ3MuYWN0aXZlSW1hZ2UrMTtfc2V0X2ltYWdlX3RvX3ZpZXcoKTtyZXR1cm4gZmFsc2U7fSk7fWVsc2V7JCgnI2xpZ2h0Ym94LW5hdi1idG5OZXh0JykudW5iaW5kKCkuaG92ZXIoZnVuY3Rpb24oKXskKHRoaXMpLmNzcyh7J2JhY2tncm91bmQnOid1cmwoJytzZXR0aW5ncy5pbWFnZUJ0bk5leHQrJykgcmlnaHQgMTUlIG5vLXJlcGVhdCd9KTt9LGZ1bmN0aW9uKCl7JCh0aGlzKS5jc3MoeydiYWNrZ3JvdW5kJzondHJhbnNwYXJlbnQgdXJsKCcrc2V0dGluZ3MuaW1hZ2VCbGFuaysnKSBuby1yZXBlYXQnfSk7fSkuc2hvdygpLmJpbmQoJ2NsaWNrJyxmdW5jdGlvbigpe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlKzE7X3NldF9pbWFnZV90b192aWV3KCk7cmV0dXJuIGZhbHNlO30pO319DQpfZW5hYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKTt9DQpmdW5jdGlvbiBfZW5hYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKXskKGRvY3VtZW50KS5rZXlkb3duKGZ1bmN0aW9uKG9iakV2ZW50KXtfa2V5Ym9hcmRfYWN0aW9uKG9iakV2ZW50KTt9KTt9DQpmdW5jdGlvbiBfZGlzYWJsZV9rZXlib2FyZF9uYXZpZ2F0aW9uKCl7JChkb2N1bWVudCkudW5iaW5kKCk7fQ0KZnVuY3Rpb24gX2tleWJvYXJkX2FjdGlvbihvYmpFdmVudCl7aWYob2JqRXZlbnQ9PW51bGwpe2tleWNvZGU9ZXZlbnQua2V5Q29kZTtlc2NhcGVLZXk9Mjc7fWVsc2V7a2V5Y29kZT1vYmpFdmVudC5rZXlDb2RlO2VzY2FwZUtleT1vYmpFdmVudC5ET01fVktfRVNDQVBFO30NCmtleT1TdHJpbmcuZnJvbUNoYXJDb2RlKGtleWNvZGUpLnRvTG93ZXJDYXNlKCk7aWYoKGtleT09c2V0dGluZ3Mua2V5VG9DbG9zZSl8fChrZXk9PSd4Jyl8fChrZXljb2RlPT1lc2NhcGVLZXkpKXtfZmluaXNoKCk7fQ0KaWYoKGtleT09c2V0dGluZ3Mua2V5VG9QcmV2KXx8KGtleWNvZGU9PTM3KSl7aWYoc2V0dGluZ3MuYWN0aXZlSW1hZ2UhPTApe3NldHRpbmdzLmFjdGl2ZUltYWdlPXNldHRpbmdzLmFjdGl2ZUltYWdlLTE7X3NldF9pbWFnZV90b192aWV3KCk7X2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbigpO319DQppZigoa2V5PT1zZXR0aW5ncy5rZXlUb05leHQpfHwoa2V5Y29kZT09MzkpKXtpZihzZXR0aW5ncy5hY3RpdmVJbWFnZSE9KHNldHRpbmdzLmltYWdlQXJyYXkubGVuZ3RoLTEpKXtzZXR0aW5ncy5hY3RpdmVJbWFnZT1zZXR0aW5ncy5hY3RpdmVJbWFnZSsxO19zZXRfaW1hZ2VfdG9fdmlldygpO19kaXNhYmxlX2tleWJvYXJkX25hdmlnYXRpb24oKTt9fX0NCmZ1bmN0aW9uIF9wcmVsb2FkX25laWdoYm9yX2ltYWdlcygpe2lmKChzZXR0aW5ncy5pbWFnZUFycmF5Lmxlbmd0aC0xKT5zZXR0aW5ncy5hY3RpdmVJbWFnZSl7b2JqTmV4dD1uZXcgSW1hZ2UoKTtvYmpOZXh0LnNyYz1zZXR0aW5ncy5pbWFnZUFycmF5W3NldHRpbmdzLmFjdGl2ZUltYWdlKzFdWzBdO30NCmlmKHNldHRpbmdzLmFjdGl2ZUltYWdlPjApe29ialByZXY9bmV3IEltYWdlKCk7b2JqUHJldi5zcmM9c2V0dGluZ3MuaW1hZ2VBcnJheVtzZXR0aW5ncy5hY3RpdmVJbWFnZS0xXVswXTt9fQ0KZnVuY3Rpb24gX2ZpbmlzaCgpeyQoJyNqcXVlcnktbGlnaHRib3gnKS5yZW1vdmUoKTskKCcjanF1ZXJ5LW92ZXJsYXknKS5mYWRlT3V0KGZ1bmN0aW9uKCl7JCgnI2pxdWVyeS1vdmVybGF5JykucmVtb3ZlKCk7fSk7JCgnZW1iZWQsIG9iamVjdCwgc2VsZWN0JykuY3NzKHsndmlzaWJpbGl0eSc6J3Zpc2libGUnfSk7fQ0KZnVuY3Rpb24gX19fZ2V0UGFnZVNpemUoKXt2YXIgeFNjcm9sbCx5U2Nyb2xsO2lmKHdpbmRvdy5pbm5lckhlaWdodCYmd2luZG93LnNjcm9sbE1heFkpe3hTY3JvbGw9d2luZG93LmlubmVyV2lkdGgrd2luZG93LnNjcm9sbE1heFg7eVNjcm9sbD13aW5kb3cuaW5uZXJIZWlnaHQrd2luZG93LnNjcm9sbE1heFk7fWVsc2UgaWYoZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQ+ZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpe3hTY3JvbGw9ZG9jdW1lbnQuYm9keS5zY3JvbGxXaWR0aDt5U2Nyb2xsPWRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0O31lbHNle3hTY3JvbGw9ZG9jdW1lbnQuYm9keS5vZmZzZXRXaWR0aDt5U2Nyb2xsPWRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0O30NCnZhciB3aW5kb3dXaWR0aCx3aW5kb3dIZWlnaHQ7aWYoc2VsZi5pbm5lckhlaWdodCl7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKXt3aW5kb3dXaWR0aD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7fWVsc2V7d2luZG93V2lkdGg9c2VsZi5pbm5lcldpZHRoO30NCndpbmRvd0hlaWdodD1zZWxmLmlubmVySGVpZ2h0O31lbHNlIGlmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCl7d2luZG93V2lkdGg9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO3dpbmRvd0hlaWdodD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0O31lbHNlIGlmKGRvY3VtZW50LmJvZHkpe3dpbmRvd1dpZHRoPWRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7d2luZG93SGVpZ2h0PWRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0O30NCmlmKHlTY3JvbGw8d2luZG93SGVpZ2h0KXtwYWdlSGVpZ2h0PXdpbmRvd0hlaWdodDt9ZWxzZXtwYWdlSGVpZ2h0PXlTY3JvbGw7fQ0KaWYoeFNjcm9sbDx3aW5kb3dXaWR0aCl7cGFnZVdpZHRoPXhTY3JvbGw7fWVsc2V7cGFnZVdpZHRoPXdpbmRvd1dpZHRoO30NCmFycmF5UGFnZVNpemU9bmV3IEFycmF5KHBhZ2VXaWR0aCxwYWdlSGVpZ2h0LHdpbmRvd1dpZHRoLHdpbmRvd0hlaWdodCk7cmV0dXJuIGFycmF5UGFnZVNpemU7fTtmdW5jdGlvbiBfX19nZXRQYWdlU2Nyb2xsKCl7dmFyIHhTY3JvbGwseVNjcm9sbDtpZihzZWxmLnBhZ2VZT2Zmc2V0KXt5U2Nyb2xsPXNlbGYucGFnZVlPZmZzZXQ7eFNjcm9sbD1zZWxmLnBhZ2VYT2Zmc2V0O31lbHNlIGlmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCl7eVNjcm9sbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO3hTY3JvbGw9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7fWVsc2UgaWYoZG9jdW1lbnQuYm9keSl7eVNjcm9sbD1kb2N1bWVudC5ib2R5LnNjcm9sbFRvcDt4U2Nyb2xsPWRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDt9DQphcnJheVBhZ2VTY3JvbGw9bmV3IEFycmF5KHhTY3JvbGwseVNjcm9sbCk7cmV0dXJuIGFycmF5UGFnZVNjcm9sbDt9O2Z1bmN0aW9uIF9fX3BhdXNlKG1zKXt2YXIgZGF0ZT1uZXcgRGF0ZSgpO2N1ckRhdGU9bnVsbDtkb3t2YXIgY3VyRGF0ZT1uZXcgRGF0ZSgpO30NCndoaWxlKGN1ckRhdGUtZGF0ZTxtcyk7fTtyZXR1cm4gdGhpcy51bmJpbmQoJ2NsaWNrJykuY2xpY2soX2luaXRpYWxpemUpO307fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/lightbox.lib/jquery.lightbox-0.5.pack.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqDQogKiBqUXVlcnkgbGlnaHRCb3ggcGx1Z2luDQogKiBUaGlzIGpRdWVyeSBwbHVnaW4gd2FzIGluc3BpcmVkIGFuZCBiYXNlZCBvbiBMaWdodGJveCAyIGJ5IExva2VzaCBEaGFrYXIgKGh0dHA6Ly93d3cuaHVkZGxldG9nZXRoZXIuY29tL3Byb2plY3RzL2xpZ2h0Ym94Mi8pDQogKiBhbmQgYWRhcHRlZCB0byBtZSBmb3IgdXNlIGxpa2UgYSBwbHVnaW4gZnJvbSBqUXVlcnkuDQogKiBAbmFtZSBqcXVlcnktbGlnaHRib3gtMC41LmpzDQogKiBAYXV0aG9yIExlYW5kcm8gVmllaXJhIFBpbmhvIC0gaHR0cDovL2xlYW5kcm92aWVpcmEuY29tDQogKiBAdmVyc2lvbiAwLjUNCiAqIEBkYXRlIEFwcmlsIDExLCAyMDA4DQogKiBAY2F0ZWdvcnkgalF1ZXJ5IHBsdWdpbg0KICogQGNvcHlyaWdodCAoYykgMjAwOCBMZWFuZHJvIFZpZWlyYSBQaW5obyAobGVhbmRyb3ZpZWlyYS5jb20pDQogKiBAbGljZW5zZSBDQ0F0dHJpYnV0aW9uLVNoYXJlQWxpa2UgMi41IEJyYXppbCAtIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzIuNS9ici9kZWVkLmVuX1VTDQogKiBAZXhhbXBsZSBWaXNpdCBodHRwOi8vbGVhbmRyb3ZpZWlyYS5jb20vcHJvamVjdHMvanF1ZXJ5L2xpZ2h0Ym94LyBmb3IgbW9yZSBpbmZvcm1hdGlvbnMgYWJvdXQgdGhpcyBqUXVlcnkgcGx1Z2luDQogKi8NCmV2YWwoZnVuY3Rpb24ocCxhLGMsayxlLHIpe2U9ZnVuY3Rpb24oYyl7cmV0dXJuKGM8YT8nJzplKHBhcnNlSW50KGMvYSkpKSsoKGM9YyVhKT4zNT9TdHJpbmcuZnJvbUNoYXJDb2RlKGMrMjkpOmMudG9TdHJpbmcoMzYpKX07aWYoIScnLnJlcGxhY2UoL14vLFN0cmluZykpe3doaWxlKGMtLSlyW2UoYyldPWtbY118fGUoYyk7az1bZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV19XTtlPWZ1bmN0aW9uKCl7cmV0dXJuJ1xcdysnfTtjPTF9O3doaWxlKGMtLSlpZihrW2NdKXA9cC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcYicrZShjKSsnXFxiJywnZycpLGtbY10pO3JldHVybiBwfSgnKDYoJCl7JC4yTi4zZz02KDQpezQ9MjMuMkgoezJCOlwnIzM0XCcsMmc6MC44LDFkOkYsMU06XCcxOC81LTMzLVkuMTZcJywxdjpcJzE4LzUtMXUtMlEuMTZcJywxRTpcJzE4LzUtMXUtMkwuMTZcJywxVzpcJzE4LzUtMXUtMkkuMTZcJywxOTpcJzE4LzUtMkYuMTZcJywxZjoxMCwyQTozZCwyczpcJzFqXCcsMm86XCczMlwnLDJqOlwnY1wnLDJmOlwncFwnLDJkOlwnblwnLGg6W10sOTowfSw0KTtmIEk9Tjs2IDIwKCl7MVgoTixJKTt1IEZ9NiAxWCgxZSxJKXskKFwnMVUsIDFTLCAxUlwnKS5sKHtcJzFRXCc6XCcyRVwnfSk7MU8oKTs0LmguQj0wOzQuOT0wOzcoSS5CPT0xKXs0LmguMUoodiAxbSgxZS4xNyhcJ0pcJyksMWUuMTcoXCcydlwnKSkpfWp7MzYoZiBpPTA7aTxJLkI7aSsrKXs0LmguMUoodiAxbShJW2ldLjE3KFwnSlwnKSxJW2ldLjE3KFwnMnZcJykpKX19Mm4oNC5oWzQuOV1bMF0hPTFlLjE3KFwnSlwnKSl7NC45Kyt9RCgpfTYgMU8oKXskKFwnbVwnKS4zMShcJzxlIGc9InEtMTMiPjwvZT48ZSBnPSJxLTUiPjxlIGc9IjUtcy1iLXciPjxlIGc9IjUtcy1iIj48MXcgZz0iNS1iIj48ZSAyVj0iIiBnPSI1LWsiPjxhIEo9IiMiIGc9IjUtay1WIj48L2E+PGEgSj0iIyIgZz0iNS1rLVgiPjwvYT48L2U+PGUgZz0iNS1ZIj48YSBKPSIjIiBnPSI1LVktMjkiPjwxdyBXPSJcJys0LjFNK1wnIj48L2E+PC9lPjwvZT48L2U+PGUgZz0iNS1zLWItVC13Ij48ZSBnPSI1LXMtYi1UIj48ZSBnPSI1LWItQSI+PDFpIGc9IjUtYi1BLTF0Ij48LzFpPjwxaSBnPSI1LWItQS0xZyI+PC8xaT48L2U+PGUgZz0iNS0xcyI+PGEgSj0iIyIgZz0iNS0xcy0yMiI+PDF3IFc9IlwnKzQuMVcrXCciPjwvYT48L2U+PC9lPjwvZT48L2U+XCcpO2Ygej0xRCgpOyQoXCcjcS0xM1wnKS5sKHsySzo0LjJCLDJKOjQuMmcsUzp6WzBdLFA6elsxXX0pLjFWKCk7ZiBSPTFwKCk7JChcJyNxLTVcJykubCh7MVQ6UlsxXSsoelszXS8xMCksMWM6UlswXX0pLkUoKTskKFwnI3EtMTMsI3EtNVwnKS5DKDYoKXsxYSgpfSk7JChcJyM1LVktMjksIzUtMXMtMjJcJykuQyg2KCl7MWEoKTt1IEZ9KTskKEcpLjJHKDYoKXtmIHo9MUQoKTskKFwnI3EtMTNcJykubCh7Uzp6WzBdLFA6elsxXX0pO2YgUj0xcCgpOyQoXCcjcS01XCcpLmwoezFUOlJbMV0rKHpbM10vMTApLDFjOlJbMF19KX0pfTYgRCgpeyQoXCcjNS1ZXCcpLkUoKTs3KDQuMWQpeyQoXCcjNS1iLCM1LXMtYi1ULXcsIzUtYi1BLTFnXCcpLjFiKCl9anskKFwnIzUtYiwjNS1rLCM1LWstViwjNS1rLVgsIzUtcy1iLVQtdywjNS1iLUEtMWdcJykuMWIoKX1mIFE9diAxaigpO1EuMVA9NigpeyQoXCcjNS1iXCcpLjJEKFwnV1wnLDQuaFs0LjldWzBdKTsxTihRLlMsUS5QKTtRLjFQPTYoKXt9fTtRLlc9NC5oWzQuOV1bMF19OzYgMU4oMW8sMXIpe2YgMUw9JChcJyM1LXMtYi13XCcpLlMoKTtmIDFLPSQoXCcjNS1zLWItd1wnKS5QKCk7ZiAxbj0oMW8rKDQuMWYqMikpO2YgMXk9KDFyKyg0LjFmKjIpKTtmIDFJPTFMLTFuO2YgMno9MUstMXk7JChcJyM1LXMtYi13XCcpLjNmKHtTOjFuLFA6MXl9LDQuMkEsNigpezJ5KCl9KTs3KCgxST09MCkmJigyej09MCkpezcoJC4zZS4zYyl7MUgoM2IpfWp7MUgoM2EpfX0kKFwnIzUtcy1iLVQtd1wnKS5sKHtTOjFvfSk7JChcJyM1LWstViwjNS1rLVhcJykubCh7UDoxcisoNC4xZioyKX0pfTs2IDJ5KCl7JChcJyM1LVlcJykuMWIoKTskKFwnIzUtYlwnKS4xVig2KCl7MnUoKTsydCgpfSk7MnIoKX07NiAydSgpeyQoXCcjNS1zLWItVC13XCcpLjM4KFwnMzVcJyk7JChcJyM1LWItQS0xdFwnKS4xYigpOzcoNC5oWzQuOV1bMV0peyQoXCcjNS1iLUEtMXRcJykuMnAoNC5oWzQuOV1bMV0pLkUoKX03KDQuaC5CPjEpeyQoXCcjNS1iLUEtMWdcJykuMnAoNC4ycytcJyBcJysoNC45KzEpK1wnIFwnKzQuMm8rXCcgXCcrNC5oLkIpLkUoKX19NiAydCgpeyQoXCcjNS1rXCcpLkUoKTskKFwnIzUtay1WLCM1LWstWFwnKS5sKHtcJ0tcJzpcJzFDIE0oXCcrNC4xOStcJykgTC1PXCd9KTs3KDQuOSE9MCl7Nyg0LjFkKXskKFwnIzUtay1WXCcpLmwoe1wnS1wnOlwnTShcJys0LjF2K1wnKSAxYyAxNSUgTC1PXCd9KS4xMSgpLjFrKFwnQ1wnLDYoKXs0Ljk9NC45LTE7RCgpO3UgRn0pfWp7JChcJyM1LWstVlwnKS4xMSgpLjJtKDYoKXskKE4pLmwoe1wnS1wnOlwnTShcJys0LjF2K1wnKSAxYyAxNSUgTC1PXCd9KX0sNigpeyQoTikubCh7XCdLXCc6XCcxQyBNKFwnKzQuMTkrXCcpIEwtT1wnfSl9KS5FKCkuMWsoXCdDXCcsNigpezQuOT00LjktMTtEKCk7dSBGfSl9fTcoNC45IT0oNC5oLkItMSkpezcoNC4xZCl7JChcJyM1LWstWFwnKS5sKHtcJ0tcJzpcJ00oXCcrNC4xRStcJykgMmwgMTUlIEwtT1wnfSkuMTEoKS4xayhcJ0NcJyw2KCl7NC45PTQuOSsxO0QoKTt1IEZ9KX1qeyQoXCcjNS1rLVhcJykuMTEoKS4ybSg2KCl7JChOKS5sKHtcJ0tcJzpcJ00oXCcrNC4xRStcJykgMmwgMTUlIEwtT1wnfSl9LDYoKXskKE4pLmwoe1wnS1wnOlwnMUMgTShcJys0LjE5K1wnKSBMLU9cJ30pfSkuRSgpLjFrKFwnQ1wnLDYoKXs0Ljk9NC45KzE7RCgpO3UgRn0pfX0yaygpfTYgMmsoKXskKGQpLjMwKDYoMTIpezJpKDEyKX0pfTYgMUcoKXskKGQpLjExKCl9NiAyaSgxMil7NygxMj09Mmgpe1U9MlouMmU7MXg9Mjd9antVPTEyLjJlOzF4PTEyLjJZfTE0PTJYLjJXKFUpLjJVKCk7NygoMTQ9PTQuMmopfHwoMTQ9PVwneFwnKXx8KFU9PTF4KSl7MWEoKX03KCgxND09NC4yZil8fChVPT0zNykpezcoNC45IT0wKXs0Ljk9NC45LTE7RCgpOzFHKCl9fTcoKDE0PT00LjJkKXx8KFU9PTM5KSl7Nyg0LjkhPSg0LmguQi0xKSl7NC45PTQuOSsxO0QoKTsxRygpfX19NiAycigpezcoKDQuaC5CLTEpPjQuOSl7MmM9diAxaigpOzJjLlc9NC5oWzQuOSsxXVswXX03KDQuOT4wKXsyYj12IDFqKCk7MmIuVz00LmhbNC45LTFdWzBdfX02IDFhKCl7JChcJyNxLTVcJykuMmEoKTskKFwnI3EtMTNcJykuMlQoNigpeyQoXCcjcS0xM1wnKS4yYSgpfSk7JChcJzFVLCAxUywgMVJcJykubCh7XCcxUVwnOlwnMlNcJ30pfTYgMUQoKXtmIG8scjs3KEcuMWgmJkcuMjgpe289Ry4yNitHLjJSO3I9Ry4xaCtHLjI4fWogNyhkLm0uMjU+ZC5tLjI0KXtvPWQubS4yUDtyPWQubS4yNX1qe289ZC5tLjJPO3I9ZC5tLjI0fWYgeSxIOzcoWi4xaCl7NyhkLnQuMWwpe3k9ZC50LjFsfWp7eT1aLjI2fUg9Wi4xaH1qIDcoZC50JiZkLnQuMUEpe3k9ZC50LjFsO0g9ZC50LjFBfWogNyhkLm0pe3k9ZC5tLjFsO0g9ZC5tLjFBfTcocjxIKXsxej1IfWp7MXo9cn03KG88eSl7MUI9b31qezFCPXl9MjE9diAxbSgxQiwxeix5LEgpO3UgMjF9OzYgMXAoKXtmIG8scjs3KFouMVope3I9Wi4xWjtvPVouMk19aiA3KGQudCYmZC50LjFGKXtyPWQudC4xRjtvPWQudC4xWX1qIDcoZC5tKXtyPWQubS4xRjtvPWQubS4xWX0ycT12IDFtKG8scik7dSAycX07NiAxSCgyQyl7ZiAyeD12IDJ3KCk7MXE9Mmg7M2h7ZiAxcT12IDJ3KCl9Mm4oMXEtMng8MkMpfTt1IE4uMTEoXCdDXCcpLkMoMjApfX0pKDIzKTsnLDYyLDIwNCwnfHx8fHNldHRpbmdzfGxpZ2h0Ym94fGZ1bmN0aW9ufGlmfHxhY3RpdmVJbWFnZXx8aW1hZ2V8fGRvY3VtZW50fGRpdnx2YXJ8aWR8aW1hZ2VBcnJheXx8ZWxzZXxuYXZ8Y3NzfGJvZHl8fHhTY3JvbGx8fGpxdWVyeXx5U2Nyb2xsfGNvbnRhaW5lcnxkb2N1bWVudEVsZW1lbnR8cmV0dXJufG5ld3xib3h8fHdpbmRvd1dpZHRofGFyclBhZ2VTaXplc3xkZXRhaWxzfGxlbmd0aHxjbGlja3xfc2V0X2ltYWdlX3RvX3ZpZXd8c2hvd3xmYWxzZXx3aW5kb3d8d2luZG93SGVpZ2h0fGpRdWVyeU1hdGNoZWRPYmp8aHJlZnxiYWNrZ3JvdW5kfG5vfHVybHx0aGlzfHJlcGVhdHxoZWlnaHR8b2JqSW1hZ2VQcmVsb2FkZXJ8YXJyUGFnZVNjcm9sbHx3aWR0aHxkYXRhfGtleWNvZGV8YnRuUHJldnxzcmN8YnRuTmV4dHxsb2FkaW5nfHNlbGZ8fHVuYmluZHxvYmpFdmVudHxvdmVybGF5fGtleXx8Z2lmfGdldEF0dHJpYnV0ZXxpbWFnZXN8aW1hZ2VCbGFua3xfZmluaXNofGhpZGV8bGVmdHxmaXhlZE5hdmlnYXRpb258b2JqQ2xpY2tlZHxjb250YWluZXJCb3JkZXJTaXplfGN1cnJlbnROdW1iZXJ8aW5uZXJIZWlnaHR8c3BhbnxJbWFnZXxiaW5kfGNsaWVudFdpZHRofEFycmF5fGludFdpZHRofGludEltYWdlV2lkdGh8X19fZ2V0UGFnZVNjcm9sbHxjdXJEYXRlfGludEltYWdlSGVpZ2h0fHNlY05hdnxjYXB0aW9ufGJ0bnxpbWFnZUJ0blByZXZ8aW1nfGVzY2FwZUtleXxpbnRIZWlnaHR8cGFnZUhlaWdodHxjbGllbnRIZWlnaHR8cGFnZVdpZHRofHRyYW5zcGFyZW50fF9fX2dldFBhZ2VTaXplfGltYWdlQnRuTmV4dHxzY3JvbGxUb3B8X2Rpc2FibGVfa2V5Ym9hcmRfbmF2aWdhdGlvbnxfX19wYXVzZXxpbnREaWZmV3xwdXNofGludEN1cnJlbnRIZWlnaHR8aW50Q3VycmVudFdpZHRofGltYWdlTG9hZGluZ3xfcmVzaXplX2NvbnRhaW5lcl9pbWFnZV9ib3h8X3NldF9pbnRlcmZhY2V8b25sb2FkfHZpc2liaWxpdHl8c2VsZWN0fG9iamVjdHx0b3B8ZW1iZWR8ZmFkZUlufGltYWdlQnRuQ2xvc2V8X3N0YXJ0fHNjcm9sbExlZnR8cGFnZVlPZmZzZXR8X2luaXRpYWxpemV8YXJyYXlQYWdlU2l6ZXxidG5DbG9zZXxqUXVlcnl8b2Zmc2V0SGVpZ2h0fHNjcm9sbEhlaWdodHxpbm5lcldpZHRofHxzY3JvbGxNYXhZfGxpbmt8cmVtb3ZlfG9ialByZXZ8b2JqTmV4dHxrZXlUb05leHR8a2V5Q29kZXxrZXlUb1ByZXZ8b3ZlcmxheU9wYWNpdHl8bnVsbHxfa2V5Ym9hcmRfYWN0aW9ufGtleVRvQ2xvc2V8X2VuYWJsZV9rZXlib2FyZF9uYXZpZ2F0aW9ufHJpZ2h0fGhvdmVyfHdoaWxlfHR4dE9mfGh0bWx8YXJyYXlQYWdlU2Nyb2xsfF9wcmVsb2FkX25laWdoYm9yX2ltYWdlc3x0eHRJbWFnZXxfc2V0X25hdmlnYXRpb258X3Nob3dfaW1hZ2VfZGF0YXx0aXRsZXxEYXRlfGRhdGV8X3Nob3dfaW1hZ2V8aW50RGlmZkh8Y29udGFpbmVyUmVzaXplU3BlZWR8b3ZlcmxheUJnQ29sb3J8bXN8YXR0cnxoaWRkZW58Ymxhbmt8cmVzaXplfGV4dGVuZHxjbG9zZXxvcGFjaXR5fGJhY2tncm91bmRDb2xvcnxuZXh0fHBhZ2VYT2Zmc2V0fGZufG9mZnNldFdpZHRofHNjcm9sbFdpZHRofHByZXZ8c2Nyb2xsTWF4WHx2aXNpYmxlfGZhZGVPdXR8dG9Mb3dlckNhc2V8c3R5bGV8ZnJvbUNoYXJDb2RlfFN0cmluZ3xET01fVktfRVNDQVBFfGV2ZW50fGtleWRvd258YXBwZW5kfG9mfGljb3wwMDB8ZmFzdHxmb3J8fHNsaWRlRG93bnx8MTAwfDI1MHxtc2llfDQwMHxicm93c2VyfGFuaW1hdGV8bGlnaHRCb3h8ZG8nLnNwbGl0KCd8JyksMCx7fSkp]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/jquery.tablesorter.pager.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZGl2LnRhYmxlc29ydGVyUGFnZXIgew0KCXBhZGRpbmc6IDEwcHggMCAxMHB4IDA7DQoJYmFja2dyb3VuZC1jb2xvcjogI0Q2RDJDMjsNCgl0ZXh0LWFsaWduOiBjZW50ZXI7DQp9DQpkaXYudGFibGVzb3J0ZXJQYWdlciBzcGFuIHsNCglwYWRkaW5nOiAwIDVweCAwIDVweDsNCn0NCmRpdi50YWJsZXNvcnRlclBhZ2VyIGlucHV0LnByZXYgew0KCXdpZHRoOiBhdXRvOw0KCW1hcmdpbi1yaWdodDogMTBweDsNCn0NCmRpdi50YWJsZXNvcnRlclBhZ2VyIGlucHV0Lm5leHQgew0KCXdpZHRoOiBhdXRvOw0KCW1hcmdpbi1sZWZ0OiAxMHB4Ow0KfQ0KZGl2LnRhYmxlc29ydGVyUGFnZXIgaW5wdXQgew0KCWZvbnQtc2l6ZTogOHB4Ow0KCXdpZHRoOiA1MHB4Ow0KCWJvcmRlcjogMXB4IHNvbGlkICMzMzAwMDA7DQoJdGV4dC1hbGlnbjogY2VudGVyOw0KfQ0KDQoNCiAg]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/addons/pager/jquery.tablesorter.pager.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCQpIHsNCgkkLmV4dGVuZCh7DQoJCXRhYmxlc29ydGVyUGFnZXI6IG5ldyBmdW5jdGlvbigpIHsNCgkJCQ0KCQkJZnVuY3Rpb24gdXBkYXRlUGFnZURpc3BsYXkoYykgew0KCQkJCXZhciBzID0gJChjLmNzc1BhZ2VEaXNwbGF5LGMuY29udGFpbmVyKS52YWwoKGMucGFnZSsxKSArIGMuc2VwZXJhdG9yICsgYy50b3RhbFBhZ2VzKTsJDQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIHNldFBhZ2VTaXplKHRhYmxlLHNpemUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnNpemUgPSBzaXplOw0KCQkJCWMudG90YWxQYWdlcyA9IE1hdGguY2VpbChjLnRvdGFsUm93cyAvIGMuc2l6ZSk7DQoJCQkJYy5wYWdlclBvc2l0aW9uU2V0ID0gZmFsc2U7DQoJCQkJbW92ZVRvUGFnZSh0YWJsZSk7DQoJCQkJZml4UG9zaXRpb24odGFibGUpOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiBmaXhQb3NpdGlvbih0YWJsZSkgew0KCQkJCXZhciBjID0gdGFibGUuY29uZmlnOw0KCQkJCWlmKCFjLnBhZ2VyUG9zaXRpb25TZXQgJiYgYy5wb3NpdGlvbkZpeGVkKSB7DQoJCQkJCXZhciBjID0gdGFibGUuY29uZmlnLCBvID0gJCh0YWJsZSk7DQoJCQkJCWlmKG8ub2Zmc2V0KSB7DQoJCQkJCQljLmNvbnRhaW5lci5jc3Moew0KCQkJCQkJCXRvcDogby5vZmZzZXQoKS50b3AgKyBvLmhlaWdodCgpICsgJ3B4JywNCgkJCQkJCQlwb3NpdGlvbjogJ2Fic29sdXRlJw0KCQkJCQkJfSk7DQoJCQkJCX0NCgkJCQkJYy5wYWdlclBvc2l0aW9uU2V0ID0gdHJ1ZTsNCgkJCQl9DQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIG1vdmVUb0ZpcnN0UGFnZSh0YWJsZSkgew0KCQkJCXZhciBjID0gdGFibGUuY29uZmlnOw0KCQkJCWMucGFnZSA9IDA7DQoJCQkJbW92ZVRvUGFnZSh0YWJsZSk7DQoJCQl9DQoJCQkNCgkJCWZ1bmN0aW9uIG1vdmVUb0xhc3RQYWdlKHRhYmxlKSB7DQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJYy5wYWdlID0gKGMudG90YWxQYWdlcy0xKTsNCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQ0KCQkJZnVuY3Rpb24gbW92ZVRvTmV4dFBhZ2UodGFibGUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnBhZ2UrKzsNCgkJCQlpZihjLnBhZ2UgPj0gKGMudG90YWxQYWdlcy0xKSkgew0KCQkJCQljLnBhZ2UgPSAoYy50b3RhbFBhZ2VzLTEpOw0KCQkJCX0NCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQ0KCQkJZnVuY3Rpb24gbW92ZVRvUHJldlBhZ2UodGFibGUpIHsNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQljLnBhZ2UtLTsNCgkJCQlpZihjLnBhZ2UgPD0gMCkgew0KCQkJCQljLnBhZ2UgPSAwOw0KCQkJCX0NCgkJCQltb3ZlVG9QYWdlKHRhYmxlKTsNCgkJCX0NCgkJCQkJCQ0KCQkJDQoJCQlmdW5jdGlvbiBtb3ZlVG9QYWdlKHRhYmxlKSB7DQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJaWYoYy5wYWdlIDwgMCB8fCBjLnBhZ2UgPiAoYy50b3RhbFBhZ2VzLTEpKSB7DQoJCQkJCWMucGFnZSA9IDA7DQoJCQkJfQ0KCQkJCQ0KCQkJCXJlbmRlclRhYmxlKHRhYmxlLGMucm93c0NvcHkpOw0KCQkJfQ0KCQkJDQoJCQlmdW5jdGlvbiByZW5kZXJUYWJsZSh0YWJsZSxyb3dzKSB7DQoJCQkJDQoJCQkJdmFyIGMgPSB0YWJsZS5jb25maWc7DQoJCQkJdmFyIGwgPSByb3dzLmxlbmd0aDsNCgkJCQl2YXIgcyA9IChjLnBhZ2UgKiBjLnNpemUpOw0KCQkJCXZhciBlID0gKHMgKyBjLnNpemUpOw0KCQkJCWlmKGUgPiByb3dzLmxlbmd0aCApIHsNCgkJCQkJZSA9IHJvd3MubGVuZ3RoOw0KCQkJCX0NCgkJCQkNCgkJCQkNCgkJCQl2YXIgdGFibGVCb2R5ID0gJCh0YWJsZS50Qm9kaWVzWzBdKTsNCgkJCQkNCgkJCQkvLyBjbGVhciB0aGUgdGFibGUgYm9keQ0KCQkJCQ0KCQkJCSQudGFibGVzb3J0ZXIuY2xlYXJUYWJsZUJvZHkodGFibGUpOw0KCQkJCQ0KCQkJCWZvcih2YXIgaSA9IHM7IGkgPCBlOyBpKyspIHsNCgkJCQkJDQoJCQkJCS8vdGFibGVCb2R5LmFwcGVuZChyb3dzW2ldKTsNCgkJCQkJDQoJCQkJCXZhciBvID0gcm93c1tpXTsNCgkJCQkJdmFyIGwgPSBvLmxlbmd0aDsNCgkJCQkJZm9yKHZhciBqPTA7IGogPCBsOyBqKyspIHsNCgkJCQkJCQ0KCQkJCQkJdGFibGVCb2R5WzBdLmFwcGVuZENoaWxkKG9bal0pOw0KDQoJCQkJCX0NCgkJCQl9DQoJCQkJDQoJCQkJZml4UG9zaXRpb24odGFibGUsdGFibGVCb2R5KTsNCgkJCQkNCgkJCQkkKHRhYmxlKS50cmlnZ2VyKCJhcHBseVdpZGdldHMiKTsNCgkJCQkNCgkJCQlpZiggYy5wYWdlID49IGMudG90YWxQYWdlcyApIHsNCiAgICAgICAgCQkJbW92ZVRvTGFzdFBhZ2UodGFibGUpOw0KCQkJCX0NCgkJCQkNCgkJCQl1cGRhdGVQYWdlRGlzcGxheShjKTsNCgkJCX0NCgkJCQ0KCQkJdGhpcy5hcHBlbmRlciA9IGZ1bmN0aW9uKHRhYmxlLHJvd3MpIHsNCgkJCQkNCgkJCQl2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCgkJCQkNCgkJCQljLnJvd3NDb3B5ID0gcm93czsNCgkJCQljLnRvdGFsUm93cyA9IHJvd3MubGVuZ3RoOw0KCQkJCWMudG90YWxQYWdlcyA9IE1hdGguY2VpbChjLnRvdGFsUm93cyAvIGMuc2l6ZSk7DQoJCQkJDQoJCQkJcmVuZGVyVGFibGUodGFibGUscm93cyk7DQoJCQl9Ow0KCQkJDQoJCQl0aGlzLmRlZmF1bHRzID0gew0KCQkJCXNpemU6IDEwLA0KCQkJCW9mZnNldDogMCwNCgkJCQlwYWdlOiAwLA0KCQkJCXRvdGFsUm93czogMCwNCgkJCQl0b3RhbFBhZ2VzOiAwLA0KCQkJCWNvbnRhaW5lcjogbnVsbCwNCgkJCQljc3NOZXh0OiAnLm5leHQnLA0KCQkJCWNzc1ByZXY6ICcucHJldicsDQoJCQkJY3NzRmlyc3Q6ICcuZmlyc3QnLA0KCQkJCWNzc0xhc3Q6ICcubGFzdCcsDQoJCQkJY3NzUGFnZURpc3BsYXk6ICcucGFnZWRpc3BsYXknLA0KCQkJCWNzc1BhZ2VTaXplOiAnLnBhZ2VzaXplJywNCgkJCQlzZXBlcmF0b3I6ICIvIiwNCgkJCQlwb3NpdGlvbkZpeGVkOiB0cnVlLA0KCQkJCWFwcGVuZGVyOiB0aGlzLmFwcGVuZGVyDQoJCQl9Ow0KCQkJDQoJCQl0aGlzLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHNldHRpbmdzKSB7DQoJCQkJDQoJCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsJDQoJCQkJCQ0KCQkJCQljb25maWcgPSAkLmV4dGVuZCh0aGlzLmNvbmZpZywgJC50YWJsZXNvcnRlclBhZ2VyLmRlZmF1bHRzLCBzZXR0aW5ncyk7DQoJCQkJCQ0KCQkJCQl2YXIgdGFibGUgPSB0aGlzLCBwYWdlciA9IGNvbmZpZy5jb250YWluZXI7DQoJCQkJDQoJCQkJCSQodGhpcykudHJpZ2dlcigiYXBwZW5kQ2FjaGUiKTsNCgkJCQkJDQoJCQkJCWNvbmZpZy5zaXplID0gcGFyc2VJbnQoJCgiLnBhZ2VzaXplIixwYWdlcikudmFsKCkpOw0KCQkJCQkNCgkJCQkJJChjb25maWcuY3NzRmlyc3QscGFnZXIpLmNsaWNrKGZ1bmN0aW9uKCkgew0KCQkJCQkJbW92ZVRvRmlyc3RQYWdlKHRhYmxlKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJCSQoY29uZmlnLmNzc05leHQscGFnZXIpLmNsaWNrKGZ1bmN0aW9uKCkgew0KCQkJCQkJbW92ZVRvTmV4dFBhZ2UodGFibGUpOw0KCQkJCQkJcmV0dXJuIGZhbHNlOw0KCQkJCQl9KTsNCgkJCQkJJChjb25maWcuY3NzUHJldixwYWdlcikuY2xpY2soZnVuY3Rpb24oKSB7DQoJCQkJCQltb3ZlVG9QcmV2UGFnZSh0YWJsZSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCQkkKGNvbmZpZy5jc3NMYXN0LHBhZ2VyKS5jbGljayhmdW5jdGlvbigpIHsNCgkJCQkJCW1vdmVUb0xhc3RQYWdlKHRhYmxlKTsNCgkJCQkJCXJldHVybiBmYWxzZTsNCgkJCQkJfSk7DQoJCQkJCSQoY29uZmlnLmNzc1BhZ2VTaXplLHBhZ2VyKS5jaGFuZ2UoZnVuY3Rpb24oKSB7DQoJCQkJCQlzZXRQYWdlU2l6ZSh0YWJsZSxwYXJzZUludCgkKHRoaXMpLnZhbCgpKSk7DQoJCQkJCQlyZXR1cm4gZmFsc2U7DQoJCQkJCX0pOw0KCQkJCX0pOw0KCQkJfTsNCgkJCQ0KCQl9DQoJfSk7DQoJLy8gZXh0ZW5kIHBsdWdpbiBzY29wZQ0KCSQuZm4uZXh0ZW5kKHsNCiAgICAgICAgdGFibGVzb3J0ZXJQYWdlcjogJC50YWJsZXNvcnRlclBhZ2VyLmNvbnN0cnVjdA0KCX0pOw0KCQ0KfSkoalF1ZXJ5KTsJCQkJ]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2pzJ10gPSBhcnJheSgnanF1ZXJ5LnRhYmxlc29ydGVyLm1pbi5qcycsJ2pxdWVyeS5tZXRhZGF0YS5qcycpOwojJGluZm9bJ2NzcyddID0gJ3RoZW1lcy9ibHVlL3N0eWxlLmNzcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2pzX25vbWluaWZ5J10gPSAxOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.metadata.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICogTWV0YWRhdGEgLSBqUXVlcnkgcGx1Z2luIGZvciBwYXJzaW5nIG1ldGFkYXRhIGZyb20gZWxlbWVudHMKICoKICogQ29weXJpZ2h0IChjKSAyMDA2IEpvaG4gUmVzaWcsIFllaHVkYSBLYXR6LCBK77+9w7ZybiBaYWVmZmVyZXIsIFBhdWwgTWNMYW5haGFuCiAqCiAqIER1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgR1BMIGxpY2Vuc2VzOgogKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCiAqICAgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sCiAqCiAqIFJldmlzaW9uOiAkSWQkCiAqCiAqLwoKLyoqCiAqIFNldHMgdGhlIHR5cGUgb2YgbWV0YWRhdGEgdG8gdXNlLiBNZXRhZGF0YSBpcyBlbmNvZGVkIGluIEpTT04sIGFuZCBlYWNoIHByb3BlcnR5CiAqIGluIHRoZSBKU09OIHdpbGwgYmVjb21lIGEgcHJvcGVydHkgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLgogKgogKiBUaGVyZSBhcmUgdGhyZWUgc3VwcG9ydGVkIHR5cGVzIG9mIG1ldGFkYXRhIHN0b3JhZ2U6CiAqCiAqICAgYXR0cjogIEluc2lkZSBhbiBhdHRyaWJ1dGUuIFRoZSBuYW1lIHBhcmFtZXRlciBpbmRpY2F0ZXMgKndoaWNoKiBhdHRyaWJ1dGUuCiAqICAgICAgICAgIAogKiAgIGNsYXNzOiBJbnNpZGUgdGhlIGNsYXNzIGF0dHJpYnV0ZSwgd3JhcHBlZCBpbiBjdXJseSBicmFjZXM6IHsgfQogKiAgIAogKiAgIGVsZW06ICBJbnNpZGUgYSBjaGlsZCBlbGVtZW50IChlLmcuIGEgc2NyaXB0IHRhZykuIFRoZQogKiAgICAgICAgICBuYW1lIHBhcmFtZXRlciBpbmRpY2F0ZXMgKndoaWNoKiBlbGVtZW50LgogKiAgICAgICAgICAKICogVGhlIG1ldGFkYXRhIGZvciBhbiBlbGVtZW50IGlzIGxvYWRlZCB0aGUgZmlyc3QgdGltZSB0aGUgZWxlbWVudCBpcyBhY2Nlc3NlZCB2aWEgalF1ZXJ5LgogKgogKiBBcyBhIHJlc3VsdCwgeW91IGNhbiBkZWZpbmUgdGhlIG1ldGFkYXRhIHR5cGUsIHVzZSAkKGV4cHIpIHRvIGxvYWQgdGhlIG1ldGFkYXRhIGludG8gdGhlIGVsZW1lbnRzCiAqIG1hdGNoZWQgYnkgZXhwciwgdGhlbiByZWRlZmluZSB0aGUgbWV0YWRhdGEgdHlwZSBhbmQgcnVuIGFub3RoZXIgJChleHByKSBmb3Igb3RoZXIgZWxlbWVudHMuCiAqIAogKiBAbmFtZSAkLm1ldGFkYXRhLnNldFR5cGUKICoKICogQGV4YW1wbGUgPHAgaWQ9Im9uZSIgY2xhc3M9InNvbWVfY2xhc3Mge2l0ZW1faWQ6IDEsIGl0ZW1fbGFiZWw6ICdMYWJlbCd9Ij5UaGlzIGlzIGEgcDwvcD4KICogQGJlZm9yZSAkLm1ldGFkYXRhLnNldFR5cGUoImNsYXNzIikKICogQGFmdGVyICQoIiNvbmUiKS5tZXRhZGF0YSgpLml0ZW1faWQgPT0gMTsgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9sYWJlbCA9PSAiTGFiZWwiCiAqIEBkZXNjIFJlYWRzIG1ldGFkYXRhIGZyb20gdGhlIGNsYXNzIGF0dHJpYnV0ZQogKiAKICogQGV4YW1wbGUgPHAgaWQ9Im9uZSIgY2xhc3M9InNvbWVfY2xhc3MiIGRhdGE9IntpdGVtX2lkOiAxLCBpdGVtX2xhYmVsOiAnTGFiZWwnfSI+VGhpcyBpcyBhIHA8L3A+CiAqIEBiZWZvcmUgJC5tZXRhZGF0YS5zZXRUeXBlKCJhdHRyIiwgImRhdGEiKQogKiBAYWZ0ZXIgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9pZCA9PSAxOyAkKCIjb25lIikubWV0YWRhdGEoKS5pdGVtX2xhYmVsID09ICJMYWJlbCIKICogQGRlc2MgUmVhZHMgbWV0YWRhdGEgZnJvbSBhICJkYXRhIiBhdHRyaWJ1dGUKICogCiAqIEBleGFtcGxlIDxwIGlkPSJvbmUiIGNsYXNzPSJzb21lX2NsYXNzIj48c2NyaXB0PntpdGVtX2lkOiAxLCBpdGVtX2xhYmVsOiAnTGFiZWwnfTwvc2NyaXB0PlRoaXMgaXMgYSBwPC9wPgogKiBAYmVmb3JlICQubWV0YWRhdGEuc2V0VHlwZSgiZWxlbSIsICJzY3JpcHQiKQogKiBAYWZ0ZXIgJCgiI29uZSIpLm1ldGFkYXRhKCkuaXRlbV9pZCA9PSAxOyAkKCIjb25lIikubWV0YWRhdGEoKS5pdGVtX2xhYmVsID09ICJMYWJlbCIKICogQGRlc2MgUmVhZHMgbWV0YWRhdGEgZnJvbSBhIG5lc3RlZCBzY3JpcHQgZWxlbWVudAogKiAKICogQHBhcmFtIFN0cmluZyB0eXBlIFRoZSBlbmNvZGluZyB0eXBlCiAqIEBwYXJhbSBTdHJpbmcgbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIGJlIHVzZWQgdG8gZ2V0IG1ldGFkYXRhIChvcHRpb25hbCkKICogQGNhdCBQbHVnaW5zL01ldGFkYXRhCiAqIEBkZXNjciBTZXRzIHRoZSB0eXBlIG9mIGVuY29kaW5nIHRvIGJlIHVzZWQgd2hlbiBsb2FkaW5nIG1ldGFkYXRhIGZvciB0aGUgZmlyc3QgdGltZQogKiBAdHlwZSB1bmRlZmluZWQKICogQHNlZSBtZXRhZGF0YSgpCiAqLwoKKGZ1bmN0aW9uKCQpIHsKCiQuZXh0ZW5kKHsKCW1ldGFkYXRhIDogewoJCWRlZmF1bHRzIDogewoJCQl0eXBlOiAnY2xhc3MnLAoJCQluYW1lOiAnbWV0YWRhdGEnLAoJCQljcmU6IC8oey4qfSkvLAoJCQlzaW5nbGU6ICdtZXRhZGF0YScKCQl9LAoJCXNldFR5cGU6IGZ1bmN0aW9uKCB0eXBlLCBuYW1lICl7CgkJCXRoaXMuZGVmYXVsdHMudHlwZSA9IHR5cGU7CgkJCXRoaXMuZGVmYXVsdHMubmFtZSA9IG5hbWU7CgkJfSwKCQlnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRzICl7CgkJCXZhciBzZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdHMsb3B0cyk7CgkJCS8vIGNoZWNrIGZvciBlbXB0eSBzdHJpbmcgaW4gc2luZ2xlIHByb3BlcnR5CgkJCWlmICggIXNldHRpbmdzLnNpbmdsZS5sZW5ndGggKSBzZXR0aW5ncy5zaW5nbGUgPSAnbWV0YWRhdGEnOwoJCQkKCQkJdmFyIGRhdGEgPSAkLmRhdGEoZWxlbSwgc2V0dGluZ3Muc2luZ2xlKTsKCQkJLy8gcmV0dXJuZWQgY2FjaGVkIGRhdGEgaWYgaXQgYWxyZWFkeSBleGlzdHMKCQkJaWYgKCBkYXRhICkgcmV0dXJuIGRhdGE7CgkJCQoJCQlkYXRhID0gInt9IjsKCQkJCgkJCWlmICggc2V0dGluZ3MudHlwZSA9PSAiY2xhc3MiICkgewoJCQkJdmFyIG0gPSBzZXR0aW5ncy5jcmUuZXhlYyggZWxlbS5jbGFzc05hbWUgKTsKCQkJCWlmICggbSApCgkJCQkJZGF0YSA9IG1bMV07CgkJCX0gZWxzZSBpZiAoIHNldHRpbmdzLnR5cGUgPT0gImVsZW0iICkgewoJCQkJaWYoICFlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lICkKCQkJCQlyZXR1cm4gdW5kZWZpbmVkOwoJCQkJdmFyIGUgPSBlbGVtLmdldEVsZW1lbnRzQnlUYWdOYW1lKHNldHRpbmdzLm5hbWUpOwoJCQkJaWYgKCBlLmxlbmd0aCApCgkJCQkJZGF0YSA9ICQudHJpbShlWzBdLmlubmVySFRNTCk7CgkJCX0gZWxzZSBpZiAoIGVsZW0uZ2V0QXR0cmlidXRlICE9IHVuZGVmaW5lZCApIHsKCQkJCXZhciBhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoIHNldHRpbmdzLm5hbWUgKTsKCQkJCWlmICggYXR0ciApCgkJCQkJZGF0YSA9IGF0dHI7CgkJCX0KCQkJCgkJCWlmICggZGF0YS5pbmRleE9mKCAneycgKSA8MCApCgkJCWRhdGEgPSAieyIgKyBkYXRhICsgIn0iOwoJCQkKCQkJZGF0YSA9IGV2YWwoIigiICsgZGF0YSArICIpIik7CgkJCQoJCQkkLmRhdGEoIGVsZW0sIHNldHRpbmdzLnNpbmdsZSwgZGF0YSApOwoJCQlyZXR1cm4gZGF0YTsKCQl9Cgl9Cn0pOwoKLyoqCiAqIFJldHVybnMgdGhlIG1ldGFkYXRhIG9iamVjdCBmb3IgdGhlIGZpcnN0IG1lbWJlciBvZiB0aGUgalF1ZXJ5IG9iamVjdC4KICoKICogQG5hbWUgbWV0YWRhdGEKICogQGRlc2NyIFJldHVybnMgZWxlbWVudCdzIG1ldGFkYXRhIG9iamVjdAogKiBAcGFyYW0gT2JqZWN0IG9wdHMgQW4gb2JqZWN0IGNvbnRpYW5pbmcgc2V0dGluZ3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzCiAqIEB0eXBlIGpRdWVyeQogKiBAY2F0IFBsdWdpbnMvTWV0YWRhdGEKICovCiQuZm4ubWV0YWRhdGEgPSBmdW5jdGlvbiggb3B0cyApewoJcmV0dXJuICQubWV0YWRhdGEuZ2V0KCB0aGlzWzBdLCBvcHRzICk7Cn07Cgp9KShqUXVlcnkpOw==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.tablesorter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoNCiAqIA0KICogVGFibGVTb3J0ZXIgMi4wIC0gQ2xpZW50LXNpZGUgdGFibGUgc29ydGluZyB3aXRoIGVhc2UhDQogKiBWZXJzaW9uIDIuMC41Yg0KICogQHJlcXVpcmVzIGpRdWVyeSB2MS4yLjMNCiAqIA0KICogQ29weXJpZ2h0IChjKSAyMDA3IENocmlzdGlhbiBCYWNoDQogKiBFeGFtcGxlcyBhbmQgZG9jcyBhdDogaHR0cDovL3RhYmxlc29ydGVyLmNvbQ0KICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6DQogKiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocA0KICogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sDQogKiANCiAqLw0KLyoqDQogKiANCiAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBzb3J0YWJsZSB0YWJsZSB3aXRoIG11bHRpLWNvbHVtbiBzb3J0aW5nIGNhcGFiaWxpdHlzDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoKTsNCiAqIEBkZXNjIENyZWF0ZSBhIHNpbXBsZSB0YWJsZXNvcnRlciBpbnRlcmZhY2UuDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoeyBzb3J0TGlzdDpbWzAsMF0sWzEsMF1dIH0pOw0KICogQGRlc2MgQ3JlYXRlIGEgdGFibGVzb3J0ZXIgaW50ZXJmYWNlIGFuZCBzb3J0IG9uIHRoZSBmaXJzdCBhbmQgc2Vjb3VuZCBjb2x1bW4gY29sdW1uIGhlYWRlcnMuDQogKiANCiAqIEBleGFtcGxlICQoJ3RhYmxlJykudGFibGVzb3J0ZXIoeyBoZWFkZXJzOiB7IDA6IHsgc29ydGVyOiBmYWxzZX0sIDE6IHtzb3J0ZXI6IGZhbHNlfSB9IH0pOw0KICogICAgICAgICAgDQogKiBAZGVzYyBDcmVhdGUgYSB0YWJsZXNvcnRlciBpbnRlcmZhY2UgYW5kIGRpc2FibGVpbmcgdGhlIGZpcnN0IGFuZCBzZWNvbmQgIGNvbHVtbiBoZWFkZXJzLg0KICogICAgICANCiAqIA0KICogQGV4YW1wbGUgJCgndGFibGUnKS50YWJsZXNvcnRlcih7IGhlYWRlcnM6IHsgMDoge3NvcnRlcjoiaW50ZWdlciJ9LCAxOiB7c29ydGVyOiJjdXJyZW5jeSJ9IH0gfSk7DQogKiANCiAqIEBkZXNjIENyZWF0ZSBhIHRhYmxlc29ydGVyIGludGVyZmFjZSBhbmQgc2V0IGEgY29sdW1uIHBhcnNlciBmb3IgdGhlIGZpcnN0DQogKiAgICAgICBhbmQgc2Vjb25kIGNvbHVtbi4NCiAqIA0KICogDQogKiBAcGFyYW0gT2JqZWN0DQogKiAgICAgICAgICAgIHNldHRpbmdzIEFuIG9iamVjdCBsaXRlcmFsIGNvbnRhaW5pbmcga2V5L3ZhbHVlIHBhaXJzIHRvIHByb3ZpZGUNCiAqICAgICAgICAgICAgb3B0aW9uYWwgc2V0dGluZ3MuDQogKiANCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgY3NzSGVhZGVyIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIGNsYXNzIG5hbWUgdG8gYmUgYXBwZW5kZWQNCiAqICAgICAgICAgdG8gc29ydGFibGUgdHIgZWxlbWVudHMgaW4gdGhlIHRoZWFkIG9mIHRoZSB0YWJsZS4gRGVmYXVsdCB2YWx1ZToNCiAqICAgICAgICAgImhlYWRlciINCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgY3NzQXNjIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIGNsYXNzIG5hbWUgdG8gYmUgYXBwZW5kZWQgdG8NCiAqICAgICAgICAgc29ydGFibGUgdHIgZWxlbWVudHMgaW4gdGhlIHRoZWFkIG9uIGEgYXNjZW5kaW5nIHNvcnQuIERlZmF1bHQgdmFsdWU6DQogKiAgICAgICAgICJoZWFkZXJTb3J0VXAiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIGNzc0Rlc2MgKG9wdGlvbmFsKSBBIHN0cmluZyBvZiB0aGUgY2xhc3MgbmFtZSB0byBiZSBhcHBlbmRlZA0KICogICAgICAgICB0byBzb3J0YWJsZSB0ciBlbGVtZW50cyBpbiB0aGUgdGhlYWQgb24gYSBkZXNjZW5kaW5nIHNvcnQuIERlZmF1bHQNCiAqICAgICAgICAgdmFsdWU6ICJoZWFkZXJTb3J0RG93biINCiAqIA0KICogQG9wdGlvbiBTdHJpbmcgc29ydEluaXRpYWxPcmRlciAob3B0aW9uYWwpIEEgc3RyaW5nIG9mIHRoZSBpbml0YWwgc29ydGluZw0KICogICAgICAgICBvcmRlciBjYW4gYmUgYXNjIG9yIGRlc2MuIERlZmF1bHQgdmFsdWU6ICJhc2MiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIHNvcnRNdWx0aXNvcnRLZXkgKG9wdGlvbmFsKSBBIHN0cmluZyBvZiB0aGUgbXVsdGktY29sdW1uIHNvcnQNCiAqICAgICAgICAga2V5LiBEZWZhdWx0IHZhbHVlOiAic2hpZnRLZXkiDQogKiANCiAqIEBvcHRpb24gU3RyaW5nIHRleHRFeHRyYWN0aW9uIChvcHRpb25hbCkgQSBzdHJpbmcgb2YgdGhlIHRleHQtZXh0cmFjdGlvbg0KICogICAgICAgICBtZXRob2QgdG8gdXNlLiBGb3IgY29tcGxleCBodG1sIHN0cnVjdHVyZXMgaW5zaWRlIHRkIGNlbGwgc2V0IHRoaXMNCiAqICAgICAgICAgb3B0aW9uIHRvICJjb21wbGV4Iiwgb24gbGFyZ2UgdGFibGVzIHRoZSBjb21wbGV4IG9wdGlvbiBjYW4gYmUgc2xvdy4NCiAqICAgICAgICAgRGVmYXVsdCB2YWx1ZTogInNpbXBsZSINCiAqIA0KICogQG9wdGlvbiBPYmplY3QgaGVhZGVycyAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvcmNlcyBzb3J0aW5nDQogKiAgICAgICAgIHJ1bGVzLiBUaGlzIG9wdGlvbiBsZXQncyB5b3Ugc3BlY2lmeSBhIGRlZmF1bHQgc29ydGluZyBydWxlLiBEZWZhdWx0DQogKiAgICAgICAgIHZhbHVlOiBudWxsDQogKiANCiAqIEBvcHRpb24gQXJyYXkgc29ydExpc3QgKG9wdGlvbmFsKSBBbiBhcnJheSBjb250YWluaW5nIHRoZSBmb3JjZXMgc29ydGluZw0KICogICAgICAgICBydWxlcy4gVGhpcyBvcHRpb24gbGV0J3MgeW91IHNwZWNpZnkgYSBkZWZhdWx0IHNvcnRpbmcgcnVsZS4gRGVmYXVsdA0KICogICAgICAgICB2YWx1ZTogbnVsbA0KICogDQogKiBAb3B0aW9uIEFycmF5IHNvcnRGb3JjZSAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgZm9yY2VkIHNvcnRpbmcgcnVsZXMuDQogKiAgICAgICAgIFRoaXMgb3B0aW9uIGxldCdzIHlvdSBzcGVjaWZ5IGEgZGVmYXVsdCBzb3J0aW5nIHJ1bGUsIHdoaWNoIGlzDQogKiAgICAgICAgIHByZXBlbmRlZCB0byB1c2VyLXNlbGVjdGVkIHJ1bGVzLiBEZWZhdWx0IHZhbHVlOiBudWxsDQogKiANCiAqIEBvcHRpb24gQm9vbGVhbiBzb3J0TG9jYWxlQ29tcGFyZSAob3B0aW9uYWwpIEJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdoYXRldmVyDQogKiAgICAgICAgIHRvIHVzZSBTdHJpbmcubG9jYWxlQ2FtcGFyZSBtZXRob2Qgb3Igbm90LiBEZWZhdWx0IHNldCB0byB0cnVlLg0KICogDQogKiANCiAqIEBvcHRpb24gQXJyYXkgc29ydEFwcGVuZCAob3B0aW9uYWwpIEFuIGFycmF5IGNvbnRhaW5pbmcgZm9yY2VkIHNvcnRpbmcgcnVsZXMuDQogKiAgICAgICAgIFRoaXMgb3B0aW9uIGxldCdzIHlvdSBzcGVjaWZ5IGEgZGVmYXVsdCBzb3J0aW5nIHJ1bGUsIHdoaWNoIGlzDQogKiAgICAgICAgIGFwcGVuZGVkIHRvIHVzZXItc2VsZWN0ZWQgcnVsZXMuIERlZmF1bHQgdmFsdWU6IG51bGwNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIHdpZHRoRml4ZWQgKG9wdGlvbmFsKSBCb29sZWFuIGZsYWcgaW5kaWNhdGluZyBpZiB0YWJsZXNvcnRlcg0KICogICAgICAgICBzaG91bGQgYXBwbHkgZml4ZWQgd2lkdGhzIHRvIHRoZSB0YWJsZSBjb2x1bW5zLiBUaGlzIGlzIHVzZWZ1bGwgd2hlbg0KICogICAgICAgICB1c2luZyB0aGUgcGFnZXIgY29tcGFuaW9uIHBsdWdpbi4gVGhpcyBvcHRpb25zIHJlcXVpcmVzIHRoZSBkaW1lbnNpb24NCiAqICAgICAgICAganF1ZXJ5IHBsdWdpbi4gRGVmYXVsdCB2YWx1ZTogZmFsc2UNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIGNhbmNlbFNlbGVjdGlvbiAob3B0aW9uYWwpIEJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIGlmDQogKiAgICAgICAgIHRhYmxlc29ydGVyIHNob3VsZCBjYW5jZWwgc2VsZWN0aW9uIG9mIHRoZSB0YWJsZSBoZWFkZXJzIHRleHQuDQogKiAgICAgICAgIERlZmF1bHQgdmFsdWU6IHRydWUNCiAqIA0KICogQG9wdGlvbiBCb29sZWFuIGRlYnVnIChvcHRpb25hbCkgQm9vbGVhbiBmbGFnIGluZGljYXRpbmcgaWYgdGFibGVzb3J0ZXINCiAqICAgICAgICAgc2hvdWxkIGRpc3BsYXkgZGVidWdpbmcgaW5mb3JtYXRpb24gdXNlZnVsbCBmb3IgZGV2ZWxvcG1lbnQuDQogKiANCiAqIEB0eXBlIGpRdWVyeQ0KICogDQogKiBAbmFtZSB0YWJsZXNvcnRlcg0KICogDQogKiBAY2F0IFBsdWdpbnMvVGFibGVzb3J0ZXINCiAqIA0KICogQGF1dGhvciBDaHJpc3RpYW4gQmFjaC9jaHJpc3RpYW4uYmFjaEBwb2x5ZXN0ZXIuc2UNCiAqLw0KDQooZnVuY3Rpb24gKCQpIHsNCiAgICAkLmV4dGVuZCh7DQogICAgICAgIHRhYmxlc29ydGVyOiBuZXcNCiAgICAgICAgZnVuY3Rpb24gKCkgew0KDQogICAgICAgICAgICB2YXIgcGFyc2VycyA9IFtdLA0KICAgICAgICAgICAgICAgIHdpZGdldHMgPSBbXTsNCg0KICAgICAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHsNCiAgICAgICAgICAgICAgICBjc3NIZWFkZXI6ICJoZWFkZXIiLA0KICAgICAgICAgICAgICAgIGNzc0FzYzogImhlYWRlclNvcnRVcCIsDQogICAgICAgICAgICAgICAgY3NzRGVzYzogImhlYWRlclNvcnREb3duIiwNCiAgICAgICAgICAgICAgICBjc3NDaGlsZFJvdzogImV4cGFuZC1jaGlsZCIsDQogICAgICAgICAgICAgICAgc29ydEluaXRpYWxPcmRlcjogImFzYyIsDQogICAgICAgICAgICAgICAgc29ydE11bHRpU29ydEtleTogInNoaWZ0S2V5IiwNCiAgICAgICAgICAgICAgICBzb3J0Rm9yY2U6IG51bGwsDQogICAgICAgICAgICAgICAgc29ydEFwcGVuZDogbnVsbCwNCiAgICAgICAgICAgICAgICBzb3J0TG9jYWxlQ29tcGFyZTogdHJ1ZSwNCiAgICAgICAgICAgICAgICB0ZXh0RXh0cmFjdGlvbjogInNpbXBsZSIsDQogICAgICAgICAgICAgICAgcGFyc2Vyczoge30sIHdpZGdldHM6IFtdLA0KICAgICAgICAgICAgICAgIHdpZGdldFplYnJhOiB7DQogICAgICAgICAgICAgICAgICAgIGNzczogWyJldmVuIiwgIm9kZCJdDQogICAgICAgICAgICAgICAgfSwgaGVhZGVyczoge30sIHdpZHRoRml4ZWQ6IGZhbHNlLA0KICAgICAgICAgICAgICAgIGNhbmNlbFNlbGVjdGlvbjogdHJ1ZSwNCiAgICAgICAgICAgICAgICBzb3J0TGlzdDogW10sDQogICAgICAgICAgICAgICAgaGVhZGVyTGlzdDogW10sDQogICAgICAgICAgICAgICAgZGF0ZUZvcm1hdDogInVzIiwNCiAgICAgICAgICAgICAgICBkZWNpbWFsOiAnL1wufFwsL2cnLA0KICAgICAgICAgICAgICAgIG9uUmVuZGVySGVhZGVyOiBudWxsLA0KICAgICAgICAgICAgICAgIHNlbGVjdG9ySGVhZGVyczogJ3RoZWFkIHRoJywNCiAgICAgICAgICAgICAgICBkZWJ1ZzogZmFsc2UNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIC8qIGRlYnVnaW5nIHV0aWxzICovDQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGJlbmNobWFyayhzLCBkKSB7DQogICAgICAgICAgICAgICAgbG9nKHMgKyAiLCIgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSBkLmdldFRpbWUoKSkgKyAibXMiKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy5iZW5jaG1hcmsgPSBiZW5jaG1hcms7DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGxvZyhzKSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb25zb2xlICE9ICJ1bmRlZmluZWQiICYmIHR5cGVvZiBjb25zb2xlLmRlYnVnICE9ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHMpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGFsZXJ0KHMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyogcGFyc2VycyB1dGlscyAqLw0KDQogICAgICAgICAgICBmdW5jdGlvbiBidWlsZFBhcnNlckNhY2hlKHRhYmxlLCAkaGVhZGVycykgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2Vyc0RlYnVnID0gIiI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLnRCb2RpZXMubGVuZ3RoID09IDApIHJldHVybjsgLy8gSW4gdGhlIGNhc2Ugb2YgZW1wdHkgdGFibGVzDQogICAgICAgICAgICAgICAgdmFyIHJvd3MgPSB0YWJsZS50Qm9kaWVzWzBdLnJvd3M7DQoNCiAgICAgICAgICAgICAgICBpZiAocm93c1swXSkgew0KDQogICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gW10sDQogICAgICAgICAgICAgICAgICAgICAgICBjZWxscyA9IHJvd3NbMF0uY2VsbHMsDQogICAgICAgICAgICAgICAgICAgICAgICBsID0gY2VsbHMubGVuZ3RoOw0KDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwID0gZmFsc2U7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkLm1ldGFkYXRhICYmICgkKCRoZWFkZXJzW2ldKS5tZXRhZGF0YSgpICYmICQoJGhlYWRlcnNbaV0pLm1ldGFkYXRhKCkuc29ydGVyKSkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGdldFBhcnNlckJ5SWQoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSAmJiB0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5zb3J0ZXIpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZ2V0UGFyc2VyQnlJZCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5zb3J0ZXIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKHRhYmxlLCByb3dzLCAtMSwgaSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXJzRGVidWcgKz0gImNvbHVtbjoiICsgaSArICIgcGFyc2VyOiIgKyBwLmlkICsgIlxuIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5wdXNoKHApOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBsb2cocGFyc2Vyc0RlYnVnKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gbGlzdDsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGRldGVjdFBhcnNlckZvckNvbHVtbih0YWJsZSwgcm93cywgcm93SW5kZXgsIGNlbGxJbmRleCkgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIG5vZGUgPSBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gZmFsc2UsDQogICAgICAgICAgICAgICAgICAgIGtlZXBMb29raW5nID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB3aGlsZSAobm9kZVZhbHVlID09ICcnICYmIGtlZXBMb29raW5nKSB7DQogICAgICAgICAgICAgICAgICAgIHJvd0luZGV4Kys7DQogICAgICAgICAgICAgICAgICAgIGlmIChyb3dzW3Jvd0luZGV4XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IGdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3MsIHJvd0luZGV4LCBjZWxsSW5kZXgpOw0KICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVZhbHVlID0gdHJpbUFuZEdldE5vZGVUZXh0KHRhYmxlLmNvbmZpZywgbm9kZSk7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdDaGVja2luZyBpZiB2YWx1ZSB3YXMgZW1wdHkgb24gcm93OicgKyByb3dJbmRleCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBrZWVwTG9va2luZyA9IGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJzW2ldLmlzKG5vZGVWYWx1ZSwgdGFibGUsIG5vZGUpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2Vyc1tpXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAvLyAwIGlzIGFsd2F5cyB0aGUgZ2VuZXJpYyBwYXJzZXIgKHRleHQpDQogICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcnNbMF07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3MsIHJvd0luZGV4LCBjZWxsSW5kZXgpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcm93c1tyb3dJbmRleF0uY2VsbHNbY2VsbEluZGV4XTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZnVuY3Rpb24gdHJpbUFuZEdldE5vZGVUZXh0KGNvbmZpZywgbm9kZSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAkLnRyaW0oZ2V0RWxlbWVudFRleHQoY29uZmlnLCBub2RlKSk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldFBhcnNlckJ5SWQobmFtZSkgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGg7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlcnNbaV0uaWQudG9Mb3dlckNhc2UoKSA9PSBuYW1lLnRvTG93ZXJDYXNlKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXJzW2ldOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLyogdXRpbHMgKi8NCg0KICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRDYWNoZSh0YWJsZSkgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgY2FjaGVUaW1lID0gbmV3IERhdGUoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgdG90YWxSb3dzID0gKHRhYmxlLnRCb2RpZXNbMF0gJiYgdGFibGUudEJvZGllc1swXS5yb3dzLmxlbmd0aCkgfHwgMCwNCiAgICAgICAgICAgICAgICAgICAgdG90YWxDZWxscyA9ICh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbMF0gJiYgdGFibGUudEJvZGllc1swXS5yb3dzWzBdLmNlbGxzLmxlbmd0aCkgfHwgMCwNCiAgICAgICAgICAgICAgICAgICAgcGFyc2VycyA9IHRhYmxlLmNvbmZpZy5wYXJzZXJzLA0KICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHJvdzogW10sDQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkOiBbXQ0KICAgICAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b3RhbFJvd3M7ICsraSkgew0KDQogICAgICAgICAgICAgICAgICAgIC8qKiBBZGQgdGhlIHRhYmxlIGRhdGEgdG8gbWFpbiBkYXRhIGFycmF5ICovDQogICAgICAgICAgICAgICAgICAgIHZhciBjID0gJCh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IFtdOw0KDQogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBjaGlsZCByb3csIGFkZCBpdCB0byB0aGUgbGFzdCByb3cncyBjaGlsZHJlbiBhbmQNCiAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgdG8gdGhlIG5leHQgcm93DQogICAgICAgICAgICAgICAgICAgIGlmIChjLmhhc0NsYXNzKHRhYmxlLmNvbmZpZy5jc3NDaGlsZFJvdykpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnJvd1tjYWNoZS5yb3cubGVuZ3RoIC0gMV0gPSBjYWNoZS5yb3dbY2FjaGUucm93Lmxlbmd0aCAtIDFdLmFkZChjKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHRvIHRoZSBuZXh0IGZvciBsb29wDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGNhY2hlLnJvdy5wdXNoKGMpOw0KDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdG90YWxDZWxsczsgKytqKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBjb2xzLnB1c2gocGFyc2Vyc1tqXS5mb3JtYXQoZ2V0RWxlbWVudFRleHQodGFibGUuY29uZmlnLCBjWzBdLmNlbGxzW2pdKSwgdGFibGUsIGNbMF0uY2VsbHNbal0pKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIGNvbHMucHVzaChjYWNoZS5ub3JtYWxpemVkLmxlbmd0aCk7IC8vIGFkZCBwb3NpdGlvbiBmb3Igcm93Q2FjaGUNCiAgICAgICAgICAgICAgICAgICAgY2FjaGUubm9ybWFsaXplZC5wdXNoKGNvbHMpOw0KICAgICAgICAgICAgICAgICAgICBjb2xzID0gbnVsbDsNCiAgICAgICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkJ1aWxkaW5nIGNhY2hlIGZvciAiICsgdG90YWxSb3dzICsgIiByb3dzOiIsIGNhY2hlVGltZSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gZ2V0RWxlbWVudFRleHQoY29uZmlnLCBub2RlKSB7DQoNCiAgICAgICAgICAgICAgICB2YXIgdGV4dCA9ICIiOw0KDQogICAgICAgICAgICAgICAgaWYgKCFub2RlKSByZXR1cm4gIiI7DQoNCiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KSBjb25maWcuc3VwcG9ydHNUZXh0Q29udGVudCA9IG5vZGUudGV4dENvbnRlbnQgfHwgZmFsc2U7DQoNCiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnRleHRFeHRyYWN0aW9uID09ICJzaW1wbGUiKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc3VwcG9ydHNUZXh0Q29udGVudCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG5vZGUudGV4dENvbnRlbnQ7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5jaGlsZE5vZGVzWzBdICYmIG5vZGUuY2hpbGROb2Rlc1swXS5oYXNDaGlsZE5vZGVzKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gbm9kZS5jaGlsZE5vZGVzWzBdLmlubmVySFRNTDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IG5vZGUuaW5uZXJIVE1MOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihjb25maWcudGV4dEV4dHJhY3Rpb24pID09ICJmdW5jdGlvbiIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBjb25maWcudGV4dEV4dHJhY3Rpb24obm9kZSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gJChub2RlKS50ZXh0KCk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHQ7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGVuZFRvVGFibGUodGFibGUsIGNhY2hlKSB7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBhcHBlbmRUaW1lID0gbmV3IERhdGUoKQ0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBjID0gY2FjaGUsDQogICAgICAgICAgICAgICAgICAgIHIgPSBjLnJvdywNCiAgICAgICAgICAgICAgICAgICAgbiA9IGMubm9ybWFsaXplZCwNCiAgICAgICAgICAgICAgICAgICAgdG90YWxSb3dzID0gbi5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIGNoZWNrQ2VsbCA9IChuWzBdLmxlbmd0aCAtIDEpLA0KICAgICAgICAgICAgICAgICAgICB0YWJsZUJvZHkgPSAkKHRhYmxlLnRCb2RpZXNbMF0pLA0KICAgICAgICAgICAgICAgICAgICByb3dzID0gW107DQoNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG90YWxSb3dzOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIHBvcyA9IG5baV1bY2hlY2tDZWxsXTsNCg0KICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2gocltwb3NdKTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYmxlLmNvbmZpZy5hcHBlbmRlcikgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZhciBvID0gOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSByW3Bvc10ubGVuZ3RoOw0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZUJvZHlbMF0uYXBwZW5kQ2hpbGQocltwb3NdW2pdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQoNCg0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5hcHBlbmRlcikgew0KDQogICAgICAgICAgICAgICAgICAgIHRhYmxlLmNvbmZpZy5hcHBlbmRlcih0YWJsZSwgcm93cyk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgcm93cyA9IG51bGw7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIGJlbmNobWFyaygiUmVidWlsdCB0YWJsZToiLCBhcHBlbmRUaW1lKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBhcHBseSB0YWJsZSB3aWRnZXRzDQogICAgICAgICAgICAgICAgYXBwbHlXaWRnZXQodGFibGUpOw0KDQogICAgICAgICAgICAgICAgLy8gdHJpZ2dlciBzb3J0ZW5kDQogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICQodGFibGUpLnRyaWdnZXIoInNvcnRFbmQiKTsNCiAgICAgICAgICAgICAgICB9LCAwKTsNCg0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRIZWFkZXJzKHRhYmxlKSB7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciB0aW1lID0gbmV3IERhdGUoKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICB2YXIgbWV0YSA9ICgkLm1ldGFkYXRhKSA/IHRydWUgOiBmYWxzZTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICB2YXIgaGVhZGVyX2luZGV4ID0gY29tcHV0ZVRhYmxlSGVhZGVyQ2VsbEluZGV4ZXModGFibGUpOw0KDQogICAgICAgICAgICAgICAgJHRhYmxlSGVhZGVycyA9ICQodGFibGUuY29uZmlnLnNlbGVjdG9ySGVhZGVycywgdGFibGUpLmVhY2goZnVuY3Rpb24gKGluZGV4KSB7DQoNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSBoZWFkZXJfaW5kZXhbdGhpcy5wYXJlbnROb2RlLnJvd0luZGV4ICsgIi0iICsgdGhpcy5jZWxsSW5kZXhdOw0KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmNvbHVtbiA9IGluZGV4Ow0KICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyID0gZm9ybWF0U29ydGluZ09yZGVyKHRhYmxlLmNvbmZpZy5zb3J0SW5pdGlhbE9yZGVyKTsNCiAgICAgICAgICAgICAgICAgICAgDQoJCQkJCQ0KCQkJCQl0aGlzLmNvdW50ID0gdGhpcy5vcmRlcjsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tIZWFkZXJNZXRhZGF0YSh0aGlzKSB8fCBjaGVja0hlYWRlck9wdGlvbnModGFibGUsIGluZGV4KSkgdGhpcy5zb3J0RGlzYWJsZWQgPSB0cnVlOw0KCQkJCQlpZiAoY2hlY2tIZWFkZXJPcHRpb25zU29ydGluZ0xvY2tlZCh0YWJsZSwgaW5kZXgpKSB0aGlzLm9yZGVyID0gdGhpcy5sb2NrZWRPcmRlciA9IGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsIGluZGV4KTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc29ydERpc2FibGVkKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgJHRoID0gJCh0aGlzKS5hZGRDbGFzcyh0YWJsZS5jb25maWcuY3NzSGVhZGVyKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcub25SZW5kZXJIZWFkZXIpIHRhYmxlLmNvbmZpZy5vblJlbmRlckhlYWRlci5hcHBseSgkdGgpOw0KICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGNlbGwgdG8gaGVhZGVyTGlzdA0KICAgICAgICAgICAgICAgICAgICB0YWJsZS5jb25maWcuaGVhZGVyTGlzdFtpbmRleF0gPSB0aGlzOw0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkJ1aWx0IGhlYWRlcnM6IiwgdGltZSk7DQogICAgICAgICAgICAgICAgICAgIGxvZygkdGFibGVIZWFkZXJzKTsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICByZXR1cm4gJHRhYmxlSGVhZGVyczsNCg0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgLy8gZnJvbToNCiAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuamF2YXNjcmlwdHRvb2xib3guY29tL2xpYi90YWJsZS9leGFtcGxlcy5waHANCiAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cuamF2YXNjcmlwdHRvb2xib3guY29tL3RlbXAvdGFibGVfY2VsbGluZGV4Lmh0bWwNCg0KDQogICAgICAgICAgICBmdW5jdGlvbiBjb21wdXRlVGFibGVIZWFkZXJDZWxsSW5kZXhlcyh0KSB7DQogICAgICAgICAgICAgICAgdmFyIG1hdHJpeCA9IFtdOw0KICAgICAgICAgICAgICAgIHZhciBsb29rdXAgPSB7fTsNCiAgICAgICAgICAgICAgICB2YXIgdGhlYWQgPSB0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdUSEVBRCcpWzBdOw0KICAgICAgICAgICAgICAgIHZhciB0cnMgPSB0aGVhZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnVFInKTsNCg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdHJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjZWxscyA9IHRyc1tpXS5jZWxsczsNCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjZWxscy5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBjZWxsc1tqXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd0luZGV4ID0gYy5wYXJlbnROb2RlLnJvd0luZGV4Ow0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNlbGxJZCA9IHJvd0luZGV4ICsgIi0iICsgYy5jZWxsSW5kZXg7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93U3BhbiA9IGMucm93U3BhbiB8fCAxOw0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbFNwYW4gPSBjLmNvbFNwYW4gfHwgMQ0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpcnN0QXZhaWxDb2w7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG1hdHJpeFtyb3dJbmRleF0pID09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4W3Jvd0luZGV4XSA9IFtdOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBmaXJzdCBhdmFpbGFibGUgY29sdW1uIGluIHRoZSBmaXJzdCByb3cNCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWF0cml4W3Jvd0luZGV4XS5sZW5ndGggKyAxOyBrKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mKG1hdHJpeFtyb3dJbmRleF1ba10pID09ICJ1bmRlZmluZWQiKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QXZhaWxDb2wgPSBrOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbY2VsbElkXSA9IGZpcnN0QXZhaWxDb2w7DQogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrID0gcm93SW5kZXg7IGsgPCByb3dJbmRleCArIHJvd1NwYW47IGsrKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YobWF0cml4W2tdKSA9PSAidW5kZWZpbmVkIikgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhba10gPSBbXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hdHJpeHJvdyA9IG1hdHJpeFtrXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBsID0gZmlyc3RBdmFpbENvbDsgbCA8IGZpcnN0QXZhaWxDb2wgKyBjb2xTcGFuOyBsKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4cm93W2xdID0gIngiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBjaGVja0NlbGxDb2xTcGFuKHRhYmxlLCByb3dzLCByb3cpIHsNCiAgICAgICAgICAgICAgICB2YXIgYXJyID0gW10sDQogICAgICAgICAgICAgICAgICAgIHIgPSB0YWJsZS50SGVhZC5yb3dzLA0KICAgICAgICAgICAgICAgICAgICBjID0gcltyb3ddLmNlbGxzOw0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjZWxsID0gY1tpXTsNCg0KICAgICAgICAgICAgICAgICAgICBpZiAoY2VsbC5jb2xTcGFuID4gMSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgYXJyID0gYXJyLmNvbmNhdChjaGVja0NlbGxDb2xTcGFuKHRhYmxlLCBoZWFkZXJBcnIsIHJvdysrKSk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGUudEhlYWQubGVuZ3RoID09IDEgfHwgKGNlbGwucm93U3BhbiA+IDEgfHwgIXJbcm93ICsgMV0pKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyLnB1c2goY2VsbCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXJBcnJbcm93XSA9IChpK3Jvdyk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcmV0dXJuIGFycjsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGNoZWNrSGVhZGVyTWV0YWRhdGEoY2VsbCkgew0KICAgICAgICAgICAgICAgIGlmICgoJC5tZXRhZGF0YSkgJiYgKCQoY2VsbCkubWV0YWRhdGEoKS5zb3J0ZXIgPT09IGZhbHNlKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZnVuY3Rpb24gY2hlY2tIZWFkZXJPcHRpb25zKHRhYmxlLCBpKSB7DQogICAgICAgICAgICAgICAgaWYgKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSkgJiYgKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlciA9PT0gZmFsc2UpKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgfQ0KCQkJDQoJCQkgZnVuY3Rpb24gY2hlY2tIZWFkZXJPcHRpb25zU29ydGluZ0xvY2tlZCh0YWJsZSwgaSkgew0KICAgICAgICAgICAgICAgIGlmICgodGFibGUuY29uZmlnLmhlYWRlcnNbaV0pICYmICh0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5sb2NrZWRPcmRlcikpIHJldHVybiB0YWJsZS5jb25maWcuaGVhZGVyc1tpXS5sb2NrZWRPcmRlcjsNCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoJCQkNCiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGx5V2lkZ2V0KHRhYmxlKSB7DQogICAgICAgICAgICAgICAgdmFyIGMgPSB0YWJsZS5jb25maWcud2lkZ2V0czsNCiAgICAgICAgICAgICAgICB2YXIgbCA9IGMubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgZ2V0V2lkZ2V0QnlJZChjW2ldKS5mb3JtYXQodGFibGUpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBnZXRXaWRnZXRCeUlkKG5hbWUpIHsNCiAgICAgICAgICAgICAgICB2YXIgbCA9IHdpZGdldHMubGVuZ3RoOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmICh3aWRnZXRzW2ldLmlkLnRvTG93ZXJDYXNlKCkgPT0gbmFtZS50b0xvd2VyQ2FzZSgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2lkZ2V0c1tpXTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFNvcnRpbmdPcmRlcih2KSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZih2KSAhPSAiTnVtYmVyIikgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHYudG9Mb3dlckNhc2UoKSA9PSAiZGVzYyIpID8gMSA6IDA7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh2ID09IDEpID8gMSA6IDA7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBpc1ZhbHVlSW5BcnJheSh2LCBhKSB7DQogICAgICAgICAgICAgICAgdmFyIGwgPSBhLmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoYVtpXVswXSA9PSB2KSB7DQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEhlYWRlcnNDc3ModGFibGUsICRoZWFkZXJzLCBsaXN0LCBjc3MpIHsNCiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGhlYWRlciBpbmZvcm1hdGlvbg0KICAgICAgICAgICAgICAgICRoZWFkZXJzLnJlbW92ZUNsYXNzKGNzc1swXSkucmVtb3ZlQ2xhc3MoY3NzWzFdKTsNCg0KICAgICAgICAgICAgICAgIHZhciBoID0gW107DQogICAgICAgICAgICAgICAgJGhlYWRlcnMuZWFjaChmdW5jdGlvbiAob2Zmc2V0KSB7DQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3J0RGlzYWJsZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGhbdGhpcy5jb2x1bW5dID0gJCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICAgICAgdmFyIGwgPSBsaXN0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBoW2xpc3RbaV1bMF1dLmFkZENsYXNzKGNzc1tsaXN0W2ldWzFdXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBmdW5jdGlvbiBmaXhDb2x1bW5XaWR0aCh0YWJsZSwgJGhlYWRlcnMpIHsNCiAgICAgICAgICAgICAgICB2YXIgYyA9IHRhYmxlLmNvbmZpZzsNCiAgICAgICAgICAgICAgICBpZiAoYy53aWR0aEZpeGVkKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBjb2xncm91cCA9ICQoJzxjb2xncm91cD4nKTsNCiAgICAgICAgICAgICAgICAgICAgJCgidHI6Zmlyc3QgdGQiLCB0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGdyb3VwLmFwcGVuZCgkKCc8Y29sPicpLmNzcygnd2lkdGgnLCAkKHRoaXMpLndpZHRoKCkpKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgICQodGFibGUpLnByZXBlbmQoY29sZ3JvdXApOw0KICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHVwZGF0ZUhlYWRlclNvcnRDb3VudCh0YWJsZSwgc29ydExpc3QpIHsNCiAgICAgICAgICAgICAgICB2YXIgYyA9IHRhYmxlLmNvbmZpZywNCiAgICAgICAgICAgICAgICAgICAgbCA9IHNvcnRMaXN0Lmxlbmd0aDsNCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IHNvcnRMaXN0W2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgbyA9IGMuaGVhZGVyTGlzdFtzWzBdXTsNCiAgICAgICAgICAgICAgICAgICAgby5jb3VudCA9IHNbMV07DQogICAgICAgICAgICAgICAgICAgIG8uY291bnQrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8qIHNvcnRpbmcgbWV0aG9kcyAqLw0KDQogICAgICAgICAgICBmdW5jdGlvbiBtdWx0aXNvcnQodGFibGUsIHNvcnRMaXN0LCBjYWNoZSkgew0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc29ydFRpbWUgPSBuZXcgRGF0ZSgpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHZhciBkeW5hbWljRXhwID0gInZhciBzb3J0V3JhcHBlciA9IGZ1bmN0aW9uKGEsYikgeyIsDQogICAgICAgICAgICAgICAgICAgIGwgPSBzb3J0TGlzdC5sZW5ndGg7DQoNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbmxpbmUgZnVuY3Rpb25zLg0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBzb3J0TGlzdFtpXVswXTsNCiAgICAgICAgICAgICAgICAgICAgdmFyIG9yZGVyID0gc29ydExpc3RbaV1bMV07DQogICAgICAgICAgICAgICAgICAgIC8vIHZhciBzID0gKGdldENhY2hlZFNvcnRUeXBlKHRhYmxlLmNvbmZpZy5wYXJzZXJzLGMpID09ICJ0ZXh0IikgPw0KICAgICAgICAgICAgICAgICAgICAvLyAoKG9yZGVyID09IDApID8gInNvcnRUZXh0IiA6ICJzb3J0VGV4dERlc2MiKSA6ICgob3JkZXIgPT0gMCkgPw0KICAgICAgICAgICAgICAgICAgICAvLyAic29ydE51bWVyaWMiIDogInNvcnROdW1lcmljRGVzYyIpOw0KICAgICAgICAgICAgICAgICAgICAvLyB2YXIgcyA9ICh0YWJsZS5jb25maWcucGFyc2Vyc1tjXS50eXBlID09ICJ0ZXh0IikgPyAoKG9yZGVyID09IDApDQogICAgICAgICAgICAgICAgICAgIC8vID8gbWFrZVNvcnRUZXh0KGMpIDogbWFrZVNvcnRUZXh0RGVzYyhjKSkgOiAoKG9yZGVyID09IDApID8NCiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZVNvcnROdW1lcmljKGMpIDogbWFrZVNvcnROdW1lcmljRGVzYyhjKSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBzID0gKHRhYmxlLmNvbmZpZy5wYXJzZXJzW2NdLnR5cGUgPT0gInRleHQiKSA/ICgob3JkZXIgPT0gMCkgPyBtYWtlU29ydEZ1bmN0aW9uKCJ0ZXh0IiwgImFzYyIsIGMpIDogbWFrZVNvcnRGdW5jdGlvbigidGV4dCIsICJkZXNjIiwgYykpIDogKChvcmRlciA9PSAwKSA/IG1ha2VTb3J0RnVuY3Rpb24oIm51bWVyaWMiLCAiYXNjIiwgYykgOiBtYWtlU29ydEZ1bmN0aW9uKCJudW1lcmljIiwgImRlc2MiLCBjKSk7DQogICAgICAgICAgICAgICAgICAgIHZhciBlID0gImUiICsgaTsNCg0KICAgICAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJ2YXIgIiArIGUgKyAiID0gIiArIHM7IC8vICsgIihhWyIgKyBjICsgIl0sYlsiICsgYw0KICAgICAgICAgICAgICAgICAgICAvLyArICJdKTsgIjsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAiaWYoIiArIGUgKyAiKSB7IHJldHVybiAiICsgZSArICI7IH0gIjsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAiZWxzZSB7ICI7DQoNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBpcyB0aGUgc2FtZSBrZWVwIG9yaWduYWwgb3JkZXINCiAgICAgICAgICAgICAgICB2YXIgb3JnT3JkZXJDb2wgPSBjYWNoZS5ub3JtYWxpemVkWzBdLmxlbmd0aCAtIDE7DQogICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAicmV0dXJuIGFbIiArIG9yZ09yZGVyQ29sICsgIl0tYlsiICsgb3JnT3JkZXJDb2wgKyAiXTsiOw0KDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgZHluYW1pY0V4cCArPSAifTsgIjsNCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJyZXR1cm4gMDsgIjsNCiAgICAgICAgICAgICAgICBkeW5hbWljRXhwICs9ICJ9OyAiOw0KDQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5kZWJ1Zykgew0KICAgICAgICAgICAgICAgICAgICBiZW5jaG1hcmsoIkV2YWxpbmcgZXhwcmVzc2lvbjoiICsgZHluYW1pY0V4cCwgbmV3IERhdGUoKSk7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZXZhbChkeW5hbWljRXhwKTsNCg0KICAgICAgICAgICAgICAgIGNhY2hlLm5vcm1hbGl6ZWQuc29ydChzb3J0V3JhcHBlcik7DQoNCiAgICAgICAgICAgICAgICBpZiAodGFibGUuY29uZmlnLmRlYnVnKSB7DQogICAgICAgICAgICAgICAgICAgIGJlbmNobWFyaygiU29ydGluZyBvbiAiICsgc29ydExpc3QudG9TdHJpbmcoKSArICIgYW5kIGRpciAiICsgb3JkZXIgKyAiIHRpbWU6Iiwgc29ydFRpbWUpOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0RnVuY3Rpb24odHlwZSwgZGlyZWN0aW9uLCBpbmRleCkgew0KICAgICAgICAgICAgICAgIHZhciBhID0gImFbIiArIGluZGV4ICsgIl0iLA0KICAgICAgICAgICAgICAgICAgICBiID0gImJbIiArIGluZGV4ICsgIl0iOw0KICAgICAgICAgICAgICAgIGlmICh0eXBlID09ICd0ZXh0JyAmJiBkaXJlY3Rpb24gPT0gJ2FzYycpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIoIiArIGEgKyAiID09ICIgKyBiICsgIiA/IDAgOiAoIiArIGEgKyAiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICgiICsgYSArICIgPCAiICsgYiArICIpID8gLTEgOiAxICkpKTsiOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAndGV4dCcgJiYgZGlyZWN0aW9uID09ICdkZXNjJykgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gIigiICsgYSArICIgPT0gIiArIGIgKyAiID8gMCA6ICgiICsgYSArICIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIiArIGIgKyAiID09PSBudWxsID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA8ICIgKyBhICsgIikgPyAtMSA6IDEgKSkpOyI7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdudW1lcmljJyAmJiBkaXJlY3Rpb24gPT0gJ2FzYycpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIoIiArIGEgKyAiID09PSBudWxsICYmICIgKyBiICsgIiA9PT0gbnVsbCkgPyAwIDooIiArIGEgKyAiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIgKyBiICsgIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICIgKyBhICsgIiAtICIgKyBiICsgIikpOyI7DQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICdudW1lcmljJyAmJiBkaXJlY3Rpb24gPT0gJ2Rlc2MnKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiAiKCIgKyBhICsgIiA9PT0gbnVsbCAmJiAiICsgYiArICIgPT09IG51bGwpID8gMCA6KCIgKyBhICsgIiA9PT0gbnVsbCA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6ICgiICsgYiArICIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAiICsgYiArICIgLSAiICsgYSArICIpKTsiOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0VGV4dChpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICIoKGFbIiArIGkgKyAiXSA8IGJbIiArIGkgKyAiXSkgPyAtMSA6ICgoYVsiICsgaSArICJdID4gYlsiICsgaSArICJdKSA/IDEgOiAwKSk7IjsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VTb3J0VGV4dERlc2MoaSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAiKChiWyIgKyBpICsgIl0gPCBhWyIgKyBpICsgIl0pID8gLTEgOiAoKGJbIiArIGkgKyAiXSA+IGFbIiArIGkgKyAiXSkgPyAxIDogMCkpOyI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBtYWtlU29ydE51bWVyaWMoaSkgew0KICAgICAgICAgICAgICAgIHJldHVybiAiYVsiICsgaSArICJdLWJbIiArIGkgKyAiXTsiOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgZnVuY3Rpb24gbWFrZVNvcnROdW1lcmljRGVzYyhpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuICJiWyIgKyBpICsgIl0tYVsiICsgaSArICJdOyI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBzb3J0VGV4dChhLCBiKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSkgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKChhIDwgYikgPyAtMSA6ICgoYSA+IGIpID8gMSA6IDApKTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNvcnRUZXh0RGVzYyhhLCBiKSB7DQogICAgICAgICAgICAgICAgaWYgKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSkgcmV0dXJuIGIubG9jYWxlQ29tcGFyZShhKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKChiIDwgYSkgPyAtMSA6ICgoYiA+IGEpID8gMSA6IDApKTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIHNvcnROdW1lcmljKGEsIGIpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gYSAtIGI7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBmdW5jdGlvbiBzb3J0TnVtZXJpY0Rlc2MoYSwgYikgew0KICAgICAgICAgICAgICAgIHJldHVybiBiIC0gYTsNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGZ1bmN0aW9uIGdldENhY2hlZFNvcnRUeXBlKHBhcnNlcnMsIGkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2Vyc1tpXS50eXBlOw0KICAgICAgICAgICAgfTsgLyogcHVibGljIG1ldGhvZHMgKi8NCiAgICAgICAgICAgIHRoaXMuY29uc3RydWN0ID0gZnVuY3Rpb24gKHNldHRpbmdzKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vIHRoZWFkIG9yIHRib2R5IHF1aXQuDQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy50SGVhZCB8fCAhdGhpcy50Qm9kaWVzKSByZXR1cm47DQogICAgICAgICAgICAgICAgICAgIC8vIGRlY2xhcmUNCiAgICAgICAgICAgICAgICAgICAgdmFyICR0aGlzLCAkZG9jdW1lbnQsICRoZWFkZXJzLCBjYWNoZSwgY29uZmlnLCBzaGlmdERvd24gPSAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgc29ydE9yZGVyOw0KICAgICAgICAgICAgICAgICAgICAvLyBuZXcgYmxhbmsgY29uZmlnIG9iamVjdA0KICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZyA9IHt9Ow0KICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbmQgZXh0ZW5kLg0KICAgICAgICAgICAgICAgICAgICBjb25maWcgPSAkLmV4dGVuZCh0aGlzLmNvbmZpZywgJC50YWJsZXNvcnRlci5kZWZhdWx0cywgc2V0dGluZ3MpOw0KICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBjb21tb24gZXhwcmVzc2lvbiBmb3Igc3BlZWQNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRoZSBzZXR0aW5ncyB3aGVyZSB0aGV5IHJlYWQNCiAgICAgICAgICAgICAgICAgICAgJC5kYXRhKHRoaXMsICJ0YWJsZXNvcnRlciIsIGNvbmZpZyk7DQogICAgICAgICAgICAgICAgICAgIC8vIGJ1aWxkIGhlYWRlcnMNCiAgICAgICAgICAgICAgICAgICAgJGhlYWRlcnMgPSBidWlsZEhlYWRlcnModGhpcyk7DQogICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBhdXRvIGRldGVjdCBjb2x1bW4gdHlwZSwgYW5kIHN0b3JlIGluIHRhYmxlcyBjb25maWcNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWcucGFyc2VycyA9IGJ1aWxkUGFyc2VyQ2FjaGUodGhpcywgJGhlYWRlcnMpOw0KICAgICAgICAgICAgICAgICAgICAvLyBidWlsZCB0aGUgY2FjaGUgZm9yIHRoZSB0Ym9keSBjZWxscw0KICAgICAgICAgICAgICAgICAgICBjYWNoZSA9IGJ1aWxkQ2FjaGUodGhpcyk7DQogICAgICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY3NzIGNsYXNzIG5hbWVzLCBjb3VsZCBiZSBkb25lIGVsc2Ugd2hlcmUuDQogICAgICAgICAgICAgICAgICAgIHZhciBzb3J0Q1NTID0gW2NvbmZpZy5jc3NEZXNjLCBjb25maWcuY3NzQXNjXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZml4YXRlIGNvbHVtbnMgaWYgdGhlIHVzZXJzIHN1cHBsaWVzIHRoZSBmaXhlZFdpZHRoIG9wdGlvbg0KICAgICAgICAgICAgICAgICAgICBmaXhDb2x1bW5XaWR0aCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgZXZlbnQgaGFuZGxpbmcgdG8gaGVhZGVycw0KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGJpZywgcGVyaGFwcyBicmVhayBpdCBvdXQ/DQogICAgICAgICAgICAgICAgICAgICRoZWFkZXJzLmNsaWNrKA0KDQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdG90YWxSb3dzID0gKCR0aGlzWzBdLnRCb2RpZXNbMF0gJiYgJHRoaXNbMF0udEJvZGllc1swXS5yb3dzLmxlbmd0aCkgfHwgMDsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3J0RGlzYWJsZWQgJiYgdG90YWxSb3dzID4gMCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY2FsbCBzb3J0U3RhcnQgaWYgc29ydGluZyBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMudHJpZ2dlcigic29ydFN0YXJ0Iik7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmUgZXhwLCBmb3Igc3BlZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJGNlbGwgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBjdXJyZW50IGNvbHVtbiBpbmRleA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gdGhpcy5jb2x1bW47DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1cnJlbnQgY29sdW1uIHNvcnQgb3JkZXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9yZGVyID0gdGhpcy5jb3VudCsrICUgMjsNCgkJCQkJCQkvLyBhbHdheXMgc29ydCBvbiB0aGUgbG9ja2VkIG9yZGVyLg0KCQkJCQkJCWlmKHRoaXMubG9ja2VkT3JkZXIpIHRoaXMub3JkZXIgPSB0aGlzLmxvY2tlZE9yZGVyOw0KCQkJCQkJCQ0KCQkJCQkJCS8vIHVzZXIgb25seSB3aGFudHMgdG8gc29ydCBvbiBvbmUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2x1bW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVbY29uZmlnLnNvcnRNdWx0aVNvcnRLZXldKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIHRoZSBzb3J0IGxpc3QNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gW107DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWcuc29ydEZvcmNlICE9IG51bGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gY29uZmlnLnNvcnRGb3JjZTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYS5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhW2pdWzBdICE9IGkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0LnB1c2goYVtqXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBjb2x1bW4gdG8gc29ydCBsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zb3J0TGlzdC5wdXNoKFtpLCB0aGlzLm9yZGVyXSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG11bHRpIGNvbHVtbiBzb3J0aW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgaGFzIGNsaWNrZWQgb24gYW4gYWxsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWR5IHNvcnRldCBjb2x1bW4uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZhbHVlSW5BcnJheShpLCBjb25maWcuc29ydExpc3QpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXZlcnMgdGhlIHNvcnRpbmcgZGlyZWN0aW9uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYWxsIHRhYmxlcy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29uZmlnLnNvcnRMaXN0Lmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHMgPSBjb25maWcuc29ydExpc3Rbal0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBjb25maWcuaGVhZGVyTGlzdFtzWzBdXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc1swXSA9PSBpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8uY291bnQgPSBzWzFdOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLmNvdW50Kys7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNbMV0gPSBvLmNvdW50ICUgMjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgY29sdW1uIHRvIHNvcnQgbGlzdCBhcnJheQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0LnB1c2goW2ksIHRoaXMub3JkZXJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBjc3MgZm9yIGhlYWRlcnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGVhZGVyc0NzcygkdGhpc1swXSwgJGhlYWRlcnMsIGNvbmZpZy5zb3J0TGlzdCwgc29ydENTUyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvVGFibGUoDQoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpc1swXSwgbXVsdGlzb3J0KA0KCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXNbMF0sIGNvbmZpZy5zb3J0TGlzdCwgY2FjaGUpDQoJCQkJCQkJCSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMSk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcCBub3JtYWwgZXZlbnQgYnkgcmV0dXJuaW5nIGZhbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuY2VsIHNlbGVjdGlvbg0KICAgICAgICAgICAgICAgICAgICB9KS5tb3VzZWRvd24oZnVuY3Rpb24gKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5jYW5jZWxTZWxlY3Rpb24pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgZWFzeSBtZXRob2RzIHRoYXQgdHJpZ2dlciBiaW5kZWQgZXZlbnRzDQogICAgICAgICAgICAgICAgICAgICR0aGlzLmJpbmQoInVwZGF0ZSIsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZSA9IHRoaXM7DQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWJ1aWxkIHBhcnNlcnMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWUuY29uZmlnLnBhcnNlcnMgPSBidWlsZFBhcnNlckNhY2hlKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCAkaGVhZGVycyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVidWlsZCB0aGUgY2FjaGUgbWFwDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUgPSBidWlsZENhY2hlKG1lKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEpOw0KICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKCJ1cGRhdGVDZWxsIiwgZnVuY3Rpb24gKGUsIGNlbGwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb25maWcgPSB0aGlzLmNvbmZpZzsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBwb3NpdGlvbiBmcm9tIHRoZSBkb20uDQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcG9zID0gWyhjZWxsLnBhcmVudE5vZGUucm93SW5kZXggLSAxKSwgY2VsbC5jZWxsSW5kZXhdOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGNhY2hlDQogICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS5ub3JtYWxpemVkW3Bvc1swXV1bcG9zWzFdXSA9IGNvbmZpZy5wYXJzZXJzW3Bvc1sxXV0uZm9ybWF0KA0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudFRleHQoY29uZmlnLCBjZWxsKSwgY2VsbCk7DQogICAgICAgICAgICAgICAgICAgIH0pLmJpbmQoInNvcnRvbiIsIGZ1bmN0aW9uIChlLCBsaXN0KSB7DQogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoInNvcnRTdGFydCIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gbGlzdDsNCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBhbmQgc3RvcmUgdGhlIHNvcnRsaXN0DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc29ydExpc3QgPSBjb25maWcuc29ydExpc3Q7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaGVhZGVyIGNvdW50IGluZGV4DQogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVIZWFkZXJTb3J0Q291bnQodGhpcywgc29ydExpc3QpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGNzcyBmb3IgaGVhZGVycw0KICAgICAgICAgICAgICAgICAgICAgICAgc2V0SGVhZGVyc0Nzcyh0aGlzLCAkaGVhZGVycywgc29ydExpc3QsIHNvcnRDU1MpOw0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gc29ydCB0aGUgdGFibGUgYW5kIGFwcGVuZCBpdCB0byB0aGUgZG9tDQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1RhYmxlKHRoaXMsIG11bHRpc29ydCh0aGlzLCBzb3J0TGlzdCwgY2FjaGUpKTsNCiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCgiYXBwZW5kQ2FjaGUiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUb1RhYmxlKHRoaXMsIGNhY2hlKTsNCiAgICAgICAgICAgICAgICAgICAgfSkuYmluZCgiYXBwbHlXaWRnZXRJZCIsIGZ1bmN0aW9uIChlLCBpZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0V2lkZ2V0QnlJZChpZCkuZm9ybWF0KHRoaXMpOw0KICAgICAgICAgICAgICAgICAgICB9KS5iaW5kKCJhcHBseVdpZGdldHMiLCBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB3aWRnZXRzDQogICAgICAgICAgICAgICAgICAgICAgICBhcHBseVdpZGdldCh0aGlzKTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIGlmICgkLm1ldGFkYXRhICYmICgkKHRoaXMpLm1ldGFkYXRhKCkgJiYgJCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0KSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnNvcnRMaXN0ID0gJCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0Ow0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZXIgaGFzIHN1cHBsaWVkIGEgc29ydCBsaXN0IHRvIGNvbnN0cnVjdG9yLg0KICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnNvcnRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoInNvcnRvbiIsIFtjb25maWcuc29ydExpc3RdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSB3aWRnZXRzDQogICAgICAgICAgICAgICAgICAgIGFwcGx5V2lkZ2V0KHRoaXMpOw0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuYWRkUGFyc2VyID0gZnVuY3Rpb24gKHBhcnNlcikgew0KICAgICAgICAgICAgICAgIHZhciBsID0gcGFyc2Vycy5sZW5ndGgsDQogICAgICAgICAgICAgICAgICAgIGEgPSB0cnVlOw0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZXJzW2ldLmlkLnRvTG93ZXJDYXNlKCkgPT0gcGFyc2VyLmlkLnRvTG93ZXJDYXNlKCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoYSkgew0KICAgICAgICAgICAgICAgICAgICBwYXJzZXJzLnB1c2gocGFyc2VyKTsNCiAgICAgICAgICAgICAgICB9Ow0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuYWRkV2lkZ2V0ID0gZnVuY3Rpb24gKHdpZGdldCkgew0KICAgICAgICAgICAgICAgIHdpZGdldHMucHVzaCh3aWRnZXQpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuZm9ybWF0RmxvYXQgPSBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgICAgIHZhciBpID0gcGFyc2VGbG9hdChzKTsNCiAgICAgICAgICAgICAgICByZXR1cm4gKGlzTmFOKGkpKSA/IDAgOiBpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuZm9ybWF0SW50ID0gZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgICAgICB2YXIgaSA9IHBhcnNlSW50KHMpOw0KICAgICAgICAgICAgICAgIHJldHVybiAoaXNOYU4oaSkpID8gMCA6IGk7DQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgdGhpcy5pc0RpZ2l0ID0gZnVuY3Rpb24gKHMsIGNvbmZpZykgew0KICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgYWxsIGFuIHdhbnRlZCBjaGFycyBhbmQgbWF0Y2guDQogICAgICAgICAgICAgICAgcmV0dXJuIC9eWy0rXT9cZCokLy50ZXN0KCQudHJpbShzLnJlcGxhY2UoL1ssLiddL2csICcnKSkpOw0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHRoaXMuY2xlYXJUYWJsZUJvZHkgPSBmdW5jdGlvbiAodGFibGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoJC5icm93c2VyLm1zaWUpIHsNCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZW1wdHkoKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5maXJzdENoaWxkKQ0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0Q2hpbGQpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVtcHR5LmFwcGx5KHRhYmxlLnRCb2RpZXNbMF0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRhYmxlLnRCb2RpZXNbMF0uaW5uZXJIVE1MID0gIiI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfTsNCiAgICAgICAgfQ0KICAgIH0pOw0KDQogICAgLy8gZXh0ZW5kIHBsdWdpbiBzY29wZQ0KICAgICQuZm4uZXh0ZW5kKHsNCiAgICAgICAgdGFibGVzb3J0ZXI6ICQudGFibGVzb3J0ZXIuY29uc3RydWN0DQogICAgfSk7DQoNCiAgICAvLyBtYWtlIHNob3J0Y3V0DQogICAgdmFyIHRzID0gJC50YWJsZXNvcnRlcjsNCg0KICAgIC8vIGFkZCBkZWZhdWx0IHBhcnNlcnMNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogInRleHQiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50cmltKHMudG9Mb2NhbGVMb3dlckNhc2UoKSk7DQogICAgICAgIH0sIHR5cGU6ICJ0ZXh0Ig0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJkaWdpdCIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocywgdGFibGUpIHsNCiAgICAgICAgICAgIHZhciBjID0gdGFibGUuY29uZmlnOw0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuaXNEaWdpdChzLCBjKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocyk7DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJjdXJyZW5jeSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIC9eW8KjJOKCrD8uXS8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocy5yZXBsYWNlKG5ldyBSZWdFeHAoL1vCoyTigqxdL2cpLCAiIikpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAiaXBBZGRyZXNzIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL15cZHsyLDN9W1wuXVxkezIsM31bXC5dXGR7MiwzfVtcLl1cZHsyLDN9JC8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgdmFyIGEgPSBzLnNwbGl0KCIuIiksDQogICAgICAgICAgICAgICAgciA9ICIiLA0KICAgICAgICAgICAgICAgIGwgPSBhLmxlbmd0aDsNCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7DQogICAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBhW2ldOw0KICAgICAgICAgICAgICAgIGlmIChpdGVtLmxlbmd0aCA9PSAyKSB7DQogICAgICAgICAgICAgICAgICAgIHIgKz0gIjAiICsgaXRlbTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByICs9IGl0ZW07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocik7DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KDQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJ1cmwiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXihodHRwcz98ZnRwfGZpbGUpOlwvXC8kLy50ZXN0KHMpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4galF1ZXJ5LnRyaW0ocy5yZXBsYWNlKG5ldyBSZWdFeHAoLyhodHRwcz98ZnRwfGZpbGUpOlwvXC8vKSwgJycpKTsNCiAgICAgICAgfSwgdHlwZTogInRleHQiDQogICAgfSk7DQoNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogImlzb0RhdGUiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXlxkezR9W1wvLV1cZHsxLDJ9W1wvLV1cZHsxLDJ9JC8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQoKHMgIT0gIiIpID8gbmV3IERhdGUocy5yZXBsYWNlKA0KICAgICAgICAgICAgbmV3IFJlZ0V4cCgvLS9nKSwgIi8iKSkuZ2V0VGltZSgpIDogIjAiKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQoNCiAgICB0cy5hZGRQYXJzZXIoew0KICAgICAgICBpZDogInBlcmNlbnQiLA0KICAgICAgICBpczogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAvXCUkLy50ZXN0KCQudHJpbShzKSk7DQogICAgICAgIH0sIGZvcm1hdDogZnVuY3Rpb24gKHMpIHsNCiAgICAgICAgICAgIHJldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KHMucmVwbGFjZShuZXcgUmVnRXhwKC8lL2cpLCAiIikpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAidXNMb25nRGF0ZSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIHMubWF0Y2gobmV3IFJlZ0V4cCgvXltBLVphLXpdezMsMTB9XC4/IFswLTldezEsMn0sIChbMC05XXs0fXwnP1swLTldezJ9KSAoKFswLTJdP1swLTldOlswLTVdWzAtOV0pfChbMC0xXT9bMC05XTpbMC01XVswLTldXHMoQU18UE0pKSkkLykpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZShzKS5nZXRUaW1lKCkpOw0KICAgICAgICB9LCB0eXBlOiAibnVtZXJpYyINCiAgICB9KTsNCg0KICAgIHRzLmFkZFBhcnNlcih7DQogICAgICAgIGlkOiAic2hvcnREYXRlIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL1xkezEsMn1bXC9cLV1cZHsxLDJ9W1wvXC1dXGR7Miw0fS8udGVzdChzKTsNCiAgICAgICAgfSwgZm9ybWF0OiBmdW5jdGlvbiAocywgdGFibGUpIHsNCiAgICAgICAgICAgIHZhciBjID0gdGFibGUuY29uZmlnOw0KICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvXC0vZywgIi8iKTsNCiAgICAgICAgICAgIGlmIChjLmRhdGVGb3JtYXQgPT0gInVzIikgew0KICAgICAgICAgICAgICAgIC8vIHJlZm9ybWF0IHRoZSBzdHJpbmcgaW4gSVNPIGZvcm1hdA0KICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCAiJDMvJDEvJDIiKTsNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoYy5kYXRlRm9ybWF0ID09ICJ1ayIpIHsNCiAgICAgICAgICAgICAgICAvLyByZWZvcm1hdCB0aGUgc3RyaW5nIGluIElTTyBmb3JtYXQNCiAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKC8oXGR7MSwyfSlbXC9cLV0oXGR7MSwyfSlbXC9cLV0oXGR7NH0pLywgIiQzLyQyLyQxIik7DQogICAgICAgICAgICB9IGVsc2UgaWYgKGMuZGF0ZUZvcm1hdCA9PSAiZGQvbW0veXkiIHx8IGMuZGF0ZUZvcm1hdCA9PSAiZGQtbW0teXkiKSB7DQogICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvKFxkezEsMn0pW1wvXC1dKFxkezEsMn0pW1wvXC1dKFxkezJ9KS8sICIkMS8kMi8kMyIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQobmV3IERhdGUocykuZ2V0VGltZSgpKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJ0aW1lIiwNCiAgICAgICAgaXM6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gL14oKFswLTJdP1swLTldOlswLTVdWzAtOV0pfChbMC0xXT9bMC05XTpbMC01XVswLTldXHMoYW18cG0pKSkkLy50ZXN0KHMpOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzKSB7DQogICAgICAgICAgICByZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZSgiMjAwMC8wMS8wMSAiICsgcykuZ2V0VGltZSgpKTsNCiAgICAgICAgfSwgdHlwZTogIm51bWVyaWMiDQogICAgfSk7DQogICAgdHMuYWRkUGFyc2VyKHsNCiAgICAgICAgaWQ6ICJtZXRhZGF0YSIsDQogICAgICAgIGlzOiBmdW5jdGlvbiAocykgew0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgICAgICB9LCBmb3JtYXQ6IGZ1bmN0aW9uIChzLCB0YWJsZSwgY2VsbCkgew0KICAgICAgICAgICAgdmFyIGMgPSB0YWJsZS5jb25maWcsDQogICAgICAgICAgICAgICAgcCA9ICghYy5wYXJzZXJNZXRhZGF0YU5hbWUpID8gJ3NvcnRWYWx1ZScgOiBjLnBhcnNlck1ldGFkYXRhTmFtZTsNCiAgICAgICAgICAgIHJldHVybiAkKGNlbGwpLm1ldGFkYXRhKClbcF07DQogICAgICAgIH0sIHR5cGU6ICJudW1lcmljIg0KICAgIH0pOw0KICAgIC8vIGFkZCBkZWZhdWx0IHdpZGdldHMNCiAgICB0cy5hZGRXaWRnZXQoew0KICAgICAgICBpZDogInplYnJhIiwNCiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbiAodGFibGUpIHsNCiAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICB2YXIgdGltZSA9IG5ldyBEYXRlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgJHRyLCByb3cgPSAtMSwNCiAgICAgICAgICAgICAgICBvZGQ7DQogICAgICAgICAgICAvLyBsb29wIHRocm91Z2ggdGhlIHZpc2libGUgcm93cw0KICAgICAgICAgICAgJCgidHI6dmlzaWJsZSIsIHRhYmxlLnRCb2RpZXNbMF0pLmVhY2goZnVuY3Rpb24gKGkpIHsNCiAgICAgICAgICAgICAgICAkdHIgPSAkKHRoaXMpOw0KICAgICAgICAgICAgICAgIC8vIHN0eWxlIGNoaWxkcmVuIHJvd3MgdGhlIHNhbWUgd2F5IHRoZSBwYXJlbnQNCiAgICAgICAgICAgICAgICAvLyByb3cgd2FzIHN0eWxlZA0KICAgICAgICAgICAgICAgIGlmICghJHRyLmhhc0NsYXNzKHRhYmxlLmNvbmZpZy5jc3NDaGlsZFJvdykpIHJvdysrOw0KICAgICAgICAgICAgICAgIG9kZCA9IChyb3cgJSAyID09IDApOw0KICAgICAgICAgICAgICAgICR0ci5yZW1vdmVDbGFzcygNCiAgICAgICAgICAgICAgICB0YWJsZS5jb25maWcud2lkZ2V0WmVicmEuY3NzW29kZCA/IDAgOiAxXSkuYWRkQ2xhc3MoDQogICAgICAgICAgICAgICAgdGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQgPyAxIDogMF0pDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGlmICh0YWJsZS5jb25maWcuZGVidWcpIHsNCiAgICAgICAgICAgICAgICAkLnRhYmxlc29ydGVyLmJlbmNobWFyaygiQXBwbHlpbmcgWmVicmEgd2lkZ2V0IiwgdGltZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9KTsNCn0pKGpRdWVyeSk7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/jquery.tablesorter.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[CihmdW5jdGlvbigkKXskLmV4dGVuZCh7dGFibGVzb3J0ZXI6bmV3CmZ1bmN0aW9uKCl7dmFyIHBhcnNlcnM9W10sd2lkZ2V0cz1bXTt0aGlzLmRlZmF1bHRzPXtjc3NIZWFkZXI6ImhlYWRlciIsY3NzQXNjOiJoZWFkZXJTb3J0VXAiLGNzc0Rlc2M6ImhlYWRlclNvcnREb3duIixjc3NDaGlsZFJvdzoiZXhwYW5kLWNoaWxkIixzb3J0SW5pdGlhbE9yZGVyOiJhc2MiLHNvcnRNdWx0aVNvcnRLZXk6InNoaWZ0S2V5Iixzb3J0Rm9yY2U6bnVsbCxzb3J0QXBwZW5kOm51bGwsc29ydExvY2FsZUNvbXBhcmU6dHJ1ZSx0ZXh0RXh0cmFjdGlvbjoic2ltcGxlIixwYXJzZXJzOnt9LHdpZGdldHM6W10sd2lkZ2V0WmVicmE6e2NzczpbImV2ZW4iLCJvZGQiXX0saGVhZGVyczp7fSx3aWR0aEZpeGVkOmZhbHNlLGNhbmNlbFNlbGVjdGlvbjp0cnVlLHNvcnRMaXN0OltdLGhlYWRlckxpc3Q6W10sZGF0ZUZvcm1hdDoidXMiLGRlY2ltYWw6Jy9cLnxcLC9nJyxvblJlbmRlckhlYWRlcjpudWxsLHNlbGVjdG9ySGVhZGVyczondGhlYWQgdGgnLGRlYnVnOmZhbHNlfTtmdW5jdGlvbiBiZW5jaG1hcmsocyxkKXtsb2cocysiLCIrKG5ldyBEYXRlKCkuZ2V0VGltZSgpLWQuZ2V0VGltZSgpKSsibXMiKTt9dGhpcy5iZW5jaG1hcms9YmVuY2htYXJrO2Z1bmN0aW9uIGxvZyhzKXtpZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCImJnR5cGVvZiBjb25zb2xlLmRlYnVnIT0idW5kZWZpbmVkIil7Y29uc29sZS5sb2cocyk7fWVsc2V7YWxlcnQocyk7fX1mdW5jdGlvbiBidWlsZFBhcnNlckNhY2hlKHRhYmxlLCRoZWFkZXJzKXtpZih0YWJsZS5jb25maWcuZGVidWcpe3ZhciBwYXJzZXJzRGVidWc9IiI7fWlmKHRhYmxlLnRCb2RpZXMubGVuZ3RoPT0wKXJldHVybjt2YXIgcm93cz10YWJsZS50Qm9kaWVzWzBdLnJvd3M7aWYocm93c1swXSl7dmFyIGxpc3Q9W10sY2VsbHM9cm93c1swXS5jZWxscyxsPWNlbGxzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXt2YXIgcD1mYWxzZTtpZigkLm1ldGFkYXRhJiYoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKSYmJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpKXtwPWdldFBhcnNlckJ5SWQoJCgkaGVhZGVyc1tpXSkubWV0YWRhdGEoKS5zb3J0ZXIpO31lbHNlIGlmKCh0YWJsZS5jb25maWcuaGVhZGVyc1tpXSYmdGFibGUuY29uZmlnLmhlYWRlcnNbaV0uc29ydGVyKSl7cD1nZXRQYXJzZXJCeUlkKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlcik7fWlmKCFwKXtwPWRldGVjdFBhcnNlckZvckNvbHVtbih0YWJsZSxyb3dzLC0xLGkpO31pZih0YWJsZS5jb25maWcuZGVidWcpe3BhcnNlcnNEZWJ1Zys9ImNvbHVtbjoiK2krIiBwYXJzZXI6IitwLmlkKyJcbiI7fWxpc3QucHVzaChwKTt9fWlmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7bG9nKHBhcnNlcnNEZWJ1Zyk7fXJldHVybiBsaXN0O307ZnVuY3Rpb24gZGV0ZWN0UGFyc2VyRm9yQ29sdW1uKHRhYmxlLHJvd3Mscm93SW5kZXgsY2VsbEluZGV4KXt2YXIgbD1wYXJzZXJzLmxlbmd0aCxub2RlPWZhbHNlLG5vZGVWYWx1ZT1mYWxzZSxrZWVwTG9va2luZz10cnVlO3doaWxlKG5vZGVWYWx1ZT09JycmJmtlZXBMb29raW5nKXtyb3dJbmRleCsrO2lmKHJvd3Nbcm93SW5kZXhdKXtub2RlPWdldE5vZGVGcm9tUm93QW5kQ2VsbEluZGV4KHJvd3Mscm93SW5kZXgsY2VsbEluZGV4KTtub2RlVmFsdWU9dHJpbUFuZEdldE5vZGVUZXh0KHRhYmxlLmNvbmZpZyxub2RlKTtpZih0YWJsZS5jb25maWcuZGVidWcpe2xvZygnQ2hlY2tpbmcgaWYgdmFsdWUgd2FzIGVtcHR5IG9uIHJvdzonK3Jvd0luZGV4KTt9fWVsc2V7a2VlcExvb2tpbmc9ZmFsc2U7fX1mb3IodmFyIGk9MTtpPGw7aSsrKXtpZihwYXJzZXJzW2ldLmlzKG5vZGVWYWx1ZSx0YWJsZSxub2RlKSl7cmV0dXJuIHBhcnNlcnNbaV07fX1yZXR1cm4gcGFyc2Vyc1swXTt9ZnVuY3Rpb24gZ2V0Tm9kZUZyb21Sb3dBbmRDZWxsSW5kZXgocm93cyxyb3dJbmRleCxjZWxsSW5kZXgpe3JldHVybiByb3dzW3Jvd0luZGV4XS5jZWxsc1tjZWxsSW5kZXhdO31mdW5jdGlvbiB0cmltQW5kR2V0Tm9kZVRleHQoY29uZmlnLG5vZGUpe3JldHVybiAkLnRyaW0oZ2V0RWxlbWVudFRleHQoY29uZmlnLG5vZGUpKTt9ZnVuY3Rpb24gZ2V0UGFyc2VyQnlJZChuYW1lKXt2YXIgbD1wYXJzZXJzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZihwYXJzZXJzW2ldLmlkLnRvTG93ZXJDYXNlKCk9PW5hbWUudG9Mb3dlckNhc2UoKSl7cmV0dXJuIHBhcnNlcnNbaV07fX1yZXR1cm4gZmFsc2U7fWZ1bmN0aW9uIGJ1aWxkQ2FjaGUodGFibGUpe2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7dmFyIGNhY2hlVGltZT1uZXcgRGF0ZSgpO312YXIgdG90YWxSb3dzPSh0YWJsZS50Qm9kaWVzWzBdJiZ0YWJsZS50Qm9kaWVzWzBdLnJvd3MubGVuZ3RoKXx8MCx0b3RhbENlbGxzPSh0YWJsZS50Qm9kaWVzWzBdLnJvd3NbMF0mJnRhYmxlLnRCb2RpZXNbMF0ucm93c1swXS5jZWxscy5sZW5ndGgpfHwwLHBhcnNlcnM9dGFibGUuY29uZmlnLnBhcnNlcnMsY2FjaGU9e3JvdzpbXSxub3JtYWxpemVkOltdfTtmb3IodmFyIGk9MDtpPHRvdGFsUm93czsrK2kpe3ZhciBjPSQodGFibGUudEJvZGllc1swXS5yb3dzW2ldKSxjb2xzPVtdO2lmKGMuaGFzQ2xhc3ModGFibGUuY29uZmlnLmNzc0NoaWxkUm93KSl7Y2FjaGUucm93W2NhY2hlLnJvdy5sZW5ndGgtMV09Y2FjaGUucm93W2NhY2hlLnJvdy5sZW5ndGgtMV0uYWRkKGMpO2NvbnRpbnVlO31jYWNoZS5yb3cucHVzaChjKTtmb3IodmFyIGo9MDtqPHRvdGFsQ2VsbHM7KytqKXtjb2xzLnB1c2gocGFyc2Vyc1tqXS5mb3JtYXQoZ2V0RWxlbWVudFRleHQodGFibGUuY29uZmlnLGNbMF0uY2VsbHNbal0pLHRhYmxlLGNbMF0uY2VsbHNbal0pKTt9Y29scy5wdXNoKGNhY2hlLm5vcm1hbGl6ZWQubGVuZ3RoKTtjYWNoZS5ub3JtYWxpemVkLnB1c2goY29scyk7Y29scz1udWxsO307aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIkJ1aWxkaW5nIGNhY2hlIGZvciAiK3RvdGFsUm93cysiIHJvd3M6IixjYWNoZVRpbWUpO31yZXR1cm4gY2FjaGU7fTtmdW5jdGlvbiBnZXRFbGVtZW50VGV4dChjb25maWcsbm9kZSl7dmFyIHRleHQ9IiI7aWYoIW5vZGUpcmV0dXJuIiI7aWYoIWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KWNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50PW5vZGUudGV4dENvbnRlbnR8fGZhbHNlO2lmKGNvbmZpZy50ZXh0RXh0cmFjdGlvbj09InNpbXBsZSIpe2lmKGNvbmZpZy5zdXBwb3J0c1RleHRDb250ZW50KXt0ZXh0PW5vZGUudGV4dENvbnRlbnQ7fWVsc2V7aWYobm9kZS5jaGlsZE5vZGVzWzBdJiZub2RlLmNoaWxkTm9kZXNbMF0uaGFzQ2hpbGROb2RlcygpKXt0ZXh0PW5vZGUuY2hpbGROb2Rlc1swXS5pbm5lckhUTUw7fWVsc2V7dGV4dD1ub2RlLmlubmVySFRNTDt9fX1lbHNle2lmKHR5cGVvZihjb25maWcudGV4dEV4dHJhY3Rpb24pPT0iZnVuY3Rpb24iKXt0ZXh0PWNvbmZpZy50ZXh0RXh0cmFjdGlvbihub2RlKTt9ZWxzZXt0ZXh0PSQobm9kZSkudGV4dCgpO319cmV0dXJuIHRleHQ7fWZ1bmN0aW9uIGFwcGVuZFRvVGFibGUodGFibGUsY2FjaGUpe2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7dmFyIGFwcGVuZFRpbWU9bmV3IERhdGUoKX12YXIgYz1jYWNoZSxyPWMucm93LG49Yy5ub3JtYWxpemVkLHRvdGFsUm93cz1uLmxlbmd0aCxjaGVja0NlbGw9KG5bMF0ubGVuZ3RoLTEpLHRhYmxlQm9keT0kKHRhYmxlLnRCb2RpZXNbMF0pLHJvd3M9W107Zm9yKHZhciBpPTA7aTx0b3RhbFJvd3M7aSsrKXt2YXIgcG9zPW5baV1bY2hlY2tDZWxsXTtyb3dzLnB1c2gocltwb3NdKTtpZighdGFibGUuY29uZmlnLmFwcGVuZGVyKXt2YXIgbD1yW3Bvc10ubGVuZ3RoO2Zvcih2YXIgaj0wO2o8bDtqKyspe3RhYmxlQm9keVswXS5hcHBlbmRDaGlsZChyW3Bvc11bal0pO319fWlmKHRhYmxlLmNvbmZpZy5hcHBlbmRlcil7dGFibGUuY29uZmlnLmFwcGVuZGVyKHRhYmxlLHJvd3MpO31yb3dzPW51bGw7aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIlJlYnVpbHQgdGFibGU6IixhcHBlbmRUaW1lKTt9YXBwbHlXaWRnZXQodGFibGUpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXskKHRhYmxlKS50cmlnZ2VyKCJzb3J0RW5kIik7fSwwKTt9O2Z1bmN0aW9uIGJ1aWxkSGVhZGVycyh0YWJsZSl7aWYodGFibGUuY29uZmlnLmRlYnVnKXt2YXIgdGltZT1uZXcgRGF0ZSgpO312YXIgbWV0YT0oJC5tZXRhZGF0YSk/dHJ1ZTpmYWxzZTt2YXIgaGVhZGVyX2luZGV4PWNvbXB1dGVUYWJsZUhlYWRlckNlbGxJbmRleGVzKHRhYmxlKTskdGFibGVIZWFkZXJzPSQodGFibGUuY29uZmlnLnNlbGVjdG9ySGVhZGVycyx0YWJsZSkuZWFjaChmdW5jdGlvbihpbmRleCl7dGhpcy5jb2x1bW49aGVhZGVyX2luZGV4W3RoaXMucGFyZW50Tm9kZS5yb3dJbmRleCsiLSIrdGhpcy5jZWxsSW5kZXhdO3RoaXMub3JkZXI9Zm9ybWF0U29ydGluZ09yZGVyKHRhYmxlLmNvbmZpZy5zb3J0SW5pdGlhbE9yZGVyKTt0aGlzLmNvdW50PXRoaXMub3JkZXI7aWYoY2hlY2tIZWFkZXJNZXRhZGF0YSh0aGlzKXx8Y2hlY2tIZWFkZXJPcHRpb25zKHRhYmxlLGluZGV4KSl0aGlzLnNvcnREaXNhYmxlZD10cnVlO2lmKGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsaW5kZXgpKXRoaXMub3JkZXI9dGhpcy5sb2NrZWRPcmRlcj1jaGVja0hlYWRlck9wdGlvbnNTb3J0aW5nTG9ja2VkKHRhYmxlLGluZGV4KTtpZighdGhpcy5zb3J0RGlzYWJsZWQpe3ZhciAkdGg9JCh0aGlzKS5hZGRDbGFzcyh0YWJsZS5jb25maWcuY3NzSGVhZGVyKTtpZih0YWJsZS5jb25maWcub25SZW5kZXJIZWFkZXIpdGFibGUuY29uZmlnLm9uUmVuZGVySGVhZGVyLmFwcGx5KCR0aCk7fXRhYmxlLmNvbmZpZy5oZWFkZXJMaXN0W2luZGV4XT10aGlzO30pO2lmKHRhYmxlLmNvbmZpZy5kZWJ1Zyl7YmVuY2htYXJrKCJCdWlsdCBoZWFkZXJzOiIsdGltZSk7bG9nKCR0YWJsZUhlYWRlcnMpO31yZXR1cm4gJHRhYmxlSGVhZGVyczt9O2Z1bmN0aW9uIGNvbXB1dGVUYWJsZUhlYWRlckNlbGxJbmRleGVzKHQpe3ZhciBtYXRyaXg9W107dmFyIGxvb2t1cD17fTt2YXIgdGhlYWQ9dC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnVEhFQUQnKVswXTt2YXIgdHJzPXRoZWFkLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdUUicpO2Zvcih2YXIgaT0wO2k8dHJzLmxlbmd0aDtpKyspe3ZhciBjZWxscz10cnNbaV0uY2VsbHM7Zm9yKHZhciBqPTA7ajxjZWxscy5sZW5ndGg7aisrKXt2YXIgYz1jZWxsc1tqXTt2YXIgcm93SW5kZXg9Yy5wYXJlbnROb2RlLnJvd0luZGV4O3ZhciBjZWxsSWQ9cm93SW5kZXgrIi0iK2MuY2VsbEluZGV4O3ZhciByb3dTcGFuPWMucm93U3Bhbnx8MTt2YXIgY29sU3Bhbj1jLmNvbFNwYW58fDEKdmFyIGZpcnN0QXZhaWxDb2w7aWYodHlwZW9mKG1hdHJpeFtyb3dJbmRleF0pPT0idW5kZWZpbmVkIil7bWF0cml4W3Jvd0luZGV4XT1bXTt9Zm9yKHZhciBrPTA7azxtYXRyaXhbcm93SW5kZXhdLmxlbmd0aCsxO2srKyl7aWYodHlwZW9mKG1hdHJpeFtyb3dJbmRleF1ba10pPT0idW5kZWZpbmVkIil7Zmlyc3RBdmFpbENvbD1rO2JyZWFrO319bG9va3VwW2NlbGxJZF09Zmlyc3RBdmFpbENvbDtmb3IodmFyIGs9cm93SW5kZXg7azxyb3dJbmRleCtyb3dTcGFuO2srKyl7aWYodHlwZW9mKG1hdHJpeFtrXSk9PSJ1bmRlZmluZWQiKXttYXRyaXhba109W107fXZhciBtYXRyaXhyb3c9bWF0cml4W2tdO2Zvcih2YXIgbD1maXJzdEF2YWlsQ29sO2w8Zmlyc3RBdmFpbENvbCtjb2xTcGFuO2wrKyl7bWF0cml4cm93W2xdPSJ4Ijt9fX19cmV0dXJuIGxvb2t1cDt9ZnVuY3Rpb24gY2hlY2tDZWxsQ29sU3Bhbih0YWJsZSxyb3dzLHJvdyl7dmFyIGFycj1bXSxyPXRhYmxlLnRIZWFkLnJvd3MsYz1yW3Jvd10uY2VsbHM7Zm9yKHZhciBpPTA7aTxjLmxlbmd0aDtpKyspe3ZhciBjZWxsPWNbaV07aWYoY2VsbC5jb2xTcGFuPjEpe2Fycj1hcnIuY29uY2F0KGNoZWNrQ2VsbENvbFNwYW4odGFibGUsaGVhZGVyQXJyLHJvdysrKSk7fWVsc2V7aWYodGFibGUudEhlYWQubGVuZ3RoPT0xfHwoY2VsbC5yb3dTcGFuPjF8fCFyW3JvdysxXSkpe2Fyci5wdXNoKGNlbGwpO319fXJldHVybiBhcnI7fTtmdW5jdGlvbiBjaGVja0hlYWRlck1ldGFkYXRhKGNlbGwpe2lmKCgkLm1ldGFkYXRhKSYmKCQoY2VsbCkubWV0YWRhdGEoKS5zb3J0ZXI9PT1mYWxzZSkpe3JldHVybiB0cnVlO307cmV0dXJuIGZhbHNlO31mdW5jdGlvbiBjaGVja0hlYWRlck9wdGlvbnModGFibGUsaSl7aWYoKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldKSYmKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLnNvcnRlcj09PWZhbHNlKSl7cmV0dXJuIHRydWU7fTtyZXR1cm4gZmFsc2U7fWZ1bmN0aW9uIGNoZWNrSGVhZGVyT3B0aW9uc1NvcnRpbmdMb2NrZWQodGFibGUsaSl7aWYoKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldKSYmKHRhYmxlLmNvbmZpZy5oZWFkZXJzW2ldLmxvY2tlZE9yZGVyKSlyZXR1cm4gdGFibGUuY29uZmlnLmhlYWRlcnNbaV0ubG9ja2VkT3JkZXI7cmV0dXJuIGZhbHNlO31mdW5jdGlvbiBhcHBseVdpZGdldCh0YWJsZSl7dmFyIGM9dGFibGUuY29uZmlnLndpZGdldHM7dmFyIGw9Yy5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7Z2V0V2lkZ2V0QnlJZChjW2ldKS5mb3JtYXQodGFibGUpO319ZnVuY3Rpb24gZ2V0V2lkZ2V0QnlJZChuYW1lKXt2YXIgbD13aWRnZXRzLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZih3aWRnZXRzW2ldLmlkLnRvTG93ZXJDYXNlKCk9PW5hbWUudG9Mb3dlckNhc2UoKSl7cmV0dXJuIHdpZGdldHNbaV07fX19O2Z1bmN0aW9uIGZvcm1hdFNvcnRpbmdPcmRlcih2KXtpZih0eXBlb2YodikhPSJOdW1iZXIiKXtyZXR1cm4odi50b0xvd2VyQ2FzZSgpPT0iZGVzYyIpPzE6MDt9ZWxzZXtyZXR1cm4odj09MSk/MTowO319ZnVuY3Rpb24gaXNWYWx1ZUluQXJyYXkodixhKXt2YXIgbD1hLmxlbmd0aDtmb3IodmFyIGk9MDtpPGw7aSsrKXtpZihhW2ldWzBdPT12KXtyZXR1cm4gdHJ1ZTt9fXJldHVybiBmYWxzZTt9ZnVuY3Rpb24gc2V0SGVhZGVyc0Nzcyh0YWJsZSwkaGVhZGVycyxsaXN0LGNzcyl7JGhlYWRlcnMucmVtb3ZlQ2xhc3MoY3NzWzBdKS5yZW1vdmVDbGFzcyhjc3NbMV0pO3ZhciBoPVtdOyRoZWFkZXJzLmVhY2goZnVuY3Rpb24ob2Zmc2V0KXtpZighdGhpcy5zb3J0RGlzYWJsZWQpe2hbdGhpcy5jb2x1bW5dPSQodGhpcyk7fX0pO3ZhciBsPWxpc3QubGVuZ3RoO2Zvcih2YXIgaT0wO2k8bDtpKyspe2hbbGlzdFtpXVswXV0uYWRkQ2xhc3MoY3NzW2xpc3RbaV1bMV1dKTt9fWZ1bmN0aW9uIGZpeENvbHVtbldpZHRoKHRhYmxlLCRoZWFkZXJzKXt2YXIgYz10YWJsZS5jb25maWc7aWYoYy53aWR0aEZpeGVkKXt2YXIgY29sZ3JvdXA9JCgnPGNvbGdyb3VwPicpOyQoInRyOmZpcnN0IHRkIix0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uKCl7Y29sZ3JvdXAuYXBwZW5kKCQoJzxjb2w+JykuY3NzKCd3aWR0aCcsJCh0aGlzKS53aWR0aCgpKSk7fSk7JCh0YWJsZSkucHJlcGVuZChjb2xncm91cCk7fTt9ZnVuY3Rpb24gdXBkYXRlSGVhZGVyU29ydENvdW50KHRhYmxlLHNvcnRMaXN0KXt2YXIgYz10YWJsZS5jb25maWcsbD1zb3J0TGlzdC5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIHM9c29ydExpc3RbaV0sbz1jLmhlYWRlckxpc3Rbc1swXV07by5jb3VudD1zWzFdO28uY291bnQrKzt9fWZ1bmN0aW9uIG11bHRpc29ydCh0YWJsZSxzb3J0TGlzdCxjYWNoZSl7aWYodGFibGUuY29uZmlnLmRlYnVnKXt2YXIgc29ydFRpbWU9bmV3IERhdGUoKTt9dmFyIGR5bmFtaWNFeHA9InZhciBzb3J0V3JhcHBlciA9IGZ1bmN0aW9uKGEsYikgeyIsbD1zb3J0TGlzdC5sZW5ndGg7Zm9yKHZhciBpPTA7aTxsO2krKyl7dmFyIGM9c29ydExpc3RbaV1bMF07dmFyIG9yZGVyPXNvcnRMaXN0W2ldWzFdO3ZhciBzPSh0YWJsZS5jb25maWcucGFyc2Vyc1tjXS50eXBlPT0idGV4dCIpPygob3JkZXI9PTApP21ha2VTb3J0RnVuY3Rpb24oInRleHQiLCJhc2MiLGMpOm1ha2VTb3J0RnVuY3Rpb24oInRleHQiLCJkZXNjIixjKSk6KChvcmRlcj09MCk/bWFrZVNvcnRGdW5jdGlvbigibnVtZXJpYyIsImFzYyIsYyk6bWFrZVNvcnRGdW5jdGlvbigibnVtZXJpYyIsImRlc2MiLGMpKTt2YXIgZT0iZSIraTtkeW5hbWljRXhwKz0idmFyICIrZSsiID0gIitzO2R5bmFtaWNFeHArPSJpZigiK2UrIikgeyByZXR1cm4gIitlKyI7IH0gIjtkeW5hbWljRXhwKz0iZWxzZSB7ICI7fXZhciBvcmdPcmRlckNvbD1jYWNoZS5ub3JtYWxpemVkWzBdLmxlbmd0aC0xO2R5bmFtaWNFeHArPSJyZXR1cm4gYVsiK29yZ09yZGVyQ29sKyJdLWJbIitvcmdPcmRlckNvbCsiXTsiO2Zvcih2YXIgaT0wO2k8bDtpKyspe2R5bmFtaWNFeHArPSJ9OyAiO31keW5hbWljRXhwKz0icmV0dXJuIDA7ICI7ZHluYW1pY0V4cCs9In07ICI7aWYodGFibGUuY29uZmlnLmRlYnVnKXtiZW5jaG1hcmsoIkV2YWxpbmcgZXhwcmVzc2lvbjoiK2R5bmFtaWNFeHAsbmV3IERhdGUoKSk7fWV2YWwoZHluYW1pY0V4cCk7Y2FjaGUubm9ybWFsaXplZC5zb3J0KHNvcnRXcmFwcGVyKTtpZih0YWJsZS5jb25maWcuZGVidWcpe2JlbmNobWFyaygiU29ydGluZyBvbiAiK3NvcnRMaXN0LnRvU3RyaW5nKCkrIiBhbmQgZGlyICIrb3JkZXIrIiB0aW1lOiIsc29ydFRpbWUpO31yZXR1cm4gY2FjaGU7fTtmdW5jdGlvbiBtYWtlU29ydEZ1bmN0aW9uKHR5cGUsZGlyZWN0aW9uLGluZGV4KXt2YXIgYT0iYVsiK2luZGV4KyJdIixiPSJiWyIraW5kZXgrIl0iO2lmKHR5cGU9PSd0ZXh0JyYmZGlyZWN0aW9uPT0nYXNjJyl7cmV0dXJuIigiK2ErIiA9PSAiK2IrIiA/IDAgOiAoIithKyIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAoIithKyIgPCAiK2IrIikgPyAtMSA6IDEgKSkpOyI7fWVsc2UgaWYodHlwZT09J3RleHQnJiZkaXJlY3Rpb249PSdkZXNjJyl7cmV0dXJuIigiK2ErIiA9PSAiK2IrIiA/IDAgOiAoIithKyIgPT09IG51bGwgPyBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPT09IG51bGwgPyBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkgOiAoIitiKyIgPCAiK2ErIikgPyAtMSA6IDEgKSkpOyI7fWVsc2UgaWYodHlwZT09J251bWVyaWMnJiZkaXJlY3Rpb249PSdhc2MnKXtyZXR1cm4iKCIrYSsiID09PSBudWxsICYmICIrYisiID09PSBudWxsKSA/IDAgOigiK2ErIiA9PT0gbnVsbCA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6ICgiK2IrIiA9PT0gbnVsbCA/IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA6ICIrYSsiIC0gIitiKyIpKTsiO31lbHNlIGlmKHR5cGU9PSdudW1lcmljJyYmZGlyZWN0aW9uPT0nZGVzYycpe3JldHVybiIoIithKyIgPT09IG51bGwgJiYgIitiKyIgPT09IG51bGwpID8gMCA6KCIrYSsiID09PSBudWxsID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogKCIrYisiID09PSBudWxsID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDogIitiKyIgLSAiK2ErIikpOyI7fX07ZnVuY3Rpb24gbWFrZVNvcnRUZXh0KGkpe3JldHVybiIoKGFbIitpKyJdIDwgYlsiK2krIl0pID8gLTEgOiAoKGFbIitpKyJdID4gYlsiK2krIl0pID8gMSA6IDApKTsiO307ZnVuY3Rpb24gbWFrZVNvcnRUZXh0RGVzYyhpKXtyZXR1cm4iKChiWyIraSsiXSA8IGFbIitpKyJdKSA/IC0xIDogKChiWyIraSsiXSA+IGFbIitpKyJdKSA/IDEgOiAwKSk7Ijt9O2Z1bmN0aW9uIG1ha2VTb3J0TnVtZXJpYyhpKXtyZXR1cm4iYVsiK2krIl0tYlsiK2krIl07Ijt9O2Z1bmN0aW9uIG1ha2VTb3J0TnVtZXJpY0Rlc2MoaSl7cmV0dXJuImJbIitpKyJdLWFbIitpKyJdOyI7fTtmdW5jdGlvbiBzb3J0VGV4dChhLGIpe2lmKHRhYmxlLmNvbmZpZy5zb3J0TG9jYWxlQ29tcGFyZSlyZXR1cm4gYS5sb2NhbGVDb21wYXJlKGIpO3JldHVybigoYTxiKT8tMTooKGE+Yik/MTowKSk7fTtmdW5jdGlvbiBzb3J0VGV4dERlc2MoYSxiKXtpZih0YWJsZS5jb25maWcuc29ydExvY2FsZUNvbXBhcmUpcmV0dXJuIGIubG9jYWxlQ29tcGFyZShhKTtyZXR1cm4oKGI8YSk/LTE6KChiPmEpPzE6MCkpO307ZnVuY3Rpb24gc29ydE51bWVyaWMoYSxiKXtyZXR1cm4gYS1iO307ZnVuY3Rpb24gc29ydE51bWVyaWNEZXNjKGEsYil7cmV0dXJuIGItYTt9O2Z1bmN0aW9uIGdldENhY2hlZFNvcnRUeXBlKHBhcnNlcnMsaSl7cmV0dXJuIHBhcnNlcnNbaV0udHlwZTt9O3RoaXMuY29uc3RydWN0PWZ1bmN0aW9uKHNldHRpbmdzKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7aWYoIXRoaXMudEhlYWR8fCF0aGlzLnRCb2RpZXMpcmV0dXJuO3ZhciAkdGhpcywkZG9jdW1lbnQsJGhlYWRlcnMsY2FjaGUsY29uZmlnLHNoaWZ0RG93bj0wLHNvcnRPcmRlcjt0aGlzLmNvbmZpZz17fTtjb25maWc9JC5leHRlbmQodGhpcy5jb25maWcsJC50YWJsZXNvcnRlci5kZWZhdWx0cyxzZXR0aW5ncyk7JHRoaXM9JCh0aGlzKTskLmRhdGEodGhpcywidGFibGVzb3J0ZXIiLGNvbmZpZyk7JGhlYWRlcnM9YnVpbGRIZWFkZXJzKHRoaXMpO3RoaXMuY29uZmlnLnBhcnNlcnM9YnVpbGRQYXJzZXJDYWNoZSh0aGlzLCRoZWFkZXJzKTtjYWNoZT1idWlsZENhY2hlKHRoaXMpO3ZhciBzb3J0Q1NTPVtjb25maWcuY3NzRGVzYyxjb25maWcuY3NzQXNjXTtmaXhDb2x1bW5XaWR0aCh0aGlzKTskaGVhZGVycy5jbGljayhmdW5jdGlvbihlKXt2YXIgdG90YWxSb3dzPSgkdGhpc1swXS50Qm9kaWVzWzBdJiYkdGhpc1swXS50Qm9kaWVzWzBdLnJvd3MubGVuZ3RoKXx8MDtpZighdGhpcy5zb3J0RGlzYWJsZWQmJnRvdGFsUm93cz4wKXskdGhpcy50cmlnZ2VyKCJzb3J0U3RhcnQiKTt2YXIgJGNlbGw9JCh0aGlzKTt2YXIgaT10aGlzLmNvbHVtbjt0aGlzLm9yZGVyPXRoaXMuY291bnQrKyUyO2lmKHRoaXMubG9ja2VkT3JkZXIpdGhpcy5vcmRlcj10aGlzLmxvY2tlZE9yZGVyO2lmKCFlW2NvbmZpZy5zb3J0TXVsdGlTb3J0S2V5XSl7Y29uZmlnLnNvcnRMaXN0PVtdO2lmKGNvbmZpZy5zb3J0Rm9yY2UhPW51bGwpe3ZhciBhPWNvbmZpZy5zb3J0Rm9yY2U7Zm9yKHZhciBqPTA7ajxhLmxlbmd0aDtqKyspe2lmKGFbal1bMF0hPWkpe2NvbmZpZy5zb3J0TGlzdC5wdXNoKGFbal0pO319fWNvbmZpZy5zb3J0TGlzdC5wdXNoKFtpLHRoaXMub3JkZXJdKTt9ZWxzZXtpZihpc1ZhbHVlSW5BcnJheShpLGNvbmZpZy5zb3J0TGlzdCkpe2Zvcih2YXIgaj0wO2o8Y29uZmlnLnNvcnRMaXN0Lmxlbmd0aDtqKyspe3ZhciBzPWNvbmZpZy5zb3J0TGlzdFtqXSxvPWNvbmZpZy5oZWFkZXJMaXN0W3NbMF1dO2lmKHNbMF09PWkpe28uY291bnQ9c1sxXTtvLmNvdW50Kys7c1sxXT1vLmNvdW50JTI7fX19ZWxzZXtjb25maWcuc29ydExpc3QucHVzaChbaSx0aGlzLm9yZGVyXSk7fX07c2V0VGltZW91dChmdW5jdGlvbigpe3NldEhlYWRlcnNDc3MoJHRoaXNbMF0sJGhlYWRlcnMsY29uZmlnLnNvcnRMaXN0LHNvcnRDU1MpO2FwcGVuZFRvVGFibGUoJHRoaXNbMF0sbXVsdGlzb3J0KCR0aGlzWzBdLGNvbmZpZy5zb3J0TGlzdCxjYWNoZSkpO30sMSk7cmV0dXJuIGZhbHNlO319KS5tb3VzZWRvd24oZnVuY3Rpb24oKXtpZihjb25maWcuY2FuY2VsU2VsZWN0aW9uKXt0aGlzLm9uc2VsZWN0c3RhcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gZmFsc2V9O3JldHVybiBmYWxzZTt9fSk7JHRoaXMuYmluZCgidXBkYXRlIixmdW5jdGlvbigpe3ZhciBtZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXttZS5jb25maWcucGFyc2Vycz1idWlsZFBhcnNlckNhY2hlKG1lLCRoZWFkZXJzKTtjYWNoZT1idWlsZENhY2hlKG1lKTt9LDEpO30pLmJpbmQoInVwZGF0ZUNlbGwiLGZ1bmN0aW9uKGUsY2VsbCl7dmFyIGNvbmZpZz10aGlzLmNvbmZpZzt2YXIgcG9zPVsoY2VsbC5wYXJlbnROb2RlLnJvd0luZGV4LTEpLGNlbGwuY2VsbEluZGV4XTtjYWNoZS5ub3JtYWxpemVkW3Bvc1swXV1bcG9zWzFdXT1jb25maWcucGFyc2Vyc1twb3NbMV1dLmZvcm1hdChnZXRFbGVtZW50VGV4dChjb25maWcsY2VsbCksY2VsbCk7fSkuYmluZCgic29ydG9uIixmdW5jdGlvbihlLGxpc3QpeyQodGhpcykudHJpZ2dlcigic29ydFN0YXJ0Iik7Y29uZmlnLnNvcnRMaXN0PWxpc3Q7dmFyIHNvcnRMaXN0PWNvbmZpZy5zb3J0TGlzdDt1cGRhdGVIZWFkZXJTb3J0Q291bnQodGhpcyxzb3J0TGlzdCk7c2V0SGVhZGVyc0Nzcyh0aGlzLCRoZWFkZXJzLHNvcnRMaXN0LHNvcnRDU1MpO2FwcGVuZFRvVGFibGUodGhpcyxtdWx0aXNvcnQodGhpcyxzb3J0TGlzdCxjYWNoZSkpO30pLmJpbmQoImFwcGVuZENhY2hlIixmdW5jdGlvbigpe2FwcGVuZFRvVGFibGUodGhpcyxjYWNoZSk7fSkuYmluZCgiYXBwbHlXaWRnZXRJZCIsZnVuY3Rpb24oZSxpZCl7Z2V0V2lkZ2V0QnlJZChpZCkuZm9ybWF0KHRoaXMpO30pLmJpbmQoImFwcGx5V2lkZ2V0cyIsZnVuY3Rpb24oKXthcHBseVdpZGdldCh0aGlzKTt9KTtpZigkLm1ldGFkYXRhJiYoJCh0aGlzKS5tZXRhZGF0YSgpJiYkKHRoaXMpLm1ldGFkYXRhKCkuc29ydGxpc3QpKXtjb25maWcuc29ydExpc3Q9JCh0aGlzKS5tZXRhZGF0YSgpLnNvcnRsaXN0O31pZihjb25maWcuc29ydExpc3QubGVuZ3RoPjApeyR0aGlzLnRyaWdnZXIoInNvcnRvbiIsW2NvbmZpZy5zb3J0TGlzdF0pO31hcHBseVdpZGdldCh0aGlzKTt9KTt9O3RoaXMuYWRkUGFyc2VyPWZ1bmN0aW9uKHBhcnNlcil7dmFyIGw9cGFyc2Vycy5sZW5ndGgsYT10cnVlO2Zvcih2YXIgaT0wO2k8bDtpKyspe2lmKHBhcnNlcnNbaV0uaWQudG9Mb3dlckNhc2UoKT09cGFyc2VyLmlkLnRvTG93ZXJDYXNlKCkpe2E9ZmFsc2U7fX1pZihhKXtwYXJzZXJzLnB1c2gocGFyc2VyKTt9O307dGhpcy5hZGRXaWRnZXQ9ZnVuY3Rpb24od2lkZ2V0KXt3aWRnZXRzLnB1c2god2lkZ2V0KTt9O3RoaXMuZm9ybWF0RmxvYXQ9ZnVuY3Rpb24ocyl7dmFyIGk9cGFyc2VGbG9hdChzKTtyZXR1cm4oaXNOYU4oaSkpPzA6aTt9O3RoaXMuZm9ybWF0SW50PWZ1bmN0aW9uKHMpe3ZhciBpPXBhcnNlSW50KHMpO3JldHVybihpc05hTihpKSk/MDppO307dGhpcy5pc0RpZ2l0PWZ1bmN0aW9uKHMsY29uZmlnKXtyZXR1cm4vXlstK10/XGQqJC8udGVzdCgkLnRyaW0ocy5yZXBsYWNlKC9bLC4nXS9nLCcnKSkpO307dGhpcy5jbGVhclRhYmxlQm9keT1mdW5jdGlvbih0YWJsZSl7aWYoJC5icm93c2VyLm1zaWUpe2Z1bmN0aW9uIGVtcHR5KCl7d2hpbGUodGhpcy5maXJzdENoaWxkKXRoaXMucmVtb3ZlQ2hpbGQodGhpcy5maXJzdENoaWxkKTt9ZW1wdHkuYXBwbHkodGFibGUudEJvZGllc1swXSk7fWVsc2V7dGFibGUudEJvZGllc1swXS5pbm5lckhUTUw9IiI7fX07fX0pOyQuZm4uZXh0ZW5kKHt0YWJsZXNvcnRlcjokLnRhYmxlc29ydGVyLmNvbnN0cnVjdH0pO3ZhciB0cz0kLnRhYmxlc29ydGVyO3RzLmFkZFBhcnNlcih7aWQ6InRleHQiLGlzOmZ1bmN0aW9uKHMpe3JldHVybiB0cnVlO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiAkLnRyaW0ocy50b0xvY2FsZUxvd2VyQ2FzZSgpKTt9LHR5cGU6InRleHQifSk7dHMuYWRkUGFyc2VyKHtpZDoiZGlnaXQiLGlzOmZ1bmN0aW9uKHMsdGFibGUpe3ZhciBjPXRhYmxlLmNvbmZpZztyZXR1cm4gJC50YWJsZXNvcnRlci5pc0RpZ2l0KHMsYyk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocyk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6ImN1cnJlbmN5IixpczpmdW5jdGlvbihzKXtyZXR1cm4vXlvCoyTigqw/Ll0vLnRlc3Qocyk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQocy5yZXBsYWNlKG5ldyBSZWdFeHAoL1vCoyTigqxdL2cpLCIiKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6ImlwQWRkcmVzcyIsaXM6ZnVuY3Rpb24ocyl7cmV0dXJuL15cZHsyLDN9W1wuXVxkezIsM31bXC5dXGR7MiwzfVtcLl1cZHsyLDN9JC8udGVzdChzKTt9LGZvcm1hdDpmdW5jdGlvbihzKXt2YXIgYT1zLnNwbGl0KCIuIikscj0iIixsPWEubGVuZ3RoO2Zvcih2YXIgaT0wO2k8bDtpKyspe3ZhciBpdGVtPWFbaV07aWYoaXRlbS5sZW5ndGg9PTIpe3IrPSIwIitpdGVtO31lbHNle3IrPWl0ZW07fX1yZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChyKTt9LHR5cGU6Im51bWVyaWMifSk7dHMuYWRkUGFyc2VyKHtpZDoidXJsIixpczpmdW5jdGlvbihzKXtyZXR1cm4vXihodHRwcz98ZnRwfGZpbGUpOlwvXC8kLy50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiBqUXVlcnkudHJpbShzLnJlcGxhY2UobmV3IFJlZ0V4cCgvKGh0dHBzP3xmdHB8ZmlsZSk6XC9cLy8pLCcnKSk7fSx0eXBlOiJ0ZXh0In0pO3RzLmFkZFBhcnNlcih7aWQ6Imlzb0RhdGUiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9eXGR7NH1bXC8tXVxkezEsMn1bXC8tXVxkezEsMn0kLy50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMpe3JldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KChzIT0iIik/bmV3IERhdGUocy5yZXBsYWNlKG5ldyBSZWdFeHAoLy0vZyksIi8iKSkuZ2V0VGltZSgpOiIwIik7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6InBlcmNlbnQiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9cJSQvLnRlc3QoJC50cmltKHMpKTt9LGZvcm1hdDpmdW5jdGlvbihzKXtyZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChzLnJlcGxhY2UobmV3IFJlZ0V4cCgvJS9nKSwiIikpO30sdHlwZToibnVtZXJpYyJ9KTt0cy5hZGRQYXJzZXIoe2lkOiJ1c0xvbmdEYXRlIixpczpmdW5jdGlvbihzKXtyZXR1cm4gcy5tYXRjaChuZXcgUmVnRXhwKC9eW0EtWmEtel17MywxMH1cLj8gWzAtOV17MSwyfSwgKFswLTldezR9fCc/WzAtOV17Mn0pICgoWzAtMl0/WzAtOV06WzAtNV1bMC05XSl8KFswLTFdP1swLTldOlswLTVdWzAtOV1ccyhBTXxQTSkpKSQvKSk7fSxmb3JtYXQ6ZnVuY3Rpb24ocyl7cmV0dXJuICQudGFibGVzb3J0ZXIuZm9ybWF0RmxvYXQobmV3IERhdGUocykuZ2V0VGltZSgpKTt9LHR5cGU6Im51bWVyaWMifSk7dHMuYWRkUGFyc2VyKHtpZDoic2hvcnREYXRlIixpczpmdW5jdGlvbihzKXtyZXR1cm4vXGR7MSwyfVtcL1wtXVxkezEsMn1bXC9cLV1cZHsyLDR9Ly50ZXN0KHMpO30sZm9ybWF0OmZ1bmN0aW9uKHMsdGFibGUpe3ZhciBjPXRhYmxlLmNvbmZpZztzPXMucmVwbGFjZSgvXC0vZywiLyIpO2lmKGMuZGF0ZUZvcm1hdD09InVzIil7cz1zLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCIkMy8kMS8kMiIpO31lbHNlIGlmKGMuZGF0ZUZvcm1hdD09InVrIil7cz1zLnJlcGxhY2UoLyhcZHsxLDJ9KVtcL1wtXShcZHsxLDJ9KVtcL1wtXShcZHs0fSkvLCIkMy8kMi8kMSIpO31lbHNlIGlmKGMuZGF0ZUZvcm1hdD09ImRkL21tL3l5Inx8Yy5kYXRlRm9ybWF0PT0iZGQtbW0teXkiKXtzPXMucmVwbGFjZSgvKFxkezEsMn0pW1wvXC1dKFxkezEsMn0pW1wvXC1dKFxkezJ9KS8sIiQxLyQyLyQzIik7fXJldHVybiAkLnRhYmxlc29ydGVyLmZvcm1hdEZsb2F0KG5ldyBEYXRlKHMpLmdldFRpbWUoKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6InRpbWUiLGlzOmZ1bmN0aW9uKHMpe3JldHVybi9eKChbMC0yXT9bMC05XTpbMC01XVswLTldKXwoWzAtMV0/WzAtOV06WzAtNV1bMC05XVxzKGFtfHBtKSkpJC8udGVzdChzKTt9LGZvcm1hdDpmdW5jdGlvbihzKXtyZXR1cm4gJC50YWJsZXNvcnRlci5mb3JtYXRGbG9hdChuZXcgRGF0ZSgiMjAwMC8wMS8wMSAiK3MpLmdldFRpbWUoKSk7fSx0eXBlOiJudW1lcmljIn0pO3RzLmFkZFBhcnNlcih7aWQ6Im1ldGFkYXRhIixpczpmdW5jdGlvbihzKXtyZXR1cm4gZmFsc2U7fSxmb3JtYXQ6ZnVuY3Rpb24ocyx0YWJsZSxjZWxsKXt2YXIgYz10YWJsZS5jb25maWcscD0oIWMucGFyc2VyTWV0YWRhdGFOYW1lKT8nc29ydFZhbHVlJzpjLnBhcnNlck1ldGFkYXRhTmFtZTtyZXR1cm4gJChjZWxsKS5tZXRhZGF0YSgpW3BdO30sdHlwZToibnVtZXJpYyJ9KTt0cy5hZGRXaWRnZXQoe2lkOiJ6ZWJyYSIsZm9ybWF0OmZ1bmN0aW9uKHRhYmxlKXtpZih0YWJsZS5jb25maWcuZGVidWcpe3ZhciB0aW1lPW5ldyBEYXRlKCk7fXZhciAkdHIscm93PS0xLG9kZDskKCJ0cjp2aXNpYmxlIix0YWJsZS50Qm9kaWVzWzBdKS5lYWNoKGZ1bmN0aW9uKGkpeyR0cj0kKHRoaXMpO2lmKCEkdHIuaGFzQ2xhc3ModGFibGUuY29uZmlnLmNzc0NoaWxkUm93KSlyb3crKztvZGQ9KHJvdyUyPT0wKTskdHIucmVtb3ZlQ2xhc3ModGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQ/MDoxXSkuYWRkQ2xhc3ModGFibGUuY29uZmlnLndpZGdldFplYnJhLmNzc1tvZGQ/MTowXSl9KTtpZih0YWJsZS5jb25maWcuZGVidWcpeyQudGFibGVzb3J0ZXIuYmVuY2htYXJrKCJBcHBseWluZyBaZWJyYSB3aWRnZXQiLHRpbWUpO319fSk7fSkoalF1ZXJ5KTs=]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/asc.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjB+gC+jP2ptn0WskLQA7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/bg.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAJAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAkAAAIXjI+AywnaYnhUMoqt3gZXPmVg94yJVQAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/blue.zip</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UEsDBBQAAAAIAKV7DjcyBouJNQAAADYAAAAHAAAAYXNjLmdpZnP3dLOwTBRlYGFoYGBQ1jX4//+/4k8WRgYGRgYdBiAAyTAw8fbIL+B+cf7W7PSL2Sq6DNYAUEsDBBQAAAAIAKV7DjfeZTDnPwAAAEAAAAAGAAAAYmcuZ2lmc/d0s7BMFGXgZGhgYFDWNfj//7/iTxZGBgZGBh0GIADJMDCJ9/Q3nOa8lVQRYtS19h5buF1qwveezlAGBmsAUEsDBBQAAAAIAKV7Dje24DEINQAAADYAAAAIAAAAZGVzYy5naWZz93SzsEwUZWBhaGBgUNY1+P//v+JPFkYGBkYGHQYgAMkwMPH29DOeXLthTnOIUVckI4M1AFBLAwQUAAAACAAQCRA3k/FDzkoBAACQAwAACQAAAHN0eWxlLmNzc51S707CMBD/DE/RhJgokbFFJaR8FPcCxgfo1q67WHpNdwhofHdbNxIJGyHuvlzvmt+/bj5lJAqjGjadj3+7pD2jJ+XZ13hUoaVZJTZgDlx4EGY1HhWifNcet1bOSjToOZs8r2OF3UZ4DZZnqduz1BHLntx+1cE08Kk4WzoKgx1IqjnL0vQmnEjtaSYMaMuZUVW48N0jh2olJKPY3LOedYVI7Toq71GpFi/hiw7QSxUmWVDZoAHJJnme9+l0QkqwmrPH6OOiqiQ2bWp/uGEjdEDbenNb6ERDdXeaoFdOCeLMYteerh02QIAhl1LZSOdB1/FOufVNNOUQ4nxAW4HywEhGTccQHtaxzqz15dVm8qE8QSnM8YEI3UU2n6CUHekZ6CRPQy2ui/I1jN/ccKCiKbtEr0Vb484O40n1L8Den3HISk/MS1lIuYycP1BLAQIUABQAAAAIAKV7DjcyBouJNQAAADYAAAAHAAAAAAAAAAAAIAAAAAAAAABhc2MuZ2lmUEsBAhQAFAAAAAgApXsON95lMOc/AAAAQAAAAAYAAAAAAAAAAAAgAAAAWgAAAGJnLmdpZlBLAQIUABQAAAAIAKV7Dje24DEINQAAADYAAAAIAAAAAAAAAAAAIAAAAL0AAABkZXNjLmdpZlBLAQIUABQAAAAIABAJEDeT8UPOSgEAAJADAAAJAAAAAAAAAAEAIAAAABgBAABzdHlsZS5jc3NQSwUGAAAAAAQABADWAAAAiQIAAAAA]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/desc.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhFQAEAIAAACMtMP///yH5BAEAAAEALAAAAAAVAAQAAAINjI8Bya2wnINUMopZAQA7]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/blue/style.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogdGFibGVzICovCnRhYmxlLnRhYmxlc29ydGVyIHsKCWZvbnQtZmFtaWx5OmFyaWFsOwoJYmFja2dyb3VuZC1jb2xvcjogI0NEQ0RDRDsKCW1hcmdpbjoxMHB4IDBwdCAxNXB4OwoJZm9udC1zaXplOiA4cHQ7Cgl3aWR0aDogMTAwJTsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgdGgsIHRhYmxlLnRhYmxlc29ydGVyIHRmb290IHRyIHRoIHsKCWJhY2tncm91bmQtY29sb3I6ICNlNkVFRUU7Cglib3JkZXI6IDFweCBzb2xpZCAjRkZGOwoJZm9udC1zaXplOiA4cHQ7CglwYWRkaW5nOiA0cHg7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgLmhlYWRlciB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoYmcuZ2lmKTsKCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgcmlnaHQ7CgljdXJzb3I6IHBvaW50ZXI7Cn0KdGFibGUudGFibGVzb3J0ZXIgdGJvZHkgdGQgewoJY29sb3I6ICMzRDNEM0Q7CglwYWRkaW5nOiA0cHg7CgliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGOwoJdmVydGljYWwtYWxpZ246IHRvcDsKfQp0YWJsZS50YWJsZXNvcnRlciB0Ym9keSB0ci5vZGQgdGQgewoJYmFja2dyb3VuZC1jb2xvcjojRjBGMEY2Owp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0VXAgewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKGFzYy5naWYpOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGVzYy5naWYpOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoZWFkIHRyIC5oZWFkZXJTb3J0RG93biwgdGFibGUudGFibGVzb3J0ZXIgdGhlYWQgdHIgLmhlYWRlclNvcnRVcCB7CmJhY2tncm91bmQtY29sb3I6ICM4ZGJkZDg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/asc.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAASwAAAAhCAMAAABUSmYtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMAUExURWTEbWO+ZcbGxlDMWma9cMHWslq+S1HHU32+VFq/TaG3k4bGXpGlhG+wRWOkOz3DQEmxEvb29vX19fT09PPz8+np6cHBwfj4+G5ubuvr6+3t7ebm5t/f39zc3M3NzeTk5Pb29/Hy8d/g39ra2s7OzuTk4+np6vb39vHx8eDf4M7OzdbW1uLj4tXW1vDv7+/v7+Dg3/Py8+Pi49nY2czNzdjZ2d/g4O3u7e7t7erp6c3OztHS0uPj4+/w7/Lz89bW1eDf3/Lx8dLS0dnZ2fX19urq6ePk5NHR0c3NzPf2987Nztrb2tLR0ebm5enq6eLi4vb19fPz8u/v8O3s7dvb2trb29bV1fHx8vDw7/b399jY2fHy8tnZ2N/f4M3Mzdzb3NHR0vT19OTj4+zt7dLR0unq6tva2tjZ2PDw8Nra29zc2+Xm5u/w8PLy8+3t7Pf29vX29ePj4tHS0fX09NLS0uLj49vc3O3s7NbV1u3t7uLi49nY2Pf39tXV1tXW1dva2+7t7tjY2NXV1fT09eTj5OPi4u3u7u7u7tvb3M3OzfLx8s7Nze7u7erp6s3MzNvb2/Lz8ubl5v///+Dg4PLy8uzs7erq6vLy8czMzC7ALEbITdzb2+Pk41nPaDzFP+zs7Ozt7M3NzuXl5VnPXzfDLS7AIDnEO8zhv+np6L+/v2+rSUiuCY3HaFTNWNvc22POa1SuGufn5yW9H03LV+vq6mynSFexHjzFNE6zJF63JdfX10+oF1TNYLm5ube3t7GxsUmvEkqwFqipqVHMXInFYz3FQGPOaeLh4t/e3/b19k3LTfDv8PX09dnZ2vX29szNzOPj5Ofn6MvLzGbOeGbTeE2xDmbScOfo6FDMU1nFX8/OztTU0+jo6Ojp6E23Td7e3t7e38zLzN7f3k60JDfDOeXk5GPGZmbTd2PIY0bDQkbIQlq2TcHBwkqrFkquFka/QtDR0dHR0Fq6SdPT06WmpjnEMGTSc2bRcFHDU2TSdWbRd1qySk6wJEerCMvKy8rLy45tlFkAAAbvSURBVHja7Jp3WFNXGMZvtVZtazXIte01JJcEAoEkBEJiSAJEQoAAJgwZskEEXCxBBWcVnK22Vlu1rtZqh7bVVju0tXV077333nvP7yS5qbkcjsf/892ce8/3e9+Xhy8P5Em4MBeHirqYsFBRFxMeKupixoaKuhhJqKgLPVkxvu0UCR/DS3geAC/Ibd4zHyPhXX5jm6QNLsjAU0bP4CSJWA1DKaGYnNZTDYN+DeuXj60P/nmbAwfUcnSqnyOIy32rfuxTsLwGqijRSRLxGpZSQjHx97TDMFcmJs5OTCsMT4QXsLTCQnRJDN8I58JCoIVp3n72bBATwxO9XVp4IXThs9PookQnScRrWEoJBxB/TzsM01KUkFqkS02dpdPNSigvSoCa1dJSXtSSmppQrkvQwQLaklqeoENOYDpdwpNF5ak6HV2U6CSJeA1LKaGYCD3tMEwxx3FTYbWi000X3PfyfRfcxBUXb5rHccVcK/DinVNbW4vhsWvXJq9vKkRaQeaCotw8XzsgSnSe4ctgNCylhSIi9LTDMCyrYt3TUtgrUpw37z9+3iO/PHLe8f03O1knq3KyKe6UadPcbhULBti6nSowup0sm6JiVdNOizqdKdewKjerUjnFUaKTJOI1LKWEYiL0tMMwM8ePnwQHPG44de+n20/edXL7Hx+eumG8r65Cp5kgzvQ1YPRJM33LH0U1ye8eL4oSnSQRr2EpJRQToacdhrFpkpI03R5br2bYmJfu3/rw3oe33v/imGGajt6k/g6NxpPU3eHp7++22Tyajm5Nv6ej19bba4OULen/qCdJ0+Hp7rf1oo0oSnSSRLyGpZRwABF6ymEYqcJ76KXvjhi5feuNW7ZsuXHr9pEjPpBKpSapVC2VVsNOaodVrfdZpQq7Qmq3K+yBKHJKkWL3X4OiJCdJHETDUUooJkJPOwwTATV31YyICMPddwzdsefOO/fs2DH0k7sdCCNtVcSMCF/NuH3ujLnXIXp7LWK1gWitz1MLaq3PGxwlOYkiRsNSajiA0HwXgWGYBYbmiiqH0eD4cd/vT/y8AdXeu5h9bxoMRmPzAkOFo6LK4Gh2GAwViFQ1OxwLjA4HYIMxEL3M2FxlrDJcVmE0GB0LqkRRkpMk4jUspYRiIvS0wzCy5OTkHFmNTDbkwB2v3bMHnqt7dgw/58AQmSw5pya5RrZZliODx7M1OTXoClUDm3XrcpJlgaiX5iTn+LfBUaKTJOI1LKWEYiL0tMMwcZbcXEtuVFzckFEjd8Nr1oYtH33++pejhlwfZYmKi4KS5a61REXlws7iPSEqsyApEI2Ls6yNWp0rWx1nsYAhOEp0ksRBNBylhGIi9LTDMHUZjVZrdnZ+/r/nP/TrbV+M3jv629vOfej8f+qyG611dXXWroxOa2N+ficcdZ3W/GxrZ35+dnZjV0Z2RiBq7cywdjXmdwICsTE4SnSSRLyGpZRQTISedhhGq122uDS+ND39+69uvfeV3b+9M3z3uX/dOu67xaXzS0tL58cvgpU+Pz4ePRYv1mrnpy+KXxafrtWi5Y8CiteCnq6NX6Rdpg2OEp0kcRANRymhmAg97TDMkunKyXklyvV5R2QPHP7mh8+Yc/78+vADsiNKZYlySVOeUqlsUi4BQ5OyBJzK6UCVeU1NTcq8yYGoUjm9qaQE9tMng0UZHCU6SSJew1JKOID4e9phGIVabao2SdXqx6peOHbhRUf/PnrRhcfeN75nN+kV1Xq1yaS3q00KeJMltSuulgKrhvceJvQGRB+IqvUgX63Q69V2EyBRlOQkiXgNSymhmAg97TBMtFwuj86SZ0U3PNr0xi0PnvjpxIO3RK33RMttoPTJQYCSZzWgXV90X9a2hj55tPw5bywQ7WtogF1WlnybDeGgKNFJEvEaltJCEQn0lMPAB2k2BT5DQr190PN01+Z/Nnc5PAffYt3s6SV0KWxw+aNu1ncNNtM7sSJRw1JK+D8JHuqMwzAcd/lSzsxNmGDmdu069OrHNvnzhzbtnLBiJceZV5h7lvb09KC/WXDmpbDM4DKbOdhOWIlgIAprhZnjesw9nDhKdJJEvIallHAA8fe0wzCVkZETy8piIyfGxkbGroEuEjbXllXGVlaWraks8+KyiSCjbeXG2Gs3liHHRIjRRYlOkojXsJQSionQ0w7DtBf4biAWhPk3YZmZ6NyeWRDW7t2EFRRkhj0Ou2e8oB0R5MqkjJKcJBGvDZaggmIi9JTDMBKXK2YKj259LJzi8t7HkUhc3hshroUL+ZiFkra2KbyrjedjeBcviYEuxsUjnW+ji5KdRBGvYSglFBOhpx0mdN/wbO4bhv6D4Sz+1+HSUFEXMy5U1MVcEirq+k+AAQAogBm+ic8zsgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/bg.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAASwAAAAhCAMAAABUSmYtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMAUExURWO+ZcbGxlDMWma9cMHWslq+S1HHU32+VFq/TaG3k4bGXpGlhG+wRWOkOz3DQEmxEvb29vX19fT09PPz8+np6cHBwfj4+G5ubuvr6+3t7ebm5t/f39zc3M3NzeTk5Pb29/Hy8d/g39ra2s7OzuTk4+np6vb39uDf4PHx8dbW1s7OzeLj4tXW1vDv7+/v7/Py8+Pi4+Dg39nY2czNzdjZ2d/g4O3u7e7t7erp6c3OztHS0uPj4+/w7/Lz89bW1eDf3/Lx8dLS0dnZ2fX19urq6ePk5NHR0ff2983NzM7Nztrb2tLR0enq6ebm5eLi4vb19fPz8u/v8O3s7dvb2trb29bV1fHx8vDw79jY2fHy8tnZ2Pb3983Mzd/f4Nzb3OTj49HR0vT19Ozt7dva2tLR0unq6tjZ2Nra2/Dw8Nzc2+/w8OXm5vLy8/f29vX29e3t7OPj4tHS0fX09NLS0uLj4+3s7Nvc3NbV1uLi4+3t7vf39tnY2P///9XV1tXW1dva29jY2NXV1e7t7u3u7vT09eTj5OPi4u7u7tvb3M3OzfLx8vLz8urp6s7Nzc3MzO7u7dvb2+bl5uDg4Orq6vLy8uzs7fLy8czMzOPk49zb20bITc3Nzuzs7Ozt7FnPaFnPX+Xl5TfDLTzFP163Jefn5+np6GynSEiuCWPOa1TNWEmvEo3HaG+rSU6zJNvc21exHszhv03LV+vq6r+/v9fX11SuGk+oF1TNYLm5ubGxsbe3t6ipqVHMXInFY0qwFiO8HCu/GznEMD3FQGPOad/e397f3k23TeLh4vb19vDv8PX09dnZ2szNzOfn6GbOeNTU0/X29k2xDlDMU1nFXzzFNGbScOjo6Ojp6E3LTd7e3svLzN7e38zLzFq2TeXk5GPGZk60JGPIYzfDOefo6EbDQkbIQtPT08HBwmbTeGbTd0qrFuPj5EquFs/Ozka/QtDR0dHR0Fq6ScvKy6WmpjnEO2TSc2bRcFHDU2TSdWbRd1qySk6wJEerCMrKysrLy2TEbRSCzSEAAAblSURBVHja7Jp3WFNXGMavs2rVBrm2vYbkkkAIkARISAxJgEAIhJGGIVuWgogDAUEFxS1Uu4ertqCtdldt3dpq99577733HvY7SW5qLsfj6f/5bs695/u978vDxxPyJFyYc0NFXUxYqKiLCQ8VdTGTQkVdjCRU1IV+WDG+7XQJH8NLeB4AL8it3jMfI+FdfmOrpBUuyMBTRs/gJIlYDUMpoZic0lMNg34NZ6ybNCP4+bYQDqh16DRjoSCu860Zk56A5TVQRYlOkojXsJQSiom/px2GuTgxcX5iWlF4IryApRUVoUti+EY4FxUBLUrz9vPng5gYnujt0sKLoAufn0YXJTpJIl7DUko4hPh72mGYluKE1GJdaupcnW5uQkVxAtTclpaK4pbU1IQKXYIOFtCW1IoEHXIC0+kSHi+uSNXp6KJEJ0nEa1hKCcVE6GmHYUo4jpsJqw2d7hy38/md4+7kSko2LeK4Eq4NeMl1M9vaSuAxMLDJ65sJkTaQuaAot8jXDokSnWf4MhgNS2mhiAg97TAMy6pY96wU9pIU5423nxj14M8Pjjpx+41O1smqnGyKO2XWLLdbxYIBtm6nCoxuJ8umqFjVrFOiTmfK1azKzapUTnGU6CSJeA1LKaGYCD3tMMy8KVMugAMeO47v/nzwnrvuGfz9veM7pvjqSnSaB+I8XwNGnzTPt/xRVBf43VNEUaKTJOI1LKWEYiL0tMMwNk1SkqbLY+vWjDzns8PbHuh9YNvhZ84ZqWnvTupv12g8SV3tnv7+LpvNo2nv0vR72rtt3d02SNmS/ot6kjTtnq5+WzfaiKJEJ0nEa1hKCYcQoacchpEqvIde+vpZYwa3Xd/b23v9tsExZz0slUpNUqlaKq2FndQOq1bvs0oVdoXUblfYA1HklCLF7r8GRUlOkngaDUcpoZgIPe0wTATU4vVzIiIMe28ZfkMvqhuGv7vXgTDS1kfMifDVnD2L5yy+BtE9dYjVBaJ1Pk8dqHU+b3CU5CSKGA1LqeEQQvNdBIZhlhmaK6sdRoPjk5t/e+3+++699777f7rr5M3PGgxGY/MyQ6WjstrgaHYYDJWIVDc7HMuMDgdggzEQXWVsrjZWG1ZVGg1Gx7JqUZTkJIl4DUspoZgIPe0wjCw5OTlXViOTDTt4ywsv+Z5Zo5mDw2Sy5Nya5BrZFlmuDB5P1eTWoCtUDWwuuyw3WRaIemlucq5/GxwlOkkiXsNSSigmQk87DBNvycuz5EXFxw8bP2a79zXrg49efHv8sGujLFHxUVCyvEstUVF5sLN4T4jKLEgKROPjLZdGbciTbYi3WMAQHCU6SeJpNBylhGIi9LTDMA2ZTVZrTk5BwT9jb/vl1o8n9k785tYRt439oSGnydrQ0GDtzOywNhUUdMDR0GEtyLF2FBTk5DR1ZuZkBqLWjkxrZ1NBByAQm4KjRCdJxGtYSgnFROhph2G02tUryuLK0tO/+/SO3S9v//WR0dtH/HnH5G9XlC0pKytbErccVvqSuDj0WLFCq12SvjxudVy6VouWPwooTgt6ujZuuXa1NjhKdJLE02g4SgnFROhph2FWzlZOyy9VXpF/QHbkpq++f/8k88cXNx2RHVAqS5UrG/OVSmWjciUYGpWl4FTOBqrMb2xsVOZPC0SVytmNpaWwnz0NLMrgKNFJEvEallLCIcTf0w7DKNRqU61JqlY/VP3GsbMnHPrr0ISzj71lfNNu0itq9WqTSW9XmxTwJktqV1wlBVYL7z1M6A2IPhBV60G+SqHXq+0mQKIoyUkS8RqWUkIxEXraYZhouVwenS3Pjq5/tPHr/Ufv/vHuo/ujrvBEy22g9MlBgJJn16NdX3Rf9tb6Pnm0/EtvLBDtq6+HXXa2fKsN4aAo0UkS8RqW0kIRCfSUw8AHaTYFPkNCvbrL82Tnlr+3dDo8u15h3eypJXQpbHD5o27Wdw020zuxIlHDUkr4Hwke6ozDMBx3+RrOzE2dauYGBvZ9+I5N/vS+TddNXXshx5nXmnvW9PT0oL9ZcOY1sMzgMps52E69EMFAFNZaM8f1mHs4cZToJIl4DUsp4RDi72mHYaoiIzPKy2MjM2JjI2Mvgi4SNpvLq2Krqsovqir34vIMkNG2amPs5o3lyJEBMboo0UkS8RqWUkIxEXraYZgFhb4biIVh/k1YVhY6L8gqDFvg3YQVFmaFPQa757xgASLIlUUZJTlJIl47XYIKionQUw7DSFyumOk8uvWxdLrLex9HInF5b4S4li7lY5ZKWlun865Wno/hXbwkBroYF490vpUuSnYSRbyGoZRQTISedpjQfcP/c98w9B8M/+N/Hc4PFXUxk0NFXcx5oaKufwUYADdq83MijKvrAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/desc.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAASwAAAAhCAMAAABUSmYtAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMAUExURWTEbWO+ZcbGxlDMWma9cMHWslq+S1HHU32+VFq/TaG3k4bGXpGlhG+wRWOkOz3DQEmxEvb29vX19fT09PPz8+np6cHBwfj4+G5ubuvr6+3t7ebm5t/f39zc3M3NzeTk5Pb29/Hy8d/g39ra2s7OzuTk4+np6vb39vHx8eDf4M7OzdbW1uLj4tXW1vDv7+/v7+Dg3/Py8+Pi49nY2czNzdjZ2d/g4O3u7e7t7erp6c3OztHS0uPj4+/w7/Lz89bW1eDf3/Lx8dLS0dnZ2fX19urq6ePk5NHR0c3NzPf2987Nztrb2tLR0ebm5enq6eLi4vb19fPz8u/v8O3s7dvb2trb29bV1fHx8vDw7/b399jY2fHy8tnZ2N/f4M3Mzdzb3NHR0vT19OTj4+zt7dLR0unq6tva2tjZ2PDw8Nra29zc2+Xm5u/w8PLy8+3t7Pf29vX29ePj4tHS0fX09NLS0uLj49vc3O3s7NbV1u3t7uLi49nY2Pf39tXV1tXW1dva2+7t7tjY2NXV1fT09eTj5OPi4u3u7u7u7tvb3M3OzfLx8s7Nze7u7erp6s3MzNvb2/Lz8ubl5v///+Dg4PLy8uzs7erq6vLy8czMzC7ALEbITdzb2+Pk41nPaDzFP+zs7Ozt7M3NzuXl5VnPXzfDLS7AIDnEO8zhv+np6L+/v2+rSUiuCY3HaFTNWNvc22POa1SuGufn5yW9H03LV+vq6mynSFexHjzFNE6zJF63JdfX10+oF1TNYLm5ube3t7GxsUmvEkqwFqipqVHMXInFYz3FQGPOaeLh4t/e3/b19k3LTfDv8PX09dnZ2vX29szNzOPj5Ofn6MvLzGbOeGbTeE2xDmbScOfo6FDMU1nFX8/OztTU0+jo6Ojp6E23Td7e3t7e38zLzN7f3k60JDfDOeXk5GPGZmbTd2PIY0bDQkbIQlq2TcHBwkqrFkquFka/QtDR0dHR0Fq6SdPT06WmpjnEMGTSc2bRcFHDU2TSdWbRd1qySk6wJEerCMvKy8rLy45tlFkAAAbsSURBVHja7Jp3WFNXGMavttatDXI7riG5JBAIJCEQEkMSIBICBGjCkCFbRMAFgqCCW8GqbW2LWkcLWlf30g7tdnbvvffee9t+J8lNzeV4PP6f7+bce77f+748fDyQJ+GGuTBU1MWEhYq6mPBQURczIVTUxUhCRV3ohxXj206V8DG8hOcB8ILc6j3zMRLe5Te2Slrhggw8ZfQMTpKI1TCUEorJKT3VMOjPcNrqCdOCf9/mwwG1Gp2mzRfE1b41bcLTsLwGqijRSRLxGpZSQjHx97TDMFclJs5NTCsMT4QnsLTCQnRJDN8E58JCoIVp3n7uXBATwxO9XVp4IXThc9PookQnScRrWEoJBxF/TzsM01yUkFqkS02do9PNSSgvSoCa09xcXtScmppQrkvQwQLanFqeoENOYDpdwlNF5ak6HV2U6CSJeA1LKaGYCD3tMEwxx3HTYbWg0w2jD71yaPQNXHHx5oUcV8y1AC/eMb2lpRgeO3du9vqmQ6QFZC4oyi30tYOiROcZvgxGw1JaKCJCTzsMw7Iq1j0jhb0ixXnjrYfPO/HrifMO33qjk3WyKieb4k6ZMcPtVrFggK3bqQKj28myKSpWNeOUqNOZcg2rcrMqlVMcJTpJIl7DUkooJkJPOwwze+LES+CAx65jBz/rP3rgaP+fHx3bNdFXV6PTbBBn+xow+qTZvuWPorrE754oihKdJBGvYSklFBOhpx2GsWmSkjSdHlu3Ztj5Lz+4/fi+49sffOn8YZq27qTeNo3Gk9TZ5unt7bTZPJq2Tk2vp63b1t1tg5Qt6f+oJ0nT5unstXWjjShKdJJEvIallHAQEXrKYRipwnvope+NGNm/fc+2vm17tvePHPGhVCo1SaVqqbQadlI7rGq9zypV2BVSu11hD0SRU4oUu/8aFCU5SeJpNBylhGIi9LTDMBFQC9bOiogw3HvHOQN7+/r6BgbO+fReB8JIWxsxK8JXs25fMGvBtYjeXotYbSBa6/PUglrr8wZHSU6iiNGwlBoOIjTfRWAYZrGhqaLKYTQ4frrljyd/6UO17wBzy1sGg9HYtNhQ4aioMjiaHAZDBSJVTQ7HYqPDAdhgDERXGpuqjFWGlRVGg9GxuEoUJTlJIl7DUkooJkJPOwwjS05OzpHVyGRD77zj9fv27t+/976B4UPuHCqTJefUJNfItspyZPB4rianBl2hamCzYUNOsiwQ9dKc5Bz/NjhKdJJEvIallFBMhJ52GCbOkptryY2Kixs6duRueM7atu3jL974auzQ66MsUXFRULLcyyxRUbmws3hPiMosSApE4+Isl0Wty5Wti7NYwBAcJTpJ4mk0HKWEYiL0tMMwdRkNVmt2dn7+v6Me/e22L8fvG//dbec+OupkXXaDta6uztqR0W5tyM9vh6Ou3ZqfbW3Pz8/ObujIyM4IRK3tGdaOhvx2QCA2BEeJTpKI17CUEoqJ0NMOw2i1q5aVxpemp//w9c0HX939+7vDd5/7980XfL+sdFFpaemi+KWw0hfFx6PHsmVa7aL0pfGr4tO1WrT8UUDxWtDTtfFLtau0wVGikySeRsNRSigmQk87DLN8pnJKXonyyrz7ZQ/d8+2PnzND/vrmnodk9yuVJcrljXlKpbJRuRwMjcoScCpnAlXmNTY2KvOmBKJK5czGkhLYz5wCFmVwlOgkiXgNSynhIOLvaYdhFGq1qdokVasfr3rx4THjHvjngXFjHv7A+L7dpFdU69Umk96uNingRZbUrtgoBVYNrz1M6AWIPhBV60HeqNDr1XYTIFGU5CSJeA1LKaGYCD3tMEy0XC6PzpJnRdc/1vjmTY8c+fnIIzdFXemJlttA6ZGDACXPqke7nuierOvqe+TR8ue9sUC0p74edllZ8utsCAdFiU6SiNewlBaKSKCnHAbeSLMp8B4S6p27PM90bD25tcPhuett1s2eWkKXwgaXP+pmfddgM70TKxI1LKWE/5Pgoc44DMNxl6/gzNykSWZu5867X/vEJn/h7s07Jq25lOPMa8xdK7q6utD/LDjzClhmcJnNHGwnXYpgIAprjZnjusxdnDhKdJJEvIallHAQ8fe0wzCVkZGTy8piIyfHxkbGrocuEjZbyipjKyvL1leWeXHZZJDRtnJT7JZNZcgxGWJ0UaKTJOI1LKWEYiL0tMMw8wp8NxALwvybsMxMdJ6XWRA2z7sJKyjIDHsCds96wTxEkCuTMkpykkS8droEFRQToacchpG4XDFTeXTrY8lUl/c+jkTi8t4IcS1ZwscskbS2TuVdrTwfw7t4SQx0MS4e6XwrXZTsJIp4DUMpoZgIPe0wofuGZ3PfMPQJhrP4rMPFoaIu5oJQURdzUaio6z8BBgBEVxm+ERVlyQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/green.zip</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[UEsDBBQAAAAIAJWIaDZDq0MDIAoAAGYKAAAIAAAAZGVzYy5wbmdVVgk81Gkfn9qSWlrptlYqIiS20oFVrszUTAYlE0WYTkKS0tauStFry5VNpdwk99EixLhi/v8xM2aaq5kxF3OZ04zS5v17393Pu+/3+Xye6/Mcv9/393yf50n3Rx00Xma2DAaDGcP9vANgsAUOUH2j4TdQHoTAboOKRWcOIA/AYHVDuxdniKH2+kSf44mBl7CJVyMSomEHoi6djraEx0SciQ6Ijoi6Fv8+2g0G+wbmfzjIJ6ovJrIremBgwB+PwXbG9VAbMV2H0IOBP3cFYbqRRW9y0gZOZpXduVTvE1nq6o7bD28w1el009PTWq1Wo9GIxeKenp6ZmZnY2FipVCqXy0UiEYfDYbFYAAAIBAKdTq9SqzhcDoPBAEFQIOCLxRKdXqdSqbgcLggCVCqVx+dRqFSlYh5cLkej1vB5fDqNjgcAGp3O4XLlU1CSS8RiAASJJBKfz1coFWqNhkqlcDkctUpFIhHpdPr0tE4iEfMFAiKRCAB4vU4PAiCDySARiSKRUCwR83g8yHSNRq1QKOUyOZPJYDCZVApFpVIrlQqdXk+j0VVqNZ1O43C4AB5gMVlEIkk7rRXw+TK5nEQkiSUSaBKNTlMqldBkFospFIkUSqVarZHLZXqIGd00n88jkogQQSQSicfnQ4PkMhmVQpXLp3jzftH0eh2FAnVQmAwm5BmNRqNQKFrttIAv4PN48ql5MJksAATUKjUIAFNTkO8SAI9nMplqjVokFM3NzXG5XLVaLZPJJRKJWq3C4/GO7xx8h5AsJhNaJoRw1q3fQwZBLgMAUCgUhhBO7cZtc3xnubfPFT/eLRZPdnd3X6qG+9UuzRw8GwQcZ7KYkeCFoFqziYkJ684NyJFgqURyscIvuMHCrX8nqsnq5BvrDx8+HKlcGwSEt7W1vXnzpqGhAV5niqhfU1lVhcaHpvdHuvfvjwTP8cZ5HDYH4gI5glQqlNPaaTqdMa3T4QE8ny+YmJgcGcFjwWQsORnZsBxLipuYnPTHB4b0nyKA4NgYeRKCeBL5BsmeBwc/gmdz2Khmq924vUKBIHIAiyVfjRyK9MV5+g55YlqRPT29iOo1iNo1vt2eo1DsiaOYdjiZTC4rL9/b5xRFuowlxqFxgVGkK1jiVUwjAlVvdbDacGQYSiO/xeSGwGAGMrj3gaBkhqzg6vHA4HUDda3UGuME19qNbVYmhlYbTUy9TC1NFy462/to4wnvd4tTX6ae6HkVE/MAc/BbTLCetFyelKTo1LNTmDdt3iMBYbLb1xcKESulizPb5XbD7ZHNeFqbU9BY/527Ge2/K/3Ra3dshFp+nj5hk/dW85moPKXz2zsTC5SpLIm7xtmULdzdisCMpxq5RWuNUNn3KU65phnvt7pTnCYJcQzJUnLqLY4It6DF7Hk5sLaP0rUrppdc/9bglS0Rbqoyexzg6azSN+Ocgq23gMjD9kZH7tjUN/d6JsKNOIsmej1f3j3HvjkVarISt7IzDJO8MXH8Mnmy2NsG3nfhOGLpkhW3jrgakUNzH2FKDyGfl5ABuO12xC8FZFboybFnBQX+tYdGexYynmEKX3qhwveF9Qb6CKv2/RCWO2mVnmx8aGvR74bucqfDzoPx5IiWl2Tjku86E85qjUPjVaK75sH4Fth2tnNnWdk6C9ersbrP5V6li6McbYe3aVtuF3tPrO8y8sUFYGw3eUI24BrtqO6b73Zu6r/Gr7lHcFVJ0zXLOddLcq402tk85aGeOOPkxxrCf6lhVi0sYb5v3Gp3bBc/t5L8JMG4OqHJLi/Q3HoffNNJXADCdsv8ejtSeH2HuL8M1kYu8ZB6XOeenXux4QfmLmJwcAn5osmZWTOnz6X0LuHD4vY+RaFthulzqxV1EVutV60sqvghreFcdvbO5xYn3mBpn7Z7/PHnTBefueGG+EtEQetUKdslcyBnjC4Sy+XNdLeCVhSyrqKGSf0Yczt3m3iu0gZOFollLVdKMm0Ridneb9PKcuNMVlwfjlhX1ZsyWabIXEfv/pnQ2hWT0qp/aK4qCrLbBS87X9VslhTg+vp8J8HuKG11QEdYxHfeWYEZqzrmzFZZ74Xzzu00L7tzepMWCvQK/2+pYMZ9J1bK4N5vUmY/fzYwAD9pTy7p9TvxvbN9b3BT7CmnCz0t99knHxyPscRINWOpUGZwEI4qvk+szzVbvmknxyd8HbahqKp4OGLnnpvtwoc2t8ReLQrY5ZETBreJtGaa/3hl5Y97CswNvBZvOopcPni6BLeAFm7kHWz29NW/jqblrfa9TWz4AzFv2j8433wIhQKzKENRXoq3/OlZ3RSnW9/167jXlLldjvXEmNWHodbhhChlcu2WCoOwovPhTRFeqEYHk2nSM4H5nMuev+nyP3ynMGndFjD76YX3mRkPvt+XJIhNBhmtcv529sx52ai0xAEdj/ZvZI04oNFt9U3JR+4PO/gt8+bzHPJ9akbyah40HX9nMn8e/knblfXGxy4kJd382l1i8ae8dfug4vu5jzETP+2TRIUl3W6prQUZWcTYmCHCpXsltR8LXsTEEAgEMHZyaAg09K6Rr6f+lvYlab+ly6KD6ZBIP9RDIk0fJS/HnW2pfpw3kF9eMaecBpac+vjnbAfu6otZPbD2RvfrRPS5c+LimbJ60tr+wZLBxmiMvFhbpqrmkVswzV/Q+1WYUXKL6lBLdXMPujjHqtAXh/6Ly6Yb5QmIk+nq4bez0d991Mgfvtjh9fWzqPBelN4+z3pYmHkNUdaIbjM3yhw2jbM7s/CoaJeLi52mfFExQogfyDalEZ4tXBMd97dQxy15inP3Iladb6liWB2t3lB3XTXuzLeYmfg1PtLi67uZro+lwUFSypYcdq3LVq7P47Famu3iY8Z17ocnF9//yeSo9AC7clRKSVppic4V/J/2m0MdH4LZZ3w+eFBnRMiH5p8+DW3e7RMmTn/M3C/Oug2zJrw62FE4WfhaKkkRENUTnQ37myu6LJJCQtTSi4ZLfP5ic02G38sKcwO2X9NWpYWp5HmHGyHxontbC268TRpDBQoxnvm9BvkeEuzPH8J3dK60N93lUHZnLodbBO4xwsXn13HxrFI4NnYC7Dg127fl1vgU4Lqlpi2Xj7+AD7Nvb28fnXPYo1l2HBv3BDC/aBOWEW657ELmE347PuzZnv/p9D83aV5WVs7I8OnNNoMDvgO19xxNXU4M20Xa249Qgx9fi6dHPSK2JgTKHiOjh5zXn06cjxtv3pj/HjPNshu7Tb7t/fK0Hn84sTA/xMSF0LHU3nbIKGVhEuF6j5v3I/ucHxEJ0IZJ7YtWz1835mlZf4Q6B15LlEa+D8rX//SbN0/NNozfFtI76JDV3IoShtW4bcB1JMONEp0dLcQ37MNyZVYZycZef0WgaDbtzGWOk3ZpWtPMa1x/UbGjKBV6dC6jKyulHgsMYN7B67tWrI5+D30UYXAflHetZ3jqvwFQSwMEFAAAAAgA8AgQN67s2hQTAQAAIQMAAAkAAABzdHlsZS5jc3ONUctugzAQPIevsJRLewCRR6uKXCk/UPUDDN4Yq67XMkuDWvXfi3lUSYE0Wsky3p0ZZpZ4riEif1boCBz7ClZHNBRW6hMSttna5hCscl68SYe1EWGBGl3C1vvUV9s7KUFlOxlv9/0sOgHtxMY2rEKtBFvHcXwIvgOaiFHp9QgaCrlW0iRMw5FaEsuFUEYm7GFJ//HZ1wKt8LTjZJZlE8Y5VAQfYDxwRm2X+lrAoRALsGs/GZXARR/4GVK9c9nmXjt9l8vIGnl/ad+BBU4JMzhcfxMPfXQXsffGh65TsqTpVsY2oZ3BDqEN1Lu4W8b42EGeuqcSenZeE151+9J+vdplz7wqbjP9j0aKp7+rPFMRcLPMD1BLAwQUAAAACACViGg2L0q8+zsKAABpCgAABwAAAGFzYy5wbmddVg04k+sbX/rQByVOUQnlI5WvTiGhskZtmvKRIvJN+SzHVzlEQkSdRlLhOOIgx2c+jgppjNimbW02m2222Ww2+7Sp0+H/dv7nXP/r/H/PdT3v+z7X89zXff/u5/7db8F5j9OaG3duBIFAmtAzEC8QaJUF8L5n/Wpg9oFFWgKPNVEucBcQqHXUfm0hH/jekeR6Kck7ITIpNSQxAuQSnhAaYQSNC4mK8IoICb9540OEEwi0GnT+rI9r+FBcWH8ECoU6j/aP7Ls+SOrw73f3HPHO6PfxH4D/0lOSh7ryqO5uQptrWK2jM/IktF1bqVQuLi4qFAq5XM7n8wcHB5eWluLj4+fn50UiEZfLZTAYNBoNg8FwOBylUiWVSRlMxtTUFBaL5XDYfL5AqVJKpVImg4nFYkgkEovNIpJIEvE3MJkMuUzOZrEpZAoagyFTKAwmU7QADJGAz8dgsTg8ns1miyVimVxOIhGZDIZMKsXjcRQKZXFRKRDw2RwODofDYNAqpQqLwU5Rp/A4HJc7yxfwWSwW4LpcLhOLJSKhiEqdmqJSSUSiVCqTSMRKlYpMpkhlMgqFzGAwMWgMjUrD4fCKRQWHzRaKRHgcni8QAIfIFLJEIgEO02jUWS5XLJHIZHKRSKgCmFEustksHB4HEITH41lsNrBJJBSSiCSRaIH1LS6ySqUkEoEFInWKCkRGJpOJRKJCschhc9gslmjhG6hUGgaLkUllWAxmYQGIXYBBo6lUqkwu485yV1ZWmEymTCYTCkUCgUAmk6LRaKt3Fm6jcBqVCpjxm7jqNHxCCEAkxGCws7OzfhNB9khLq3dGDkOO6JkBPn9uYGAgoQl6pmVD8chVH8wlKo0aho3xadnJ4/FM+wzh4xfnBYLY+jMX2w2cho94vDK50mM6OTl5rkHXBxPc29vb09PT3t4ObdWGtW1vaGz0RAcUDIc5D58Mw15jzbAYdAbABXwcLhFLFhWLFMrUolKJxqDZbA6PNzc+jo7EpkUS0uDtmyPx13lzc+fR3n7DQRNY7KdPhDkA/Dl4D5z+DQz0OJrOoHt0mtgjHWY5nDBUZCQhNWw0zA0JdhsF+3fDBwffw5q2w1q2uw2APwK5x330fw0lEAh1v/7qMGQTjv8hEnfdE+kdjk+OxKX6d8A82kxON60fHwPG+IO4Uj8QaJ0YCnHxSZsSPku95H1RD5XQ5RsXYzvaJbI1ebJGLdtkDTj0jBoEnAUy09jR4bImwMJlbdS2iuZu38tdLaTo/G6ir2NnV3KSuE9FT58Qm/Q29uo/GFmRT1ekT6jSGU/yrbdwoL/b6OYXvi5vO++pq2NwQBCKyit8rQdtaNjk7HeoX/TdBkOke5oByHo0jn7Y0HgmMDPsea2m1eg7b7cJpknBJc1T+38pryB5a+Zkas4/edi8Zfnm89XqnxKTXv5sfG88oylT6N32dt1LcxxUW7qzzAt8SKrqRNpcNDPDepw9qHHurm5b53twElSDsZ73Hlyde42eqYzV0kHq9AX6p+1JmnlFmKuB7IMOxVyCbVDXun3OUYPgVfqTf607vLKOgIGZW8OynhHxXlc+IZ49O9/i/nFQbQrhX1V9yiP4WOD7EtfZxmO7A0vnTArSNN0BP9c7i2zOHhq54R3SVUOA69JUsgxd2tA23YRnIzeGAw5KWJXely/fn2mPmTRrTTgA8Xfh3qmhOQU5GsGSqmbGg49Y1OXu3asA/LdoCp0meJEPelXYi09k0o0HnBLp0j/tHf32NSV27F8ovUagxW/btI78uvKAzetKi+c1oRcIHvePVe6fbDtg3+TlMOxZU2LCsrWouxv6l73DIw9/XqPuFH80WVxPPUdPTvzD0LDqdcjb1hZw/VMjrMI2WAE9nDFu6Gr7QWxgXahdabK1NWS/6Xc6v9Tvzmu/hkAcmTa43BpJLn+ywPgioef30FdY5SHPHtBrlzcXo0o+Tc/wxeJuitOzB/HwgfoXkyRqTE6pJX+lYR+UMMNf6FmsKTaHJSEgb/PqSq+Dtt4aC9FrfJ8+Vyd+oNebMV98uTu298a88pHx8Z9gdWaNPpaPfZEe0fkXmlV+dRvfgKN7DgqzzRNhj0JVQTk1Jvug+hCkJ8zcDAykS2eVbSqx6N565HSqxnQ7D+uoEpIPKUre7F5vHHdhqGh9EOb3jIWi3sk9t9ItQ7uyrzZPeG+Kbp7YpW/qULDXDekVfTTr44+62SHla/O4hQfyccylGwzxua9vVxHpb8ozEnZquIXJ1U7lvqgZY15N0dPYds/H1lF/U9Fm9eCcQ1p9aHJAxG/fB/iGHNHbveklxBPxL9Y7gD6g71d81o7zbnfr9Cv1qqb0FI0TvHdaTy0c6s163br9yoxzRl7ZOtjObbyw+nnyfCIiIrvhCdeEt9Qz+H8ZvFFGC3CP9wmg/eRpnIqMIeVZGmYsf3nyIi/AMKKg8P4dxGxLF8R19j2W5bznwCuj/VrF91/9VuxfefDy7qj2rD1HAfaHXI7o/2MueUexb0xKSubyAO+EYj4uqIju+IVKxWbMfb0t6NjVnJycTGop8ogJy8zcp59cSfoaGxOVmZmSEnbRLcXNKFqEbkux5aaqqbUfOvpPWs+fvVuVoufWFNj9+5H+I85//tEa36d6PD3Qd/hHVe/t6WMLb4br5O7u7rwR6zuPj584buC83ZoUzau3Lgza/nMLsWb2oVrh5J2qluKg2sBfNR8AV/CGlubpv4sKjeCPfbhpOrZ483T4Fv1lbv5E+Q/LX79IVncYwyIKEqHeVV6NsV5Wq06VdKypGOOffHwTDoePvf2Q3eDl0NdYu0ZJ2JfjukPf9Bh07xWkF+xo1lL6VIhern/cSzsoUTDy8srRlBnX0yvHb+FyR+j2/VH2/G3EW10fanua4BvTSky7DraUqTXlqQzMFOsghvdeLhoFNX+cJ6boGHmWcv5V/J0BVg+xiChXe6cpBcpyS9USfyinB9KsgozHVSs+uGQhomyrA4OSgkjdecdvdn51SLDQEsVczQr0LfvxueZM9d8yhgdv3aAoRb5Tv2a39vgpcF/GR3nSJPe2XaqDkzojdFrIN03aH3v984t4UqqmHcGxfa8nENTSiQ0GgiKkjX7qZy8sGl4ezE0RHVMIRuw+y/PtRBVtoaYjTy+Wp5cpFYrqAb/r3Lo2NPP75w5kj0sFwUYbY3Kfsm+hnSuO/q9M/1LSx48e6YyPhRrvQ6HcUC3ZVtp2k2UXUL6+Zc2NFnJWR4HRi7hZFDnGvmzPCOQezrXAA3Fvsq1Uu7DgI2EzslN3Kd5o+93P9iFPn87Rqvy0SAvTd7d9F57nvPlN1Nvq3Vs5Y7VFiApAbDTLqu8AN7MUaaP95GDkxofxGRYVLBl95NGZAPquPS25mz6X5yK6u/e/bSrmhaXpWhdkW6GGjSsTXtxHVEIArTL/r1aZJTEksQu78pZzZiyWJ2fwQM85bOXzaThA+4Dgy7msVSDzrB39BROHO4B/RRDU1QPSAg6+8x9QSwMEFAAAAAgAlYhoNsHYSPMgCgAAXwoAAAYAAABiZy5wbmdVlglU00cex2NVFCWUUkAExIpYD+6qHAIqCEiCiSApl0bFcAhK4gGIouIiIihiAWGtFOQoikQjiEvKLY2cOSCBBJIACUkIJJD7QlHYv7u1b/c37831Zr7vN5/5vflNbjD8MHidxToQCASGBPodA4FW2AP9LWtXAjUCGucANKvifWA+INDrPrfV90TAeGOyf0RyKCYu+Ur0pViQTwzmTOwPkKTo+NhjsdExVy/2x3qBQCtBwUcQ/qiO2J6enmBSVFz7hS7Gm6iOoJDe0BsdiKhOWCW+KLvnZEFNFqbeH/W7pzfhIKTBWKvVajQatVqtUqlEIlFXV9fCwgIajZ6bm5NIJEKhkMPhjI+Pk8lkgUCg1eoUSgWHy2GxWBQKRSDgi0RirU7L5XAVCgWDwaBQyDw+j85gyGVfTKVU8Xl8LpfDHGOSyOQxJpPD5UqkQJGIRSIyhUKl0fh8vkwuU6pUDAady+EoFQoajcpkMjUarVgs4gsEVCpVp9WRySQKmcJis2hUqkgsEgqneTwe4LpKpZTJ5JJ5CZvNYrHZDDpdoVDK5bKxMaZCqWQyx7Q6HZlE5nC44+xxAZ9PpdLUGvW8RAIsp1FpIrF4jDkG7JTL5ePjbJlcPi0UKpUqHYBFq5FI5vl8HpVGBQDRaDQeny+Zn2ePjzPoDB6PL5FIdTotc2xseXmZTgfm6GwWe2xsjE6nfzmiVKpWawR8AZ/Hk0qlbPY4mUJWAj6plGKRmAIAJZGkUsBttnBayOVyxWKxUqmcn5colQoSiQTsG2ezA/pgZDJlHjDJfOTg2cjBU9PT024EB6/uAyfx22ZmZkSi2fPPAwNx+ijKOQQ5AvLa+EHvWQwWAm+0ZY+zwxusSVOdMGL4nFjc2dk5OjqKwFkcrd2AIJ9ubm5uaGjA4/G1L16EkE7kdqOg9WZb26zsOi093jt7dx9EURI4k18KDA/jTQGotXKZXKPWMJksEpk0MzMbR0kbGRnWaLWwBsNgUmhk9ymv7j1xtAuzgIlmYUTY5OQkkUianOSQiKSoJti0QIDqiYO/tUX1odwIHjOzswEE34A+3+Hh4a6uP+OG0+KGr0CxZny+AIozG6RQAjp9h4C7pw5FtUCIA8SaZ8883nvG0C7HUS+EEEJjaClx1CtRb6DwetvD2LUDgBGJMe+TTDLJW0AgvWmInw8ijTX/5EpEaLh5z+vGRLpec1N7tqDw4NpfVgUGGkBuHVybVZC95XhJZs7KFT6rux0QrXexTRWvUsOTJliJusl0WbvOWusJQSc69vJFyx/QlPaZxXYZkdD7vdL2xOPLh/yRRyJqa+/rf2ua4lLk64/Ms0WM3LkZ4dIhSdbfTAhKswY59b2a3L156xTyJgr7u6lj37vQgEGubW4E+NDOyse/0ULBt2+C41+W7tm68KHJyLA2ZXYPqvIHnOrVxqLyW9N7g/1z4YU5o/WPjO/ldj7flN3s7nLx5pmokDSbtls1pqaVQWcWAtw3mK5wgKq0qpnbj83LZyW0P+9XrH/6NGDDtn0Qm5OEY1D3rIV0VvTjEl7WyBlkovhEGRrt63/xm5HxkpJ7vJKRkax1yExDs6GSkXurNl36ZlhkbO2EC6SLZqv8tkPen4uA6nf7zSbcjYa655fqY8FlUiu86kMZXyqAQl0deH8Y48Bp/Sm72Swo18W5vn+uVL/A9Zfmih34vlHDXOOy+IWfzMFBCZU5a70lzgbEugjdSxNtocnMA/xTcw138Nv8fRcXH8AZ/XW/nb/nGcuwxx/vzlzRhH6+Lg+9nfisNoL+MrQKHj9AfzlArkPALz6atc1NAwcB7L7okdp2hjreWmntmS9bui4vb5Vu/PS5ne/5bEEMTX6yhud1amXA0z2D+E8hiA0LE6F+IVVFtry99jVZZ2zUbwnOrrBjhc+IqDlGntdMI4FtPXvjNHsqnrLxRYIMLsaMnvWCICXlS0uOpeTqBBlNnc5qTZqYcA1kFi7dv1a4R1KOu3ncjZXzN6W7RpXPrbILdrXdPfnxYyRKD4/ksNnpn5u6XOK97YuhsGMvona9ulM2YogNkzVCTVPvjKDDx1aGCB7ZdEs79fwh8MI0C/Dhv052ZNUIT3PZxsYgHbPx5iGnOsvsztbRfzjTGIdJuXL6b973Z+w79KjeKTn01VUp+49uqk3Zj7nwSGB7D4D9YsrIV4VclR1dsvGJHXZTwG1+UWlGumRpUdqu61jMaJkTkActDAJQqp8O1VS/YXHPppobFOcg3DytiHmGa07fdjFCxp7HuYZZhv1sAQ7ofZMYAgj/D/U8ew8Pj/CwrUVgzzTieqcP5ZHVv94mxLwRjD8RWDDNInEG1kfpAkaFHQJ83rHV3i3SLOdaAvoSLsPS6mtI7vjR96inwfeYfmKjwL+791vLA3Gtur1ztx+evJ7+qf5ctX2IIiT4TVuQQ0jI1frGtKM5A/aB6/z4fId/BiT1FSXl4CPeGX0R4yXssfp6neBfYWHn4HCfrgMozOI04+F2LfyTkPEd/sHnyi3P+1lDQ6clpPl6V1OT5HfUoWiHvoZUExOBYE9KnDBGr4qRf+RcfKjPmh+MSjOr/z/u37LodgO8Adpw56I6f8IJs6wpoLIPf7raK8CEP3LYaWd33BhvFfax8A93dUSDLxZZ2OGFTjnREna/5MC6HfD111pc0c2p/3J1hyYXvh8+6/5VNowSBic6/XyyIONgquDZ646MZVtV7wa3TQWbgncFFdtZqoqhsdWXtplbFNdwERS9OhLm/HmE8Oh6v+IB5oOamvqn3mD7Ae4OKsRYYVFy7M8t7znDhoQdI4mhryB1YQcQn3saGrdbfZwbymp82B57fRhNs0vUJBZBMOGlJvIfgxLDT2xbHbZe5n1kFpyz3+jnOZ8OaOUoVvLjwaod/f+V9HX57hrwbJxtPmFd5jCYj8t4q5j7fFi2pJBWL1bj5H7EpAp1v8+twvjRauSp5FNaxsf9V99+CsLYG0mwr+8iU5uuY8FTFX85SPP9Tl/9iPBuTYLr6v2HfNtbiKqYmZJOfPI+r9aT0RPzL7Yl7zx/4UM1mnEF7Drs2WATAkTJwmZ9a3EewdnqygcLCglWlijU09PeWMiHLak7YKMwZPqW3l9Hn6QzgJ9LRWfkBeHeehL3p1KPMXi7UddBE0bU7l7N43T3v9+MKSOeDABfZ7N19wARtXX3GdRWlFOmo7FrKRF7Bls34FS3S8dTGvxCbUpEzQsfTPcVrHBp+Qr4Lxqr73RY5tyJXoJFhJntc+rbZXCcO5FlahZ3x1uvdabt9AqbvmL/jds8gCj3RGauu5c7FGpICDyBeyzyatE0JLcQ0zcftrl4FZP1R4njNKoEGnX8uQoXVv5wCtlmq9divuFhckexIzTV2L8tu/JR8JGs8tTHQzcIy5c5zurNBsv8jE2U/2QaIO+QrlZW4TJWm4PcElWXbfKwc8APEQTxh/vhfE9n/htQSwECFAAUAAAACACViGg2Q6tDAyAKAABmCgAACAAAAAAAAAAAACAAAAAAAAAAZGVzYy5wbmdQSwECFAAUAAAACADwCBA3ruzaFBMBAAAhAwAACQAAAAAAAAABACAAAABGCgAAc3R5bGUuY3NzUEsBAhQAFAAAAAgAlYhoNi9KvPs7CgAAaQoAAAcAAAAAAAAAAAAgAAAAgAsAAGFzYy5wbmdQSwECFAAUAAAACACViGg2wdhI8yAKAABfCgAABgAAAAAAAAAAACAAAADgFQAAYmcucG5nUEsFBgAAAAAEAAQA1gAAACQgAAAAAA==]]></data>
	</file>
	<file>
	  <filename>/lib/tablesorter.lib/themes/green/style.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dGFibGUudGFibGVzb3J0ZXIgewoJZm9udC1zaXplOiAxMnB4OwoJYmFja2dyb3VuZC1jb2xvcjogIzRENEQ0RDsKCXdpZHRoOiAxMDI0cHg7Cglib3JkZXI6IDFweCBzb2xpZCAjMDAwOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRoIHsKCXRleHQtYWxpZ246IGxlZnQ7CglwYWRkaW5nOiA1cHg7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNkU2RTZFOwp9CnRhYmxlLnRhYmxlc29ydGVyIHRkIHsKCWNvbG9yOiAjRkZGOwoJcGFkZGluZzogNXB4Owp9CnRhYmxlLnRhYmxlc29ydGVyIC5ldmVuIHsKCWJhY2tncm91bmQtY29sb3I6ICMzRDNEM0Q7Cn0KdGFibGUudGFibGVzb3J0ZXIgLm9kZCB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNkU2RTZFOwp9CnRhYmxlLnRhYmxlc29ydGVyIC5oZWFkZXIgewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKGJnLnBuZyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwoJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjRkZGOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzAwMDsKCWJvcmRlci10b3A6IDFweCBzb2xpZCAjRkZGOwoJcGFkZGluZy1sZWZ0OiAzMHB4OwoJcGFkZGluZy10b3A6IDhweDsKCWhlaWdodDogYXV0bzsKfQp0YWJsZS50YWJsZXNvcnRlciAuaGVhZGVyU29ydFVwIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybChhc2MucG5nKTsKCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KdGFibGUudGFibGVzb3J0ZXIgLmhlYWRlclNvcnREb3duIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybChkZXNjLnBuZyk7CgliYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Owp9]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/animated-overlay.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_diagonals-thick_18_b81900_40x40.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAAAoEAIAAABTDPN5AAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAA4ElEQVRo3u3YMQoCMRBG4c02XkCQLcXKwsN5Eq+znScRa8FasLP4q0DGZASLecmr0mSHr9tMuh5Pr91+MnpfnofHfXK2OW9v9jdb+t/cuR+qCaZSC2A2NQP3QFVpXZfFfy0iVc3eC3GpmusAR6fq3ARmUJvAJGoFzKOaYCq1AGZTM3APVJW+v5ZIVOX+8YhL1dwfwRGpOrvBcalucHSqA8ygNoFJ1AqYRzXBVGoBzKZm4B6oauy0uNSx06JTm8AkagXMo5pgKrUAZlMzcA9UNXZaXOrYadGpbnB0qgPMoKoPsn/eaLRwj54AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDA6ngyxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM1LTA3OjAwS8O0DQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_diagonals-thick_20_666666_40x40.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAAAoEAAAAAD5BTvyAAAAAmJLR0T//xSrMc0AAAAJcEhZcwAAAEgAAABIAEbJaz4AAAB6SURBVEjH7dXLEYAgDEVRqk0HNmpFMgxi+Lnw3Z0hSzJnmZuO8x6b3vPn530vsVwDKa6CHFdAkssgyy1AjTNLLDeAOteBBOdAhmsgxVWQ4wpIchlkuQ34nXPni+EWoMZNoMoNoM51IMFFU3QumqJz0RSdi6bo3C+bcgHap6IryOSd+AAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0OTozNS0wNzowMDqeDLEAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDBLw7QNAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_flat_10_000000_40x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAACgAAABkAQAAAADcH0/XAAAAAmJLR0QAAd2KE6QAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAAPSURBVCjPY2AYBaOA+gAAAlgAAXU2hncAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDA6ngyxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM1LTA3OjAwS8O0DQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_glass_65_ffffff_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQAQAAAABHIzd2AAAAAmJLR0QAAd2KE6QAAAAJcEhZcwAAAEgAAABIAEbJaz4AAAARSURBVCjPY2hgGIWjcBTigACVaMgB0zSxaQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0OTozNC0wNzowMJzpBwUAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDg6NDk6MzQtMDc6MDDttL+5AAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_glass_100_f6f6f6_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAAAAAAao4lEAAAAAmJLR0T//xSrMc0AAAAJcEhZcwAAAEgAAABIAEbJaz4AAABISURBVDjLY/g1mWEUjSKqo2/fGL5LMXzPYfh+nOGHFsOPBQw/xRh+TmX4JcLwq4vhNwPD71yG3xcZ/igx/Ilk+JM0ikYRMQgA8pJH3iOhTlAAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzQtMDc6MDCc6QcFAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM0LTA3OjAw7bS/uQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_glass_100_fdf5ce_1x400.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAAGQEAIAAACwqkHPAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAmklEQVRIx+3PPwsBARgH4N/7s0gmXZSuKMvNdl/AV2A1X1ltzBaf5UazEp3RpKujFMV0uT/dy6cQwzs98wPdZVk8IwAAhmEYxrdBWSZJGFKq4smGaGDENeFgwgfREp8d6Ph1OEZEWxaVOXSVRieHcGXJALrNnvEQes6nlz20yO9Xl9IUn128e0VwS4k6BvQIoob+X6QNwzB+yAca/jJVRVy4gQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0OTozNS0wNzowMDqeDLEAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDBLw7QNAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_gloss-wave_35_f6a828_500x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAfQAAABkEAIAAACvNYlpAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAV9UlEQVR42u2dX6hn11XH97m/H5FMVAaSVCzJ3GChEIkNGkpJ1TxUhdC5rbWYPA34VpO3WnyRRPFlhIJgwJck+hIbFGeiiXDzpxQKJg/1JdL4EnzLvTM2GCehUJ3fzTC/e3w4M+Xc2Xev+a795/f7ncnn85DcnLP32mt919r77Mmcs2938NJ3H/q9EwEAAAAAADaYrXU7AAAAAAAAN4eNOwAAAADABGDjDgAAAAAwAdi4AwAAAABMADbuAAAAAAATgI07AAAAAMAEYOMOAAAAADAB2LgDAAAAAEwANu4AAAAAABOAjTsAAAAAwARg4w4AAAAAMAHYuAMAAAAATAA27gAAAAAAE4CNOwAAAADABGDjDgAAAAAwAdi4AwAAAABMADbuAAAAAAAT4GYb92XY63dvckW/nmpjj15i2b6espCKOm6T8lCxn6dG3uh5inl1sC2UZN+b3xLNlV76vLDj8lrTM+uNV8msopgSo55NpdLyZlM5ebPAazl111v5el/FgjeWFnNfGaVcK6+eJXNBX22UvHjXEEVhL97aa3235JlYrkCJnnkV7n3W5NnXI7Lte/dj5aoqsZSsP9428ojdwT9+966vfT8zVAAAAAAAWAmeV2WW/X7YvfbPTaCuJylr9ijrVcPrm3IlvrsJeV9Nrm0F4r5eZZSWdo5Wk4ty++1mjVdD71irrPNadVhibRP0qWUzL+95o5fM/RLN89bwujrkrVGpGi7337ZTN7/6lZIZmke7dVXPVN7TqmR2eCOyn+ZeC3meeC1H17uDv3/j8te+VUEmAAAAAABoxjwsw96G/B90AAAAAABIwKkyAAAAAAATgI07AAAAAMAEmIerYa9/NczDdnf6yJ3h+nE9trvTR3qNW47tpNrEdm7m4/Gj6FeUn/O8SmmV0tMeXddZV1LJkadeVH2U0RUfUt7G+ujWlDpRfPBSUm8lFtrNoNZZVuwrc8TupY+bp2oKPY/eVbeWbkpVpKwpa6BSLeXVlZe7vPbeGR339UaUVw/etU5/3uU9Pb3rWIvn42qy7CVvxzVG3wWl1qu8vHij87Ys2cuVZDYvxpSSSi6iXt3B377x/O/+VZiFU2Hn2rVl2A+7ySvDzzHj9mPG7ccW9BFtmynLXgtxFCnPU+PaOtjj2qSiUzyv1UZXxs6FopWikhKLomRqXKX+87KvKGn7lorI9jxlR8mRMpt0xRQLij4tLOv1462TlFd6jhS1vTWjV6PtlRdFAe8zSNHK1kefKfrodhtlrFpRe9dt28O6sef5o+xJ8maT0l55xqWi1q3ZudN3PiX7OiU67zNIz7iylip5t7317ve8e0W9llK6jbi+cQcAAAAAgA2GU2UAAAAAACYAH6cCAAAAAEwANu4AAAAAABNgHpZhr+dVGQAAAACAjWaeec4JAAAAAACsEF6VAQAAAACYAJ5TZWZhO+y4T6EZeg3YffPs17VTy4dVjjK2ZltucXec34G8CklZVqzZCqy+rhQfUle8Gsax181CLa3aVWaJJyWrUwu1vTZXs5LUyo5us8RzpaWucAtP1vWU2YQnrNeCsrYPrHLt0rNcy7d2NVOyr1vljm6g7lN+NTOifIcT0R385Rvhq3cVOQ0AAAAAAI2ZH/mvZb/X74ZZt93tXPs5j7EFr7W4/XBl7GGeJ3p7eyw7Ot2CHlF5RryKjRlHGvts+5bSpzyWPDt6L0WHWA0ldruX7aeShdjDVHvFk7q+2dqmYtG1suutxTwqWd/yfCuJoq62dXVL1bCyeujzItU3NW7eutcCZV4rKilzU6kK7+gtPLEt15op3pZ5Cnh1Vqyl6llXPs+CbVmJyM6md9eh2PSi+6brIGvbHXz79b2v/JvbaQAAAAAAWCF8nAoAAAAAMAG04yBTn4Po7e3X9se9FPtxe91D5dMW+4PLkhFTlHyso6hnf4pn29E/JlM++/Oql9IwlaOUD4qdvNpQdPZmTfmQRffEzqBS7XZ03hqwW3qzr+ddrzRdbWXd0Psq1aLnJS93tv/6x2F5n6/pYynoCuux5M27lFd5vinV5cU7Q/M+tfd+LF6+Dit17o1LXxmUeW1n01uxJSuJoqetlTei8oqyM+tVLLam15L+cWqJVsuwF3a7gz9//ezOxTALx78/99Om/e61NuOflfbeu7cSJZHGfTdBtxY+pGwq18e/Piyl1Sbo1kIfu2Ve/dRqs2l4a2z1/qzGw03I3Sp92LS8t4hlk6n1BFzlc6eWzbza0+8qz8FNY73PlzzLec/fxnFd37gDAAAAAMAGsxWuhv2we+SfNnFLxUKql/fn1N28UVIWUv7b49pRexUu8UEZ1/ZEUdKbaz13XpUUf3RsxfIqXM+gnv0S+8ocse96VdVt1qpMrx3v9VrzS/fWq1JepF7/7V7elUr3QYld97l8Zbb/mYpdsaOMoniu+6lnwWtZf055azivlnQN7XG9fipq5F1X4srTTY+67m4hZdObQT3ekv2Jt2/W+tMdPP36H+48e+T2MuyFV8MsbIfToYTBzoBtTW/ZwsPBTmwz5VWqpe5Pqn2JDnFfb3S2V/p1/a4yenlmvRrqveJMKRlMjVheV7oyKc/zaljpWyu68qprPZdbKxn3HfDqr1wfW85bT8Z415+S+ldG965pSr68K22t7Cs14I1F76WMXrK66rWhrG95a1esc0ns9pVaufDuKNrhXU/Kx8qbxXk5LZ/Fzti7gz95/dGdr1QQCwAAAAAAmsFxkAAAAAAAE2AeroS3+ifCLJzqdsIy7K/id3OGU6OzFG4csdyTFrGkbI6v6+OmFIivl9vU44rHylNS0aouJbrZHuq1Wquq62puq1RLeSVeb1x5Fkp01rPZQh+vzZRv3opdzZpvK6OvrjF6PaRWidiOUhutdStZi+LrSoz2dX2skjmuZM1rOc+r8YheH1KjxzVcq6J0D+s+BfL2J3rsJXfrYs/HlJ4lM8K03x1887VLp5+83q3bDjth2UdnVXajUyQTd8fXx+3tXqm7ij+pXnqbm4goj67oZqvhtZzqq6ut6J+nZHlm4766tyVR2G3yfLbrR8mL174SXWoU+2dbDV3hMfa6YUetrDN2jrxa6aPY0aV09t7VvdJnvb2eexW249KzoOCN1GuznQ+tV2PvLCvXqvz5W6JVreeIkk1lJfSulsp8t+8qz51aK0aqr349jkV/EnmrwvtE1u2k/LHz5Y00hHDjxh0AAAAAADaSefK3PcGtzcfhrf6J8H5/4vDv1uzJB/0vH34YfhLOHv5w3aJEfNg/2j8cLocX+3tXNOK93V1b59Yd9oj7uodmi+SLCjonu+e7p8LJ8NzWU+sOCQAAYKp0B0++9vKX31m3G83433C2fyd82D96+LDU/kf9icMXwiJro/aj/o7DF478DjOZ/r3Dt5cnMv8Qtde/vby9gXYAm8R299BscZM2J7oz3YXuF7vLW39wk5Y/F57aejCc7J7rnr5Jy3u6u2bnws+ER8KzyTZ3dm9s/SD8bHiqe3DdMgEAwK1Md/CN15758tnk/Q/6+w8/CovwYn9Pso3+/26Hre2V/s3+iVSTftg0Dy1tLvb/s3wsXA37N5yxCgCwCczDqXA63NPdPTt/zN2T3XPdU92d4Y2tHxy5flv3SPds+HT3fzf88WP4g8Fd3Y3tP9W9u3VnuD2c6S6sO2AAAGhLt/jXV37/10+t2w0AAKjK8NrVLGwffc2pu/76042/8uO+rV879u80truHZpePXBn+/mH4uwgAABi42F9aPh4+Dm+Go/97eq9/e3nimPbvHf77DW9MLMNeeLV/L3qTYnib40J/6fDxbvH9Vz7/xf9Yd6wAADBxbguPdM+Ge6MN/W3hN8Oz3ae7y7Ojf4dwe3cmXAifCu/O7jxy/cRwvXt3687kWCfDc1tPX3tJCQA+mbzf37F8IVxOvBWy6F8M94b/7u8//NCwcGL5QrgS3grHHNPSX+gvLR875jXmC/2l5ePhSjDeH2lHt/jeK7/wxb9Y/cAAAAANGV5DOtk916U/iR7+eHAinOkuppp0w98tzMLxR7wNfGbr67MvOXwbPvi+t7t767yjF0AJwwZ02Izq/Lj/Rn/W8a3gwPv9HYcv9FfCm3363MJhS516GXs4FuJ94cXpTxjdYvfl/3z4o+T9edjudsJV84NLpc16KfcwtjC+kro7EI9bS7G6yq8yj9P1fJP90cctaZnqm5oRSvsSP1NzbdOqQkfRvEWu8/rm2Y+zptRMiZ5jWoxSSxNd7c9sfX3+W5keJl6jkpiFU2EnLMN+6bnvlp3uvugFLYUP+vsPP+ovm1/ltWCIZSClzE/6s4fvhA/Do/1x29952A6nw9Ww5/pm72J/aflY+Lh/s39iRfWsz9Nas6DdbNo0ZJ+7xb+8/L2Hv7NufwEAAAAAwIJz3AEAAAAAJgAbdwAAAACACTAPy7A/oXeAAAAAAAA+kfB/3AEAAAAAJsA8fBzeMg7rGZiFU93psAz7/atHrgwM1+M2ih2FeCy9l3csrwIp++O7dT0piV2PwhtvO+XzRinxv1yr+O5AiT+ttW1Rz7Wqa/UzKB59oNaMrrs+5K2Q7cayo9O93bQ1J/Z/HEWtLNSKpbUmig5eNerOrNR1ZUaXZLN8NbNH964eynxst1cpefLWfe6s0vMWuo2udIu/+eeLX3imwjAAAAAAANAMXpUBAAAAAJgA87Cc1AH1AAAAAACfSOYVfv8ZAAAAAAA0Zh6u8qoMAAAAAMCmMw9XhFNlAAAAAABgrfBxKgAAAADABJiHZc/GHQAAAABgw5mHZdjnVBkAAAAAgM2Gj1MBAAAAACZA+h33ZdgPo1+1Gk4n26TuKngtjL2yfdPt2BZSHiqel+tTi7qe2JoM1K2Zca+SjLRWUq8r74heVRXFSiKtZaF11kpmeotsen2OR9fXwLr6l8/uFjM35ZVe/+Velcw1W9VyZWyb3tGVlX9MiXp69dojep8dSkV58+j1px3e6PJWxTyt2qnhXQFaPE+r+twtvvVPjz30WsPhAQAAAACgGE6VAQAAAACYALzjDgAAAAAwAeZh2XOqDAAAAADAhsOrMgAAAAAAE2AeroS3+iev/dcsnOp23DaGk+Dz+nqtKWPp/tT1vC6bH8V43NTP69Uqvr45vq3Sn1o+jH/ngz4H83rpV0r0jH+LhVLD613xdD0/CZRkqqQyvR6OR6n7FCvRLY7dvl7usz6jvddt/2vZTFn26tCCvEpTbHoVK1Fmk3dlenTt9h7LsN/vdoszL/3Zr35n3REDAAAAAIAFH6cCAAAAAEyAeViGfTbuAAAAAACbzTwswx6nygAAAAAAbDbDqTKvlhsCAAAAAIB2zMOy51UZAAAAAIAN5/qrMsMnqvOwHY4eVTP+dHW4m2qZwtve7hV/SpvyanwldTe2o/dNWbNVilvqUStqKMroCqRs5nml983TTc+jUpN5fW1VlVhsHepGnVcbCiWzPhXR+Lp9RfE8Via2pmfcux7qY+mHB6Ri8apdC1vhcmt56tV6cumzKaV5irx1SVcp9kTRJJXNlAV9hfeuY3qvVEs9s96nQMk+RNfWi7dmUlrpmVLUznsix8p4I/LazFv/FR30Z0fkZ7f4nfP/8OAz1/5r+FB1Fk6FnSMfrY6vxD+P+47bj4nbK3ftXnHLGNvzuJcylj26rYkSUYm3tg4l2toWdN9ifewoFN1sy95K9uqgq6TnWsHbXu9lq+fVPw+lNmyv9Oj0GovJy2x5VShRKLnTlU+NO7Zfvg7o9ZkaJS9qXZk43rx12NtGn7Nen701Ztv35kuPRfe2JIPKc033wTuXvRlR9NR10K3VenZ7FWhHuQ91n8imtW7xpfPffvC3b+iw1++GWdiexAH4449rbZ/jz3Dj9t7Y89or3qbsey3o3o7v6i2VsXTLtn3lujKWomGJn3oeU37WmoN2zXv11EfM61tiIS/XtSL1Xi+fay0qxK4Nxf+8OrdHTx2f4J2b5bVkWx575R1LiSjlg1Lhtn1vNXpzkTeW7X+tdT4PXaUWK+Eq1+Ty9dyrm7JWpLStVQkl+cobxTlit/iN86c/91JmGgAAAAAAYCXMr/371j5bZha2w+lbPMYWrEY3srPJ3KrZ8cYVt5+uMtP1fNMYK1lL1fLKbB3pJo9S18/Vz5Spj8jashK6xefP//zn7k7en4dTYSdcjd70Sl33EtuZj97pGa6n2qTuKmPpceXZT90do/ufF29JLnSv4lhS0Sn6lFSakrvYQ+8oyog2eix2+5S2tSrWq8PY29gfW4e8OkmNkrdueGs+lR0ld6vMi1fJPMt2LhQ9a61pema99VCSl3ZzzR6rlsLlK7mSIz0ur295c7/uk7dkJ6Ov9vbaW3c+lu++Sp77yvO3JIrWu1zviKPorm/cl/1evxtmXfRu0Oj68PPA+Ep8N8XYvrd93Mv2NjVKfDeOJTWW3T5FqpdtX+mbGj1l2VYgL++KzinfFG3tjNu1ZGdTiVexo7dX0Pva2dEVsKtOj0KZj7aGyqqirwm6z3qO9Fms6GP7qVjLqy599Sjvpdz1Whu38T6JdFVLZrGtgL3C6/HaSpavqPq6p6+Eer68udArqsQH7+pkq5ryUPFTr6LyJ1q52ooOeU/hlOfeWGo9rUr2k4pXy36v3+0WD5774a/8aQAAAAAAgA1mnjyUyiZ1WFJr8sat5e26oq5FO/83UxnliLp2PuuaeNVTjiprR4tRSiLanNrbBG83QY1a9Xzrsd7n16bFqBx53G7EW4nyuMrn7GqeC6vPYC0f9CNHBU+6xf3n/vqB//rpDfVwOvtYKPsIp1SvMSXHgeUdVZbyMBWRfSCX9xC0PE+0ZB/fS9e2/Ogx5ZAm239bN6/PetSKhjEloysx6leU2Wd7krcO2NaUQwPb6Wxb9sborbqSQwbj9nn+2CrZ65vSN+W/vTIrlKyQtQ4VVVTSj1PMm6GpUbwrQ621sSQjeXdL2uetGN7DphXNUxrmzZFas8yOWn/W6D7kVbI9lpIp7xG0ek7t9vGIeizLsNfvdovPnvvjB553pxMAAAAAAFbIvOiL6ZJeAy2+5G1x7krdr87ts03G18tt6nHVOkWh9TfaSuwtTolRsq+0zFOvvNdqTvCwlax1bkm5erXORamlj9dmyjdvxbaYj15l9NU1xnse17iXfsbU6nUrWYvi60qM9nV9rJI5rmTNaznPq/GIJWetKGe81NrzKB7WfQrk7U9i8k4oWuUKlneCTcmMMO13i1869/gDXw3LsBd2wyxsy7/c1de+xOZwfWB8N3VdsTzum2ch1Uax5u01Hj1un4oudVfxRPFH1y0m5a0+ih1XSgFbyZRlr4YllabHaKtUPkPLo27nj5J9Re287HhnSq3q1VXyRlSuoTdGvc1qqLWKKprYqubNesVbb0byVoBac7NEDcVOSX5132pF124WlzwHlb7tngVj8p65tWaNV+2S58Uy7IXdbrF97gsPbGXKBwAAAAAAK2Hev3v4R1c/u243AAAAAADA4v8BDLU8YcdgY18AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDA6ngyxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM1LTA3OjAwS8O0DQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_highlight-soft_75_ffe45c_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAIAAACY3hF0AAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAAhklEQVQoz+WQMQrCUBBEH1NaCzaxTc7iHcwhcoiktP6kS8BK8BIWHkYQrM1mLD5Bb6Bg9Xg7syws9mNztADgj3CjFbifk4A+0od1UWDfr2kloJkGgZsYBdRTKfB+qgTOtgzrqHJWCtg9T++9pdnEIHAb22yjwPk6XRQCzvNa4IsP3//ST+MF5uU/iXGyfBoAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDk6MzUtMDc6MDA6ngyxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA4OjQ5OjM1LTA3OjAwS8O0DQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-bg_highlight-soft_100_eeeeee_1x100.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAAEAAABkEAAAAAAy19n/AAAAAmJLR0T//xSrMc0AAAAJcEhZcwAAAEgAAABIAEbJaz4AAABYSURBVBjTxcK9DUBAAIDRjxk0dBQaE4gR7KFVM4rEDBIjEKVV7s79OZ0teHk8FR/NCAehJ6TcK3eD3/EtbsPV2AVbYmZMgh7RMdfAFaEmVIE8kR0yR4gfv1IulNTJHsTLAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTAzLTExVDA4OjQ5OjM0LTA3OjAwnOkHBQAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wMy0xMVQwODo0OTozNC0wNzowMO20v7kAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_228ef1_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAABDlBMVEUijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEijvEzfqCuAAAAWXRSTlMAGRAzBAhQv4KZLyJVcUBmYBoTMswNITwWQkhLIB5aIycxUyyFNIeAw2rIz8Y4RRy8uL58q7WljKqorR+yKf0BnlEk7woGAgOPomKUSqCvbd+cR2M/b3+RaPlAXvEAAAABYktHRACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAPZElEQVR42u1dC2PbthEGyUiq6ZiSXblLE6ex1mTO5iXZq+u6ro3abG26pOkSd13v//+RAXzhcIeHWMoUbeOTLesIEMB9PIB3ACgLERERMQIkkOy6CTvWH0bOQO/mJeDXP8EMqMzDEkIsEBRMAmh7jHSVmuAjAKwC8FRAzi8/DmoS1AI5AQltj5FOryAjgJ7OK2CZkwEZYO23q+BJ5wwKkttfui1z4s20VTAL5k2kF5hbiPcKcwvwNGB4C7CTwproI4CdDcxEPKUTExx+DNiAj0u9C9AuNPxdYOe46Y5QRERERERExIhx6Z7gjv2ghEVrQJ33hJ5BsxsBfsIq8M0HsAkhWfqglFgawAhgGWh2M1xMWAWUAE90qUofMhhi7be32JNsmVFJPKeLwBQglAQMNh3ALVjYbNaI1jaYD0jM0nw9atcWYEXiaXH/+QDeQ3Y6BoRx3e8CERERERERERG7Qz/HP+iaBsvvHXj0LAD4cip0yN27fXw7AGtQoDTwH+HqkWTgWczTwZVmr8DbAEuqv35bCT6CWDorjGnAqwOSCI7EhlFWHjkBXIkb1M/DZQgRwCeAwK9B+HRPFlPBOjeZszKz0wK9/FlzeE3I24GEzUII45bT/SYarqGLesE+btlDBP70QInkckDwggQqAGGt052667vAJZ8fvk1GRERERERE3FT035ba081ILLvR3UXa/NDgUlWg+m4N2KgCfzzP1lYtDUDpAi9ObeDVqczu4ASsy/u8kaxId/2W+JYq4CsbrBcV8SPw8iRvrWWze+IlILA3XFjNzMeAl7/EMt0TmH4wwtkmHG4OsLVzYkEsHLZE4+yRDbFBA+ypVoZJ6fR8iw24T2cEsBbw5pnptIuFCbA3wHkJN0pmAbObAOvaOl+hd14A1gVIFwl2AXsvT5w5GMPezQE8j8XAhFmAYCv0AQLIIEhS2bAUmsGh9VuukT/Z3goHgZsE7wEL4JnHPR+w6+djIiIiIiIiRo3LvYtzR4U8Kms5Y7uORbg46Ja9o/7Aj+Doz3oGZm2j9XKiMc0MTpGt7PgXvroD2G5x03es1iY9T4cHXH1LBmAKCyP69BIC9jL7EuB+vrtM8nw/gG0+w1yvZu31BQfNueA6fesENOGmi4DEEg7zpnviKZ5uW50Gkgr+zLBFChJLC1m4C9hEwduHLaXRCRHvnhUrAbRLbD2804Oamkxg0Zn5fL8lnQi2bo8JYfwECAkR3h/mjA6LTskTI4HoNbQJKDT/4J8/uoa47vpFRERERFxvpFf8RmZxO8C3XEW94V+i/5iWAqzLLKb3lQZXAyElhXpFIUa1GMK2LgsUryhVU0hRMGTGdylUFqDzC+sSOCNwLN0GePRCt9dL/Y3ozCAAKhKMeJaKWN8ExkWAZfmdE5QSmRKA/wpL7IaOJW0XG0sX2MACWH5zx0ZFkMMC6H6Fhu7R6M90ZGMAyWGdoUm1ldAxwLJBZjTmr9tkSPiPY8hH+VO7QmD5pDDgd2V2YIDT0e0i0XugD8kICeiLLvpHRERERNwsZMpPyDbPf2sicWuo1k1l42ZTX473Ap4b7FWukkvFjCZnfj5uiRwgF7dIAeiMfSnuC4dME8XtGuSERiU4KIopcvbKzwYhpVs057ufG3FRa7gw9G1bTGW2srVfpzetnuQwmUA+MRogWDBB99paherA3FZjG6QVRZFWIITMDAIQA6BMdKJr3DMIkEUfSrSuNDQW4FrvrorTBU5gcnT0PmAClsul/wkMgQkQAQL2DQJBqY4OSEISTEjVQJPwYwWXBcAU0B9VcT0GAGqg0eLj8vRjTcDRB/u/Mgi4c+cO2x7vlskBSoDS/0NMgGlSIPUHTlGKpv3gjoLTAg6V6jA91PMAWWn/LQGqfDTFVhWnC5Rd4O5d3AWWQl4C+d6ekJWvX0iA0v/2vQ/dBCTkgDySJIcJCmHg5OTEPQbAoWRA6o8JKH9aAspBEBFwX519/35z4KgaBI+IOugETgB7REMQAj7C8xPzxW35XrgIoBXCgxKowtPTU9AmyiwgO5xO5ZvuAqXsJuC0Qn0gyeGDPF9Bjp8RQl1IHvh1+cL6TigBE0IAGBYw1/p7CGiL+7gEMblJSwC1gOywRHOJmAxqjJ2C0SfzvL0L5E39udMCOAGhLoDTqzGwaDO3BGRmfW1xlR8A7wkHiAWEboNVe+bmHEymb93AFQ4MegtcPT9ACSgZKMT2kGWLEh18Pcah6bqEs0OvaaX9reofERERETFyPHzoT0/BO68NYNv6SJDpcPdReZt61Ih1sN3G2PNanrfnVq7J/sayEL8h7Sm89zUZbR2TQ/K2jfXPMs3ATHmRZ/kUBTuyyfO91pGzUpHp449qV7xhQJ6sQFaaTM8mV67gxnJ1PVoNCuXMpe29PVXczvE1fQzwmOivHKUTrb/yzdvoN7E7Yiich9/K1wFuUCavc4byG2uDNLYQvxPn4vc4vs2lkBuyMOXjyTGSVfsXC1cDoXb2a7kxOGRxsrGLVLuO1YxFG11xAkg4DOLJ/afP7t1H00aZtO8Mt8dLwB/gj/L1J6ygcv2JjIMPGRtPcur7tnLtzKf2+h42IhoHZnCwkBxUwl4zY7PnIqAeBZAFHMCf4aFukNQfTdmFLeAv4hPxVz2ldEos4JRYwCmxgIURe8geUA1SbXxL6vu0kj5tG1gG8zh2ADUGaP3CBDy5/9ED+bLrX3vqmIAUylmnRv4bfCZff0c7Jow+XsrvExmll/1X4oGDgCa6S40GEfsRGOYoD5OpODHiRUJARhgm+rc7IkwCkPz5J3dmd/7xRS0fNsXtbyYvzKsnWBeoZSw+fqxlZfvtfKeVAEGg9gilwj0pCWSS+1HdYH0XUFuMhKtLqO5OivPLgujPA/gU6y+efimHv/mXT1sCZP9PPeczRedsEDUnWdkkP/ED6LQ3kW3fAOOTF1R/ehsU1aYunVyuCNwu2vOBlWAgF1cQRYcA3/CBIiIiIiJ2gCmemFauHJyyPM/1x0veWlguRXjvftCnBSms5fsa35rPALmaH8JXX339NXyBmnOg9C8hP6zuwZMncG/VpJP9Fs10QzPf0Mr0QBu8Ub8ph9l0+sJgwP/lYiEsZFk5ijZBMrCm3viJ9rz+qfAv7Yqup7KABQtu2nSyVEs+1MGrziNdx0wGO3pxsErQwZVyjNfwwrJb9hcSoFwtdIbSvfw1DUAT8M23z59/+41uz1RAscArO5QAY8sIlJNRaMNDKqqpilT72pmaj0EEPFNrdbjCtWLdRQANL7m6JL1a3dMWtS5lrX9q5ofS1vfb01/KpBlyV2FCNmSY55froCgDqMBTxnMCW8B8jver56uVCi81AVJ/gabAKOM0WLCLxMTb9jc2gPSvrmAzBnwG+xLwss1QFMb5cOwn4Eh+PFI/TbIysCmcIAsg0euzZ4fPVnDWFvhCtW62PQKoBXxXys2sXK2/VjBflzgxT9eEyUt6fHxsEFBf2erPicTn8odseFg7x4DVSnUAPAi+mE5nWxwEyRjwXT0G1Awo/QsjHF2p9p7o09cHcIYYUAUdoWGvmbxp9Pv44/qHGIhzDJhmq9UKVpgBehvc9l3gsZqY1e2hodt6PtcTVnIElD+pZgCMP83H/eYAvQ2WFlHCMQbAVAETYLuGfQggSMtr/7jxAyx7BM0RVlrLi1SNlM+b1H8/ScyvdRHlqFFLk0xN6WXNho3ufsDucfTq1RESFweKq/R5yxhtMNs5GREREdELU7w7+vX3aoj5/vWuGzUg3gC8aYUfmlH3h103azDcVererYXX1R1HvWsbWMISn/AfizMjtrfzbFnyv+xf0KZ4owKoxgTeagLetjmI22DzIwpNCVt6oAeoDEt1T196y79E3K0Uvosqp64Ha09KDxTaKAIbN5X8bvLOXJ1l1Q1JgBwBVAj9xqjcbMMcL4xV+uvlxcLU37Z1d5EusH7v5Ns7I8NyhwQUzfUu3AQUpMsDnKc4DetvIyA1TKbcaD4xwmmDgAyWy+Vwnq5W2E0APwfpL3U3BsXeFjDsIFgaQPXQTKnDK03AK5Sp8BeA03uPAcNGa3TQe6rFpzgTOYkwYPDT+y4gxIBD4FIrXLXgohEvsI50DMBSsf3d5zsN1n9U07Lw8sddtmFMsxURERERERGXjAJ84mUDZsSR2egJiT7Y26P6g0e8fAKAUGAQUKalOEMxS9WbkUGFzI08rzK5w9uC+M4FS4ZyhWxAAkwKTAKqtLbN5eWR6tEMBgE4nRNAg0U+GWBuxh2EALwZmBJQTn/UjSz/zHCb6wyYgJlFp7DGhrjN/x+wEQEDWsBGBAxsAcOOARQ7HwMGvgvw+Y4d3wVGgN36ARERERERNxv+58iuO9L/Cvjpc7R3U3opZzfoe3LVc6TwU4GeZ8iLl5YHKBrfhH7/QVd5dFjD/yQBAu1OVqzMGAP0yVK9X7+bPDakcC7ET4U4x09br09kRGs+X6sVmRxP5E+7fRuOzf3sSgZTnqjXZKTubVbvmz/TVyhfgNptf+AgoPxqtOSw+X49SCBJ1IFGPlQv/f17Kl0eSQ5HSkBpARLn+IqrcWFt7E5GBHxRoTXxjvLoMCvvgQu050UGo1M4mToIuHaDYA5wfnaOh/1qOkKHpLDl/3A5NuRv5PV5cyWfmo+IiIiI6A36fEBIppuouspd6+srh0CfDwjJdBtdV7lrfX3l4PWHFq83kelGyq5y1/r6ykHQ5wPe6gIa+UL5hhe1XG2lLdNftTJQWTjT3+r0t876BXjT1Y5Oki5o+wV+3sEH0BVAKzeFiHo1+OICrw6H8vN0ll8vkdvS8eqZ/S8Y7RE///yzMNtTPpG8KQHGB4useu8FaTBuEMsvmEL+/ISAYHtE8+uQV5X+2yNggb6DzkKA7W8XhYL1WyzEZwHq20ZW0IGAcBdQ377VxcRDXQRCBHq7lCD5qSwZWLX5g6DPB1gGtWYQ1IMYHaSAyu5B1TpI0vrpIGumN/y4ZNUHWjmIoW9jfW+jXeUwhnZk+jpSXeUwhnZl+7rSXeWIiIiIiIgID2rH4dLk0YP8/8CwfA0JAD8B5QsrKPwECPpPD8eN6isJwSMTgqB5c8nk39+NHdECbvwYcNPvAhERERERERHbRnJ1PIHgLkjIum90Tcj/BxozEhFo6wYE0Ot9lfTfhgVQfa+U/qYFlNvby5eDgHbtzdTX4FCdfW3HgKyBqT++4pX+V8cG+lpAlf/q6t/XAq68/n3vAg79r+0YEIDW/+rYQNACukDp3fxGRIwc/we0wIqagmy7GAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0NzoxMS0wNzowMJI9H2wAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDc6NTk6MzUtMDc6MDCtPb74AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_222222_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAAAmJLR0QAIn/tYtYAAAAJcEhZcwAAAEgAAABIAEbJaz4AABonSURBVHja7Z17aGXHfcc/Z70br7y2e5W0MRIp3gep+6DsXUsmcXHxVds0awdiaUuaUihItpEaQu3EUChJwXZK6F+x3QTTrklW20ACbkKkNWmyTh+SsWkTR/JqcesmDX5BI1Ga9qruH3JYJ6d/nNfMOfM659yre6Uz30V77z2/ec9vfjNnfr/5TXAcjybjwKAL4DFYeAZoODwDyBgjZGzQhdhNeAYQMcYmsNkkFug1Awx+/IwRVo65CYyjY4Ek5cHXsYeQGcAsAMP0nwm28aOPH8a5j2nD2PJOOrFaDaLu34pZwJTyPpIRIgP0QgCO10ghiZuMw/KoExcCAraALQICQ8p16jh0CNJ9gKSKyTjQIYRC84iI0gkqxU9GmS5/W95hzbK7pmyr4x5CJgHMAtAVpjFonz6i3E1daE6l3tg0TUFiyvXkzJAhKL0TaB5FpjGYNWrVsWNPwTw2zWU3y8AsZZuc2VMozwBmhANvmjE2KzOYeQpKUh58HXuIXjPAXscYm/upe+04OOgCDBm29sfSzh1+J7Dh8AzQcHgGaDg8AzQcngEaDs8ADYdngIbD2wPk4w66/LuMMvYAbhYBNmXMmNEewJyDvXvq2APY1eFR2fcVk5SzB3DTgJmbUN9B45rvrmnbut+W+mbuU5/6vrEGKNoDRNDvhiehTPo2Pd0W28UewFQ6c+72+GaEcdrJ576AbA+g+i5jy0kKqMPYx6eLPYBp/LmVTc8+odXaoExOewJVtIEmheuw2wOYmMsmf5Kae3WwAYNvnLr2AIMu/y7D2wM0HH4jqOHwDNBweAZoODwDNByeARoOzwANh2eAhsObhecRDnCXv/5eaenyH6wXvS+NMMgShNYSVFcF2WMOoObyFBCCUdfv4h8grEApi6p52MofdX1gTMXOHFVju9XAJVSJuAekALbqBw4V0McPHBrIpQqhQdnjUr7AQJM/y+WRUOwtYK6hmYFCS2ywDWKp/OIU4Fp9nbWOvZGCHgj40KiJtM2idUoQprEDJVXMXZVLMrz0ZQgNdHPaWe3Mw0AsZQBlF4Ghw+ixhXLhzmpj3K1zA4fUTR3kkm7VFjANQZe07W1QoJd5DcxEnEsoNc0sAu0cbE7DJmLdRLRtBNlyd1lEVoWdxe10qQRlJICb6Ky3yg0cpUy/yhgYBaxbuoFDmKowT9PmCVAZ96Am0OAw6BLs5fwrxPU7gQ2HZ4CGwzNAw+EZoOHwDNBweAZoODwDNBzy4dDEWergYPcH3k+4tICLRrRaPNvZaNdcSiFjgORglIu792oN0DtUS8tWcrcWMLmazbRxY6VjR3rK5J++DmOVWyDMlRJQHw41H+F00WiPKZ71jgV0abm5htCX360FdHmM5Y7XjpWKndXAJoHqHU0vHNCVj4a5uFO3HcHWHRB1s6Sxl0CXjt2Fu73kbg7p1RqDYtcGObrtYHnWOarziaGUsllhrFNYB8UwZRnAvQGCEnHdSmBuQpf87Wf79fnbYtsYwN4G5g60M4CZgTQMUO4tIGuAKiqLQEhDnXoofZryr4Ks3FXXEKbcx2NqMoOrPQiY8k9iqtcAtpQz3w2m8835Upa0BzA1gLyAMVXfXDhTFU1piFWzm32pusDOgKYabOUcSGyVTsENpu7dSq+9cSslZacAN3Oq0OoiwjwL1ont1rzqerjNwfVN2kzpVL/Uxr4GUML7BxAxZr0xad/BHwwR0bjbAvxWcOPhGaDh8AzQcHgGaDg8AzQcngF6jUGqsysgbw9gg0lf5VL1sZr67n6jfukCy2b3kNW9aA9ggklj7rJLmGjsxh0OmOpR93CV+Xh4YD3+au9gXXxT6gNCthMoFsvu7be42Sgejax2+7frRjOYNHa22IE2nPhUp+00HR4NnajuNd0VqNcAOqMDs74qmxqqGC1EI8duNqX3YRDiqusLSjxV5avK336yeSiRMYCsKCx/gXx0wXrSfeXjB2S6vGoHqLMwdV1QVMvXLUQdHx99QMYAoqKwCg/bbhKwK1vrzo6BIEHUEkL+VIXozShW5SBLj6GRE+IUkKlCVAI8EvCRuZcaW0Z7ABdtv909hBmZLYDapMLc9NkkpPcukoQMSlLFEFUNavoCtTpYt4wBF2WpbhHYC2Wrm9Vi1YWmyyISQwn24GUy3h5AxtCI5t2C3wmU0bDu9wzQeHgGaDg8AzQcngEaDs8ADcfwMUBrWDZJm4E8A7jpsk0qm9CJqgvRorsrr2KD9oMwNCjnLt5NFTNaozxdEiZpGcNVdVmfYR/dAF4HMgOYd6nNu93JqG7RVbJAmG6Uqs/uRaJ/NA3R1cRPvlVzqi5Kn/Iay32IjAFkd+9FZPpwncv0gCDu/m1lXmbRHon+bUYNZ2eT3NX5yxYF+VTc3Ec0DsnRsKzJzB6vbZqspPurz+PbTq6c1af/9U7VE2O2jL6ProCvg4QBkqY1mUyBeGmCGvWvRNHJDzn3fBnkixCKJdyU8g5o2BFQPbLDoWKT6R2M2G+9cL1WQkePWCAsrCMSRbDaK79cnl65lW8AyrwFZE2ss8mzXclkoo+m1C4QFORAIOSumojM9kSy+wiPFGXeAsxGVTYnZzbfHdsp1eU1MnB8lsBmsNZYuF8YYZsiegPzGqAOGnj23wXD5iDCd9IuY/h0AR67Cs8ADYdngIbDM0DDsZ8YYCLdaZjoS/oHORz/G7alcw1EDDAdN9wK05VT+pRF029DyFnJWqBsJ06wln5fU8aeqMUeB3mLm9hhh5t4S8kCE9bSH4+pusMYerotJnwo98+cQ9pL0cGQkAe4BLRYEgJnr2TT6fMZljVJZ+fqFjhrOFlUTD3CLC8KXQhznJcady0XfpL1EnS5hKrSHedl6fcJXpF+H+YmNhgBdmjzfd7UtoA6Dxdn0vqbP22XYkchspa31THdOk84+RIAq5pduCUFg6wyhQ4LmgKMpN92CrRFnkCPNSLHEhE2CVmTclhjUmKByRzdjpeF0kUlzMffYIQjwETMCLpywqSC4lqaOpfPmyGyeJpSwgAb8adohiEW+RLwfXaM27SH48+z2hCHDLHneJF5A31GckExI8kqgHWBBVSjP38+t9ghh3gj/X69sgxHuJ6AawylvNNAM0tAszo+UKRSjsGT7v9N/kF8nM1lXUsC32enEEYuQsQAo4bUdOMGbBIAnk9ZIGSG5xUhEhYodn+EVu6zWLobjCVt8yPuAL5JWxl/HVIWUpdgMpZUk4UJq99Iuv93GZFZwHU9q+r+YgOCWVBFY+dVJc0mARIWQNP9xLmjXeSdyH3mcZjX4283KqhHuEybDaDNZd5RWAPkNalVj5naBb0txO/z5cKzqPsXOAJ8HSCZwN1fA4vdn6/gNVzDNYxwjVZIXs3VXA2oRtiipfthjOeZYYbnNeacE2wxzTRbFdf5I/xi/G+kUL4x3kXIG7Rpc4CQdxlNSic1nX9U+NPhMDbYQnxJ8Sxi+rO8jb8BYIrViFD9jbZYxRFrnO8ZQtokwBhbEI/9LUXzT0h0FQv8fO4z30TRKGkTrYhkOfFONkB4L9igbbAoqiPgd2qGUNt0vBLXL1qfpd1vYgBxJVsUOsXu/zNelH4VYRaJ5jXApOI1rwwd4J25z3wTReuLg6wVXgGzRbL4JL9Msy3y4KvCXxFzLArfq4XQ45WUxYXuHyYHERPArwq/X9QspPqLEBTd38vUIwxG7X2cl+XuHyYG8BgI9pMuwKMCPAM0HJ4BGg7PAA2HZ4D9hU/z6XIRZAZoORzM1sPl5k03TCg16pOCLrv4lj9NKP2bztHnc3TVppOoLT/eBzrAn1vap0Oncrtdxyf4BNdZQs0yy2zyQ3wNbNFlElhT2OavcEe8A/UwSxxjSaGxfoJ1zgILTDAv0ct50Ex0+3L4Sb4bP41SuyW39RPpwxOcLcR31ce3gWjjp/f0JEwAzEr2DgAdVhilC4zSzb+v06ILLPAE85wF5fmJZ7kNeI5fN7TubLyZNMcqr4kMEHV/pE0rskDIeO48fdnbw6PzhB/lcT7K4zzAI5oGmmCdaZYKOj3x6KcqB5fr27/Ne7nEKf6JX9P4OGhzmZCAk4WdvowOGOivcIVDHFfSk+afAxZLtmBCXUjV7SJ9vqCEX1DurE6zxBzLdBODG1EdnGynrjFZyVGLaCug1hzeyiY/4N94nRc1OsEJ1phhWavSrYO/5z1cpM1FbuUftaGivfS2kS7vWcq4orAVSpCMvkUldVRqNZ3lhdra4kaHJwD3A6Px9NhiO1sDnJV209eYNJh16LDNNl26bGsPd/0zv8O3mOXrLBQMOiDp/iUm+rIN/Ft8ldN8g9N8WWm4cRNgOh+Z0AMCrtLSD3FYY/gyK3V8fi+/E3d/cnqyW2ot8Ek+I/3+DJ8shDnKUTrAIywyx/mol8Q1QAjxGkAlwO1TQEA2w4VK+nvZ5Da+w3v4Du8paK2T7lePfnEfXbWmiBzMdAWDlDz9K3yIJ/kwT/JhvsYZjQuJNqCawzP6VfzESFfHz+beCM/mbBA7rKS1iuonrwJaOalaXAOYbw/P2E+i5bWB+pHXZYZljsaiW28PqMNkYY6TGcDc/XJFbSYR28qnf8wR7uMG7uMa/pQzEm2cH8bfNuLPEz2lZ91/XlPm1XgKSGqW7+BtaYoodn8LgOeA24jFey7/aO5flaPlJYA4ivONbkYUohU3f3l7mKji+u5P3gISqN4CRlMXNcU6mBeJycz+L8bS1aEHhIbuV5VQ5UgrYgHVG8D7uMhHeAKY5y85zd9J1FkWeYAui/m4mQQQTRKrdOCCVIEFZRjblSym0b/GLQIL3FLQ/5/gZbpky88TCrr8Ow+b05g69Dlr98NU7jWwiG2BxfO4wu/xFQCeoMsVRYhHgLl8XFd18Mn49cej3+hAXkz3BLMARRb09gANh9cFNByeARoOzwANh2eAhqN5DBCpjTsKSidV5d7kkI5O17fHPBKLDHAybYCTldOr7h+gLlqEnIu/n9NaNTwU6yBWCizwG6xwhjO8m3fzPX6pEDNqnY/Hv8SbjiOc4gOE3MqthHyAU4X4ZvcVeWuGvD1DkW4LMV3IQ6YnFUlfA0+ywSp/ASzSStWexURcXEn2x+p9lkXaXOYkG4pNlSjnRe7mXLzfrt8PP8arFHcKj6Tf3+LHir3QRZ5iiTaX43TkvXq7OjzR73WVimTz3muo0A52cyGC1FBmTeHKN2RUiJGqszMJsMEqUyzzQVpsK07CDB6LwAazbKBSqCZ77Un3q1SuR+NPtSr6TX7MDjv8mLeU9KdYBkZTnf5q6RqcoJteiVGUA4kdlE6GbjMX61rV+tYwTmUCtFL4XYwzzjj/lTzIJEDIDMucYy7mdLM9iy57EWXkgO6GAhEnBbZUSahzgop1kbsL9Lw+LT9CssFwjJcLuT/KxwBYpQNKCSSeeNxRSgB9/iEjscXViDKFSAJ0IVbJvVa4XCeRABPAWaUz75A2B4CfAunRNlkbGHX/3UpPQWHuWzVlj675XXA5PRs3p5yg7oZ09Ku7X7R5yO+1P8lPU/3AyzxWiP9xLpCsHdS7+oeUO/CuOJJ+/gj4WUWIjwGwxAxLHFPIgJDsWGpxQE0A/w38lAP8HC/wcPRYlADbtOKmW6FTweQLYwg3gydTDjYJ8EX+IP2et4uTu1/VgSe5X/j1KV4z5K5isGiM/gSAK1oJoPMiFHJMeh7yWkECiPIj0u2VWwPcDPwnAD/MWjcTe21abPMU06zQUZhEZStetc9v8akqRJD7Z6aqctiIOy/7LiLp/khG3MazEjXp/ilGCZTj9zKfYy7+V+x+2GCRB4CHiVYaRWyzzf/xNq5SnuCftDjYuJZreZVruS7+3wzV2WDbGuBGDnADN3ADcHMSIpsCIv8X0UtSeyh1f3PxW8AlNhQNEHX/c9zNu7mNyCxCRNT9q4b0L7HIt4FfUHQ/wBdZ5RFWeYwuc6CQAhCJWRXWBTOW44XzxzPx4frs/5lciFYqI5LfeYhmMmqTGYVnhLLawEG+BprRopsK/me5Lac1j8zd7LZGaMsfLTG3OcZ2vJw8kHMJA/fwEq+zpW2lkCA9L5BfZh7mV1iLTfIm+decaem0woZSdtmXD1F06Kf0X+DVwSLewcPAg5pRPMsoizFbtfhffqbAYiJUDCB6M+yH3XMFeAZoOJqnC/CQ4Bmg4fAM0HDkGWBa6y/8Ts6nmqTzRpeoHnsI8iJwiWlgufAOCn/EZ3NP7uNzgy68R32IEuB0PPqnOZ0LdWfa/dkO3WeVUmCN0OAm8dVYgnSs5bKH2H2sCdr03fb12zeIDLAAjDJK8VjHGWVc1dMJMDhqPRp/rlhK1VEYbMBs3Piz2ni2EDZ6KFw1UeziSc33PY1sCjjNN8mOht3BRalhNLELT+w7gS3FwU0ZyTFJeeN2VvKSeV4RzxZilkVO8wy3c1GTgptDd1sN9xQyCRCN+la8x7ygCW+7eXfBEDdKv4v65Esn/VR1v2zgoT5fH5lpjMbuF1T00zzNmzzNaU0KwHDsz+0eEgboxPN/N9ZZTVechf89/tOhC2woFpmJ0Nd1vyuW2dZeagPP5D4zuNgyTgDrrLMOfbqWagBIpgBRDVJUiciir44gjM7wbueeZt2u7367K+YQmGOZaRZRC/DTPA3A+7moTWE97dx8CPEqqvX9sgqIJEAn/d0S1IzZ08eVcVVPO5Y1fkCgsGVJ7h8yjf45zXf56SLd1AtPkX6R93OY93PR4Gt7womyzySAbZH3Pr6loP527gx6lpJeMujVyXbhb3eyYAtho4essxCvAtY0Y7zqTSBDiogB1PfsiWLuHj6fo97LFxRxOqwY52+TPYEt7nBgXzKAC25nOjZLhMdYViykmoHGMoDHvoTXBjYcngEaDs8ADYdngIbDM0DD4Rkgj47Fm/8ecwBhg8gAoVILjxSiV1dCDApnLU6wO0ZbhY7VkmHPQZYAHVasTKBGxjwtbQodVmJNQ4eVAgvJ7DevoM9LKalYsOD/olCCeeYN9XPvfherpj2BvK/gCKs8rNyS1XsTDqV4Ifk9/ajxAqDDg3HjmVKY52yBHl2BoIsv18DswyAw0GwpJ9R9siOoXgN0WLHe5a2Ll3S0OEZD4alZwiQp6FBVQkWlKH6rm9Keh5oBVpkyXuWswypTTJFIgGyEBMJTs7onSUEHW/zdwb4Y+xGKDLBasZGTeC1WmCLIpbBKwBQrtAzpu+VctXyyDwI1dcoYV6SGFW5MGErIawDd3J+F0N8oMPwwz/IRsrVKeeqehNcG5tFhxdDFZuoehGeAhsPvBDYcngEaDs8ADYdngIbDM0DDkWcA09lbj32IjAFasavUG7lR42s/0rM9pKF67EkkDNCimzqHOUZX2cltpniMB+k6XCiRV5fM564rmN9luocGyUbQOeb4LPcT8hAPEyrdIUdosUTH6ky26Ko4/1t2lNhvuocGEQO06LLBKeBBnmGVS7Q1t1Mv8ileY4WO5gLTKJzKV/VI7E79EFc4VPCnHXI9b3C94HBdTX9D608/ou3EfyqP/R4KRM6iTwAXAGIv8hdoc6IwgtqcYpE5jjFDlzkeLZXT29Nv6tu/r43/1JfPw3Xx39tR6+OvBUZj+qjvfFfkJUAEtQRIQq4yxTnmtO6Q1RLgl6XfLxVEeH/pHhpEEmCbVTrMxoemZ2mzqrmRImCGJY7ylOGEvQoLvJT7vb6rdA8NkkVgdB/GBhe4izbqGwMya4ApUKhFxdG/Tyzm9j/Ea+Meil8El3loKC+M8OgDvD1Aw+F1AQ2HZ4CGwzNAw+EZoOHIGMB2H0Bd+u08mtIf5fZdp/e7foOmV0TyFmC7D6Au3eZmrt/0ftdv0PTKiBjgTv5WQfsA34i/1aXbHE32m97v+g2aXgPRFJB5/hePTZ1RfBORp9+bXi17b45+l5A+iqd3qZLX0IMK8c8o46vqZ6u/WP7y8delg2m6+Ca6WAp1r5RE3lWs2hm0zZVs5iD2HuAL0pPepe8S356+yh22a/wA9QGzsMTvUEilSP9DAP5K237J01O8QE8OqYkMIOvXiwWw0ZN5N5uP1Q2sayB7+oEyNdcOsKdvZoD67ROkz6vRb+YFoft7wgAH6ych4CfC/+URWiWCGeJx9CopBMJnlfihQ1ybmuwjBtrNXJK6vyfo9RQwC5yn+hRQX8Try1dMoZoIN6XvJkFsEkqX/81ckrq/BxIgWgTa7gNwo98DLLIYfxPp4gtZqHj6BYFqo2Oko6TL5Q8LTx+XKDZ61fZJ6hdWpr8gdb8615KIGOCCVIAEFxTfROTpn08b8PM5+teE9FE8/ZoqeQ09rBD/gjK+qn62+ovlLxs/77yqLB2QhL+6V0riqlGAV/gPPpij3MtX0+916T/gf7gjR7+PL+0avd/1GzS9BiIGgEusss1746eP8ScsSeHq0p/nu7xFO/7113xS6J7doPe7foOmV4Y3CGk4vDaw4fAM0HB4Bmg4PAM0HJ4BGg7PAA2HqAxyvzx9OOkeFSBrA0fSbzvK0HXpHkOH4hRQr+t2rCnUG7lB7RQ8JOQZwNaBO+wY6Yl7Bh1sHajz5Z0grKjr99AgzwAjYOzAEUaM9MhDhx4hZoMJ04UvYDeo8CiJ4hQwUiEVObY5hXrj18ZAHiUhLwJt839dusfQQWQAm2gddrpHBfiNoIbDM0DD4Rmg4fAM0HB4Bmg4PAM0HHuXAcb8hlAvIDNA/X22kAlCJvpe7jE2Ge97Lg2AzADj8d+gYRvdUfdvDbqY+wEyA2zGf4OFbXT77u8hXCVAyFjhrxzCwj81ou7Vs2HS/X4N0BPIyqBNAjY1d2sX/8ph0ilU0v3jRvqWXwP0CjIDmCTAeNo1yV85IbxWeFJkojEhfRWLyd3vJ4EeYJgkgO/+AcBVAtSH/QKHct0/pgnnUQquEmA3YJIuqu73a4AeoNcSoF9Wu4nQz3961IT3D9Bw7F1dgEdP8P+NTFhDa6AzzgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0NzoxMS0wNzowMJI9H2wAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDc6NTk6MzUtMDc6MDCtPb74AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_ef8c08_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAABDlBMVEXvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAjvjAiiapmXAAAAWXRSTlMAGRAzBAhQv4KZLyJVcUBmYBoTMswNITwWQkhLIB5aIycxUyyFNIeAw2rIz8Y4RRy8uL58q7WljKqorR+yKf0BnlEk7woGAgOPomKUSqCvbd+cR2M/b3+RaPlAXvEAAAABYktHRACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAPZElEQVR42u1dC2PbthEGyUiq6ZiSXblLE6ex1mTO5iXZq+u6ro3abG26pOkSd13v//+RAXzhcIeHWMoUbeOTLesIEMB9PIB3ACgLERERMQIkkOy6CTvWH0bOQO/mJeDXP8EMqMzDEkIsEBRMAmh7jHSVmuAjAKwC8FRAzi8/DmoS1AI5AQltj5FOryAjgJ7OK2CZkwEZYO23q+BJ5wwKkttfui1z4s20VTAL5k2kF5hbiPcKcwvwNGB4C7CTwproI4CdDcxEPKUTExx+DNiAj0u9C9AuNPxdYOe46Y5QRERERERExIhx6Z7gjv2ghEVrQJ33hJ5BsxsBfsIq8M0HsAkhWfqglFgawAhgGWh2M1xMWAWUAE90qUofMhhi7be32JNsmVFJPKeLwBQglAQMNh3ALVjYbNaI1jaYD0jM0nw9atcWYEXiaXH/+QDeQ3Y6BoRx3e8CERERERERERG7Qz/HP+iaBsvvHXj0LAD4cip0yN27fXw7AGtQoDTwH+HqkWTgWczTwZVmr8DbAEuqv35bCT6CWDorjGnAqwOSCI7EhlFWHjkBXIkb1M/DZQgRwCeAwK9B+HRPFlPBOjeZszKz0wK9/FlzeE3I24GEzUII45bT/SYarqGLesE+btlDBP70QInkckDwggQqAGGt052667vAJZ8fvk1GRERERERE3FT035ba081ILLvR3UXa/NDgUlWg+m4N2KgCfzzP1lYtDUDpAi9ObeDVqczu4ASsy/u8kaxId/2W+JYq4CsbrBcV8SPw8iRvrWWze+IlILA3XFjNzMeAl7/EMt0TmH4wwtkmHG4OsLVzYkEsHLZE4+yRDbFBA+ypVoZJ6fR8iw24T2cEsBbw5pnptIuFCbA3wHkJN0pmAbObAOvaOl+hd14A1gVIFwl2AXsvT5w5GMPezQE8j8XAhFmAYCv0AQLIIEhS2bAUmsGh9VuukT/Z3goHgZsE7wEL4JnHPR+w6+djIiIiIiIiRo3LvYtzR4U8Kms5Y7uORbg46Ja9o/7Aj+Doz3oGZm2j9XKiMc0MTpGt7PgXvroD2G5x03es1iY9T4cHXH1LBmAKCyP69BIC9jL7EuB+vrtM8nw/gG0+w1yvZu31BQfNueA6fesENOGmi4DEEg7zpnviKZ5uW50Gkgr+zLBFChJLC1m4C9hEwduHLaXRCRHvnhUrAbRLbD2804Oamkxg0Zn5fL8lnQi2bo8JYfwECAkR3h/mjA6LTskTI4HoNbQJKDT/4J8/uoa47vpFRERERFxvpFf8RmZxO8C3XEW94V+i/5iWAqzLLKb3lQZXAyElhXpFIUa1GMK2LgsUryhVU0hRMGTGdylUFqDzC+sSOCNwLN0GePRCt9dL/Y3ozCAAKhKMeJaKWN8ExkWAZfmdE5QSmRKA/wpL7IaOJW0XG0sX2MACWH5zx0ZFkMMC6H6Fhu7R6M90ZGMAyWGdoUm1ldAxwLJBZjTmr9tkSPiPY8hH+VO7QmD5pDDgd2V2YIDT0e0i0XugD8kICeiLLvpHRERERNwsZMpPyDbPf2sicWuo1k1l42ZTX473Ap4b7FWukkvFjCZnfj5uiRwgF7dIAeiMfSnuC4dME8XtGuSERiU4KIopcvbKzwYhpVs057ufG3FRa7gw9G1bTGW2srVfpzetnuQwmUA+MRogWDBB99paherA3FZjG6QVRZFWIITMDAIQA6BMdKJr3DMIkEUfSrSuNDQW4FrvrorTBU5gcnT0PmAClsul/wkMgQkQAQL2DQJBqY4OSEISTEjVQJPwYwWXBcAU0B9VcT0GAGqg0eLj8vRjTcDRB/u/Mgi4c+cO2x7vlskBSoDS/0NMgGlSIPUHTlGKpv3gjoLTAg6V6jA91PMAWWn/LQGqfDTFVhWnC5Rd4O5d3AWWQl4C+d6ekJWvX0iA0v/2vQ/dBCTkgDySJIcJCmHg5OTEPQbAoWRA6o8JKH9aAspBEBFwX519/35z4KgaBI+IOugETgB7REMQAj7C8xPzxW35XrgIoBXCgxKowtPTU9AmyiwgO5xO5ZvuAqXsJuC0Qn0gyeGDPF9Bjp8RQl1IHvh1+cL6TigBE0IAGBYw1/p7CGiL+7gEMblJSwC1gOywRHOJmAxqjJ2C0SfzvL0L5E39udMCOAGhLoDTqzGwaDO3BGRmfW1xlR8A7wkHiAWEboNVe+bmHEymb93AFQ4MegtcPT9ACSgZKMT2kGWLEh18Pcah6bqEs0OvaaX9reofERERETFyPHzoT0/BO68NYNv6SJDpcPdReZt61Ih1sN3G2PNanrfnVq7J/sayEL8h7Sm89zUZbR2TQ/K2jfXPMs3ATHmRZ/kUBTuyyfO91pGzUpHp449qV7xhQJ6sQFaaTM8mV67gxnJ1PVoNCuXMpe29PVXczvE1fQzwmOivHKUTrb/yzdvoN7E7Yiich9/K1wFuUCavc4byG2uDNLYQvxPn4vc4vs2lkBuyMOXjyTGSVfsXC1cDoXb2a7kxOGRxsrGLVLuO1YxFG11xAkg4DOLJ/afP7t1H00aZtO8Mt8dLwB/gj/L1J6ygcv2JjIMPGRtPcur7tnLtzKf2+h42IhoHZnCwkBxUwl4zY7PnIqAeBZAFHMCf4aFukNQfTdmFLeAv4hPxVz2ldEos4JRYwCmxgIURe8geUA1SbXxL6vu0kj5tG1gG8zh2ADUGaP3CBDy5/9ED+bLrX3vqmIAUylmnRv4bfCZff0c7Jow+XsrvExmll/1X4oGDgCa6S40GEfsRGOYoD5OpODHiRUJARhgm+rc7IkwCkPz5J3dmd/7xRS0fNsXtbyYvzKsnWBeoZSw+fqxlZfvtfKeVAEGg9gilwj0pCWSS+1HdYH0XUFuMhKtLqO5OivPLgujPA/gU6y+efimHv/mXT1sCZP9PPeczRedsEDUnWdkkP/ED6LQ3kW3fAOOTF1R/ehsU1aYunVyuCNwu2vOBlWAgF1cQRYcA3/CBIiIiIiJ2gCmemFauHJyyPM/1x0veWlguRXjvftCnBSms5fsa35rPALmaH8JXX339NXyBmnOg9C8hP6zuwZMncG/VpJP9Fs10QzPf0Mr0QBu8Ub8ph9l0+sJgwP/lYiEsZFk5ijZBMrCm3viJ9rz+qfAv7Yqup7KABQtu2nSyVEs+1MGrziNdx0wGO3pxsErQwZVyjNfwwrJb9hcSoFwtdIbSvfw1DUAT8M23z59/+41uz1RAscArO5QAY8sIlJNRaMNDKqqpilT72pmaj0EEPFNrdbjCtWLdRQANL7m6JL1a3dMWtS5lrX9q5ofS1vfb01/KpBlyV2FCNmSY55froCgDqMBTxnMCW8B8jver56uVCi81AVJ/gabAKOM0WLCLxMTb9jc2gPSvrmAzBnwG+xLwss1QFMb5cOwn4Eh+PFI/TbIysCmcIAsg0euzZ4fPVnDWFvhCtW62PQKoBXxXys2sXK2/VjBflzgxT9eEyUt6fHxsEFBf2erPicTn8odseFg7x4DVSnUAPAi+mE5nWxwEyRjwXT0G1Awo/QsjHF2p9p7o09cHcIYYUAUdoWGvmbxp9Pv44/qHGIhzDJhmq9UKVpgBehvc9l3gsZqY1e2hodt6PtcTVnIElD+pZgCMP83H/eYAvQ2WFlHCMQbAVAETYLuGfQggSMtr/7jxAyx7BM0RVlrLi1SNlM+b1H8/ScyvdRHlqFFLk0xN6WXNho3ufsDucfTq1RESFweKq/R5yxhtMNs5GREREdELU7w7+vX3aoj5/vWuGzUg3gC8aYUfmlH3h103azDcVererYXX1R1HvWsbWMISn/AfizMjtrfzbFnyv+xf0KZ4owKoxgTeagLetjmI22DzIwpNCVt6oAeoDEt1T196y79E3K0Uvosqp64Ha09KDxTaKAIbN5X8bvLOXJ1l1Q1JgBwBVAj9xqjcbMMcL4xV+uvlxcLU37Z1d5EusH7v5Ns7I8NyhwQUzfUu3AQUpMsDnKc4DetvIyA1TKbcaD4xwmmDgAyWy+Vwnq5W2E0APwfpL3U3BsXeFjDsIFgaQPXQTKnDK03AK5Sp8BeA03uPAcNGa3TQe6rFpzgTOYkwYPDT+y4gxIBD4FIrXLXgohEvsI50DMBSsf3d5zsN1n9U07Lw8sddtmFMsxURERERERGXjAJ84mUDZsSR2egJiT7Y26P6g0e8fAKAUGAQUKalOEMxS9WbkUGFzI08rzK5w9uC+M4FS4ZyhWxAAkwKTAKqtLbN5eWR6tEMBgE4nRNAg0U+GWBuxh2EALwZmBJQTn/UjSz/zHCb6wyYgJlFp7DGhrjN/x+wEQEDWsBGBAxsAcOOARQ7HwMGvgvw+Y4d3wVGgN36ARERERERNxv+58iuO9L/Cvjpc7R3U3opZzfoe3LVc6TwU4GeZ8iLl5YHKBrfhH7/QVd5dFjD/yQBAu1OVqzMGAP0yVK9X7+bPDakcC7ET4U4x09br09kRGs+X6sVmRxP5E+7fRuOzf3sSgZTnqjXZKTubVbvmz/TVyhfgNptf+AgoPxqtOSw+X49SCBJ1IFGPlQv/f17Kl0eSQ5HSkBpARLn+IqrcWFt7E5GBHxRoTXxjvLoMCvvgQu050UGo1M4mToIuHaDYA5wfnaOh/1qOkKHpLDl/3A5NuRv5PV5cyWfmo+IiIiI6A36fEBIppuouspd6+srh0CfDwjJdBtdV7lrfX3l4PWHFq83kelGyq5y1/r6ykHQ5wPe6gIa+UL5hhe1XG2lLdNftTJQWTjT3+r0t876BXjT1Y5Oki5o+wV+3sEH0BVAKzeFiHo1+OICrw6H8vN0ll8vkdvS8eqZ/S8Y7RE///yzMNtTPpG8KQHGB4useu8FaTBuEMsvmEL+/ISAYHtE8+uQV5X+2yNggb6DzkKA7W8XhYL1WyzEZwHq20ZW0IGAcBdQ377VxcRDXQRCBHq7lCD5qSwZWLX5g6DPB1gGtWYQ1IMYHaSAyu5B1TpI0vrpIGumN/y4ZNUHWjmIoW9jfW+jXeUwhnZk+jpSXeUwhnZl+7rSXeWIiIiIiIgID2rH4dLk0YP8/8CwfA0JAD8B5QsrKPwECPpPD8eN6isJwSMTgqB5c8nk39+NHdECbvwYcNPvAhERERERERHbRnJ1PIHgLkjIum90Tcj/BxozEhFo6wYE0Ot9lfTfhgVQfa+U/qYFlNvby5eDgHbtzdTX4FCdfW3HgKyBqT++4pX+V8cG+lpAlf/q6t/XAq68/n3vAg79r+0YEIDW/+rYQNACukDp3fxGRIwc/we0wIqagmy7GAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0NzoxMS0wNzowMJI9H2wAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDc6NTk6MzUtMDc6MDCtPb74AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_ffd27a_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAMAAADYSUr5AAABDlBMVEX/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nr/0nqfzRgWAAAAWXRSTlMAGRAzBAhQv4KZLyJVcUBmYBoTMswNITwWQkhLIB5aIycxUyyFNIeAw2rIz8Y4RRy8uL58q7WljKqorR+yKf0BnlEk7woGAgOPomKUSqCvbd+cR2M/b3+RaPlAXvEAAAABYktHRACIBR1IAAAACXBIWXMAAABIAAAASABGyWs+AAAPZElEQVR42u1dC2PbthEGyUiq6ZiSXblLE6ex1mTO5iXZq+u6ro3abG26pOkSd13v//+RAXzhcIeHWMoUbeOTLesIEMB9PIB3ACgLERERMQIkkOy6CTvWH0bOQO/mJeDXP8EMqMzDEkIsEBRMAmh7jHSVmuAjAKwC8FRAzi8/DmoS1AI5AQltj5FOryAjgJ7OK2CZkwEZYO23q+BJ5wwKkttfui1z4s20VTAL5k2kF5hbiPcKcwvwNGB4C7CTwproI4CdDcxEPKUTExx+DNiAj0u9C9AuNPxdYOe46Y5QRERERERExIhx6Z7gjv2ghEVrQJ33hJ5BsxsBfsIq8M0HsAkhWfqglFgawAhgGWh2M1xMWAWUAE90qUofMhhi7be32JNsmVFJPKeLwBQglAQMNh3ALVjYbNaI1jaYD0jM0nw9atcWYEXiaXH/+QDeQ3Y6BoRx3e8CERERERERERG7Qz/HP+iaBsvvHXj0LAD4cip0yN27fXw7AGtQoDTwH+HqkWTgWczTwZVmr8DbAEuqv35bCT6CWDorjGnAqwOSCI7EhlFWHjkBXIkb1M/DZQgRwCeAwK9B+HRPFlPBOjeZszKz0wK9/FlzeE3I24GEzUII45bT/SYarqGLesE+btlDBP70QInkckDwggQqAGGt052667vAJZ8fvk1GRERERERE3FT035ba081ILLvR3UXa/NDgUlWg+m4N2KgCfzzP1lYtDUDpAi9ObeDVqczu4ASsy/u8kaxId/2W+JYq4CsbrBcV8SPw8iRvrWWze+IlILA3XFjNzMeAl7/EMt0TmH4wwtkmHG4OsLVzYkEsHLZE4+yRDbFBA+ypVoZJ6fR8iw24T2cEsBbw5pnptIuFCbA3wHkJN0pmAbObAOvaOl+hd14A1gVIFwl2AXsvT5w5GMPezQE8j8XAhFmAYCv0AQLIIEhS2bAUmsGh9VuukT/Z3goHgZsE7wEL4JnHPR+w6+djIiIiIiIiRo3LvYtzR4U8Kms5Y7uORbg46Ja9o/7Aj+Doz3oGZm2j9XKiMc0MTpGt7PgXvroD2G5x03es1iY9T4cHXH1LBmAKCyP69BIC9jL7EuB+vrtM8nw/gG0+w1yvZu31BQfNueA6fesENOGmi4DEEg7zpnviKZ5uW50Gkgr+zLBFChJLC1m4C9hEwduHLaXRCRHvnhUrAbRLbD2804Oamkxg0Zn5fL8lnQi2bo8JYfwECAkR3h/mjA6LTskTI4HoNbQJKDT/4J8/uoa47vpFRERERFxvpFf8RmZxO8C3XEW94V+i/5iWAqzLLKb3lQZXAyElhXpFIUa1GMK2LgsUryhVU0hRMGTGdylUFqDzC+sSOCNwLN0GePRCt9dL/Y3ozCAAKhKMeJaKWN8ExkWAZfmdE5QSmRKA/wpL7IaOJW0XG0sX2MACWH5zx0ZFkMMC6H6Fhu7R6M90ZGMAyWGdoUm1ldAxwLJBZjTmr9tkSPiPY8hH+VO7QmD5pDDgd2V2YIDT0e0i0XugD8kICeiLLvpHRERERNwsZMpPyDbPf2sicWuo1k1l42ZTX473Ap4b7FWukkvFjCZnfj5uiRwgF7dIAeiMfSnuC4dME8XtGuSERiU4KIopcvbKzwYhpVs057ufG3FRa7gw9G1bTGW2srVfpzetnuQwmUA+MRogWDBB99paherA3FZjG6QVRZFWIITMDAIQA6BMdKJr3DMIkEUfSrSuNDQW4FrvrorTBU5gcnT0PmAClsul/wkMgQkQAQL2DQJBqY4OSEISTEjVQJPwYwWXBcAU0B9VcT0GAGqg0eLj8vRjTcDRB/u/Mgi4c+cO2x7vlskBSoDS/0NMgGlSIPUHTlGKpv3gjoLTAg6V6jA91PMAWWn/LQGqfDTFVhWnC5Rd4O5d3AWWQl4C+d6ekJWvX0iA0v/2vQ/dBCTkgDySJIcJCmHg5OTEPQbAoWRA6o8JKH9aAspBEBFwX519/35z4KgaBI+IOugETgB7REMQAj7C8xPzxW35XrgIoBXCgxKowtPTU9AmyiwgO5xO5ZvuAqXsJuC0Qn0gyeGDPF9Bjp8RQl1IHvh1+cL6TigBE0IAGBYw1/p7CGiL+7gEMblJSwC1gOywRHOJmAxqjJ2C0SfzvL0L5E39udMCOAGhLoDTqzGwaDO3BGRmfW1xlR8A7wkHiAWEboNVe+bmHEymb93AFQ4MegtcPT9ACSgZKMT2kGWLEh18Pcah6bqEs0OvaaX9reofERERETFyPHzoT0/BO68NYNv6SJDpcPdReZt61Ih1sN3G2PNanrfnVq7J/sayEL8h7Sm89zUZbR2TQ/K2jfXPMs3ATHmRZ/kUBTuyyfO91pGzUpHp449qV7xhQJ6sQFaaTM8mV67gxnJ1PVoNCuXMpe29PVXczvE1fQzwmOivHKUTrb/yzdvoN7E7Yiich9/K1wFuUCavc4byG2uDNLYQvxPn4vc4vs2lkBuyMOXjyTGSVfsXC1cDoXb2a7kxOGRxsrGLVLuO1YxFG11xAkg4DOLJ/afP7t1H00aZtO8Mt8dLwB/gj/L1J6ygcv2JjIMPGRtPcur7tnLtzKf2+h42IhoHZnCwkBxUwl4zY7PnIqAeBZAFHMCf4aFukNQfTdmFLeAv4hPxVz2ldEos4JRYwCmxgIURe8geUA1SbXxL6vu0kj5tG1gG8zh2ADUGaP3CBDy5/9ED+bLrX3vqmIAUylmnRv4bfCZff0c7Jow+XsrvExmll/1X4oGDgCa6S40GEfsRGOYoD5OpODHiRUJARhgm+rc7IkwCkPz5J3dmd/7xRS0fNsXtbyYvzKsnWBeoZSw+fqxlZfvtfKeVAEGg9gilwj0pCWSS+1HdYH0XUFuMhKtLqO5OivPLgujPA/gU6y+efimHv/mXT1sCZP9PPeczRedsEDUnWdkkP/ED6LQ3kW3fAOOTF1R/ehsU1aYunVyuCNwu2vOBlWAgF1cQRYcA3/CBIiIiIiJ2gCmemFauHJyyPM/1x0veWlguRXjvftCnBSms5fsa35rPALmaH8JXX339NXyBmnOg9C8hP6zuwZMncG/VpJP9Fs10QzPf0Mr0QBu8Ub8ph9l0+sJgwP/lYiEsZFk5ijZBMrCm3viJ9rz+qfAv7Yqup7KABQtu2nSyVEs+1MGrziNdx0wGO3pxsErQwZVyjNfwwrJb9hcSoFwtdIbSvfw1DUAT8M23z59/+41uz1RAscArO5QAY8sIlJNRaMNDKqqpilT72pmaj0EEPFNrdbjCtWLdRQANL7m6JL1a3dMWtS5lrX9q5ofS1vfb01/KpBlyV2FCNmSY55froCgDqMBTxnMCW8B8jver56uVCi81AVJ/gabAKOM0WLCLxMTb9jc2gPSvrmAzBnwG+xLwss1QFMb5cOwn4Eh+PFI/TbIysCmcIAsg0euzZ4fPVnDWFvhCtW62PQKoBXxXys2sXK2/VjBflzgxT9eEyUt6fHxsEFBf2erPicTn8odseFg7x4DVSnUAPAi+mE5nWxwEyRjwXT0G1Awo/QsjHF2p9p7o09cHcIYYUAUdoWGvmbxp9Pv44/qHGIhzDJhmq9UKVpgBehvc9l3gsZqY1e2hodt6PtcTVnIElD+pZgCMP83H/eYAvQ2WFlHCMQbAVAETYLuGfQggSMtr/7jxAyx7BM0RVlrLi1SNlM+b1H8/ScyvdRHlqFFLk0xN6WXNho3ufsDucfTq1RESFweKq/R5yxhtMNs5GREREdELU7w7+vX3aoj5/vWuGzUg3gC8aYUfmlH3h103azDcVererYXX1R1HvWsbWMISn/AfizMjtrfzbFnyv+xf0KZ4owKoxgTeagLetjmI22DzIwpNCVt6oAeoDEt1T196y79E3K0Uvosqp64Ha09KDxTaKAIbN5X8bvLOXJ1l1Q1JgBwBVAj9xqjcbMMcL4xV+uvlxcLU37Z1d5EusH7v5Ns7I8NyhwQUzfUu3AQUpMsDnKc4DetvIyA1TKbcaD4xwmmDgAyWy+Vwnq5W2E0APwfpL3U3BsXeFjDsIFgaQPXQTKnDK03AK5Sp8BeA03uPAcNGa3TQe6rFpzgTOYkwYPDT+y4gxIBD4FIrXLXgohEvsI50DMBSsf3d5zsN1n9U07Lw8sddtmFMsxURERERERGXjAJ84mUDZsSR2egJiT7Y26P6g0e8fAKAUGAQUKalOEMxS9WbkUGFzI08rzK5w9uC+M4FS4ZyhWxAAkwKTAKqtLbN5eWR6tEMBgE4nRNAg0U+GWBuxh2EALwZmBJQTn/UjSz/zHCb6wyYgJlFp7DGhrjN/x+wEQEDWsBGBAxsAcOOARQ7HwMGvgvw+Y4d3wVGgN36ARERERERNxv+58iuO9L/Cvjpc7R3U3opZzfoe3LVc6TwU4GeZ8iLl5YHKBrfhH7/QVd5dFjD/yQBAu1OVqzMGAP0yVK9X7+bPDakcC7ET4U4x09br09kRGs+X6sVmRxP5E+7fRuOzf3sSgZTnqjXZKTubVbvmz/TVyhfgNptf+AgoPxqtOSw+X49SCBJ1IFGPlQv/f17Kl0eSQ5HSkBpARLn+IqrcWFt7E5GBHxRoTXxjvLoMCvvgQu050UGo1M4mToIuHaDYA5wfnaOh/1qOkKHpLDl/3A5NuRv5PV5cyWfmo+IiIiI6A36fEBIppuouspd6+srh0CfDwjJdBtdV7lrfX3l4PWHFq83kelGyq5y1/r6ykHQ5wPe6gIa+UL5hhe1XG2lLdNftTJQWTjT3+r0t876BXjT1Y5Oki5o+wV+3sEH0BVAKzeFiHo1+OICrw6H8vN0ll8vkdvS8eqZ/S8Y7RE///yzMNtTPpG8KQHGB4useu8FaTBuEMsvmEL+/ISAYHtE8+uQV5X+2yNggb6DzkKA7W8XhYL1WyzEZwHq20ZW0IGAcBdQ377VxcRDXQRCBHq7lCD5qSwZWLX5g6DPB1gGtWYQ1IMYHaSAyu5B1TpI0vrpIGumN/y4ZNUHWjmIoW9jfW+jXeUwhnZk+jpSXeUwhnZl+7rSXeWIiIiIiIgID2rH4dLk0YP8/8CwfA0JAD8B5QsrKPwECPpPD8eN6isJwSMTgqB5c8nk39+NHdECbvwYcNPvAhERERERERHbRnJ1PIHgLkjIum90Tcj/BxozEhFo6wYE0Ot9lfTfhgVQfa+U/qYFlNvby5eDgHbtzdTX4FCdfW3HgKyBqT++4pX+V8cG+lpAlf/q6t/XAq68/n3vAg79r+0YEIDW/+rYQNACukDp3fxGRIwc/we0wIqagmy7GAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0wMy0xMVQwODo0NzoxMS0wNzowMJI9H2wAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMDMtMTFUMDc6NTk6MzUtMDc6MDCtPb74AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/images/ui-icons_ffffff_256x240.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAQAAAADwCAQAAABFnnJAAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAAAEgAAABIAEbJaz4AABe4SURBVHja7V1diCXHdf56vbZmVl6nxwKFO2yyq1mM4qAwM7oDsR6C7iYIKesH3V1QHgyBu5YYJwHjrB9NQCuByIthHbAga6TZxeBgHMJKISZ+SDIb1oQgRtoVgtjGyD8PmSGQMIpfJmCLk4f+q6o+daq6+965P1VfM3Pv7VN16ud8Vd1dp6o6IUSEjBPTzkDEdBEJEDgiAXT0QOhNOxPHiUgAFT3sA9gPiQLjJsD0208Pbe9rM/OvwkaBQvP0yzhG6ASQO0AqDwmu9mOPT3nqPWsYV9qFEduVIDP/QU4BSfMC9REqAcbRAa520FDELdphc3SJCyRIcADgAAkSQXOXMs4ckrIxFEUs2oENBNSqR0WmJ2kVv2hltvRdaVPHvPtqdpVxjlD1AHIH6AupDbovH1nqkgllLd3apnQJUjV362dmDEnjOya5FUltsEqqbdtxa5Dbppx3uQ+sNLv6mblCcwLIoKlXTQ/7rQkmX4IKzdMv4xgxbgLMO3rYXyTzuhEJEDjiSGDgiAQIHJEAgSMSIHBEAgSOSIDAEQkQOOJ8ADPutPN/zGgyH8BvRoDLGdMT5wPIKbjN02U+gNsdnuV9oUjSbD6AnwdMrkK7gVYt3311u8zv0r5vfNq1L8xsgPp8gAz20fAilORvs8tdsX3mA0i5k1N3x5dBue7icyGgzwfgvus48OoF+DDu9ukzH0Bqf355s9OHnLMNmqQ0F2jjDJIcrrM+H0Ail6v/KUoe3cECpl85XecDTDv/x4zoDg4ccSAocEQCBI5IgMARCRA4IgECRyRA4IgECBwnp52BmQNNcZS/+1hp4/yf7BZ9IpUwzRyQMwftXUHumFMouX4JIED09fvsD0AtJE3RNg1X/jPTJ6IWNznaxvYrgU+oBnFPaAFcxU88CmCPn3hUkE8RSHD2+OQvEWT6Z7M0Com7BuQSygQiR2zA1Yi1/KuXAN/i22bruCspGUMHT6In0nUV7ZIDKmMnrFRNnUulaF72PJAgl3VXpZObgZrLBGh6E0gerccVyoed7dq4n3ETD+2SgXz0tq0BqQn66HbXQU3e5DGw6uJ8QvEyuQt0M1jW4epi/bpoVwtype5zE9kWboq75VoOTHdw6E8B851+i8fIOB8gcMSRwMARCRA4IgECRyRA4IgECByRAIEjEiBw6ItDi81Spwf3fuCThE8N+HhE28VzrY32TaURKgIUC6N8tntvVwHjQztdrpz71YC01Wzljes1jp35KYvDXoZe6xogI5cA+MWh8hJOH492jzk3PgrYdPltDWHPv18N2NLoGctre41iVyVw9UDdlqbXFujqQ8E+26m7lmDbFoj6zaRx58Cmx72FuzvnfhvS8z63umkTQ+5aWF4Zh1ufSJpm2WFsc1gn9TBNCeBfAUmDuH45kKvQJ3332n57+q7YLgK460A2oJsAMoEsBGj2FFBVQBuPVaLo4LWT9iml3wZVvtveQ0ipr+bS4grO7yAgpV/E5O8BXJqrvRuk9c1mLhvOB5AqQL+BkYovZ04qoqRDLZp72hdnAjcBpRIcGBtIHDTW4AfJvAfla2/8commlwA/XzU5t4iQr4JdYvtVL18Ov2tw9yltkp72L7Vx3wOwiPMBVPScb0xaOEQCBI44FBw4IgECRyRA4IgECByRAIEjEmDcmLPHKnM+gAuSv8qn6L2O/u5Jo3vuEsdg94yVvT4fQILkMfcZJSw8dqseC0zt6Lq4Sl4enjiXv7oNbIsvaZ8SqoEgNVvu3X7rg43q0sh2b//2HWgGJI+dK3ZiDaeetXk7pcWj5CX1L+mxgL8HsE06kP1V1aWhzaSFrOW4p03Z9zAg+Pr6kgZnuXS59N0rm2cS5vsCqips+gZu8xKSNIhbSP2WQLsXb7ffQkIyo6uH8Ncs7RFwzKh6ANVR2CZrrjcJuJ2tXa+OidKD8D2E/smFGE8r5lLQe48ZMb9+CTgoM8V14FkHn0334nEgzgfw8fa7t4eQUc0F4KdUyFVfXYTsu4sUIZOGUjVE2wk1EwHvDSRrB+7jLLXdBI7D2eo3a7HtjabPTSQAB0Fnxrg+iO5gHTPTNR8XIgECRxwKDhyRAIEjEiBwRAIEjkiAwDF7BEhny1u26DAJ4OfLllw25CW1hUhxeCxP4tPeB2Fm0Gy7eJ/tpBOsdMjPIQqSpGK4tlvWV1igN4B3gU4AeZRaHu0uWnWKQ5YCVA6U8mv3sq5/pQxxaIlffGu3qbra+/i9an7BURFA3+69jsofbtsyPUGSm/8DNi25a8+6/g+wIqydLVLn09dnFJha/LaPCA7FULDf6nYJxVwbm/nNuThmL+L6LZ2tS8xw5vYR0lvOg4I6JSxB3Uwm7FMZ/CZE2CeVmQSyTcngc+jaPkEn+IK9Ar4LqhdGqFVm32DE/dYL39dK2OQZBah2H1E4gvld+fX8+Lw2IgIAtz+A38r1ul/evUONJM1uHuUQurbE61wB9w5CgcL/hRH6rNjq+7hhv4voBv/tI4LCrM0HmJT5IyyYNQJEHDNmzxcQcayIBAgckQCBIxIgcCwSAfqlJ6A/Ef0nsZQfzd63OtPICDDMK24Xw9aaXnZ4+l0g3NBmCzQ1Yh975fc9Nna/Ez1O4ld4FEc4wqP4FUuBvjP3a7l0zZKGXe6KCTxnHHIKxtwOoqs0oAENSUUVtjo/JFgOKj+3tbhqCF57doyor8lHmrRPJvqN5HoOudytGfHXDPkSrRPREi0R0TotCTXAp1GHVEP+EjXEtncZyxAFk+8BAO5YJnPcxpdxD0CK2+W5O7hgZeMXLCOKy+W3o5rsJr4htL89ZBtLZNgHYU9LYQ9bSg8AbBlyN95Xcpfl0Ix/H8t4EEAf942wej6BLUbim5suL5+XsYb3y++lpoIA9/NPdRqGmuV7AH6EI3G2z1L+ecMa4qNC7Ct4D9uC/JLmSr6kUDHD2woFtvC2ISWoizP5FYYfxS/K759g8/AgPoEEp4RcXhRkpkeSl/MvoE4YLc0IXpj/D/DP6unqWnboUPAjHNXC6FnICLAiaLO1G8DVAwBvlRQgXMJbTIiCAnXzZ0iNz3rufl3M6Qb+G38I4B+xwcZ/GygpxOdgK++p9N7qOFCY/4+wrFPA936WM3+9AgG5o8razk9ZmasHKCgAi/mRpw7rTd5549PEEn6efzvLSB/Eu9jAfQAbeBcP4f8MuTkLqe0yU3dH7wrxOfxN7Vxm/i/gQQD/AADFBdz/MbBufrOAp3AKp7CMU9ZO8gE8gAcAcC3spsP8QA9v4RIu4S3LdM4+DjDEEAct7/OX8Vv5sVzLXw9nQPgFNrCBEyCcEaeUblmMf075s2EJLrhCfIs5l5H+Bj6G7wAALuBOJmj/RFsv4rIzzg+FkK4eoIcDIG/7B0z19zU5R4HfMD7NKspayQayOyK9n3gY9wH8pPx9HxvCjKIuHfxRxxD8hNmf5OXL7s9K86N8DEwdj1HuR5iXNfnL1scV+2PMjQk+BhYPSdWnLRd95hGQe4hzPeg1fQwGjayl9wmhlpDXXzwEDtSzs+MO7gP4HeX3e5YbqcmCAJxXWvr4tWeYztSUNbyvtX7E+QDBY5F8AREtEAkQOCIBAkckQOCIBFgsvIJXmkXQCZCC4FqYbQeVjoyujxZ9cB71LeXxte5vGxqPvUNDvm3IuUEn1Vu+NgE5APylo34GGLSut9P4Cr6C045QI4wwKn8pdZISUZ/6RJTWBhF2aSkfRrhG6zRkh0Fu5AMR23TDkMuebPPos+G3FE82EdEWOxBSHPX47oGcLMw6rdP6hORFmGxQx5QMqBiQS83hmtw6RNuEvHQpo/suERHdFWu3GEwa0TkCQU+gn4+h1dUT9RqNg3FyENGf5X9XrRXUp2wCSt+iH5YUXAYmAv07ge4R6N+InzJBtJ5L1gU5RPlpWqLTFnlR/SMaNa7BAtusfLsWe5tNf0hEI0qrkUTVHVw4Kfew1WqjFnWuAO85fAL7+DF+gJ/jPYtPsI89XMIbVpduF/wTfhffwwa+hyfwL9ZQ2Vj6hijXxyx1/LLmJ6wwwk0AyP/X6+9Q+8WDn21x1uMMAHwJwEp+eUzxAcoe4IYxmt6nG417ALWDs/UAV4noL4joFbaF9InY1j+uHuBvCfRdAn2Llpj0H3X0AIUcotzeA4y03JmXgIGS6wyDRuX7qib7KlOD5+hcPXUziX5OhHr1j4MAn6HfpM/R+fyvifn1WXE2AqRElFKaXy9N+XeI6Nv539/V5EX5bNfwSv64Q87Hr6692XG+IQFMd10q1JDsatLOmwrUT122RENCyaEBE0ImQN1f18T8ZvFkAvDys/Rdeph26WH6e/q0IV+t5W5trPLK/LAeuolTUW6T3s1vBE35iIpr/25bAsBxUJ6N1DM8b+C+Vb5lVDD3FJCWRecJYidghsccuesih8P8Pi73ggIpI3uKPsxv/LbpQ3qKIcBVGtXj+ibvNqh+H8rfg0qTlmXzmxTYqkld07plORFRz2GcLvKR0/yux8CKAqkl9nPl9+dqsa09kK87eB3v+gWM6IgBoHvsx4QRAOCWeTrOBwgc0RcQOCIBAkckQOCIBAgc4REgcxsPGMmgfDZ61EOPbTfFOburVgmwXlbAemt9NLUqSEHYyb/vwDar4Vq+qHS3RoHfxy4u4zI+hU/hh/h0LWZWO1fzX9mepeq+55v4LAhP4AkQPovNWnx5+4ph7cF+6JC7QgxraRgjQObZdSLapSEN6ZAqpwc34CENZpAzRPtjlOdrnR1UybBDoB1rLorhkHPsUNep8vgYOxa6Q8M8B5meAZO+fRyv8FKklmEw+UwVO7XoycYa+7k3B0z51BjrxXc1QDZKvENEh1YjTpMAxVgWn0Zh9uqzruGaONZ5gj5CCSX0ETrBGmRIIKJB6dPncicTQPWHmCuXMm9Iv6zjOgGgzaKoEyDTul2OyXIEOEOr+cEQYJhX4w4748dFAHJWgdu4cvx1Rcb1UDuKnDN/KuonSspjjUn9eh5rlx9SpWz3kOLgCWBPn8oZV7wGKn2cQwKdYwkAhQB8n7JOm7RZ+isZAuzkVcdP+XIxXA7RTMoTyOVTk1p/NeMpw8CQf5uI1vKD6DqjYVC6bLn0iU53IsBD+dmHyv9m7KL/GhLROUsPYK+/PhGdoTO0Smdok4iuZefV9wV8gBQ38fn8FknecR9OubSbuFvKpbBe7mOSrdE38U38cfn9+/g9TZYqM56AK/UxcazjS8qvl/EzIfWslszyrwD4EADwS2aDGcKKNs/KfMHFI9p5ws8MuT5f6Ca+bMzayrbwzybL7jHb+RMeB/BfAID/VGpX62APaUhD2qXZvAksWh+fxjfL1p/hrhG3n7f71Kp/s2w759jUd+gqUd4Odxh59vmQ5UbPnGhjtt/H6DHjv9x/NL8HGFKfNmmTNolos34JUK+xNvPP/lPAXSrmxnLVM3CksEPbtM1Op0IeO6MQRwESfpln12ohhrUOfGjEPFc7mt0DEA3Lw0IA31Y4LQLIR6q0+rtkes2z1uFTOlv+s57lkFIqbieTWtzP02eoJ9QSEZT7DF22lD8FZP/NbejqBDEpMhSlaum0MkZ3sIqH8BKAF/E/rHSEFdzM32aQ4n/xa9qbDVz3SIC+meUk5j23QCRA4AjPFxChIRIgcEQCBA6TAEPrfuEXcau8obwlbokaMU/QHhRuExHRbeYB5ou1h5AvTuVhLx5jPtQfz5TGfcYIdlF7eixwkVG4R0R71uR+6jkgA48Qx3/sKfTfm3puJkCA21T4nMw+4DWWAK8xCuWBoNowhNX8HEncy6tcIVxyor1yuGiPlfvlf46O6uszmoH1PsCGpgQAgV24WTd/vZ9Q19byBnSFGBHR07RET1s1+JVuQQmQXf8Lr7PeB+gFl6phm2zLwlTz7zKSQfnJXyZcxkFu+DQnAid/Ov/2tKBhT0hjgQkwIBOqAfwJwHfeuqZ7jEeuiGczvy8BUrL3MVSOsNf99RXsBOgT0R7t0R75+BXm5DArwPzelACuozBS3fyZ2W3mn4UeYIFvAqv2nyp+58oMX2cJ8HVGoasHsB1qD8THn/49gJuCc3hwRasX8ilW+hSj0FU5dqnU+nUDj1qH6PoUkIWZutHGT4A91sBqFTxfkz5vNeNASFCiR9ve43iPBSOAvzv4SQzx5/n3r+EN/Ou0xzCnhLbvAppRxPkAgSN6AwNHJEDgiAQIHJEAgSMSIHBEApgYgFpL5xAqAYjZNkEHYVyvhJgWbgjvNgeAAXZbS+cTxigd0a4wGqd6A0xJES+1ahjQbu4IGtCuoAGEfHmTLt/WNLVx1w4cg80Dj9hFDdi1zNXBV5/NhBIB1Hj1ah6UcQb5CntZg50Atvg+BJCksqOnLl2QIWFbIflpHS4CZCasfutSEErjuTTYCGCP7yZAUxPbpfwGDHN58DeBd3AB32hxPbmDC7iAbJ3cBWXMPFHOXhB3wi002OCKfzxYJG9AjeWLfA/gOgK8B1CdQYQ7eElsX5Szv/icL6hPLrbcZ/f57aRziegNNDHArmBiWTqHiAQIHHEkMHBEAgSOSIDAEQkQOCIBAodJAFJeLB4RACoCpPlWqWdx1rLXfjZ0dM0ijZhLFARIcVhuDvMIDlkjb+ACvoYXcejxQglzeGHbGIHcPmZ5hA15je0Q0V8RiOhFyvbFtY0ep+JewtWovOt3/1jl8bAchVGJ7hEI9CINCHSPbG+n3qFzlDllU6tSfqfapXw79dP5n7nT7WmSNlwv5CTKl8q/pdYOocCOkwCA8wDeBAC8BAB4Exs4X9vKdAObuIkreASXcIgruN6oq/mk0ukkqI9Afzz/S8Avvzqd/30S/ObyHwewkstXFmu8fpLIfAEpDnFfedHRPWxgRdsJt0CKQ9zBBezgClvJlO9UX9+t/re13/9h7JU7aXmEDXlXsEvVoukR8Zu4ZL7w7H0VtpfK2ObL6O8Wr883mrQ8Hpaj8AZm78O4jzfxLDbAv5Gjmg1wAWDcomrrX7A1tIuLyh28jmv5g+AbuBZfFh8K4nyAwBF9AYEjEiBwRAIEjkiAwFERwPU+gK7yJ3G9lF/Hk8cun3T5pi1vi1yn630AXeWubeYmLZ90+aYtb31kHxeJQ/U+gK5y10aTk5ZPunzTlnc4skvA5bJDSJQRvMvMNxWm/IU8boIXDPmzin4wZ5/l1FvkSYv4l9n4XPlc5Vfz3zz+20iUELb4klzNBW+VhsgGgqrRoKT2S5dzGSnkCYDnAbyunRmffp/4bv1qiKbxE/ALzKjBb1K01OV/AgD4a2v9FWc38Q7GskhNJYD+Lup6Blxy4AW8DuB5vCZWsK2C3PoTVpuvAdz6ZQJ0r5+kPN9O/jjeUcw/FgKc7K5CwYfK/+YgZ48gQ12O3kZDony2iU8ecV1usj8VZI/jnmb+sWDcl4ARgFtofwno3sXb81fX0K4Ll/T79SCuHsqW/uO4p5l/DD1AdhP4Kit7lfkmyZ8HcBM382+q/HUlFjFnX1ekLjlEOVi5nn+qnX1Vk7jkbeunKB+1lr+jmZ9PtSmCeAyb9mPopOWdxwEWfyBm2gNRk5Z3JgDoSbpeKr9OT9aCdpVfpFul/BYziDFp+aTLN215yyNOCAkc0RsYOCIBAkckQOCIBAgckQCBIxIgcKjOoLrTUcesyyNaQPcGLpffjtjQXeURM4f6JaCb6Y6cGrq13KSzhggNJgFcBjzCkShfxpHSD9ThMqA6JYoDtfT1R1hgEmAZEA24jGVRfoRlkSAEecJE7qGwIq47HjPql4DlFlr02LKGbu3XRaCIhtDfF6BJamFnXR7RAtEbGDjiQFDgiAQIHJEAgSMSIHBEAgSOSIDAMb8E6MUBoXFAJ0D3cTZCH4T+xPPdwz5WJ55KANAJsJr/TRuu1p2Z/2Da2VwE6ATYz/+mC1frjuYfI3x7AEKv9tcMzKokFpl57TQszB/vAcYCfUbQPhLss26WhPlrhi2vUIX5V0X5QbwHGBd0Akg9wGppmuKvWSe8VztTJ1FP0c9RTDd/vAiMAbPUA0TzTwG+PUB3uN/f0cz8PUu4iEbw7QGOA1Lvwpk/3gOMAfqEkB4O0JvJzpXyTt/8jOiIOCMocMyvLyBiLPh/gj9Qphd3t8gAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMTFUMDg6NDc6MTEtMDc6MDCSPR9sAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTExVDA3OjU5OjM1LTA3OjAwrT2++AAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/info.dat</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGluZm9bJ2NzcyddID0gJ2pxdWVyeS11aS5taW4uY3NzJzsKJGluZm9bJ2pzJ10gPSAnanF1ZXJ5LXVpLm1pbi5qcyc7CiRpbmZvWydkZXBlbmRzJ10gPSAnanF1ZXJ5JzsKJGluZm9bJ2Nzc19ub21pbmlmeSddID0gMTsKJGluZm9bJ2pzX25vbWluaWZ5J10gPSAxOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/jquery-ui.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjExLjAgLSAyMDE0LTA3LTE3CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBjb3JlLmNzcywgZHJhZ2dhYmxlLmNzcywgcmVzaXphYmxlLmNzcywgc2VsZWN0YWJsZS5jc3MsIHNvcnRhYmxlLmNzcywgYWNjb3JkaW9uLmNzcywgYXV0b2NvbXBsZXRlLmNzcywgYnV0dG9uLmNzcywgZGF0ZXBpY2tlci5jc3MsIGRpYWxvZy5jc3MsIG1lbnUuY3NzLCBwcm9ncmVzc2Jhci5jc3MsIHNlbGVjdG1lbnUuY3NzLCBzbGlkZXIuY3NzLCBzcGlubmVyLmNzcywgdGFicy5jc3MsIHRvb2x0aXAuY3NzLCB0aGVtZS5jc3MKKiBUbyB2aWV3IGFuZCBtb2RpZnkgdGhpcyB0aGVtZSwgdmlzaXQgaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci8/ZmZEZWZhdWx0PVRyZWJ1Y2hldCUyME1TJTJDVGFob21hJTJDVmVyZGFuYSUyQ0FyaWFsJTJDc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPWY2YTgyOCZiZ1RleHR1cmVIZWFkZXI9Z2xvc3Nfd2F2ZSZiZ0ltZ09wYWNpdHlIZWFkZXI9MzUmYm9yZGVyQ29sb3JIZWFkZXI9ZTc4ZjA4JmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9ZmZmZmZmJmJnQ29sb3JDb250ZW50PWVlZWVlZSZiZ1RleHR1cmVDb250ZW50PWhpZ2hsaWdodF9zb2Z0JmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD1kZGRkZGQmZmNDb250ZW50PTMzMzMzMyZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD1mNmY2ZjYmYmdUZXh0dXJlRGVmYXVsdD1nbGFzcyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9Y2NjY2NjJmZjRGVmYXVsdD0xYzk0YzQmaWNvbkNvbG9yRGVmYXVsdD1lZjhjMDgmYmdDb2xvckhvdmVyPWZkZjVjZSZiZ1RleHR1cmVIb3Zlcj1nbGFzcyZiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYm9yZGVyQ29sb3JIb3Zlcj1mYmNiMDkmZmNIb3Zlcj1jNzc0MDUmaWNvbkNvbG9ySG92ZXI9ZWY4YzA4JmJnQ29sb3JBY3RpdmU9ZmZmZmZmJmJnVGV4dHVyZUFjdGl2ZT1nbGFzcyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9ZmJkODUwJmZjQWN0aXZlPWViOGYwMCZpY29uQ29sb3JBY3RpdmU9ZWY4YzA4JmJnQ29sb3JIaWdobGlnaHQ9ZmZlNDVjJmJnVGV4dHVyZUhpZ2hsaWdodD1oaWdobGlnaHRfc29mdCZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NzUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmVkMjJmJmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9MjI4ZWYxJmJnQ29sb3JFcnJvcj1iODE5MDAmYmdUZXh0dXJlRXJyb3I9ZGlhZ29uYWxzX3RoaWNrJmJnSW1nT3BhY2l0eUVycm9yPTE4JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZDI3YSZiZ0NvbG9yT3ZlcmxheT02NjY2NjYmYmdUZXh0dXJlT3ZlcmxheT1kaWFnb25hbHNfdGhpY2smYmdJbWdPcGFjaXR5T3ZlcmxheT0yMCZvcGFjaXR5T3ZlcmxheT01MCZiZ0NvbG9yU2hhZG93PTAwMDAwMCZiZ1RleHR1cmVTaGFkb3c9ZmxhdCZiZ0ltZ09wYWNpdHlTaGFkb3c9MTAmb3BhY2l0eVNoYWRvdz0yMCZ0aGlja25lc3NTaGFkb3c9NXB4Jm9mZnNldFRvcFNoYWRvdz0tNXB4Jm9mZnNldExlZnRTaGFkb3c9LTVweCZjb3JuZXJSYWRpdXNTaGFkb3c9NXB4CiogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCgovKiBMYXlvdXQgaGVscGVycwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLWhlbHBlci1oaWRkZW4gewoJZGlzcGxheTogbm9uZTsKfQoudWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIHsKCWJvcmRlcjogMDsKCWNsaXA6IHJlY3QoMCAwIDAgMCk7CgloZWlnaHQ6IDFweDsKCW1hcmdpbjogLTFweDsKCW92ZXJmbG93OiBoaWRkZW47CglwYWRkaW5nOiAwOwoJcG9zaXRpb246IGFic29sdXRlOwoJd2lkdGg6IDFweDsKfQoudWktaGVscGVyLXJlc2V0IHsKCW1hcmdpbjogMDsKCXBhZGRpbmc6IDA7Cglib3JkZXI6IDA7CglvdXRsaW5lOiAwOwoJbGluZS1oZWlnaHQ6IDEuMzsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKCWZvbnQtc2l6ZTogMTAwJTsKCWxpc3Qtc3R5bGU6IG5vbmU7Cn0KLnVpLWhlbHBlci1jbGVhcmZpeDpiZWZvcmUsCi51aS1oZWxwZXItY2xlYXJmaXg6YWZ0ZXIgewoJY29udGVudDogIiI7CglkaXNwbGF5OiB0YWJsZTsKCWJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7Cn0KLnVpLWhlbHBlci1jbGVhcmZpeDphZnRlciB7CgljbGVhcjogYm90aDsKfQoudWktaGVscGVyLWNsZWFyZml4IHsKCW1pbi1oZWlnaHQ6IDA7IC8qIHN1cHBvcnQ6IElFNyAqLwp9Ci51aS1oZWxwZXItemZpeCB7Cgl3aWR0aDogMTAwJTsKCWhlaWdodDogMTAwJTsKCXRvcDogMDsKCWxlZnQ6IDA7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglvcGFjaXR5OiAwOwoJZmlsdGVyOkFscGhhKE9wYWNpdHk9MCk7Cn0KCi51aS1mcm9udCB7Cgl6LWluZGV4OiAxMDA7Cn0KCgovKiBJbnRlcmFjdGlvbiBDdWVzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoudWktc3RhdGUtZGlzYWJsZWQgewoJY3Vyc29yOiBkZWZhdWx0ICFpbXBvcnRhbnQ7Cn0KCgovKiBJY29ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIHN0YXRlcyBhbmQgaW1hZ2VzICovCi51aS1pY29uIHsKCWRpc3BsYXk6IGJsb2NrOwoJdGV4dC1pbmRlbnQ6IC05OTk5OXB4OwoJb3ZlcmZsb3c6IGhpZGRlbjsKCWJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KCgovKiBNaXNjIHZpc3VhbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBPdmVybGF5cyAqLwoudWktd2lkZ2V0LW92ZXJsYXkgewoJcG9zaXRpb246IGZpeGVkOwoJdG9wOiAwOwoJbGVmdDogMDsKCXdpZHRoOiAxMDAlOwoJaGVpZ2h0OiAxMDAlOwp9Ci51aS1kcmFnZ2FibGUtaGFuZGxlIHsKCS1tcy10b3VjaC1hY3Rpb246IG5vbmU7Cgl0b3VjaC1hY3Rpb246IG5vbmU7Cn0KLnVpLXJlc2l6YWJsZSB7Cglwb3NpdGlvbjogcmVsYXRpdmU7Cn0KLnVpLXJlc2l6YWJsZS1oYW5kbGUgewoJcG9zaXRpb246IGFic29sdXRlOwoJZm9udC1zaXplOiAwLjFweDsKCWRpc3BsYXk6IGJsb2NrOwoJLW1zLXRvdWNoLWFjdGlvbjogbm9uZTsKCXRvdWNoLWFjdGlvbjogbm9uZTsKfQoudWktcmVzaXphYmxlLWRpc2FibGVkIC51aS1yZXNpemFibGUtaGFuZGxlLAoudWktcmVzaXphYmxlLWF1dG9oaWRlIC51aS1yZXNpemFibGUtaGFuZGxlIHsKCWRpc3BsYXk6IG5vbmU7Cn0KLnVpLXJlc2l6YWJsZS1uIHsKCWN1cnNvcjogbi1yZXNpemU7CgloZWlnaHQ6IDdweDsKCXdpZHRoOiAxMDAlOwoJdG9wOiAtNXB4OwoJbGVmdDogMDsKfQoudWktcmVzaXphYmxlLXMgewoJY3Vyc29yOiBzLXJlc2l6ZTsKCWhlaWdodDogN3B4OwoJd2lkdGg6IDEwMCU7Cglib3R0b206IC01cHg7CglsZWZ0OiAwOwp9Ci51aS1yZXNpemFibGUtZSB7CgljdXJzb3I6IGUtcmVzaXplOwoJd2lkdGg6IDdweDsKCXJpZ2h0OiAtNXB4OwoJdG9wOiAwOwoJaGVpZ2h0OiAxMDAlOwp9Ci51aS1yZXNpemFibGUtdyB7CgljdXJzb3I6IHctcmVzaXplOwoJd2lkdGg6IDdweDsKCWxlZnQ6IC01cHg7Cgl0b3A6IDA7CgloZWlnaHQ6IDEwMCU7Cn0KLnVpLXJlc2l6YWJsZS1zZSB7CgljdXJzb3I6IHNlLXJlc2l6ZTsKCXdpZHRoOiAxMnB4OwoJaGVpZ2h0OiAxMnB4OwoJcmlnaHQ6IDFweDsKCWJvdHRvbTogMXB4Owp9Ci51aS1yZXNpemFibGUtc3cgewoJY3Vyc29yOiBzdy1yZXNpemU7Cgl3aWR0aDogOXB4OwoJaGVpZ2h0OiA5cHg7CglsZWZ0OiAtNXB4OwoJYm90dG9tOiAtNXB4Owp9Ci51aS1yZXNpemFibGUtbncgewoJY3Vyc29yOiBudy1yZXNpemU7Cgl3aWR0aDogOXB4OwoJaGVpZ2h0OiA5cHg7CglsZWZ0OiAtNXB4OwoJdG9wOiAtNXB4Owp9Ci51aS1yZXNpemFibGUtbmUgewoJY3Vyc29yOiBuZS1yZXNpemU7Cgl3aWR0aDogOXB4OwoJaGVpZ2h0OiA5cHg7CglyaWdodDogLTVweDsKCXRvcDogLTVweDsKfQoudWktc2VsZWN0YWJsZSB7CgktbXMtdG91Y2gtYWN0aW9uOiBub25lOwoJdG91Y2gtYWN0aW9uOiBub25lOwp9Ci51aS1zZWxlY3RhYmxlLWhlbHBlciB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl6LWluZGV4OiAxMDA7Cglib3JkZXI6IDFweCBkb3R0ZWQgYmxhY2s7Cn0KLnVpLXNvcnRhYmxlLWhhbmRsZSB7CgktbXMtdG91Y2gtYWN0aW9uOiBub25lOwoJdG91Y2gtYWN0aW9uOiBub25lOwp9Ci51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXIgewoJZGlzcGxheTogYmxvY2s7CgljdXJzb3I6IHBvaW50ZXI7Cglwb3NpdGlvbjogcmVsYXRpdmU7CgltYXJnaW46IDJweCAwIDAgMDsKCXBhZGRpbmc6IC41ZW0gLjVlbSAuNWVtIC43ZW07CgltaW4taGVpZ2h0OiAwOyAvKiBzdXBwb3J0OiBJRTcgKi8KCWZvbnQtc2l6ZTogMTAwJTsKfQoudWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taWNvbnMgewoJcGFkZGluZy1sZWZ0OiAyLjJlbTsKfQoudWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taWNvbnMgLnVpLWFjY29yZGlvbi1pY29ucyB7CglwYWRkaW5nLWxlZnQ6IDIuMmVtOwp9Ci51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXIgLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglsZWZ0OiAuNWVtOwoJdG9wOiA1MCU7CgltYXJnaW4tdG9wOiAtOHB4Owp9Ci51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1jb250ZW50IHsKCXBhZGRpbmc6IDFlbSAyLjJlbTsKCWJvcmRlci10b3A6IDA7CglvdmVyZmxvdzogYXV0bzsKfQoudWktYXV0b2NvbXBsZXRlIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMDsKCWxlZnQ6IDA7CgljdXJzb3I6IGRlZmF1bHQ7Cn0KLnVpLWJ1dHRvbiB7CglkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cglwb3NpdGlvbjogcmVsYXRpdmU7CglwYWRkaW5nOiAwOwoJbGluZS1oZWlnaHQ6IG5vcm1hbDsKCW1hcmdpbi1yaWdodDogLjFlbTsKCWN1cnNvcjogcG9pbnRlcjsKCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7CglvdmVyZmxvdzogdmlzaWJsZTsgLyogcmVtb3ZlcyBleHRyYSB3aWR0aCBpbiBJRSAqLwp9Ci51aS1idXR0b24sCi51aS1idXR0b246bGluaywKLnVpLWJ1dHRvbjp2aXNpdGVkLAoudWktYnV0dG9uOmhvdmVyLAoudWktYnV0dG9uOmFjdGl2ZSB7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLyogdG8gbWFrZSByb29tIGZvciB0aGUgaWNvbiwgYSB3aWR0aCBuZWVkcyB0byBiZSBzZXQgaGVyZSAqLwoudWktYnV0dG9uLWljb24tb25seSB7Cgl3aWR0aDogMi4yZW07Cn0KLyogYnV0dG9uIGVsZW1lbnRzIHNlZW0gdG8gbmVlZCBhIGxpdHRsZSBtb3JlIHdpZHRoICovCmJ1dHRvbi51aS1idXR0b24taWNvbi1vbmx5IHsKCXdpZHRoOiAyLjRlbTsKfQoudWktYnV0dG9uLWljb25zLW9ubHkgewoJd2lkdGg6IDMuNGVtOwp9CmJ1dHRvbi51aS1idXR0b24taWNvbnMtb25seSB7Cgl3aWR0aDogMy43ZW07Cn0KCi8qIGJ1dHRvbiB0ZXh0IGVsZW1lbnQgKi8KLnVpLWJ1dHRvbiAudWktYnV0dG9uLXRleHQgewoJZGlzcGxheTogYmxvY2s7CglsaW5lLWhlaWdodDogbm9ybWFsOwp9Ci51aS1idXR0b24tdGV4dC1vbmx5IC51aS1idXR0b24tdGV4dCB7CglwYWRkaW5nOiAuNGVtIDFlbTsKfQoudWktYnV0dG9uLWljb24tb25seSAudWktYnV0dG9uLXRleHQsCi51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLXRleHQgewoJcGFkZGluZzogLjRlbTsKCXRleHQtaW5kZW50OiAtOTk5OTk5OXB4Owp9Ci51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWJ1dHRvbi10ZXh0LAoudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0IHsKCXBhZGRpbmc6IC40ZW0gMWVtIC40ZW0gMi4xZW07Cn0KLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24tdGV4dCwKLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24tdGV4dCB7CglwYWRkaW5nOiAuNGVtIDIuMWVtIC40ZW0gMWVtOwp9Ci51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLXRleHQgewoJcGFkZGluZy1sZWZ0OiAyLjFlbTsKCXBhZGRpbmctcmlnaHQ6IDIuMWVtOwp9Ci8qIG5vIGljb24gc3VwcG9ydCBmb3IgaW5wdXQgZWxlbWVudHMsIHByb3ZpZGUgcGFkZGluZyBieSBkZWZhdWx0ICovCmlucHV0LnVpLWJ1dHRvbiB7CglwYWRkaW5nOiAuNGVtIDFlbTsKfQoKLyogYnV0dG9uIGljb24gZWxlbWVudChzKSAqLwoudWktYnV0dG9uLWljb24tb25seSAudWktaWNvbiwKLnVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSAudWktaWNvbiwKLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1pY29uLAoudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWljb24sCi51aS1idXR0b24taWNvbnMtb25seSAudWktaWNvbiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDUwJTsKCW1hcmdpbi10b3A6IC04cHg7Cn0KLnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb24gewoJbGVmdDogNTAlOwoJbWFyZ2luLWxlZnQ6IC04cHg7Cn0KLnVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSAudWktYnV0dG9uLWljb24tcHJpbWFyeSwKLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1wcmltYXJ5LAoudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnkgewoJbGVmdDogLjVlbTsKfQoudWktYnV0dG9uLXRleHQtaWNvbi1zZWNvbmRhcnkgLnVpLWJ1dHRvbi1pY29uLXNlY29uZGFyeSwKLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24taWNvbi1zZWNvbmRhcnksCi51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHsKCXJpZ2h0OiAuNWVtOwp9CgovKiBidXR0b24gc2V0cyAqLwoudWktYnV0dG9uc2V0IHsKCW1hcmdpbi1yaWdodDogN3B4Owp9Ci51aS1idXR0b25zZXQgLnVpLWJ1dHRvbiB7CgltYXJnaW4tbGVmdDogMDsKCW1hcmdpbi1yaWdodDogLS4zZW07Cn0KCi8qIHdvcmthcm91bmRzICovCi8qIHJlc2V0IGV4dHJhIHBhZGRpbmcgaW4gRmlyZWZveCwgc2VlIGg1YnAuY29tL2wgKi8KaW5wdXQudWktYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLApidXR0b24udWktYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKCWJvcmRlcjogMDsKCXBhZGRpbmc6IDA7Cn0KLnVpLWRhdGVwaWNrZXIgewoJd2lkdGg6IDE3ZW07CglwYWRkaW5nOiAuMmVtIC4yZW0gMDsKCWRpc3BsYXk6IG5vbmU7Cn0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItaGVhZGVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXBhZGRpbmc6IC4yZW0gMDsKfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LAoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0IHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogMnB4OwoJd2lkdGg6IDEuOGVtOwoJaGVpZ2h0OiAxLjhlbTsKfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyLAoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIHsKCXRvcDogMXB4Owp9Ci51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYgewoJbGVmdDogMnB4Owp9Ci51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLW5leHQgewoJcmlnaHQ6IDJweDsKfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIHsKCWxlZnQ6IDFweDsKfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIHsKCXJpZ2h0OiAxcHg7Cn0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiBzcGFuLAoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0IHNwYW4gewoJZGlzcGxheTogYmxvY2s7Cglwb3NpdGlvbjogYWJzb2x1dGU7CglsZWZ0OiA1MCU7CgltYXJnaW4tbGVmdDogLThweDsKCXRvcDogNTAlOwoJbWFyZ2luLXRvcDogLThweDsKfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZSB7CgltYXJnaW46IDAgMi4zZW07CglsaW5lLWhlaWdodDogMS44ZW07Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItdGl0bGUgc2VsZWN0IHsKCWZvbnQtc2l6ZTogMWVtOwoJbWFyZ2luOiAxcHggMDsKfQoudWktZGF0ZXBpY2tlciBzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwKLnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciB7Cgl3aWR0aDogNDklOwp9Ci51aS1kYXRlcGlja2VyIHRhYmxlIHsKCXdpZHRoOiAxMDAlOwoJZm9udC1zaXplOiAuOWVtOwoJYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKCW1hcmdpbjogMCAwIC40ZW07Cn0KLnVpLWRhdGVwaWNrZXIgdGggewoJcGFkZGluZzogLjdlbSAuM2VtOwoJdGV4dC1hbGlnbjogY2VudGVyOwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cglib3JkZXI6IDA7Cn0KLnVpLWRhdGVwaWNrZXIgdGQgewoJYm9yZGVyOiAwOwoJcGFkZGluZzogMXB4Owp9Ci51aS1kYXRlcGlja2VyIHRkIHNwYW4sCi51aS1kYXRlcGlja2VyIHRkIGEgewoJZGlzcGxheTogYmxvY2s7CglwYWRkaW5nOiAuMmVtOwoJdGV4dC1hbGlnbjogcmlnaHQ7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB7CgliYWNrZ3JvdW5kLWltYWdlOiBub25lOwoJbWFyZ2luOiAuN2VtIDAgMCAwOwoJcGFkZGluZzogMCAuMmVtOwoJYm9yZGVyLWxlZnQ6IDA7Cglib3JkZXItcmlnaHQ6IDA7Cglib3JkZXItYm90dG9tOiAwOwp9Ci51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgYnV0dG9uIHsKCWZsb2F0OiByaWdodDsKCW1hcmdpbjogLjVlbSAuMmVtIC40ZW07CgljdXJzb3I6IHBvaW50ZXI7CglwYWRkaW5nOiAuMmVtIC42ZW0gLjNlbSAuNmVtOwoJd2lkdGg6IGF1dG87CglvdmVyZmxvdzogdmlzaWJsZTsKfQoudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnQgewoJZmxvYXQ6IGxlZnQ7Cn0KCi8qIHdpdGggbXVsdGlwbGUgY2FsZW5kYXJzICovCi51aS1kYXRlcGlja2VyLnVpLWRhdGVwaWNrZXItbXVsdGkgewoJd2lkdGg6IGF1dG87Cn0KLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgewoJZmxvYXQ6IGxlZnQ7Cn0KLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgdGFibGUgewoJd2lkdGg6IDk1JTsKCW1hcmdpbjogMCBhdXRvIC40ZW07Cn0KLnVpLWRhdGVwaWNrZXItbXVsdGktMiAudWktZGF0ZXBpY2tlci1ncm91cCB7Cgl3aWR0aDogNTAlOwp9Ci51aS1kYXRlcGlja2VyLW11bHRpLTMgLnVpLWRhdGVwaWNrZXItZ3JvdXAgewoJd2lkdGg6IDMzLjMlOwp9Ci51aS1kYXRlcGlja2VyLW11bHRpLTQgLnVpLWRhdGVwaWNrZXItZ3JvdXAgewoJd2lkdGg6IDI1JTsKfQoudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciwKLnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIC51aS1kYXRlcGlja2VyLWhlYWRlciB7Cglib3JkZXItbGVmdC13aWR0aDogMDsKfQoudWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIHsKCWNsZWFyOiBsZWZ0Owp9Ci51aS1kYXRlcGlja2VyLXJvdy1icmVhayB7CgljbGVhcjogYm90aDsKCXdpZHRoOiAxMDAlOwoJZm9udC1zaXplOiAwOwp9CgovKiBSVEwgc3VwcG9ydCAqLwoudWktZGF0ZXBpY2tlci1ydGwgewoJZGlyZWN0aW9uOiBydGw7Cn0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLXByZXYgewoJcmlnaHQ6IDJweDsKCWxlZnQ6IGF1dG87Cn0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLW5leHQgewoJbGVmdDogMnB4OwoJcmlnaHQ6IGF1dG87Cn0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLXByZXY6aG92ZXIgewoJcmlnaHQ6IDFweDsKCWxlZnQ6IGF1dG87Cn0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLW5leHQ6aG92ZXIgewoJbGVmdDogMXB4OwoJcmlnaHQ6IGF1dG87Cn0KLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgewoJY2xlYXI6IHJpZ2h0Owp9Ci51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbiB7CglmbG9hdDogbGVmdDsKfQoudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24udWktZGF0ZXBpY2tlci1jdXJyZW50LAoudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAgewoJZmxvYXQ6IHJpZ2h0Owp9Ci51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciwKLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXIgewoJYm9yZGVyLXJpZ2h0LXdpZHRoOiAwOwoJYm9yZGVyLWxlZnQtd2lkdGg6IDFweDsKfQoudWktZGlhbG9nIHsKCW92ZXJmbG93OiBoaWRkZW47Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJcGFkZGluZzogLjJlbTsKCW91dGxpbmU6IDA7Cn0KLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyIHsKCXBhZGRpbmc6IC40ZW0gMWVtOwoJcG9zaXRpb246IHJlbGF0aXZlOwp9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZSB7CglmbG9hdDogbGVmdDsKCW1hcmdpbjogLjFlbSAwOwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKCXdpZHRoOiA5MCU7CglvdmVyZmxvdzogaGlkZGVuOwoJdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KLnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXJpZ2h0OiAuM2VtOwoJdG9wOiA1MCU7Cgl3aWR0aDogMjBweDsKCW1hcmdpbjogLTEwcHggMCAwIDA7CglwYWRkaW5nOiAxcHg7CgloZWlnaHQ6IDIwcHg7Cn0KLnVpLWRpYWxvZyAudWktZGlhbG9nLWNvbnRlbnQgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJYm9yZGVyOiAwOwoJcGFkZGluZzogLjVlbSAxZW07CgliYWNrZ3JvdW5kOiBub25lOwoJb3ZlcmZsb3c6IGF1dG87Cn0KLnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgewoJdGV4dC1hbGlnbjogbGVmdDsKCWJvcmRlci13aWR0aDogMXB4IDAgMCAwOwoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKCW1hcmdpbi10b3A6IC41ZW07CglwYWRkaW5nOiAuM2VtIDFlbSAuNWVtIC40ZW07Cn0KLnVpLWRpYWxvZyAudWktZGlhbG9nLWJ1dHRvbnBhbmUgLnVpLWRpYWxvZy1idXR0b25zZXQgewoJZmxvYXQ6IHJpZ2h0Owp9Ci51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIGJ1dHRvbiB7CgltYXJnaW46IC41ZW0gLjRlbSAuNWVtIDA7CgljdXJzb3I6IHBvaW50ZXI7Cn0KLnVpLWRpYWxvZyAudWktcmVzaXphYmxlLXNlIHsKCXdpZHRoOiAxMnB4OwoJaGVpZ2h0OiAxMnB4OwoJcmlnaHQ6IC01cHg7Cglib3R0b206IC01cHg7CgliYWNrZ3JvdW5kLXBvc2l0aW9uOiAxNnB4IDE2cHg7Cn0KLnVpLWRyYWdnYWJsZSAudWktZGlhbG9nLXRpdGxlYmFyIHsKCWN1cnNvcjogbW92ZTsKfQoudWktbWVudSB7CglsaXN0LXN0eWxlOiBub25lOwoJcGFkZGluZzogMDsKCW1hcmdpbjogMDsKCWRpc3BsYXk6IGJsb2NrOwoJb3V0bGluZTogbm9uZTsKfQoudWktbWVudSAudWktbWVudSB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cn0KLnVpLW1lbnUgLnVpLW1lbnUtaXRlbSB7Cglwb3NpdGlvbjogcmVsYXRpdmU7CgltYXJnaW46IDA7CglwYWRkaW5nOiAzcHggMWVtIDNweCAuNGVtOwoJY3Vyc29yOiBwb2ludGVyOwoJbWluLWhlaWdodDogMDsgLyogc3VwcG9ydDogSUU3ICovCgkvKiBzdXBwb3J0OiBJRTEwLCBzZWUgIzg4NDQgKi8KCWxpc3Qtc3R5bGUtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3Iik7Cn0KLnVpLW1lbnUgLnVpLW1lbnUtZGl2aWRlciB7CgltYXJnaW46IDVweCAwOwoJaGVpZ2h0OiAwOwoJZm9udC1zaXplOiAwOwoJbGluZS1oZWlnaHQ6IDA7Cglib3JkZXItd2lkdGg6IDFweCAwIDAgMDsKfQoudWktbWVudSAudWktc3RhdGUtZm9jdXMsCi51aS1tZW51IC51aS1zdGF0ZS1hY3RpdmUgewoJbWFyZ2luOiAtMXB4Owp9CgovKiBpY29uIHN1cHBvcnQgKi8KLnVpLW1lbnUtaWNvbnMgewoJcG9zaXRpb246IHJlbGF0aXZlOwp9Ci51aS1tZW51LWljb25zIC51aS1tZW51LWl0ZW0gewoJcGFkZGluZy1sZWZ0OiAyZW07Cn0KCi8qIGxlZnQtYWxpZ25lZCAqLwoudWktbWVudSAudWktaWNvbiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7Cglib3R0b206IDA7CglsZWZ0OiAuMmVtOwoJbWFyZ2luOiBhdXRvIDA7Cn0KCi8qIHJpZ2h0LWFsaWduZWQgKi8KLnVpLW1lbnUgLnVpLW1lbnUtaWNvbiB7CglsZWZ0OiBhdXRvOwoJcmlnaHQ6IDA7Cn0KLnVpLXByb2dyZXNzYmFyIHsKCWhlaWdodDogMmVtOwoJdGV4dC1hbGlnbjogbGVmdDsKCW92ZXJmbG93OiBoaWRkZW47Cn0KLnVpLXByb2dyZXNzYmFyIC51aS1wcm9ncmVzc2Jhci12YWx1ZSB7CgltYXJnaW46IC0xcHg7CgloZWlnaHQ6IDEwMCU7Cn0KLnVpLXByb2dyZXNzYmFyIC51aS1wcm9ncmVzc2Jhci1vdmVybGF5IHsKCWJhY2tncm91bmQ6IHVybCgiaW1hZ2VzL2FuaW1hdGVkLW92ZXJsYXkuZ2lmIik7CgloZWlnaHQ6IDEwMCU7CglmaWx0ZXI6IGFscGhhKG9wYWNpdHk9MjUpOwoJb3BhY2l0eTogMC4yNTsKfQoudWktcHJvZ3Jlc3NiYXItaW5kZXRlcm1pbmF0ZSAudWktcHJvZ3Jlc3NiYXItdmFsdWUgewoJYmFja2dyb3VuZC1pbWFnZTogbm9uZTsKfQoudWktc2VsZWN0bWVudS1tZW51IHsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl0b3A6IDA7CglsZWZ0OiAwOwoJZGlzcGxheTogbm9uZTsKfQoudWktc2VsZWN0bWVudS1tZW51IC51aS1tZW51IHsKCW92ZXJmbG93OiBhdXRvOwoJLyogU3VwcG9ydDogSUU3ICovCglvdmVyZmxvdy14OiBoaWRkZW47CglwYWRkaW5nLWJvdHRvbTogMXB4Owp9Ci51aS1zZWxlY3RtZW51LW1lbnUgLnVpLW1lbnUgLnVpLXNlbGVjdG1lbnUtb3B0Z3JvdXAgewoJZm9udC1zaXplOiAxZW07Cglmb250LXdlaWdodDogYm9sZDsKCWxpbmUtaGVpZ2h0OiAxLjU7CglwYWRkaW5nOiAycHggMC40ZW07CgltYXJnaW46IDAuNWVtIDAgMCAwOwoJaGVpZ2h0OiBhdXRvOwoJYm9yZGVyOiAwOwp9Ci51aS1zZWxlY3RtZW51LW9wZW4gewoJZGlzcGxheTogYmxvY2s7Cn0KLnVpLXNlbGVjdG1lbnUtYnV0dG9uIHsKCWRpc3BsYXk6IGlubGluZS1ibG9jazsKCW92ZXJmbG93OiBoaWRkZW47Cglwb3NpdGlvbjogcmVsYXRpdmU7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7CgljdXJzb3I6IHBvaW50ZXI7Cn0KLnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktaWNvbiB7CglyaWdodDogMC41ZW07CglsZWZ0OiBhdXRvOwoJbWFyZ2luLXRvcDogLThweDsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXRvcDogNTAlOwp9Ci51aS1zZWxlY3RtZW51LWJ1dHRvbiBzcGFuLnVpLXNlbGVjdG1lbnUtdGV4dCB7Cgl0ZXh0LWFsaWduOiBsZWZ0OwoJcGFkZGluZzogMC40ZW0gMi4xZW0gMC40ZW0gMWVtOwoJZGlzcGxheTogYmxvY2s7CglsaW5lLWhlaWdodDogMS40OwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoudWktc2xpZGVyIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsKCXRleHQtYWxpZ246IGxlZnQ7Cn0KLnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZSB7Cglwb3NpdGlvbjogYWJzb2x1dGU7Cgl6LWluZGV4OiAyOwoJd2lkdGg6IDEuMmVtOwoJaGVpZ2h0OiAxLjJlbTsKCWN1cnNvcjogZGVmYXVsdDsKCS1tcy10b3VjaC1hY3Rpb246IG5vbmU7Cgl0b3VjaC1hY3Rpb246IG5vbmU7Cn0KLnVpLXNsaWRlciAudWktc2xpZGVyLXJhbmdlIHsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDE7Cglmb250LXNpemU6IC43ZW07CglkaXNwbGF5OiBibG9jazsKCWJvcmRlcjogMDsKCWJhY2tncm91bmQtcG9zaXRpb246IDAgMDsKfQoKLyogRm9yIElFOCAtIFNlZSAjNjcyNyAqLwoudWktc2xpZGVyLnVpLXN0YXRlLWRpc2FibGVkIC51aS1zbGlkZXItaGFuZGxlLAoudWktc2xpZGVyLnVpLXN0YXRlLWRpc2FibGVkIC51aS1zbGlkZXItcmFuZ2UgewoJZmlsdGVyOiBpbmhlcml0Owp9CgoudWktc2xpZGVyLWhvcml6b250YWwgewoJaGVpZ2h0OiAuOGVtOwp9Ci51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLWhhbmRsZSB7Cgl0b3A6IC0uM2VtOwoJbWFyZ2luLWxlZnQ6IC0uNmVtOwp9Ci51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLXJhbmdlIHsKCXRvcDogMDsKCWhlaWdodDogMTAwJTsKfQoudWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZS1taW4gewoJbGVmdDogMDsKfQoudWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZS1tYXggewoJcmlnaHQ6IDA7Cn0KCi51aS1zbGlkZXItdmVydGljYWwgewoJd2lkdGg6IC44ZW07CgloZWlnaHQ6IDEwMHB4Owp9Ci51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1oYW5kbGUgewoJbGVmdDogLS4zZW07CgltYXJnaW4tbGVmdDogMDsKCW1hcmdpbi1ib3R0b206IC0uNmVtOwp9Ci51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZSB7CglsZWZ0OiAwOwoJd2lkdGg6IDEwMCU7Cn0KLnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1pbiB7Cglib3R0b206IDA7Cn0KLnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1heCB7Cgl0b3A6IDA7Cn0KLnVpLXNwaW5uZXIgewoJcG9zaXRpb246IHJlbGF0aXZlOwoJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJb3ZlcmZsb3c6IGhpZGRlbjsKCXBhZGRpbmc6IDA7Cgl2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9Ci51aS1zcGlubmVyLWlucHV0IHsKCWJvcmRlcjogbm9uZTsKCWJhY2tncm91bmQ6IG5vbmU7Cgljb2xvcjogaW5oZXJpdDsKCXBhZGRpbmc6IDA7CgltYXJnaW46IC4yZW0gMDsKCXZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgltYXJnaW4tbGVmdDogLjRlbTsKCW1hcmdpbi1yaWdodDogMjJweDsKfQoudWktc3Bpbm5lci1idXR0b24gewoJd2lkdGg6IDE2cHg7CgloZWlnaHQ6IDUwJTsKCWZvbnQtc2l6ZTogLjVlbTsKCXBhZGRpbmc6IDA7CgltYXJnaW46IDA7Cgl0ZXh0LWFsaWduOiBjZW50ZXI7Cglwb3NpdGlvbjogYWJzb2x1dGU7CgljdXJzb3I6IGRlZmF1bHQ7CglkaXNwbGF5OiBibG9jazsKCW92ZXJmbG93OiBoaWRkZW47CglyaWdodDogMDsKfQovKiBtb3JlIHNwZWNpZmljaXR5IHJlcXVpcmVkIGhlcmUgdG8gb3ZlcnJpZGUgZGVmYXVsdCBib3JkZXJzICovCi51aS1zcGlubmVyIGEudWktc3Bpbm5lci1idXR0b24gewoJYm9yZGVyLXRvcDogbm9uZTsKCWJvcmRlci1ib3R0b206IG5vbmU7Cglib3JkZXItcmlnaHQ6IG5vbmU7Cn0KLyogdmVydGljYWxseSBjZW50ZXIgaWNvbiAqLwoudWktc3Bpbm5lciAudWktaWNvbiB7Cglwb3NpdGlvbjogYWJzb2x1dGU7CgltYXJnaW4tdG9wOiAtOHB4OwoJdG9wOiA1MCU7CglsZWZ0OiAwOwp9Ci51aS1zcGlubmVyLXVwIHsKCXRvcDogMDsKfQoudWktc3Bpbm5lci1kb3duIHsKCWJvdHRvbTogMDsKfQoKLyogVFIgb3ZlcnJpZGVzICovCi51aS1zcGlubmVyIC51aS1pY29uLXRyaWFuZ2xlLTEtcyB7CgkvKiBuZWVkIHRvIGZpeCBpY29ucyBzcHJpdGUgKi8KCWJhY2tncm91bmQtcG9zaXRpb246IC02NXB4IC0xNnB4Owp9Ci51aS10YWJzIHsKCXBvc2l0aW9uOiByZWxhdGl2ZTsvKiBwb3NpdGlvbjogcmVsYXRpdmUgcHJldmVudHMgSUUgc2Nyb2xsIGJ1ZyAoZWxlbWVudCB3aXRoIHBvc2l0aW9uOiByZWxhdGl2ZSBpbnNpZGUgY29udGFpbmVyIHdpdGggb3ZlcmZsb3c6IGF1dG8gYXBwZWFyIGFzICJmaXhlZCIpICovCglwYWRkaW5nOiAuMmVtOwp9Ci51aS10YWJzIC51aS10YWJzLW5hdiB7CgltYXJnaW46IDA7CglwYWRkaW5nOiAuMmVtIC4yZW0gMDsKfQoudWktdGFicyAudWktdGFicy1uYXYgbGkgewoJbGlzdC1zdHlsZTogbm9uZTsKCWZsb2F0OiBsZWZ0OwoJcG9zaXRpb246IHJlbGF0aXZlOwoJdG9wOiAwOwoJbWFyZ2luOiAxcHggLjJlbSAwIDA7Cglib3JkZXItYm90dG9tLXdpZHRoOiAwOwoJcGFkZGluZzogMDsKCXdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KLnVpLXRhYnMgLnVpLXRhYnMtbmF2IC51aS10YWJzLWFuY2hvciB7CglmbG9hdDogbGVmdDsKCXBhZGRpbmc6IC41ZW0gMWVtOwoJdGV4dC1kZWNvcmF0aW9uOiBub25lOwp9Ci51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSB7CgltYXJnaW4tYm90dG9tOiAtMXB4OwoJcGFkZGluZy1ib3R0b206IDFweDsKfQoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1hY3RpdmUgLnVpLXRhYnMtYW5jaG9yLAoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtZGlzYWJsZWQgLnVpLXRhYnMtYW5jaG9yLAoudWktdGFicyAudWktdGFicy1uYXYgbGkudWktdGFicy1sb2FkaW5nIC51aS10YWJzLWFuY2hvciB7CgljdXJzb3I6IHRleHQ7Cn0KLnVpLXRhYnMtY29sbGFwc2libGUgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZlIC51aS10YWJzLWFuY2hvciB7CgljdXJzb3I6IHBvaW50ZXI7Cn0KLnVpLXRhYnMgLnVpLXRhYnMtcGFuZWwgewoJZGlzcGxheTogYmxvY2s7Cglib3JkZXItd2lkdGg6IDA7CglwYWRkaW5nOiAxZW0gMS40ZW07CgliYWNrZ3JvdW5kOiBub25lOwp9Ci51aS10b29sdGlwIHsKCXBhZGRpbmc6IDhweDsKCXBvc2l0aW9uOiBhYnNvbHV0ZTsKCXotaW5kZXg6IDk5OTk7CgltYXgtd2lkdGg6IDMwMHB4OwoJLXdlYmtpdC1ib3gtc2hhZG93OiAwIDAgNXB4ICNhYWE7Cglib3gtc2hhZG93OiAwIDAgNXB4ICNhYWE7Cn0KYm9keSAudWktdG9vbHRpcCB7Cglib3JkZXItd2lkdGg6IDJweDsKfQoKLyogQ29tcG9uZW50IGNvbnRhaW5lcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS13aWRnZXQgewoJZm9udC1mYW1pbHk6IFRyZWJ1Y2hldCBNUyxUYWhvbWEsVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmOwoJZm9udC1zaXplOiAxLjFlbTsKfQoudWktd2lkZ2V0IC51aS13aWRnZXQgewoJZm9udC1zaXplOiAxZW07Cn0KLnVpLXdpZGdldCBpbnB1dCwKLnVpLXdpZGdldCBzZWxlY3QsCi51aS13aWRnZXQgdGV4dGFyZWEsCi51aS13aWRnZXQgYnV0dG9uIHsKCWZvbnQtZmFtaWx5OiBUcmVidWNoZXQgTVMsVGFob21hLFZlcmRhbmEsQXJpYWwsc2Fucy1zZXJpZjsKCWZvbnQtc2l6ZTogMWVtOwp9Ci51aS13aWRnZXQtY29udGVudCB7Cglib3JkZXI6IDFweCBzb2xpZCAjZGRkZGRkOwoJYmFja2dyb3VuZDogI2VlZWVlZSB1cmwoImltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8xMDBfZWVlZWVlXzF4MTAwLnBuZyIpIDUwJSB0b3AgcmVwZWF0LXg7Cgljb2xvcjogIzMzMzMzMzsKfQoudWktd2lkZ2V0LWNvbnRlbnQgYSB7Cgljb2xvcjogIzMzMzMzMzsKfQoudWktd2lkZ2V0LWhlYWRlciB7Cglib3JkZXI6IDFweCBzb2xpZCAjZTc4ZjA4OwoJYmFja2dyb3VuZDogI2Y2YTgyOCB1cmwoImltYWdlcy91aS1iZ19nbG9zcy13YXZlXzM1X2Y2YTgyOF81MDB4MTAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7Cgljb2xvcjogI2ZmZmZmZjsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Ci51aS13aWRnZXQtaGVhZGVyIGEgewoJY29sb3I6ICNmZmZmZmY7Cn0KCi8qIEludGVyYWN0aW9uIHN0YXRlcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLnVpLXN0YXRlLWRlZmF1bHQsCi51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGVmYXVsdCwKLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRlZmF1bHQgewoJYm9yZGVyOiAxcHggc29saWQgI2NjY2NjYzsKCWJhY2tncm91bmQ6ICNmNmY2ZjYgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfMTAwX2Y2ZjZmNl8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14OwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cgljb2xvcjogIzFjOTRjNDsKfQoudWktc3RhdGUtZGVmYXVsdCBhLAoudWktc3RhdGUtZGVmYXVsdCBhOmxpbmssCi51aS1zdGF0ZS1kZWZhdWx0IGE6dmlzaXRlZCB7Cgljb2xvcjogIzFjOTRjNDsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoudWktc3RhdGUtaG92ZXIsCi51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaG92ZXIsCi51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1ob3ZlciwKLnVpLXN0YXRlLWZvY3VzLAoudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWZvY3VzLAoudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZm9jdXMgewoJYm9yZGVyOiAxcHggc29saWQgI2ZiY2IwOTsKCWJhY2tncm91bmQ6ICNmZGY1Y2UgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfMTAwX2ZkZjVjZV8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14OwoJZm9udC13ZWlnaHQ6IGJvbGQ7Cgljb2xvcjogI2M3NzQwNTsKfQoudWktc3RhdGUtaG92ZXIgYSwKLnVpLXN0YXRlLWhvdmVyIGE6aG92ZXIsCi51aS1zdGF0ZS1ob3ZlciBhOmxpbmssCi51aS1zdGF0ZS1ob3ZlciBhOnZpc2l0ZWQsCi51aS1zdGF0ZS1mb2N1cyBhLAoudWktc3RhdGUtZm9jdXMgYTpob3ZlciwKLnVpLXN0YXRlLWZvY3VzIGE6bGluaywKLnVpLXN0YXRlLWZvY3VzIGE6dmlzaXRlZCB7Cgljb2xvcjogI2M3NzQwNTsKCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoudWktc3RhdGUtYWN0aXZlLAoudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwKLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWFjdGl2ZSB7Cglib3JkZXI6IDFweCBzb2xpZCAjZmJkODUwOwoJYmFja2dyb3VuZDogI2ZmZmZmZiB1cmwoImltYWdlcy91aS1iZ19nbGFzc182NV9mZmZmZmZfMXg0MDAucG5nIikgNTAlIDUwJSByZXBlYXQteDsKCWZvbnQtd2VpZ2h0OiBib2xkOwoJY29sb3I6ICNlYjhmMDA7Cn0KLnVpLXN0YXRlLWFjdGl2ZSBhLAoudWktc3RhdGUtYWN0aXZlIGE6bGluaywKLnVpLXN0YXRlLWFjdGl2ZSBhOnZpc2l0ZWQgewoJY29sb3I6ICNlYjhmMDA7Cgl0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi8qIEludGVyYWN0aW9uIEN1ZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi51aS1zdGF0ZS1oaWdobGlnaHQsCi51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0LAoudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0IHsKCWJvcmRlcjogMXB4IHNvbGlkICNmZWQyMmY7CgliYWNrZ3JvdW5kOiAjZmZlNDVjIHVybCgiaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0Xzc1X2ZmZTQ1Y18xeDEwMC5wbmciKSA1MCUgdG9wIHJlcGVhdC14OwoJY29sb3I6ICMzNjM2MzY7Cn0KLnVpLXN0YXRlLWhpZ2hsaWdodCBhLAoudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWhpZ2hsaWdodCBhLAoudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaGlnaGxpZ2h0IGEgewoJY29sb3I6ICMzNjM2MzY7Cn0KLnVpLXN0YXRlLWVycm9yLAoudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLAoudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3IgewoJYm9yZGVyOiAxcHggc29saWQgI2NkMGEwYTsKCWJhY2tncm91bmQ6ICNiODE5MDAgdXJsKCJpbWFnZXMvdWktYmdfZGlhZ29uYWxzLXRoaWNrXzE4X2I4MTkwMF80MHg0MC5wbmciKSA1MCUgNTAlIHJlcGVhdDsKCWNvbG9yOiAjZmZmZmZmOwp9Ci51aS1zdGF0ZS1lcnJvciBhLAoudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yIGEsCi51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvciBhIHsKCWNvbG9yOiAjZmZmZmZmOwp9Ci51aS1zdGF0ZS1lcnJvci10ZXh0LAoudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWVycm9yLXRleHQsCi51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1lcnJvci10ZXh0IHsKCWNvbG9yOiAjZmZmZmZmOwp9Ci51aS1wcmlvcml0eS1wcmltYXJ5LAoudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXByaW9yaXR5LXByaW1hcnksCi51aS13aWRnZXQtaGVhZGVyIC51aS1wcmlvcml0eS1wcmltYXJ5IHsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Ci51aS1wcmlvcml0eS1zZWNvbmRhcnksCi51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktc2Vjb25kYXJ5LAoudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktc2Vjb25kYXJ5IHsKCW9wYWNpdHk6IC43OwoJZmlsdGVyOkFscGhhKE9wYWNpdHk9NzApOwoJZm9udC13ZWlnaHQ6IG5vcm1hbDsKfQoudWktc3RhdGUtZGlzYWJsZWQsCi51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGlzYWJsZWQsCi51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kaXNhYmxlZCB7CglvcGFjaXR5OiAuMzU7CglmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSk7CgliYWNrZ3JvdW5kLWltYWdlOiBub25lOwp9Ci51aS1zdGF0ZS1kaXNhYmxlZCAudWktaWNvbiB7CglmaWx0ZXI6QWxwaGEoT3BhY2l0eT0zNSk7IC8qIEZvciBJRTggLSBTZWUgIzYwNTkgKi8KfQoKLyogSWNvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBzdGF0ZXMgYW5kIGltYWdlcyAqLwoudWktaWNvbiB7Cgl3aWR0aDogMTZweDsKCWhlaWdodDogMTZweDsKfQoudWktaWNvbiwKLnVpLXdpZGdldC1jb250ZW50IC51aS1pY29uIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybCgiaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyIpOwp9Ci51aS13aWRnZXQtaGVhZGVyIC51aS1pY29uIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybCgiaW1hZ2VzL3VpLWljb25zX2ZmZmZmZl8yNTZ4MjQwLnBuZyIpOwp9Ci51aS1zdGF0ZS1kZWZhdWx0IC51aS1pY29uIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybCgiaW1hZ2VzL3VpLWljb25zX2VmOGMwOF8yNTZ4MjQwLnBuZyIpOwp9Ci51aS1zdGF0ZS1ob3ZlciAudWktaWNvbiwKLnVpLXN0YXRlLWZvY3VzIC51aS1pY29uIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybCgiaW1hZ2VzL3VpLWljb25zX2VmOGMwOF8yNTZ4MjQwLnBuZyIpOwp9Ci51aS1zdGF0ZS1hY3RpdmUgLnVpLWljb24gewoJYmFja2dyb3VuZC1pbWFnZTogdXJsKCJpbWFnZXMvdWktaWNvbnNfZWY4YzA4XzI1NngyNDAucG5nIik7Cn0KLnVpLXN0YXRlLWhpZ2hsaWdodCAudWktaWNvbiB7CgliYWNrZ3JvdW5kLWltYWdlOiB1cmwoImltYWdlcy91aS1pY29uc18yMjhlZjFfMjU2eDI0MC5wbmciKTsKfQoudWktc3RhdGUtZXJyb3IgLnVpLWljb24sCi51aS1zdGF0ZS1lcnJvci10ZXh0IC51aS1pY29uIHsKCWJhY2tncm91bmQtaW1hZ2U6IHVybCgiaW1hZ2VzL3VpLWljb25zX2ZmZDI3YV8yNTZ4MjQwLnBuZyIpOwp9CgovKiBwb3NpdGlvbmluZyAqLwoudWktaWNvbi1ibGFuayB7IGJhY2tncm91bmQtcG9zaXRpb246IDE2cHggMTZweDsgfQoudWktaWNvbi1jYXJhdC0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIDA7IH0KLnVpLWljb24tY2FyYXQtMS1uZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggMDsgfQoudWktaWNvbi1jYXJhdC0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggMDsgfQoudWktaWNvbi1jYXJhdC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAwOyB9Ci51aS1pY29uLWNhcmF0LTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IDA7IH0KLnVpLWljb24tY2FyYXQtMS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAwOyB9Ci51aS1pY29uLWNhcmF0LTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IDA7IH0KLnVpLWljb24tY2FyYXQtMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggMDsgfQoudWktaWNvbi10cmlhbmdsZS0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTZweDsgfQoudWktaWNvbi10cmlhbmdsZS0xLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMS1zdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNnB4OyB9Ci51aS1pY29uLXRyaWFuZ2xlLTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMi1uLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTE2cHg7IH0KLnVpLWljb24tdHJpYW5nbGUtMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE2cHg7IH0KLnVpLWljb24tYXJyb3ctMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLW5lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTEtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMzJweDsgfQoudWktaWNvbi1hcnJvdy0xLW53IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTItbi1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93LTItbmUtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMi1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTMycHg7IH0KLnVpLWljb24tYXJyb3ctMi1zZS1udyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3N0b3AtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93c3RvcC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjA4cHggLTMycHg7IH0KLnVpLWljb24tYXJyb3dzdG9wLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMzJweDsgfQoudWktaWNvbi1hcnJvd3N0b3AtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC0zMnB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtbmUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2stMS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLXN3IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTEtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0yLW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3cgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGljay0yLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrLTItc2UtbncgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTc2cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtNDhweDsgfQoudWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTQ4cHg7IH0KLnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTI0MHB4IC00OHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JldHVybi0xLXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtNjRweDsgfQoudWktaWNvbi1hcnJvd3JlZnJlc2gtMS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC02NHB4OyB9Ci51aS1pY29uLWFycm93cmVmcmVzaC0xLWUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTYwcHggLTY0cHg7IH0KLnVpLWljb24tYXJyb3dyZWZyZXNoLTEtcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNzZweCAtNjRweDsgfQoudWktaWNvbi1hcnJvdy00IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtODBweDsgfQoudWktaWNvbi1hcnJvdy00LWRpYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtODBweDsgfQoudWktaWNvbi1leHRsaW5rIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTgwcHg7IH0KLnVpLWljb24tbmV3d2luIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTgwcHg7IH0KLnVpLWljb24tcmVmcmVzaCB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC04MHB4OyB9Ci51aS1pY29uLXNodWZmbGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtODBweDsgfQoudWktaWNvbi10cmFuc2Zlci1lLXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtODBweDsgfQoudWktaWNvbi10cmFuc2ZlcnRoaWNrLWUtdyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtODBweDsgfQoudWktaWNvbi1mb2xkZXItY29sbGFwc2VkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtOTZweDsgfQoudWktaWNvbi1mb2xkZXItb3BlbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC05NnB4OyB9Ci51aS1pY29uLWRvY3VtZW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTk2cHg7IH0KLnVpLWljb24tZG9jdW1lbnQtYiB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC05NnB4OyB9Ci51aS1pY29uLW5vdGUgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtOTZweDsgfQoudWktaWNvbi1tYWlsLWNsb3NlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC05NnB4OyB9Ci51aS1pY29uLW1haWwtb3BlbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC05NnB4OyB9Ci51aS1pY29uLXN1aXRjYXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC05NnB4OyB9Ci51aS1pY29uLWNvbW1lbnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTk2cHg7IH0KLnVpLWljb24tcGVyc29uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC05NnB4OyB9Ci51aS1pY29uLXByaW50IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC05NnB4OyB9Ci51aS1pY29uLXRyYXNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC05NnB4OyB9Ci51aS1pY29uLWxvY2tlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtOTZweDsgfQoudWktaWNvbi11bmxvY2tlZCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtOTZweDsgfQoudWktaWNvbi1ib29rbWFyayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtOTZweDsgfQoudWktaWNvbi10YWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjQwcHggLTk2cHg7IH0KLnVpLWljb24taG9tZSB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTExMnB4OyB9Ci51aS1pY29uLWZsYWcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTEycHg7IH0KLnVpLWljb24tY2FsZW5kYXIgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTEycHg7IH0KLnVpLWljb24tY2FydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0xMTJweDsgfQoudWktaWNvbi1wZW5jaWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTEycHg7IH0KLnVpLWljb24tY2xvY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTEycHg7IH0KLnVpLWljb24tZGlzayB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xMTJweDsgfQoudWktaWNvbi1jYWxjdWxhdG9yIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xMTJweDsgfQoudWktaWNvbi16b29taW4geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTI4cHggLTExMnB4OyB9Ci51aS1pY29uLXpvb21vdXQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTExMnB4OyB9Ci51aS1pY29uLXNlYXJjaCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNjBweCAtMTEycHg7IH0KLnVpLWljb24td3JlbmNoIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMTJweDsgfQoudWktaWNvbi1nZWFyIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMTJweDsgfQoudWktaWNvbi1oZWFydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTEycHg7IH0KLnVpLWljb24tc3RhciB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMjRweCAtMTEycHg7IH0KLnVpLWljb24tbGluayB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTEycHg7IH0KLnVpLWljb24tY2FuY2VsIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMTI4cHg7IH0KLnVpLWljb24tcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNnB4IC0xMjhweDsgfQoudWktaWNvbi1wbHVzdGhpY2sgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMTI4cHg7IH0KLnVpLWljb24tbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTI4cHg7IH0KLnVpLWljb24tbWludXN0aGljayB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0xMjhweDsgfQoudWktaWNvbi1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xMjhweDsgfQoudWktaWNvbi1jbG9zZXRoaWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTEyOHB4OyB9Ci51aS1pY29uLWtleSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTI4cHg7IH0KLnVpLWljb24tbGlnaHRidWxiIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xMjhweDsgfQoudWktaWNvbi1zY2lzc29ycyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTI4cHg7IH0KLnVpLWljb24tY2xpcGJvYXJkIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xMjhweDsgfQoudWktaWNvbi1jb3B5IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xMjhweDsgfQoudWktaWNvbi1jb250YWN0IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE5MnB4IC0xMjhweDsgfQoudWktaWNvbi1pbWFnZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yMDhweCAtMTI4cHg7IH0KLnVpLWljb24tdmlkZW8geyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMjI0cHggLTEyOHB4OyB9Ci51aS1pY29uLXNjcmlwdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0yNDBweCAtMTI4cHg7IH0KLnVpLWljb24tYWxlcnQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xNDRweDsgfQoudWktaWNvbi1pbmZvIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE0NHB4OyB9Ci51aS1pY29uLW5vdGljZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNDRweDsgfQoudWktaWNvbi1oZWxwIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE0NHB4OyB9Ci51aS1pY29uLWNoZWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE0NHB4OyB9Ci51aS1pY29uLWJ1bGxldCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNDRweDsgfQoudWktaWNvbi1yYWRpby1vbiB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNDRweDsgfQoudWktaWNvbi1yYWRpby1vZmYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTEycHggLTE0NHB4OyB9Ci51aS1pY29uLXBpbi13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTEyOHB4IC0xNDRweDsgfQoudWktaWNvbi1waW4tcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xNDRweCAtMTQ0cHg7IH0KLnVpLWljb24tcGxheSB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE2MHB4OyB9Ci51aS1pY29uLXBhdXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE2MHB4OyB9Ci51aS1pY29uLXNlZWstbmV4dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNjBweDsgfQoudWktaWNvbi1zZWVrLXByZXYgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTYwcHg7IH0KLnVpLWljb24tc2Vlay1lbmQgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNjRweCAtMTYwcHg7IH0KLnVpLWljb24tc2Vlay1zdGFydCB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNjBweDsgfQovKiB1aS1pY29uLXNlZWstZmlyc3QgaXMgZGVwcmVjYXRlZCwgdXNlIHVpLWljb24tc2Vlay1zdGFydCBpbnN0ZWFkICovCi51aS1pY29uLXNlZWstZmlyc3QgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMTYwcHg7IH0KLnVpLWljb24tc3RvcCB7IGJhY2tncm91bmQtcG9zaXRpb246IC05NnB4IC0xNjBweDsgfQoudWktaWNvbi1lamVjdCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMTJweCAtMTYwcHg7IH0KLnVpLWljb24tdm9sdW1lLW9mZiB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTYwcHg7IH0KLnVpLWljb24tdm9sdW1lLW9uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE0NHB4IC0xNjBweDsgfQoudWktaWNvbi1wb3dlciB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTE3NnB4OyB9Ci51aS1pY29uLXNpZ25hbC1kaWFnIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2cHggLTE3NnB4OyB9Ci51aS1pY29uLXNpZ25hbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0xNzZweDsgfQoudWktaWNvbi1iYXR0ZXJ5LTAgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMTc2cHg7IH0KLnVpLWljb24tYmF0dGVyeS0xIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE3NnB4OyB9Ci51aS1pY29uLWJhdHRlcnktMiB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0xNzZweDsgfQoudWktaWNvbi1iYXR0ZXJ5LTMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtOTZweCAtMTc2cHg7IH0KLnVpLWljb24tY2lyY2xlLXBsdXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWNsb3NlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTMycHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTQ4cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1zIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS13IHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTgwcHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS10cmlhbmdsZS1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTk2cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1hcnJvdy1lIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTExMnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtYXJyb3ctcyB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xMjhweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWFycm93LXcgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTQ0cHggLTE5MnB4OyB9Ci51aS1pY29uLWNpcmNsZS1hcnJvdy1uIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE2MHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtem9vbWluIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTE3NnB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGUtem9vbW91dCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0xOTJweCAtMTkycHg7IH0KLnVpLWljb24tY2lyY2xlLWNoZWNrIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTIwOHB4IC0xOTJweDsgfQoudWktaWNvbi1jaXJjbGVzbWFsbC1wbHVzIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogMCAtMjA4cHg7IH0KLnVpLWljb24tY2lyY2xlc21hbGwtbWludXMgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMjA4cHg7IH0KLnVpLWljb24tY2lyY2xlc21hbGwtY2xvc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMzJweCAtMjA4cHg7IH0KLnVpLWljb24tc3F1YXJlc21hbGwtcGx1cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC00OHB4IC0yMDhweDsgfQoudWktaWNvbi1zcXVhcmVzbWFsbC1taW51cyB7IGJhY2tncm91bmQtcG9zaXRpb246IC02NHB4IC0yMDhweDsgfQoudWktaWNvbi1zcXVhcmVzbWFsbC1jbG9zZSB7IGJhY2tncm91bmQtcG9zaXRpb246IC04MHB4IC0yMDhweDsgfQoudWktaWNvbi1ncmlwLWRvdHRlZC12ZXJ0aWNhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IDAgLTIyNHB4OyB9Ci51aS1pY29uLWdyaXAtZG90dGVkLWhvcml6b250YWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtMTZweCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcC1zb2xpZC12ZXJ0aWNhbCB7IGJhY2tncm91bmQtcG9zaXRpb246IC0zMnB4IC0yMjRweDsgfQoudWktaWNvbi1ncmlwLXNvbGlkLWhvcml6b250YWwgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtNDhweCAtMjI0cHg7IH0KLnVpLWljb24tZ3JpcHNtYWxsLWRpYWdvbmFsLXNlIHsgYmFja2dyb3VuZC1wb3NpdGlvbjogLTY0cHggLTIyNHB4OyB9Ci51aS1pY29uLWdyaXAtZGlhZ29uYWwtc2UgeyBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtODBweCAtMjI0cHg7IH0KCgovKiBNaXNjIHZpc3VhbHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBDb3JuZXIgcmFkaXVzICovCi51aS1jb3JuZXItYWxsLAoudWktY29ybmVyLXRvcCwKLnVpLWNvcm5lci1sZWZ0LAoudWktY29ybmVyLXRsIHsKCWJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDRweDsKfQoudWktY29ybmVyLWFsbCwKLnVpLWNvcm5lci10b3AsCi51aS1jb3JuZXItcmlnaHQsCi51aS1jb3JuZXItdHIgewoJYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDRweDsKfQoudWktY29ybmVyLWFsbCwKLnVpLWNvcm5lci1ib3R0b20sCi51aS1jb3JuZXItbGVmdCwKLnVpLWNvcm5lci1ibCB7Cglib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA0cHg7Cn0KLnVpLWNvcm5lci1hbGwsCi51aS1jb3JuZXItYm90dG9tLAoudWktY29ybmVyLXJpZ2h0LAoudWktY29ybmVyLWJyIHsKCWJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA0cHg7Cn0KCi8qIE92ZXJsYXlzICovCi51aS13aWRnZXQtb3ZlcmxheSB7CgliYWNrZ3JvdW5kOiAjNjY2NjY2IHVybCgiaW1hZ2VzL3VpLWJnX2RpYWdvbmFscy10aGlja18yMF82NjY2NjZfNDB4NDAucG5nIikgNTAlIDUwJSByZXBlYXQ7CglvcGFjaXR5OiAuNTsKCWZpbHRlcjogQWxwaGEoT3BhY2l0eT01MCk7Cn0KLnVpLXdpZGdldC1zaGFkb3cgewoJbWFyZ2luOiAtNXB4IDAgMCAtNXB4OwoJcGFkZGluZzogNXB4OwoJYmFja2dyb3VuZDogIzAwMDAwMCB1cmwoImltYWdlcy91aS1iZ19mbGF0XzEwXzAwMDAwMF80MHgxMDAucG5nIikgNTAlIDUwJSByZXBlYXQteDsKCW9wYWNpdHk6IC4yOwoJZmlsdGVyOiBBbHBoYShPcGFjaXR5PTIwKTsKCWJvcmRlci1yYWRpdXM6IDVweDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/jquery-ui.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjExLjAgLSAyMDE0LTA2LTI2CiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBjb3JlLmpzLCB3aWRnZXQuanMsIG1vdXNlLmpzLCBwb3NpdGlvbi5qcywgZHJhZ2dhYmxlLmpzLCBkcm9wcGFibGUuanMsIHJlc2l6YWJsZS5qcywgc2VsZWN0YWJsZS5qcywgc29ydGFibGUuanMsIGFjY29yZGlvbi5qcywgYXV0b2NvbXBsZXRlLmpzLCBidXR0b24uanMsIGRhdGVwaWNrZXIuanMsIGRpYWxvZy5qcywgbWVudS5qcywgcHJvZ3Jlc3NiYXIuanMsIHNlbGVjdG1lbnUuanMsIHNsaWRlci5qcywgc3Bpbm5lci5qcywgdGFicy5qcywgdG9vbHRpcC5qcywgZWZmZWN0LmpzLCBlZmZlY3QtYmxpbmQuanMsIGVmZmVjdC1ib3VuY2UuanMsIGVmZmVjdC1jbGlwLmpzLCBlZmZlY3QtZHJvcC5qcywgZWZmZWN0LWV4cGxvZGUuanMsIGVmZmVjdC1mYWRlLmpzLCBlZmZlY3QtZm9sZC5qcywgZWZmZWN0LWhpZ2hsaWdodC5qcywgZWZmZWN0LXB1ZmYuanMsIGVmZmVjdC1wdWxzYXRlLmpzLCBlZmZlY3Qtc2NhbGUuanMsIGVmZmVjdC1zaGFrZS5qcywgZWZmZWN0LXNpemUuanMsIGVmZmVjdC1zbGlkZS5qcywgZWZmZWN0LXRyYW5zZmVyLmpzCiogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCgooZnVuY3Rpb24oIGZhY3RvcnkgKSB7CglpZiAoIHR5cGVvZiBkZWZpbmUgPT09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCApIHsKCgkJLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLgoJCWRlZmluZShbICJqcXVlcnkiIF0sIGZhY3RvcnkgKTsKCX0gZWxzZSB7CgoJCS8vIEJyb3dzZXIgZ2xvYmFscwoJCWZhY3RvcnkoIGpRdWVyeSApOwoJfQp9KGZ1bmN0aW9uKCAkICkgewovKiEKICogalF1ZXJ5IFVJIENvcmUgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vY2F0ZWdvcnkvdWktY29yZS8KICovCgoKLy8gJC51aSBtaWdodCBleGlzdCBmcm9tIGNvbXBvbmVudHMgd2l0aCBubyBkZXBlbmRlbmNpZXMsIGUuZy4sICQudWkucG9zaXRpb24KJC51aSA9ICQudWkgfHwge307CgokLmV4dGVuZCggJC51aSwgewoJdmVyc2lvbjogIjEuMTEuMCIsCgoJa2V5Q29kZTogewoJCUJBQ0tTUEFDRTogOCwKCQlDT01NQTogMTg4LAoJCURFTEVURTogNDYsCgkJRE9XTjogNDAsCgkJRU5EOiAzNSwKCQlFTlRFUjogMTMsCgkJRVNDQVBFOiAyNywKCQlIT01FOiAzNiwKCQlMRUZUOiAzNywKCQlQQUdFX0RPV046IDM0LAoJCVBBR0VfVVA6IDMzLAoJCVBFUklPRDogMTkwLAoJCVJJR0hUOiAzOSwKCQlTUEFDRTogMzIsCgkJVEFCOiA5LAoJCVVQOiAzOAoJfQp9KTsKCi8vIHBsdWdpbnMKJC5mbi5leHRlbmQoewoJc2Nyb2xsUGFyZW50OiBmdW5jdGlvbigpIHsKCQl2YXIgcG9zaXRpb24gPSB0aGlzLmNzcyggInBvc2l0aW9uIiApLAoJCQlleGNsdWRlU3RhdGljUGFyZW50ID0gcG9zaXRpb24gPT09ICJhYnNvbHV0ZSIsCgkJCXNjcm9sbFBhcmVudCA9IHRoaXMucGFyZW50cygpLmZpbHRlciggZnVuY3Rpb24oKSB7CgkJCQl2YXIgcGFyZW50ID0gJCggdGhpcyApOwoJCQkJaWYgKCBleGNsdWRlU3RhdGljUGFyZW50ICYmIHBhcmVudC5jc3MoICJwb3NpdGlvbiIgKSA9PT0gInN0YXRpYyIgKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJcmV0dXJuICgvKGF1dG98c2Nyb2xsKS8pLnRlc3QoIHBhcmVudC5jc3MoICJvdmVyZmxvdyIgKSArIHBhcmVudC5jc3MoICJvdmVyZmxvdy15IiApICsgcGFyZW50LmNzcyggIm92ZXJmbG93LXgiICkgKTsKCQkJfSkuZXEoIDAgKTsKCgkJcmV0dXJuIHBvc2l0aW9uID09PSAiZml4ZWQiIHx8ICFzY3JvbGxQYXJlbnQubGVuZ3RoID8gJCggdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSA6IHNjcm9sbFBhcmVudDsKCX0sCgoJdW5pcXVlSWQ6IChmdW5jdGlvbigpIHsKCQl2YXIgdXVpZCA9IDA7CgoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCWlmICggIXRoaXMuaWQgKSB7CgkJCQkJdGhpcy5pZCA9ICJ1aS1pZC0iICsgKCArK3V1aWQgKTsKCQkJCX0KCQkJfSk7CgkJfTsKCX0pKCksCgoJcmVtb3ZlVW5pcXVlSWQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCWlmICggL151aS1pZC1cZCskLy50ZXN0KCB0aGlzLmlkICkgKSB7CgkJCQkkKCB0aGlzICkucmVtb3ZlQXR0ciggImlkIiApOwoJCQl9CgkJfSk7Cgl9Cn0pOwoKLy8gc2VsZWN0b3JzCmZ1bmN0aW9uIGZvY3VzYWJsZSggZWxlbWVudCwgaXNUYWJJbmRleE5vdE5hTiApIHsKCXZhciBtYXAsIG1hcE5hbWUsIGltZywKCQlub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKCWlmICggImFyZWEiID09PSBub2RlTmFtZSApIHsKCQltYXAgPSBlbGVtZW50LnBhcmVudE5vZGU7CgkJbWFwTmFtZSA9IG1hcC5uYW1lOwoJCWlmICggIWVsZW1lbnQuaHJlZiB8fCAhbWFwTmFtZSB8fCBtYXAubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gIm1hcCIgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJaW1nID0gJCggImltZ1t1c2VtYXA9IyIgKyBtYXBOYW1lICsgIl0iIClbMF07CgkJcmV0dXJuICEhaW1nICYmIHZpc2libGUoIGltZyApOwoJfQoJcmV0dXJuICggL2lucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0Ly50ZXN0KCBub2RlTmFtZSApID8KCQkhZWxlbWVudC5kaXNhYmxlZCA6CgkJImEiID09PSBub2RlTmFtZSA/CgkJCWVsZW1lbnQuaHJlZiB8fCBpc1RhYkluZGV4Tm90TmFOIDoKCQkJaXNUYWJJbmRleE5vdE5hTikgJiYKCQkvLyB0aGUgZWxlbWVudCBhbmQgYWxsIG9mIGl0cyBhbmNlc3RvcnMgbXVzdCBiZSB2aXNpYmxlCgkJdmlzaWJsZSggZWxlbWVudCApOwp9CgpmdW5jdGlvbiB2aXNpYmxlKCBlbGVtZW50ICkgewoJcmV0dXJuICQuZXhwci5maWx0ZXJzLnZpc2libGUoIGVsZW1lbnQgKSAmJgoJCSEkKCBlbGVtZW50ICkucGFyZW50cygpLmFkZEJhY2soKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCXJldHVybiAkLmNzcyggdGhpcywgInZpc2liaWxpdHkiICkgPT09ICJoaWRkZW4iOwoJCX0pLmxlbmd0aDsKfQoKJC5leHRlbmQoICQuZXhwclsgIjoiIF0sIHsKCWRhdGE6ICQuZXhwci5jcmVhdGVQc2V1ZG8gPwoJCSQuZXhwci5jcmVhdGVQc2V1ZG8oZnVuY3Rpb24oIGRhdGFOYW1lICkgewoJCQlyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7CgkJCQlyZXR1cm4gISEkLmRhdGEoIGVsZW0sIGRhdGFOYW1lICk7CgkJCX07CgkJfSkgOgoJCS8vIHN1cHBvcnQ6IGpRdWVyeSA8MS44CgkJZnVuY3Rpb24oIGVsZW0sIGksIG1hdGNoICkgewoJCQlyZXR1cm4gISEkLmRhdGEoIGVsZW0sIG1hdGNoWyAzIF0gKTsKCQl9LAoKCWZvY3VzYWJsZTogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJcmV0dXJuIGZvY3VzYWJsZSggZWxlbWVudCwgIWlzTmFOKCAkLmF0dHIoIGVsZW1lbnQsICJ0YWJpbmRleCIgKSApICk7Cgl9LAoKCXRhYmJhYmxlOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl2YXIgdGFiSW5kZXggPSAkLmF0dHIoIGVsZW1lbnQsICJ0YWJpbmRleCIgKSwKCQkJaXNUYWJJbmRleE5hTiA9IGlzTmFOKCB0YWJJbmRleCApOwoJCXJldHVybiAoIGlzVGFiSW5kZXhOYU4gfHwgdGFiSW5kZXggPj0gMCApICYmIGZvY3VzYWJsZSggZWxlbWVudCwgIWlzVGFiSW5kZXhOYU4gKTsKCX0KfSk7CgovLyBzdXBwb3J0OiBqUXVlcnkgPDEuOAppZiAoICEkKCAiPGE+IiApLm91dGVyV2lkdGgoIDEgKS5qcXVlcnkgKSB7CgkkLmVhY2goIFsgIldpZHRoIiwgIkhlaWdodCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7CgkJdmFyIHNpZGUgPSBuYW1lID09PSAiV2lkdGgiID8gWyAiTGVmdCIsICJSaWdodCIgXSA6IFsgIlRvcCIsICJCb3R0b20iIF0sCgkJCXR5cGUgPSBuYW1lLnRvTG93ZXJDYXNlKCksCgkJCW9yaWcgPSB7CgkJCQlpbm5lcldpZHRoOiAkLmZuLmlubmVyV2lkdGgsCgkJCQlpbm5lckhlaWdodDogJC5mbi5pbm5lckhlaWdodCwKCQkJCW91dGVyV2lkdGg6ICQuZm4ub3V0ZXJXaWR0aCwKCQkJCW91dGVySGVpZ2h0OiAkLmZuLm91dGVySGVpZ2h0CgkJCX07CgoJCWZ1bmN0aW9uIHJlZHVjZSggZWxlbSwgc2l6ZSwgYm9yZGVyLCBtYXJnaW4gKSB7CgkJCSQuZWFjaCggc2lkZSwgZnVuY3Rpb24oKSB7CgkJCQlzaXplIC09IHBhcnNlRmxvYXQoICQuY3NzKCBlbGVtLCAicGFkZGluZyIgKyB0aGlzICkgKSB8fCAwOwoJCQkJaWYgKCBib3JkZXIgKSB7CgkJCQkJc2l6ZSAtPSBwYXJzZUZsb2F0KCAkLmNzcyggZWxlbSwgImJvcmRlciIgKyB0aGlzICsgIldpZHRoIiApICkgfHwgMDsKCQkJCX0KCQkJCWlmICggbWFyZ2luICkgewoJCQkJCXNpemUgLT0gcGFyc2VGbG9hdCggJC5jc3MoIGVsZW0sICJtYXJnaW4iICsgdGhpcyApICkgfHwgMDsKCQkJCX0KCQkJfSk7CgkJCXJldHVybiBzaXplOwoJCX0KCgkJJC5mblsgImlubmVyIiArIG5hbWUgXSA9IGZ1bmN0aW9uKCBzaXplICkgewoJCQlpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHsKCQkJCXJldHVybiBvcmlnWyAiaW5uZXIiICsgbmFtZSBdLmNhbGwoIHRoaXMgKTsKCQkJfQoKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQoIHRoaXMgKS5jc3MoIHR5cGUsIHJlZHVjZSggdGhpcywgc2l6ZSApICsgInB4IiApOwoJCQl9KTsKCQl9OwoKCQkkLmZuWyAib3V0ZXIiICsgbmFtZV0gPSBmdW5jdGlvbiggc2l6ZSwgbWFyZ2luICkgewoJCQlpZiAoIHR5cGVvZiBzaXplICE9PSAibnVtYmVyIiApIHsKCQkJCXJldHVybiBvcmlnWyAib3V0ZXIiICsgbmFtZSBdLmNhbGwoIHRoaXMsIHNpemUgKTsKCQkJfQoKCQkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQoIHRoaXMpLmNzcyggdHlwZSwgcmVkdWNlKCB0aGlzLCBzaXplLCB0cnVlLCBtYXJnaW4gKSArICJweCIgKTsKCQkJfSk7CgkJfTsKCX0pOwp9CgovLyBzdXBwb3J0OiBqUXVlcnkgPDEuOAppZiAoICEkLmZuLmFkZEJhY2sgKSB7CgkkLmZuLmFkZEJhY2sgPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CgkJcmV0dXJuIHRoaXMuYWRkKCBzZWxlY3RvciA9PSBudWxsID8KCQkJdGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKQoJCSk7Cgl9Owp9CgovLyBzdXBwb3J0OiBqUXVlcnkgMS42LjEsIDEuNi4yIChodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC85NDEzKQppZiAoICQoICI8YT4iICkuZGF0YSggImEtYiIsICJhIiApLnJlbW92ZURhdGEoICJhLWIiICkuZGF0YSggImEtYiIgKSApIHsKCSQuZm4ucmVtb3ZlRGF0YSA9IChmdW5jdGlvbiggcmVtb3ZlRGF0YSApIHsKCQlyZXR1cm4gZnVuY3Rpb24oIGtleSApIHsKCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQkJcmV0dXJuIHJlbW92ZURhdGEuY2FsbCggdGhpcywgJC5jYW1lbENhc2UoIGtleSApICk7CgkJCX0gZWxzZSB7CgkJCQlyZXR1cm4gcmVtb3ZlRGF0YS5jYWxsKCB0aGlzICk7CgkJCX0KCQl9OwoJfSkoICQuZm4ucmVtb3ZlRGF0YSApOwp9CgovLyBkZXByZWNhdGVkCiQudWkuaWUgPSAhIS9tc2llIFtcdy5dKy8uZXhlYyggbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpICk7CgokLmZuLmV4dGVuZCh7Cglmb2N1czogKGZ1bmN0aW9uKCBvcmlnICkgewoJCXJldHVybiBmdW5jdGlvbiggZGVsYXksIGZuICkgewoJCQlyZXR1cm4gdHlwZW9mIGRlbGF5ID09PSAibnVtYmVyIiA/CgkJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJdmFyIGVsZW0gPSB0aGlzOwoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQkJCSQoIGVsZW0gKS5mb2N1cygpOwoJCQkJCQlpZiAoIGZuICkgewoJCQkJCQkJZm4uY2FsbCggZWxlbSApOwoJCQkJCQl9CgkJCQkJfSwgZGVsYXkgKTsKCQkJCX0pIDoKCQkJCW9yaWcuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX07Cgl9KSggJC5mbi5mb2N1cyApLAoKCWRpc2FibGVTZWxlY3Rpb246IChmdW5jdGlvbigpIHsKCQl2YXIgZXZlbnRUeXBlID0gIm9uc2VsZWN0c3RhcnQiIGluIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICJkaXYiICkgPwoJCQkic2VsZWN0c3RhcnQiIDoKCQkJIm1vdXNlZG93biI7CgoJCXJldHVybiBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIHRoaXMuYmluZCggZXZlbnRUeXBlICsgIi51aS1kaXNhYmxlU2VsZWN0aW9uIiwgZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfSk7CgkJfTsKCX0pKCksCgoJZW5hYmxlU2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy51bmJpbmQoICIudWktZGlzYWJsZVNlbGVjdGlvbiIgKTsKCX0sCgoJekluZGV4OiBmdW5jdGlvbiggekluZGV4ICkgewoJCWlmICggekluZGV4ICE9PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzLmNzcyggInpJbmRleCIsIHpJbmRleCApOwoJCX0KCgkJaWYgKCB0aGlzLmxlbmd0aCApIHsKCQkJdmFyIGVsZW0gPSAkKCB0aGlzWyAwIF0gKSwgcG9zaXRpb24sIHZhbHVlOwoJCQl3aGlsZSAoIGVsZW0ubGVuZ3RoICYmIGVsZW1bIDAgXSAhPT0gZG9jdW1lbnQgKSB7CgkJCQkvLyBJZ25vcmUgei1pbmRleCBpZiBwb3NpdGlvbiBpcyBzZXQgdG8gYSB2YWx1ZSB3aGVyZSB6LWluZGV4IGlzIGlnbm9yZWQgYnkgdGhlIGJyb3dzZXIKCQkJCS8vIFRoaXMgbWFrZXMgYmVoYXZpb3Igb2YgdGhpcyBmdW5jdGlvbiBjb25zaXN0ZW50IGFjcm9zcyBicm93c2VycwoJCQkJLy8gV2ViS2l0IGFsd2F5cyByZXR1cm5zIGF1dG8gaWYgdGhlIGVsZW1lbnQgaXMgcG9zaXRpb25lZAoJCQkJcG9zaXRpb24gPSBlbGVtLmNzcyggInBvc2l0aW9uIiApOwoJCQkJaWYgKCBwb3NpdGlvbiA9PT0gImFic29sdXRlIiB8fCBwb3NpdGlvbiA9PT0gInJlbGF0aXZlIiB8fCBwb3NpdGlvbiA9PT0gImZpeGVkIiApIHsKCQkJCQkvLyBJRSByZXR1cm5zIDAgd2hlbiB6SW5kZXggaXMgbm90IHNwZWNpZmllZAoJCQkJCS8vIG90aGVyIGJyb3dzZXJzIHJldHVybiBhIHN0cmluZwoJCQkJCS8vIHdlIGlnbm9yZSB0aGUgY2FzZSBvZiBuZXN0ZWQgZWxlbWVudHMgd2l0aCBhbiBleHBsaWNpdCB2YWx1ZSBvZiAwCgkJCQkJLy8gPGRpdiBzdHlsZT0iei1pbmRleDogLTEwOyI+PGRpdiBzdHlsZT0iei1pbmRleDogMDsiPjwvZGl2PjwvZGl2PgoJCQkJCXZhbHVlID0gcGFyc2VJbnQoIGVsZW0uY3NzKCAiekluZGV4IiApLCAxMCApOwoJCQkJCWlmICggIWlzTmFOKCB2YWx1ZSApICYmIHZhbHVlICE9PSAwICkgewoJCQkJCQlyZXR1cm4gdmFsdWU7CgkJCQkJfQoJCQkJfQoJCQkJZWxlbSA9IGVsZW0ucGFyZW50KCk7CgkJCX0KCQl9CgoJCXJldHVybiAwOwoJfQp9KTsKCi8vICQudWkucGx1Z2luIGlzIGRlcHJlY2F0ZWQuIFVzZSAkLndpZGdldCgpIGV4dGVuc2lvbnMgaW5zdGVhZC4KJC51aS5wbHVnaW4gPSB7CglhZGQ6IGZ1bmN0aW9uKCBtb2R1bGUsIG9wdGlvbiwgc2V0ICkgewoJCXZhciBpLAoJCQlwcm90byA9ICQudWlbIG1vZHVsZSBdLnByb3RvdHlwZTsKCQlmb3IgKCBpIGluIHNldCApIHsKCQkJcHJvdG8ucGx1Z2luc1sgaSBdID0gcHJvdG8ucGx1Z2luc1sgaSBdIHx8IFtdOwoJCQlwcm90by5wbHVnaW5zWyBpIF0ucHVzaCggWyBvcHRpb24sIHNldFsgaSBdIF0gKTsKCQl9Cgl9LAoJY2FsbDogZnVuY3Rpb24oIGluc3RhbmNlLCBuYW1lLCBhcmdzLCBhbGxvd0Rpc2Nvbm5lY3RlZCApIHsKCQl2YXIgaSwKCQkJc2V0ID0gaW5zdGFuY2UucGx1Z2luc1sgbmFtZSBdOwoKCQlpZiAoICFzZXQgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggIWFsbG93RGlzY29ubmVjdGVkICYmICggIWluc3RhbmNlLmVsZW1lbnRbIDAgXS5wYXJlbnROb2RlIHx8IGluc3RhbmNlLmVsZW1lbnRbIDAgXS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxMSApICkgewoJCQlyZXR1cm47CgkJfQoKCQlmb3IgKCBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKyApIHsKCQkJaWYgKCBpbnN0YW5jZS5vcHRpb25zWyBzZXRbIGkgXVsgMCBdIF0gKSB7CgkJCQlzZXRbIGkgXVsgMSBdLmFwcGx5KCBpbnN0YW5jZS5lbGVtZW50LCBhcmdzICk7CgkJCX0KCQl9Cgl9Cn07CgoKLyohCiAqIGpRdWVyeSBVSSBXaWRnZXQgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20valF1ZXJ5LndpZGdldC8KICovCgoKdmFyIHdpZGdldF91dWlkID0gMCwKCXdpZGdldF9zbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKCiQuY2xlYW5EYXRhID0gKGZ1bmN0aW9uKCBvcmlnICkgewoJcmV0dXJuIGZ1bmN0aW9uKCBlbGVtcyApIHsKCQlmb3IgKCB2YXIgaSA9IDAsIGVsZW07IChlbGVtID0gZWxlbXNbaV0pICE9IG51bGw7IGkrKyApIHsKCQkJdHJ5IHsKCQkJCSQoIGVsZW0gKS50cmlnZ2VySGFuZGxlciggInJlbW92ZSIgKTsKCQkJLy8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvODIzNQoJCQl9IGNhdGNoKCBlICkge30KCQl9CgkJb3JpZyggZWxlbXMgKTsKCX07Cn0pKCAkLmNsZWFuRGF0YSApOwoKJC53aWRnZXQgPSBmdW5jdGlvbiggbmFtZSwgYmFzZSwgcHJvdG90eXBlICkgewoJdmFyIGZ1bGxOYW1lLCBleGlzdGluZ0NvbnN0cnVjdG9yLCBjb25zdHJ1Y3RvciwgYmFzZVByb3RvdHlwZSwKCQkvLyBwcm94aWVkUHJvdG90eXBlIGFsbG93cyB0aGUgcHJvdmlkZWQgcHJvdG90eXBlIHRvIHJlbWFpbiB1bm1vZGlmaWVkCgkJLy8gc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIG1peGluIGZvciBtdWx0aXBsZSB3aWRnZXRzICgjODg3NikKCQlwcm94aWVkUHJvdG90eXBlID0ge30sCgkJbmFtZXNwYWNlID0gbmFtZS5zcGxpdCggIi4iIClbIDAgXTsKCgluYW1lID0gbmFtZS5zcGxpdCggIi4iIClbIDEgXTsKCWZ1bGxOYW1lID0gbmFtZXNwYWNlICsgIi0iICsgbmFtZTsKCglpZiAoICFwcm90b3R5cGUgKSB7CgkJcHJvdG90eXBlID0gYmFzZTsKCQliYXNlID0gJC5XaWRnZXQ7Cgl9CgoJLy8gY3JlYXRlIHNlbGVjdG9yIGZvciBwbHVnaW4KCSQuZXhwclsgIjoiIF1bIGZ1bGxOYW1lLnRvTG93ZXJDYXNlKCkgXSA9IGZ1bmN0aW9uKCBlbGVtICkgewoJCXJldHVybiAhISQuZGF0YSggZWxlbSwgZnVsbE5hbWUgKTsKCX07CgoJJFsgbmFtZXNwYWNlIF0gPSAkWyBuYW1lc3BhY2UgXSB8fCB7fTsKCWV4aXN0aW5nQ29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdOwoJY29uc3RydWN0b3IgPSAkWyBuYW1lc3BhY2UgXVsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMsIGVsZW1lbnQgKSB7CgkJLy8gYWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0ICJuZXciIGtleXdvcmQKCQlpZiAoICF0aGlzLl9jcmVhdGVXaWRnZXQgKSB7CgkJCXJldHVybiBuZXcgY29uc3RydWN0b3IoIG9wdGlvbnMsIGVsZW1lbnQgKTsKCQl9CgoJCS8vIGFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCBpbml0aWFsaXppbmcgZm9yIHNpbXBsZSBpbmhlcml0YW5jZQoJCS8vIG11c3QgdXNlICJuZXciIGtleXdvcmQgKHRoZSBjb2RlIGFib3ZlIGFsd2F5cyBwYXNzZXMgYXJncykKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXRoaXMuX2NyZWF0ZVdpZGdldCggb3B0aW9ucywgZWxlbWVudCApOwoJCX0KCX07CgkvLyBleHRlbmQgd2l0aCB0aGUgZXhpc3RpbmcgY29uc3RydWN0b3IgdG8gY2Fycnkgb3ZlciBhbnkgc3RhdGljIHByb3BlcnRpZXMKCSQuZXh0ZW5kKCBjb25zdHJ1Y3RvciwgZXhpc3RpbmdDb25zdHJ1Y3RvciwgewoJCXZlcnNpb246IHByb3RvdHlwZS52ZXJzaW9uLAoJCS8vIGNvcHkgdGhlIG9iamVjdCB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvdG90eXBlIGluIGNhc2Ugd2UgbmVlZCB0bwoJCS8vIHJlZGVmaW5lIHRoZSB3aWRnZXQgbGF0ZXIKCQlfcHJvdG86ICQuZXh0ZW5kKCB7fSwgcHJvdG90eXBlICksCgkJLy8gdHJhY2sgd2lkZ2V0cyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIHdpZGdldCBpbiBjYXNlIHRoaXMgd2lkZ2V0IGlzCgkJLy8gcmVkZWZpbmVkIGFmdGVyIGEgd2lkZ2V0IGluaGVyaXRzIGZyb20gaXQKCQlfY2hpbGRDb25zdHJ1Y3RvcnM6IFtdCgl9KTsKCgliYXNlUHJvdG90eXBlID0gbmV3IGJhc2UoKTsKCS8vIHdlIG5lZWQgdG8gbWFrZSB0aGUgb3B0aW9ucyBoYXNoIGEgcHJvcGVydHkgZGlyZWN0bHkgb24gdGhlIG5ldyBpbnN0YW5jZQoJLy8gb3RoZXJ3aXNlIHdlJ2xsIG1vZGlmeSB0aGUgb3B0aW9ucyBoYXNoIG9uIHRoZSBwcm90b3R5cGUgdGhhdCB3ZSdyZQoJLy8gaW5oZXJpdGluZyBmcm9tCgliYXNlUHJvdG90eXBlLm9wdGlvbnMgPSAkLndpZGdldC5leHRlbmQoIHt9LCBiYXNlUHJvdG90eXBlLm9wdGlvbnMgKTsKCSQuZWFjaCggcHJvdG90eXBlLCBmdW5jdGlvbiggcHJvcCwgdmFsdWUgKSB7CgkJaWYgKCAhJC5pc0Z1bmN0aW9uKCB2YWx1ZSApICkgewoJCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSB2YWx1ZTsKCQkJcmV0dXJuOwoJCX0KCQlwcm94aWVkUHJvdG90eXBlWyBwcm9wIF0gPSAoZnVuY3Rpb24oKSB7CgkJCXZhciBfc3VwZXIgPSBmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQl9LAoJCQkJX3N1cGVyQXBwbHkgPSBmdW5jdGlvbiggYXJncyApIHsKCQkJCQlyZXR1cm4gYmFzZS5wcm90b3R5cGVbIHByb3AgXS5hcHBseSggdGhpcywgYXJncyApOwoJCQkJfTsKCQkJcmV0dXJuIGZ1bmN0aW9uKCkgewoJCQkJdmFyIF9fc3VwZXIgPSB0aGlzLl9zdXBlciwKCQkJCQlfX3N1cGVyQXBwbHkgPSB0aGlzLl9zdXBlckFwcGx5LAoJCQkJCXJldHVyblZhbHVlOwoKCQkJCXRoaXMuX3N1cGVyID0gX3N1cGVyOwoJCQkJdGhpcy5fc3VwZXJBcHBseSA9IF9zdXBlckFwcGx5OwoKCQkJCXJldHVyblZhbHVlID0gdmFsdWUuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoKCQkJCXRoaXMuX3N1cGVyID0gX19zdXBlcjsKCQkJCXRoaXMuX3N1cGVyQXBwbHkgPSBfX3N1cGVyQXBwbHk7CgoJCQkJcmV0dXJuIHJldHVyblZhbHVlOwoJCQl9OwoJCX0pKCk7Cgl9KTsKCWNvbnN0cnVjdG9yLnByb3RvdHlwZSA9ICQud2lkZ2V0LmV4dGVuZCggYmFzZVByb3RvdHlwZSwgewoJCS8vIFRPRE86IHJlbW92ZSBzdXBwb3J0IGZvciB3aWRnZXRFdmVudFByZWZpeAoJCS8vIGFsd2F5cyB1c2UgdGhlIG5hbWUgKyBhIGNvbG9uIGFzIHRoZSBwcmVmaXgsIGUuZy4sIGRyYWdnYWJsZTpzdGFydAoJCS8vIGRvbid0IHByZWZpeCBmb3Igd2lkZ2V0cyB0aGF0IGFyZW4ndCBET00tYmFzZWQKCQl3aWRnZXRFdmVudFByZWZpeDogZXhpc3RpbmdDb25zdHJ1Y3RvciA/IChiYXNlUHJvdG90eXBlLndpZGdldEV2ZW50UHJlZml4IHx8IG5hbWUpIDogbmFtZQoJfSwgcHJveGllZFByb3RvdHlwZSwgewoJCWNvbnN0cnVjdG9yOiBjb25zdHJ1Y3RvciwKCQluYW1lc3BhY2U6IG5hbWVzcGFjZSwKCQl3aWRnZXROYW1lOiBuYW1lLAoJCXdpZGdldEZ1bGxOYW1lOiBmdWxsTmFtZQoJfSk7CgoJLy8gSWYgdGhpcyB3aWRnZXQgaXMgYmVpbmcgcmVkZWZpbmVkIHRoZW4gd2UgbmVlZCB0byBmaW5kIGFsbCB3aWRnZXRzIHRoYXQKCS8vIGFyZSBpbmhlcml0aW5nIGZyb20gaXQgYW5kIHJlZGVmaW5lIGFsbCBvZiB0aGVtIHNvIHRoYXQgdGhleSBpbmhlcml0IGZyb20KCS8vIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGlzIHdpZGdldC4gV2UncmUgZXNzZW50aWFsbHkgdHJ5aW5nIHRvIHJlcGxhY2Ugb25lCgkvLyBsZXZlbCBpbiB0aGUgcHJvdG90eXBlIGNoYWluLgoJaWYgKCBleGlzdGluZ0NvbnN0cnVjdG9yICkgewoJCSQuZWFjaCggZXhpc3RpbmdDb25zdHJ1Y3Rvci5fY2hpbGRDb25zdHJ1Y3RvcnMsIGZ1bmN0aW9uKCBpLCBjaGlsZCApIHsKCQkJdmFyIGNoaWxkUHJvdG90eXBlID0gY2hpbGQucHJvdG90eXBlOwoKCQkJLy8gcmVkZWZpbmUgdGhlIGNoaWxkIHdpZGdldCB1c2luZyB0aGUgc2FtZSBwcm90b3R5cGUgdGhhdCB3YXMKCQkJLy8gb3JpZ2luYWxseSB1c2VkLCBidXQgaW5oZXJpdCBmcm9tIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgYmFzZQoJCQkkLndpZGdldCggY2hpbGRQcm90b3R5cGUubmFtZXNwYWNlICsgIi4iICsgY2hpbGRQcm90b3R5cGUud2lkZ2V0TmFtZSwgY29uc3RydWN0b3IsIGNoaWxkLl9wcm90byApOwoJCX0pOwoJCS8vIHJlbW92ZSB0aGUgbGlzdCBvZiBleGlzdGluZyBjaGlsZCBjb25zdHJ1Y3RvcnMgZnJvbSB0aGUgb2xkIGNvbnN0cnVjdG9yCgkJLy8gc28gdGhlIG9sZCBjaGlsZCBjb25zdHJ1Y3RvcnMgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkCgkJZGVsZXRlIGV4aXN0aW5nQ29uc3RydWN0b3IuX2NoaWxkQ29uc3RydWN0b3JzOwoJfSBlbHNlIHsKCQliYXNlLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKCBjb25zdHJ1Y3RvciApOwoJfQoKCSQud2lkZ2V0LmJyaWRnZSggbmFtZSwgY29uc3RydWN0b3IgKTsKCglyZXR1cm4gY29uc3RydWN0b3I7Cn07CgokLndpZGdldC5leHRlbmQgPSBmdW5jdGlvbiggdGFyZ2V0ICkgewoJdmFyIGlucHV0ID0gd2lkZ2V0X3NsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLAoJCWlucHV0SW5kZXggPSAwLAoJCWlucHV0TGVuZ3RoID0gaW5wdXQubGVuZ3RoLAoJCWtleSwKCQl2YWx1ZTsKCWZvciAoIDsgaW5wdXRJbmRleCA8IGlucHV0TGVuZ3RoOyBpbnB1dEluZGV4KysgKSB7CgkJZm9yICgga2V5IGluIGlucHV0WyBpbnB1dEluZGV4IF0gKSB7CgkJCXZhbHVlID0gaW5wdXRbIGlucHV0SW5kZXggXVsga2V5IF07CgkJCWlmICggaW5wdXRbIGlucHV0SW5kZXggXS5oYXNPd25Qcm9wZXJ0eSgga2V5ICkgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCQkJCS8vIENsb25lIG9iamVjdHMKCQkJCWlmICggJC5pc1BsYWluT2JqZWN0KCB2YWx1ZSApICkgewoJCQkJCXRhcmdldFsga2V5IF0gPSAkLmlzUGxhaW5PYmplY3QoIHRhcmdldFsga2V5IF0gKSA/CgkJCQkJCSQud2lkZ2V0LmV4dGVuZCgge30sIHRhcmdldFsga2V5IF0sIHZhbHVlICkgOgoJCQkJCQkvLyBEb24ndCBleHRlbmQgc3RyaW5ncywgYXJyYXlzLCBldGMuIHdpdGggb2JqZWN0cwoJCQkJCQkkLndpZGdldC5leHRlbmQoIHt9LCB2YWx1ZSApOwoJCQkJLy8gQ29weSBldmVyeXRoaW5nIGVsc2UgYnkgcmVmZXJlbmNlCgkJCQl9IGVsc2UgewoJCQkJCXRhcmdldFsga2V5IF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiB0YXJnZXQ7Cn07CgokLndpZGdldC5icmlkZ2UgPSBmdW5jdGlvbiggbmFtZSwgb2JqZWN0ICkgewoJdmFyIGZ1bGxOYW1lID0gb2JqZWN0LnByb3RvdHlwZS53aWRnZXRGdWxsTmFtZSB8fCBuYW1lOwoJJC5mblsgbmFtZSBdID0gZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGlzTWV0aG9kQ2FsbCA9IHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiwKCQkJYXJncyA9IHdpZGdldF9zbGljZS5jYWxsKCBhcmd1bWVudHMsIDEgKSwKCQkJcmV0dXJuVmFsdWUgPSB0aGlzOwoKCQkvLyBhbGxvdyBtdWx0aXBsZSBoYXNoZXMgdG8gYmUgcGFzc2VkIG9uIGluaXQKCQlvcHRpb25zID0gIWlzTWV0aG9kQ2FsbCAmJiBhcmdzLmxlbmd0aCA/CgkJCSQud2lkZ2V0LmV4dGVuZC5hcHBseSggbnVsbCwgWyBvcHRpb25zIF0uY29uY2F0KGFyZ3MpICkgOgoJCQlvcHRpb25zOwoKCQlpZiAoIGlzTWV0aG9kQ2FsbCApIHsKCQkJdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyIG1ldGhvZFZhbHVlLAoJCQkJCWluc3RhbmNlID0gJC5kYXRhKCB0aGlzLCBmdWxsTmFtZSApOwoJCQkJaWYgKCBvcHRpb25zID09PSAiaW5zdGFuY2UiICkgewoJCQkJCXJldHVyblZhbHVlID0gaW5zdGFuY2U7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQkJaWYgKCAhaW5zdGFuY2UgKSB7CgkJCQkJcmV0dXJuICQuZXJyb3IoICJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIgKyBuYW1lICsgIiBwcmlvciB0byBpbml0aWFsaXphdGlvbjsgIiArCgkJCQkJCSJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIgKyBvcHRpb25zICsgIiciICk7CgkJCQl9CgkJCQlpZiAoICEkLmlzRnVuY3Rpb24oIGluc3RhbmNlW29wdGlvbnNdICkgfHwgb3B0aW9ucy5jaGFyQXQoIDAgKSA9PT0gIl8iICkgewoJCQkJCXJldHVybiAkLmVycm9yKCAibm8gc3VjaCBtZXRob2QgJyIgKyBvcHRpb25zICsgIicgZm9yICIgKyBuYW1lICsgIiB3aWRnZXQgaW5zdGFuY2UiICk7CgkJCQl9CgkJCQltZXRob2RWYWx1ZSA9IGluc3RhbmNlWyBvcHRpb25zIF0uYXBwbHkoIGluc3RhbmNlLCBhcmdzICk7CgkJCQlpZiAoIG1ldGhvZFZhbHVlICE9PSBpbnN0YW5jZSAmJiBtZXRob2RWYWx1ZSAhPT0gdW5kZWZpbmVkICkgewoJCQkJCXJldHVyblZhbHVlID0gbWV0aG9kVmFsdWUgJiYgbWV0aG9kVmFsdWUuanF1ZXJ5ID8KCQkJCQkJcmV0dXJuVmFsdWUucHVzaFN0YWNrKCBtZXRob2RWYWx1ZS5nZXQoKSApIDoKCQkJCQkJbWV0aG9kVmFsdWU7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCQl9IGVsc2UgewoJCQl0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgaW5zdGFuY2UgPSAkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lICk7CgkJCQlpZiAoIGluc3RhbmNlICkgewoJCQkJCWluc3RhbmNlLm9wdGlvbiggb3B0aW9ucyB8fCB7fSApOwoJCQkJCWlmICggaW5zdGFuY2UuX2luaXQgKSB7CgkJCQkJCWluc3RhbmNlLl9pbml0KCk7CgkJCQkJfQoJCQkJfSBlbHNlIHsKCQkJCQkkLmRhdGEoIHRoaXMsIGZ1bGxOYW1lLCBuZXcgb2JqZWN0KCBvcHRpb25zLCB0aGlzICkgKTsKCQkJCX0KCQkJfSk7CgkJfQoKCQlyZXR1cm4gcmV0dXJuVmFsdWU7Cgl9Owp9OwoKJC5XaWRnZXQgPSBmdW5jdGlvbiggLyogb3B0aW9ucywgZWxlbWVudCAqLyApIHt9OwokLldpZGdldC5fY2hpbGRDb25zdHJ1Y3RvcnMgPSBbXTsKCiQuV2lkZ2V0LnByb3RvdHlwZSA9IHsKCXdpZGdldE5hbWU6ICJ3aWRnZXQiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICIiLAoJZGVmYXVsdEVsZW1lbnQ6ICI8ZGl2PiIsCglvcHRpb25zOiB7CgkJZGlzYWJsZWQ6IGZhbHNlLAoKCQkvLyBjYWxsYmFja3MKCQljcmVhdGU6IG51bGwKCX0sCglfY3JlYXRlV2lkZ2V0OiBmdW5jdGlvbiggb3B0aW9ucywgZWxlbWVudCApIHsKCQllbGVtZW50ID0gJCggZWxlbWVudCB8fCB0aGlzLmRlZmF1bHRFbGVtZW50IHx8IHRoaXMgKVsgMCBdOwoJCXRoaXMuZWxlbWVudCA9ICQoIGVsZW1lbnQgKTsKCQl0aGlzLnV1aWQgPSB3aWRnZXRfdXVpZCsrOwoJCXRoaXMuZXZlbnROYW1lc3BhY2UgPSAiLiIgKyB0aGlzLndpZGdldE5hbWUgKyB0aGlzLnV1aWQ7CgkJdGhpcy5vcHRpb25zID0gJC53aWRnZXQuZXh0ZW5kKCB7fSwKCQkJdGhpcy5vcHRpb25zLAoJCQl0aGlzLl9nZXRDcmVhdGVPcHRpb25zKCksCgkJCW9wdGlvbnMgKTsKCgkJdGhpcy5iaW5kaW5ncyA9ICQoKTsKCQl0aGlzLmhvdmVyYWJsZSA9ICQoKTsKCQl0aGlzLmZvY3VzYWJsZSA9ICQoKTsKCgkJaWYgKCBlbGVtZW50ICE9PSB0aGlzICkgewoJCQkkLmRhdGEoIGVsZW1lbnQsIHRoaXMud2lkZ2V0RnVsbE5hbWUsIHRoaXMgKTsKCQkJdGhpcy5fb24oIHRydWUsIHRoaXMuZWxlbWVudCwgewoJCQkJcmVtb3ZlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkJaWYgKCBldmVudC50YXJnZXQgPT09IGVsZW1lbnQgKSB7CgkJCQkJCXRoaXMuZGVzdHJveSgpOwoJCQkJCX0KCQkJCX0KCQkJfSk7CgkJCXRoaXMuZG9jdW1lbnQgPSAkKCBlbGVtZW50LnN0eWxlID8KCQkJCS8vIGVsZW1lbnQgd2l0aGluIHRoZSBkb2N1bWVudAoJCQkJZWxlbWVudC5vd25lckRvY3VtZW50IDoKCQkJCS8vIGVsZW1lbnQgaXMgd2luZG93IG9yIGRvY3VtZW50CgkJCQllbGVtZW50LmRvY3VtZW50IHx8IGVsZW1lbnQgKTsKCQkJdGhpcy53aW5kb3cgPSAkKCB0aGlzLmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3IHx8IHRoaXMuZG9jdW1lbnRbMF0ucGFyZW50V2luZG93ICk7CgkJfQoKCQl0aGlzLl9jcmVhdGUoKTsKCQl0aGlzLl90cmlnZ2VyKCAiY3JlYXRlIiwgbnVsbCwgdGhpcy5fZ2V0Q3JlYXRlRXZlbnREYXRhKCkgKTsKCQl0aGlzLl9pbml0KCk7Cgl9LAoJX2dldENyZWF0ZU9wdGlvbnM6ICQubm9vcCwKCV9nZXRDcmVhdGVFdmVudERhdGE6ICQubm9vcCwKCV9jcmVhdGU6ICQubm9vcCwKCV9pbml0OiAkLm5vb3AsCgoJZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5fZGVzdHJveSgpOwoJCS8vIHdlIGNhbiBwcm9iYWJseSByZW1vdmUgdGhlIHVuYmluZCBjYWxscyBpbiAyLjAKCQkvLyBhbGwgZXZlbnQgYmluZGluZ3Mgc2hvdWxkIGdvIHRocm91Z2ggdGhpcy5fb24oKQoJCXRoaXMuZWxlbWVudAoJCQkudW5iaW5kKCB0aGlzLmV2ZW50TmFtZXNwYWNlICkKCQkJLnJlbW92ZURhdGEoIHRoaXMud2lkZ2V0RnVsbE5hbWUgKQoJCQkvLyBzdXBwb3J0OiBqcXVlcnkgPDEuNi4zCgkJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0Lzk0MTMKCQkJLnJlbW92ZURhdGEoICQuY2FtZWxDYXNlKCB0aGlzLndpZGdldEZ1bGxOYW1lICkgKTsKCQl0aGlzLndpZGdldCgpCgkJCS51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICkKCQkJLnJlbW92ZUNsYXNzKAoJCQkJdGhpcy53aWRnZXRGdWxsTmFtZSArICItZGlzYWJsZWQgIiArCgkJCQkidWktc3RhdGUtZGlzYWJsZWQiICk7CgoJCS8vIGNsZWFuIHVwIGV2ZW50cyBhbmQgc3RhdGVzCgkJdGhpcy5iaW5kaW5ncy51bmJpbmQoIHRoaXMuZXZlbnROYW1lc3BhY2UgKTsKCQl0aGlzLmhvdmVyYWJsZS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCXRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7Cgl9LAoJX2Rlc3Ryb3k6ICQubm9vcCwKCgl3aWRnZXQ6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmVsZW1lbnQ7Cgl9LAoKCW9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdmFyIG9wdGlvbnMgPSBrZXksCgkJCXBhcnRzLAoJCQljdXJPcHRpb24sCgkJCWk7CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMCApIHsKCQkJLy8gZG9uJ3QgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBpbnRlcm5hbCBoYXNoCgkJCXJldHVybiAkLndpZGdldC5leHRlbmQoIHt9LCB0aGlzLm9wdGlvbnMgKTsKCQl9CgoJCWlmICggdHlwZW9mIGtleSA9PT0gInN0cmluZyIgKSB7CgkJCS8vIGhhbmRsZSBuZXN0ZWQga2V5cywgZS5nLiwgImZvby5iYXIiID0+IHsgZm9vOiB7IGJhcjogX19fIH0gfQoJCQlvcHRpb25zID0ge307CgkJCXBhcnRzID0ga2V5LnNwbGl0KCAiLiIgKTsKCQkJa2V5ID0gcGFydHMuc2hpZnQoKTsKCQkJaWYgKCBwYXJ0cy5sZW5ndGggKSB7CgkJCQljdXJPcHRpb24gPSBvcHRpb25zWyBrZXkgXSA9ICQud2lkZ2V0LmV4dGVuZCgge30sIHRoaXMub3B0aW9uc1sga2V5IF0gKTsKCQkJCWZvciAoIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrICkgewoJCQkJCWN1ck9wdGlvblsgcGFydHNbIGkgXSBdID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF0gfHwge307CgkJCQkJY3VyT3B0aW9uID0gY3VyT3B0aW9uWyBwYXJ0c1sgaSBdIF07CgkJCQl9CgkJCQlrZXkgPSBwYXJ0cy5wb3AoKTsKCQkJCWlmICggYXJndW1lbnRzLmxlbmd0aCA9PT0gMSApIHsKCQkJCQlyZXR1cm4gY3VyT3B0aW9uWyBrZXkgXSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGN1ck9wdGlvblsga2V5IF07CgkJCQl9CgkJCQljdXJPcHRpb25bIGtleSBdID0gdmFsdWU7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgKSB7CgkJCQkJcmV0dXJuIHRoaXMub3B0aW9uc1sga2V5IF0gPT09IHVuZGVmaW5lZCA/IG51bGwgOiB0aGlzLm9wdGlvbnNbIGtleSBdOwoJCQkJfQoJCQkJb3B0aW9uc1sga2V5IF0gPSB2YWx1ZTsKCQkJfQoJCX0KCgkJdGhpcy5fc2V0T3B0aW9ucyggb3B0aW9ucyApOwoKCQlyZXR1cm4gdGhpczsKCX0sCglfc2V0T3B0aW9uczogZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIGtleTsKCgkJZm9yICgga2V5IGluIG9wdGlvbnMgKSB7CgkJCXRoaXMuX3NldE9wdGlvbigga2V5LCBvcHRpb25zWyBrZXkgXSApOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdGhpcy5vcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy53aWRnZXQoKQoJCQkJLnRvZ2dsZUNsYXNzKCB0aGlzLndpZGdldEZ1bGxOYW1lICsgIi1kaXNhYmxlZCIsICEhdmFsdWUgKTsKCgkJCS8vIElmIHRoZSB3aWRnZXQgaXMgYmVjb21pbmcgZGlzYWJsZWQsIHRoZW4gbm90aGluZyBpcyBpbnRlcmFjdGl2ZQoJCQlpZiAoIHZhbHVlICkgewoJCQkJdGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKTsKCQkJCXRoaXMuZm9jdXNhYmxlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCgllbmFibGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9zZXRPcHRpb25zKHsgZGlzYWJsZWQ6IGZhbHNlIH0pOwoJfSwKCWRpc2FibGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9zZXRPcHRpb25zKHsgZGlzYWJsZWQ6IHRydWUgfSk7Cgl9LAoKCV9vbjogZnVuY3Rpb24oIHN1cHByZXNzRGlzYWJsZWRDaGVjaywgZWxlbWVudCwgaGFuZGxlcnMgKSB7CgkJdmFyIGRlbGVnYXRlRWxlbWVudCwKCQkJaW5zdGFuY2UgPSB0aGlzOwoKCQkvLyBubyBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgZmxhZywgc2h1ZmZsZSBhcmd1bWVudHMKCQlpZiAoIHR5cGVvZiBzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgIT09ICJib29sZWFuIiApIHsKCQkJaGFuZGxlcnMgPSBlbGVtZW50OwoJCQllbGVtZW50ID0gc3VwcHJlc3NEaXNhYmxlZENoZWNrOwoJCQlzdXBwcmVzc0Rpc2FibGVkQ2hlY2sgPSBmYWxzZTsKCQl9CgoJCS8vIG5vIGVsZW1lbnQgYXJndW1lbnQsIHNodWZmbGUgYW5kIHVzZSB0aGlzLmVsZW1lbnQKCQlpZiAoICFoYW5kbGVycyApIHsKCQkJaGFuZGxlcnMgPSBlbGVtZW50OwoJCQllbGVtZW50ID0gdGhpcy5lbGVtZW50OwoJCQlkZWxlZ2F0ZUVsZW1lbnQgPSB0aGlzLndpZGdldCgpOwoJCX0gZWxzZSB7CgkJCWVsZW1lbnQgPSBkZWxlZ2F0ZUVsZW1lbnQgPSAkKCBlbGVtZW50ICk7CgkJCXRoaXMuYmluZGluZ3MgPSB0aGlzLmJpbmRpbmdzLmFkZCggZWxlbWVudCApOwoJCX0KCgkJJC5lYWNoKCBoYW5kbGVycywgZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVyICkgewoJCQlmdW5jdGlvbiBoYW5kbGVyUHJveHkoKSB7CgkJCQkvLyBhbGxvdyB3aWRnZXRzIHRvIGN1c3RvbWl6ZSB0aGUgZGlzYWJsZWQgaGFuZGxpbmcKCQkJCS8vIC0gZGlzYWJsZWQgYXMgYW4gYXJyYXkgaW5zdGVhZCBvZiBib29sZWFuCgkJCQkvLyAtIGRpc2FibGVkIGNsYXNzIGFzIG1ldGhvZCBmb3IgZGlzYWJsaW5nIGluZGl2aWR1YWwgcGFydHMKCQkJCWlmICggIXN1cHByZXNzRGlzYWJsZWRDaGVjayAmJgoJCQkJCQkoIGluc3RhbmNlLm9wdGlvbnMuZGlzYWJsZWQgPT09IHRydWUgfHwKCQkJCQkJCSQoIHRoaXMgKS5oYXNDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiApICkgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJcmV0dXJuICggdHlwZW9mIGhhbmRsZXIgPT09ICJzdHJpbmciID8gaW5zdGFuY2VbIGhhbmRsZXIgXSA6IGhhbmRsZXIgKQoJCQkJCS5hcHBseSggaW5zdGFuY2UsIGFyZ3VtZW50cyApOwoJCQl9CgoJCQkvLyBjb3B5IHRoZSBndWlkIHNvIGRpcmVjdCB1bmJpbmRpbmcgd29ya3MKCQkJaWYgKCB0eXBlb2YgaGFuZGxlciAhPT0gInN0cmluZyIgKSB7CgkJCQloYW5kbGVyUHJveHkuZ3VpZCA9IGhhbmRsZXIuZ3VpZCA9CgkJCQkJaGFuZGxlci5ndWlkIHx8IGhhbmRsZXJQcm94eS5ndWlkIHx8ICQuZ3VpZCsrOwoJCQl9CgoJCQl2YXIgbWF0Y2ggPSBldmVudC5tYXRjaCggL14oW1x3Oi1dKilccyooLiopJC8gKSwKCQkJCWV2ZW50TmFtZSA9IG1hdGNoWzFdICsgaW5zdGFuY2UuZXZlbnROYW1lc3BhY2UsCgkJCQlzZWxlY3RvciA9IG1hdGNoWzJdOwoJCQlpZiAoIHNlbGVjdG9yICkgewoJCQkJZGVsZWdhdGVFbGVtZW50LmRlbGVnYXRlKCBzZWxlY3RvciwgZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTsKCQkJfSBlbHNlIHsKCQkJCWVsZW1lbnQuYmluZCggZXZlbnROYW1lLCBoYW5kbGVyUHJveHkgKTsKCQkJfQoJCX0pOwoJfSwKCglfb2ZmOiBmdW5jdGlvbiggZWxlbWVudCwgZXZlbnROYW1lICkgewoJCWV2ZW50TmFtZSA9IChldmVudE5hbWUgfHwgIiIpLnNwbGl0KCAiICIgKS5qb2luKCB0aGlzLmV2ZW50TmFtZXNwYWNlICsgIiAiICkgKyB0aGlzLmV2ZW50TmFtZXNwYWNlOwoJCWVsZW1lbnQudW5iaW5kKCBldmVudE5hbWUgKS51bmRlbGVnYXRlKCBldmVudE5hbWUgKTsKCX0sCgoJX2RlbGF5OiBmdW5jdGlvbiggaGFuZGxlciwgZGVsYXkgKSB7CgkJZnVuY3Rpb24gaGFuZGxlclByb3h5KCkgewoJCQlyZXR1cm4gKCB0eXBlb2YgaGFuZGxlciA9PT0gInN0cmluZyIgPyBpbnN0YW5jZVsgaGFuZGxlciBdIDogaGFuZGxlciApCgkJCQkuYXBwbHkoIGluc3RhbmNlLCBhcmd1bWVudHMgKTsKCQl9CgkJdmFyIGluc3RhbmNlID0gdGhpczsKCQlyZXR1cm4gc2V0VGltZW91dCggaGFuZGxlclByb3h5LCBkZWxheSB8fCAwICk7Cgl9LAoKCV9ob3ZlcmFibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXRoaXMuaG92ZXJhYmxlID0gdGhpcy5ob3ZlcmFibGUuYWRkKCBlbGVtZW50ICk7CgkJdGhpcy5fb24oIGVsZW1lbnQsIHsKCQkJbW91c2VlbnRlcjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLmFkZENsYXNzKCAidWktc3RhdGUtaG92ZXIiICk7CgkJCX0sCgkJCW1vdXNlbGVhdmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCSQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWhvdmVyIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV9mb2N1c2FibGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXRoaXMuZm9jdXNhYmxlID0gdGhpcy5mb2N1c2FibGUuYWRkKCBlbGVtZW50ICk7CgkJdGhpcy5fb24oIGVsZW1lbnQsIHsKCQkJZm9jdXNpbjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLmFkZENsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJCX0sCgkJCWZvY3Vzb3V0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQkkKCBldmVudC5jdXJyZW50VGFyZ2V0ICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0pOwoJfSwKCglfdHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGV2ZW50LCBkYXRhICkgewoJCXZhciBwcm9wLCBvcmlnLAoJCQljYWxsYmFjayA9IHRoaXMub3B0aW9uc1sgdHlwZSBdOwoKCQlkYXRhID0gZGF0YSB8fCB7fTsKCQlldmVudCA9ICQuRXZlbnQoIGV2ZW50ICk7CgkJZXZlbnQudHlwZSA9ICggdHlwZSA9PT0gdGhpcy53aWRnZXRFdmVudFByZWZpeCA/CgkJCXR5cGUgOgoJCQl0aGlzLndpZGdldEV2ZW50UHJlZml4ICsgdHlwZSApLnRvTG93ZXJDYXNlKCk7CgkJLy8gdGhlIG9yaWdpbmFsIGV2ZW50IG1heSBjb21lIGZyb20gYW55IGVsZW1lbnQKCQkvLyBzbyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSB0YXJnZXQgb24gdGhlIG5ldyBldmVudAoJCWV2ZW50LnRhcmdldCA9IHRoaXMuZWxlbWVudFsgMCBdOwoKCQkvLyBjb3B5IG9yaWdpbmFsIGV2ZW50IHByb3BlcnRpZXMgb3ZlciB0byB0aGUgbmV3IGV2ZW50CgkJb3JpZyA9IGV2ZW50Lm9yaWdpbmFsRXZlbnQ7CgkJaWYgKCBvcmlnICkgewoJCQlmb3IgKCBwcm9wIGluIG9yaWcgKSB7CgkJCQlpZiAoICEoIHByb3AgaW4gZXZlbnQgKSApIHsKCQkJCQlldmVudFsgcHJvcCBdID0gb3JpZ1sgcHJvcCBdOwoJCQkJfQoJCQl9CgkJfQoKCQl0aGlzLmVsZW1lbnQudHJpZ2dlciggZXZlbnQsIGRhdGEgKTsKCQlyZXR1cm4gISggJC5pc0Z1bmN0aW9uKCBjYWxsYmFjayApICYmCgkJCWNhbGxiYWNrLmFwcGx5KCB0aGlzLmVsZW1lbnRbMF0sIFsgZXZlbnQgXS5jb25jYXQoIGRhdGEgKSApID09PSBmYWxzZSB8fAoJCQlldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApOwoJfQp9OwoKJC5lYWNoKCB7IHNob3c6ICJmYWRlSW4iLCBoaWRlOiAiZmFkZU91dCIgfSwgZnVuY3Rpb24oIG1ldGhvZCwgZGVmYXVsdEVmZmVjdCApIHsKCSQuV2lkZ2V0LnByb3RvdHlwZVsgIl8iICsgbWV0aG9kIF0gPSBmdW5jdGlvbiggZWxlbWVudCwgb3B0aW9ucywgY2FsbGJhY2sgKSB7CgkJaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PT0gInN0cmluZyIgKSB7CgkJCW9wdGlvbnMgPSB7IGVmZmVjdDogb3B0aW9ucyB9OwoJCX0KCQl2YXIgaGFzT3B0aW9ucywKCQkJZWZmZWN0TmFtZSA9ICFvcHRpb25zID8KCQkJCW1ldGhvZCA6CgkJCQlvcHRpb25zID09PSB0cnVlIHx8IHR5cGVvZiBvcHRpb25zID09PSAibnVtYmVyIiA/CgkJCQkJZGVmYXVsdEVmZmVjdCA6CgkJCQkJb3B0aW9ucy5lZmZlY3QgfHwgZGVmYXVsdEVmZmVjdDsKCQlvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCQlpZiAoIHR5cGVvZiBvcHRpb25zID09PSAibnVtYmVyIiApIHsKCQkJb3B0aW9ucyA9IHsgZHVyYXRpb246IG9wdGlvbnMgfTsKCQl9CgkJaGFzT3B0aW9ucyA9ICEkLmlzRW1wdHlPYmplY3QoIG9wdGlvbnMgKTsKCQlvcHRpb25zLmNvbXBsZXRlID0gY2FsbGJhY2s7CgkJaWYgKCBvcHRpb25zLmRlbGF5ICkgewoJCQllbGVtZW50LmRlbGF5KCBvcHRpb25zLmRlbGF5ICk7CgkJfQoJCWlmICggaGFzT3B0aW9ucyAmJiAkLmVmZmVjdHMgJiYgJC5lZmZlY3RzLmVmZmVjdFsgZWZmZWN0TmFtZSBdICkgewoJCQllbGVtZW50WyBtZXRob2QgXSggb3B0aW9ucyApOwoJCX0gZWxzZSBpZiAoIGVmZmVjdE5hbWUgIT09IG1ldGhvZCAmJiBlbGVtZW50WyBlZmZlY3ROYW1lIF0gKSB7CgkJCWVsZW1lbnRbIGVmZmVjdE5hbWUgXSggb3B0aW9ucy5kdXJhdGlvbiwgb3B0aW9ucy5lYXNpbmcsIGNhbGxiYWNrICk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudC5xdWV1ZShmdW5jdGlvbiggbmV4dCApIHsKCQkJCSQoIHRoaXMgKVsgbWV0aG9kIF0oKTsKCQkJCWlmICggY2FsbGJhY2sgKSB7CgkJCQkJY2FsbGJhY2suY2FsbCggZWxlbWVudFsgMCBdICk7CgkJCQl9CgkJCQluZXh0KCk7CgkJCX0pOwoJCX0KCX07Cn0pOwoKdmFyIHdpZGdldCA9ICQud2lkZ2V0OwoKCi8qIQogKiBqUXVlcnkgVUkgTW91c2UgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vbW91c2UvCiAqLwoKCnZhciBtb3VzZUhhbmRsZWQgPSBmYWxzZTsKJCggZG9jdW1lbnQgKS5tb3VzZXVwKCBmdW5jdGlvbigpIHsKCW1vdXNlSGFuZGxlZCA9IGZhbHNlOwp9KTsKCnZhciBtb3VzZSA9ICQud2lkZ2V0KCJ1aS5tb3VzZSIsIHsKCXZlcnNpb246ICIxLjExLjAiLAoJb3B0aW9uczogewoJCWNhbmNlbDogImlucHV0LHRleHRhcmVhLGJ1dHRvbixzZWxlY3Qsb3B0aW9uIiwKCQlkaXN0YW5jZTogMSwKCQlkZWxheTogMAoJfSwKCV9tb3VzZUluaXQ6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJdGhpcy5lbGVtZW50CgkJCS5iaW5kKCJtb3VzZWRvd24uIiArIHRoaXMud2lkZ2V0TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHsKCQkJCXJldHVybiB0aGF0Ll9tb3VzZURvd24oZXZlbnQpOwoJCQl9KQoJCQkuYmluZCgiY2xpY2suIiArIHRoaXMud2lkZ2V0TmFtZSwgZnVuY3Rpb24oZXZlbnQpIHsKCQkJCWlmICh0cnVlID09PSAkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGF0LndpZGdldE5hbWUgKyAiLnByZXZlbnRDbGlja0V2ZW50IikpIHsKCQkJCQkkLnJlbW92ZURhdGEoZXZlbnQudGFyZ2V0LCB0aGF0LndpZGdldE5hbWUgKyAiLnByZXZlbnRDbGlja0V2ZW50Iik7CgkJCQkJZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9KTsKCgkJdGhpcy5zdGFydGVkID0gZmFsc2U7Cgl9LAoKCS8vIFRPRE86IG1ha2Ugc3VyZSBkZXN0cm95aW5nIG9uZSBpbnN0YW5jZSBvZiBtb3VzZSBkb2Vzbid0IG1lc3Mgd2l0aAoJLy8gb3RoZXIgaW5zdGFuY2VzIG9mIG1vdXNlCglfbW91c2VEZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQudW5iaW5kKCIuIiArIHRoaXMud2lkZ2V0TmFtZSk7CgkJaWYgKCB0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSApIHsKCQkJdGhpcy5kb2N1bWVudAoJCQkJLnVuYmluZCgibW91c2Vtb3ZlLiIgKyB0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKQoJCQkJLnVuYmluZCgibW91c2V1cC4iICsgdGhpcy53aWRnZXROYW1lLCB0aGlzLl9tb3VzZVVwRGVsZWdhdGUpOwoJCX0KCX0sCgoJX21vdXNlRG93bjogZnVuY3Rpb24oZXZlbnQpIHsKCQkvLyBkb24ndCBsZXQgbW9yZSB0aGFuIG9uZSB3aWRnZXQgaGFuZGxlIG1vdXNlU3RhcnQKCQlpZiAoIG1vdXNlSGFuZGxlZCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gd2UgbWF5IGhhdmUgbWlzc2VkIG1vdXNldXAgKG91dCBvZiB3aW5kb3cpCgkJKHRoaXMuX21vdXNlU3RhcnRlZCAmJiB0aGlzLl9tb3VzZVVwKGV2ZW50KSk7CgoJCXRoaXMuX21vdXNlRG93bkV2ZW50ID0gZXZlbnQ7CgoJCXZhciB0aGF0ID0gdGhpcywKCQkJYnRuSXNMZWZ0ID0gKGV2ZW50LndoaWNoID09PSAxKSwKCQkJLy8gZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBJRSA4IHdpdGgKCQkJLy8gZGlzYWJsZWQgaW5wdXRzICgjNzYyMCkKCQkJZWxJc0NhbmNlbCA9ICh0eXBlb2YgdGhpcy5vcHRpb25zLmNhbmNlbCA9PT0gInN0cmluZyIgJiYgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lID8gJChldmVudC50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoIDogZmFsc2UpOwoJCWlmICghYnRuSXNMZWZ0IHx8IGVsSXNDYW5jZWwgfHwgIXRoaXMuX21vdXNlQ2FwdHVyZShldmVudCkpIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQl0aGlzLm1vdXNlRGVsYXlNZXQgPSAhdGhpcy5vcHRpb25zLmRlbGF5OwoJCWlmICghdGhpcy5tb3VzZURlbGF5TWV0KSB7CgkJCXRoaXMuX21vdXNlRGVsYXlUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQl0aGF0Lm1vdXNlRGVsYXlNZXQgPSB0cnVlOwoJCQl9LCB0aGlzLm9wdGlvbnMuZGVsYXkpOwoJCX0KCgkJaWYgKHRoaXMuX21vdXNlRGlzdGFuY2VNZXQoZXZlbnQpICYmIHRoaXMuX21vdXNlRGVsYXlNZXQoZXZlbnQpKSB7CgkJCXRoaXMuX21vdXNlU3RhcnRlZCA9ICh0aGlzLl9tb3VzZVN0YXJ0KGV2ZW50KSAhPT0gZmFsc2UpOwoJCQlpZiAoIXRoaXMuX21vdXNlU3RhcnRlZCkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCXJldHVybiB0cnVlOwoJCQl9CgkJfQoKCQkvLyBDbGljayBldmVudCBtYXkgbmV2ZXIgaGF2ZSBmaXJlZCAoR2Vja28gJiBPcGVyYSkKCQlpZiAodHJ1ZSA9PT0gJC5kYXRhKGV2ZW50LnRhcmdldCwgdGhpcy53aWRnZXROYW1lICsgIi5wcmV2ZW50Q2xpY2tFdmVudCIpKSB7CgkJCSQucmVtb3ZlRGF0YShldmVudC50YXJnZXQsIHRoaXMud2lkZ2V0TmFtZSArICIucHJldmVudENsaWNrRXZlbnQiKTsKCQl9CgoJCS8vIHRoZXNlIGRlbGVnYXRlcyBhcmUgcmVxdWlyZWQgdG8ga2VlcCBjb250ZXh0CgkJdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUgPSBmdW5jdGlvbihldmVudCkgewoJCQlyZXR1cm4gdGhhdC5fbW91c2VNb3ZlKGV2ZW50KTsKCQl9OwoJCXRoaXMuX21vdXNlVXBEZWxlZ2F0ZSA9IGZ1bmN0aW9uKGV2ZW50KSB7CgkJCXJldHVybiB0aGF0Ll9tb3VzZVVwKGV2ZW50KTsKCQl9OwoKCQl0aGlzLmRvY3VtZW50CgkJCS5iaW5kKCAibW91c2Vtb3ZlLiIgKyB0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlTW92ZURlbGVnYXRlICkKCQkJLmJpbmQoICJtb3VzZXVwLiIgKyB0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSApOwoKCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQltb3VzZUhhbmRsZWQgPSB0cnVlOwoJCXJldHVybiB0cnVlOwoJfSwKCglfbW91c2VNb3ZlOiBmdW5jdGlvbihldmVudCkgewoJCS8vIElFIG1vdXNldXAgY2hlY2sgLSBtb3VzZXVwIGhhcHBlbmVkIHdoZW4gbW91c2Ugd2FzIG91dCBvZiB3aW5kb3cKCQlpZiAoJC51aS5pZSAmJiAoICFkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgZG9jdW1lbnQuZG9jdW1lbnRNb2RlIDwgOSApICYmICFldmVudC5idXR0b24pIHsKCQkJcmV0dXJuIHRoaXMuX21vdXNlVXAoZXZlbnQpOwoKCQkvLyBJZnJhbWUgbW91c2V1cCBjaGVjayAtIG1vdXNldXAgb2NjdXJyZWQgaW4gYW5vdGhlciBkb2N1bWVudAoJCX0gZWxzZSBpZiAoICFldmVudC53aGljaCApIHsKCQkJcmV0dXJuIHRoaXMuX21vdXNlVXAoIGV2ZW50ICk7CgkJfQoKCQlpZiAodGhpcy5fbW91c2VTdGFydGVkKSB7CgkJCXRoaXMuX21vdXNlRHJhZyhldmVudCk7CgkJCXJldHVybiBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCX0KCgkJaWYgKHRoaXMuX21vdXNlRGlzdGFuY2VNZXQoZXZlbnQpICYmIHRoaXMuX21vdXNlRGVsYXlNZXQoZXZlbnQpKSB7CgkJCXRoaXMuX21vdXNlU3RhcnRlZCA9CgkJCQkodGhpcy5fbW91c2VTdGFydCh0aGlzLl9tb3VzZURvd25FdmVudCwgZXZlbnQpICE9PSBmYWxzZSk7CgkJCSh0aGlzLl9tb3VzZVN0YXJ0ZWQgPyB0aGlzLl9tb3VzZURyYWcoZXZlbnQpIDogdGhpcy5fbW91c2VVcChldmVudCkpOwoJCX0KCgkJcmV0dXJuICF0aGlzLl9tb3VzZVN0YXJ0ZWQ7Cgl9LAoKCV9tb3VzZVVwOiBmdW5jdGlvbihldmVudCkgewoJCXRoaXMuZG9jdW1lbnQKCQkJLnVuYmluZCggIm1vdXNlbW92ZS4iICsgdGhpcy53aWRnZXROYW1lLCB0aGlzLl9tb3VzZU1vdmVEZWxlZ2F0ZSApCgkJCS51bmJpbmQoICJtb3VzZXVwLiIgKyB0aGlzLndpZGdldE5hbWUsIHRoaXMuX21vdXNlVXBEZWxlZ2F0ZSApOwoKCQlpZiAodGhpcy5fbW91c2VTdGFydGVkKSB7CgkJCXRoaXMuX21vdXNlU3RhcnRlZCA9IGZhbHNlOwoKCQkJaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fbW91c2VEb3duRXZlbnQudGFyZ2V0KSB7CgkJCQkkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGlzLndpZGdldE5hbWUgKyAiLnByZXZlbnRDbGlja0V2ZW50IiwgdHJ1ZSk7CgkJCX0KCgkJCXRoaXMuX21vdXNlU3RvcChldmVudCk7CgkJfQoKCQltb3VzZUhhbmRsZWQgPSBmYWxzZTsKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZURpc3RhbmNlTWV0OiBmdW5jdGlvbihldmVudCkgewoJCXJldHVybiAoTWF0aC5tYXgoCgkJCQlNYXRoLmFicyh0aGlzLl9tb3VzZURvd25FdmVudC5wYWdlWCAtIGV2ZW50LnBhZ2VYKSwKCQkJCU1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZIC0gZXZlbnQucGFnZVkpCgkJCSkgPj0gdGhpcy5vcHRpb25zLmRpc3RhbmNlCgkJKTsKCX0sCgoJX21vdXNlRGVsYXlNZXQ6IGZ1bmN0aW9uKC8qIGV2ZW50ICovKSB7CgkJcmV0dXJuIHRoaXMubW91c2VEZWxheU1ldDsKCX0sCgoJLy8gVGhlc2UgYXJlIHBsYWNlaG9sZGVyIG1ldGhvZHMsIHRvIGJlIG92ZXJyaWRlbiBieSBleHRlbmRpbmcgcGx1Z2luCglfbW91c2VTdGFydDogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHt9LAoJX21vdXNlRHJhZzogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHt9LAoJX21vdXNlU3RvcDogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHt9LAoJX21vdXNlQ2FwdHVyZTogZnVuY3Rpb24oLyogZXZlbnQgKi8pIHsgcmV0dXJuIHRydWU7IH0KfSk7CgoKLyohCiAqIGpRdWVyeSBVSSBQb3NpdGlvbiAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9wb3NpdGlvbi8KICovCgooZnVuY3Rpb24oKSB7CgokLnVpID0gJC51aSB8fCB7fTsKCnZhciBjYWNoZWRTY3JvbGxiYXJXaWR0aCwgc3VwcG9ydHNPZmZzZXRGcmFjdGlvbnMsCgltYXggPSBNYXRoLm1heCwKCWFicyA9IE1hdGguYWJzLAoJcm91bmQgPSBNYXRoLnJvdW5kLAoJcmhvcml6b250YWwgPSAvbGVmdHxjZW50ZXJ8cmlnaHQvLAoJcnZlcnRpY2FsID0gL3RvcHxjZW50ZXJ8Ym90dG9tLywKCXJvZmZzZXQgPSAvW1wrXC1dXGQrKFwuW1xkXSspPyU/LywKCXJwb3NpdGlvbiA9IC9eXHcrLywKCXJwZXJjZW50ID0gLyUkLywKCV9wb3NpdGlvbiA9ICQuZm4ucG9zaXRpb247CgpmdW5jdGlvbiBnZXRPZmZzZXRzKCBvZmZzZXRzLCB3aWR0aCwgaGVpZ2h0ICkgewoJcmV0dXJuIFsKCQlwYXJzZUZsb2F0KCBvZmZzZXRzWyAwIF0gKSAqICggcnBlcmNlbnQudGVzdCggb2Zmc2V0c1sgMCBdICkgPyB3aWR0aCAvIDEwMCA6IDEgKSwKCQlwYXJzZUZsb2F0KCBvZmZzZXRzWyAxIF0gKSAqICggcnBlcmNlbnQudGVzdCggb2Zmc2V0c1sgMSBdICkgPyBoZWlnaHQgLyAxMDAgOiAxICkKCV07Cn0KCmZ1bmN0aW9uIHBhcnNlQ3NzKCBlbGVtZW50LCBwcm9wZXJ0eSApIHsKCXJldHVybiBwYXJzZUludCggJC5jc3MoIGVsZW1lbnQsIHByb3BlcnR5ICksIDEwICkgfHwgMDsKfQoKZnVuY3Rpb24gZ2V0RGltZW5zaW9ucyggZWxlbSApIHsKCXZhciByYXcgPSBlbGVtWzBdOwoJaWYgKCByYXcubm9kZVR5cGUgPT09IDkgKSB7CgkJcmV0dXJuIHsKCQkJd2lkdGg6IGVsZW0ud2lkdGgoKSwKCQkJaGVpZ2h0OiBlbGVtLmhlaWdodCgpLAoJCQlvZmZzZXQ6IHsgdG9wOiAwLCBsZWZ0OiAwIH0KCQl9OwoJfQoJaWYgKCAkLmlzV2luZG93KCByYXcgKSApIHsKCQlyZXR1cm4gewoJCQl3aWR0aDogZWxlbS53aWR0aCgpLAoJCQloZWlnaHQ6IGVsZW0uaGVpZ2h0KCksCgkJCW9mZnNldDogeyB0b3A6IGVsZW0uc2Nyb2xsVG9wKCksIGxlZnQ6IGVsZW0uc2Nyb2xsTGVmdCgpIH0KCQl9OwoJfQoJaWYgKCByYXcucHJldmVudERlZmF1bHQgKSB7CgkJcmV0dXJuIHsKCQkJd2lkdGg6IDAsCgkJCWhlaWdodDogMCwKCQkJb2Zmc2V0OiB7IHRvcDogcmF3LnBhZ2VZLCBsZWZ0OiByYXcucGFnZVggfQoJCX07Cgl9CglyZXR1cm4gewoJCXdpZHRoOiBlbGVtLm91dGVyV2lkdGgoKSwKCQloZWlnaHQ6IGVsZW0ub3V0ZXJIZWlnaHQoKSwKCQlvZmZzZXQ6IGVsZW0ub2Zmc2V0KCkKCX07Cn0KCiQucG9zaXRpb24gPSB7CglzY3JvbGxiYXJXaWR0aDogZnVuY3Rpb24oKSB7CgkJaWYgKCBjYWNoZWRTY3JvbGxiYXJXaWR0aCAhPT0gdW5kZWZpbmVkICkgewoJCQlyZXR1cm4gY2FjaGVkU2Nyb2xsYmFyV2lkdGg7CgkJfQoJCXZhciB3MSwgdzIsCgkJCWRpdiA9ICQoICI8ZGl2IHN0eWxlPSdkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjUwcHg7aGVpZ2h0OjUwcHg7b3ZlcmZsb3c6aGlkZGVuOyc+PGRpdiBzdHlsZT0naGVpZ2h0OjEwMHB4O3dpZHRoOmF1dG87Jz48L2Rpdj48L2Rpdj4iICksCgkJCWlubmVyRGl2ID0gZGl2LmNoaWxkcmVuKClbMF07CgoJCSQoICJib2R5IiApLmFwcGVuZCggZGl2ICk7CgkJdzEgPSBpbm5lckRpdi5vZmZzZXRXaWR0aDsKCQlkaXYuY3NzKCAib3ZlcmZsb3ciLCAic2Nyb2xsIiApOwoKCQl3MiA9IGlubmVyRGl2Lm9mZnNldFdpZHRoOwoKCQlpZiAoIHcxID09PSB3MiApIHsKCQkJdzIgPSBkaXZbMF0uY2xpZW50V2lkdGg7CgkJfQoKCQlkaXYucmVtb3ZlKCk7CgoJCXJldHVybiAoY2FjaGVkU2Nyb2xsYmFyV2lkdGggPSB3MSAtIHcyKTsKCX0sCglnZXRTY3JvbGxJbmZvOiBmdW5jdGlvbiggd2l0aGluICkgewoJCXZhciBvdmVyZmxvd1ggPSB3aXRoaW4uaXNXaW5kb3cgfHwgd2l0aGluLmlzRG9jdW1lbnQgPyAiIiA6CgkJCQl3aXRoaW4uZWxlbWVudC5jc3MoICJvdmVyZmxvdy14IiApLAoJCQlvdmVyZmxvd1kgPSB3aXRoaW4uaXNXaW5kb3cgfHwgd2l0aGluLmlzRG9jdW1lbnQgPyAiIiA6CgkJCQl3aXRoaW4uZWxlbWVudC5jc3MoICJvdmVyZmxvdy15IiApLAoJCQloYXNPdmVyZmxvd1ggPSBvdmVyZmxvd1ggPT09ICJzY3JvbGwiIHx8CgkJCQkoIG92ZXJmbG93WCA9PT0gImF1dG8iICYmIHdpdGhpbi53aWR0aCA8IHdpdGhpbi5lbGVtZW50WzBdLnNjcm9sbFdpZHRoICksCgkJCWhhc092ZXJmbG93WSA9IG92ZXJmbG93WSA9PT0gInNjcm9sbCIgfHwKCQkJCSggb3ZlcmZsb3dZID09PSAiYXV0byIgJiYgd2l0aGluLmhlaWdodCA8IHdpdGhpbi5lbGVtZW50WzBdLnNjcm9sbEhlaWdodCApOwoJCXJldHVybiB7CgkJCXdpZHRoOiBoYXNPdmVyZmxvd1kgPyAkLnBvc2l0aW9uLnNjcm9sbGJhcldpZHRoKCkgOiAwLAoJCQloZWlnaHQ6IGhhc092ZXJmbG93WCA/ICQucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKSA6IDAKCQl9OwoJfSwKCWdldFdpdGhpbkluZm86IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXZhciB3aXRoaW5FbGVtZW50ID0gJCggZWxlbWVudCB8fCB3aW5kb3cgKSwKCQkJaXNXaW5kb3cgPSAkLmlzV2luZG93KCB3aXRoaW5FbGVtZW50WzBdICksCgkJCWlzRG9jdW1lbnQgPSAhIXdpdGhpbkVsZW1lbnRbIDAgXSAmJiB3aXRoaW5FbGVtZW50WyAwIF0ubm9kZVR5cGUgPT09IDk7CgkJcmV0dXJuIHsKCQkJZWxlbWVudDogd2l0aGluRWxlbWVudCwKCQkJaXNXaW5kb3c6IGlzV2luZG93LAoJCQlpc0RvY3VtZW50OiBpc0RvY3VtZW50LAoJCQlvZmZzZXQ6IHdpdGhpbkVsZW1lbnQub2Zmc2V0KCkgfHwgeyBsZWZ0OiAwLCB0b3A6IDAgfSwKCQkJc2Nyb2xsTGVmdDogd2l0aGluRWxlbWVudC5zY3JvbGxMZWZ0KCksCgkJCXNjcm9sbFRvcDogd2l0aGluRWxlbWVudC5zY3JvbGxUb3AoKSwKCQkJd2lkdGg6IGlzV2luZG93ID8gd2l0aGluRWxlbWVudC53aWR0aCgpIDogd2l0aGluRWxlbWVudC5vdXRlcldpZHRoKCksCgkJCWhlaWdodDogaXNXaW5kb3cgPyB3aXRoaW5FbGVtZW50LmhlaWdodCgpIDogd2l0aGluRWxlbWVudC5vdXRlckhlaWdodCgpCgkJfTsKCX0KfTsKCiQuZm4ucG9zaXRpb24gPSBmdW5jdGlvbiggb3B0aW9ucyApIHsKCWlmICggIW9wdGlvbnMgfHwgIW9wdGlvbnMub2YgKSB7CgkJcmV0dXJuIF9wb3NpdGlvbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7Cgl9CgoJLy8gbWFrZSBhIGNvcHksIHdlIGRvbid0IHdhbnQgdG8gbW9kaWZ5IGFyZ3VtZW50cwoJb3B0aW9ucyA9ICQuZXh0ZW5kKCB7fSwgb3B0aW9ucyApOwoKCXZhciBhdE9mZnNldCwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCwgdGFyZ2V0T2Zmc2V0LCBiYXNlUG9zaXRpb24sIGRpbWVuc2lvbnMsCgkJdGFyZ2V0ID0gJCggb3B0aW9ucy5vZiApLAoJCXdpdGhpbiA9ICQucG9zaXRpb24uZ2V0V2l0aGluSW5mbyggb3B0aW9ucy53aXRoaW4gKSwKCQlzY3JvbGxJbmZvID0gJC5wb3NpdGlvbi5nZXRTY3JvbGxJbmZvKCB3aXRoaW4gKSwKCQljb2xsaXNpb24gPSAoIG9wdGlvbnMuY29sbGlzaW9uIHx8ICJmbGlwIiApLnNwbGl0KCAiICIgKSwKCQlvZmZzZXRzID0ge307CgoJZGltZW5zaW9ucyA9IGdldERpbWVuc2lvbnMoIHRhcmdldCApOwoJaWYgKCB0YXJnZXRbMF0ucHJldmVudERlZmF1bHQgKSB7CgkJLy8gZm9yY2UgbGVmdCB0b3AgdG8gYWxsb3cgZmxpcHBpbmcKCQlvcHRpb25zLmF0ID0gImxlZnQgdG9wIjsKCX0KCXRhcmdldFdpZHRoID0gZGltZW5zaW9ucy53aWR0aDsKCXRhcmdldEhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0OwoJdGFyZ2V0T2Zmc2V0ID0gZGltZW5zaW9ucy5vZmZzZXQ7CgkvLyBjbG9uZSB0byByZXVzZSBvcmlnaW5hbCB0YXJnZXRPZmZzZXQgbGF0ZXIKCWJhc2VQb3NpdGlvbiA9ICQuZXh0ZW5kKCB7fSwgdGFyZ2V0T2Zmc2V0ICk7CgoJLy8gZm9yY2UgbXkgYW5kIGF0IHRvIGhhdmUgdmFsaWQgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgcG9zaXRpb25zCgkvLyBpZiBhIHZhbHVlIGlzIG1pc3Npbmcgb3IgaW52YWxpZCwgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2VudGVyCgkkLmVhY2goIFsgIm15IiwgImF0IiBdLCBmdW5jdGlvbigpIHsKCQl2YXIgcG9zID0gKCBvcHRpb25zWyB0aGlzIF0gfHwgIiIgKS5zcGxpdCggIiAiICksCgkJCWhvcml6b250YWxPZmZzZXQsCgkJCXZlcnRpY2FsT2Zmc2V0OwoKCQlpZiAoIHBvcy5sZW5ndGggPT09IDEpIHsKCQkJcG9zID0gcmhvcml6b250YWwudGVzdCggcG9zWyAwIF0gKSA/CgkJCQlwb3MuY29uY2F0KCBbICJjZW50ZXIiIF0gKSA6CgkJCQlydmVydGljYWwudGVzdCggcG9zWyAwIF0gKSA/CgkJCQkJWyAiY2VudGVyIiBdLmNvbmNhdCggcG9zICkgOgoJCQkJCVsgImNlbnRlciIsICJjZW50ZXIiIF07CgkJfQoJCXBvc1sgMCBdID0gcmhvcml6b250YWwudGVzdCggcG9zWyAwIF0gKSA/IHBvc1sgMCBdIDogImNlbnRlciI7CgkJcG9zWyAxIF0gPSBydmVydGljYWwudGVzdCggcG9zWyAxIF0gKSA/IHBvc1sgMSBdIDogImNlbnRlciI7CgoJCS8vIGNhbGN1bGF0ZSBvZmZzZXRzCgkJaG9yaXpvbnRhbE9mZnNldCA9IHJvZmZzZXQuZXhlYyggcG9zWyAwIF0gKTsKCQl2ZXJ0aWNhbE9mZnNldCA9IHJvZmZzZXQuZXhlYyggcG9zWyAxIF0gKTsKCQlvZmZzZXRzWyB0aGlzIF0gPSBbCgkJCWhvcml6b250YWxPZmZzZXQgPyBob3Jpem9udGFsT2Zmc2V0WyAwIF0gOiAwLAoJCQl2ZXJ0aWNhbE9mZnNldCA/IHZlcnRpY2FsT2Zmc2V0WyAwIF0gOiAwCgkJXTsKCgkJLy8gcmVkdWNlIHRvIGp1c3QgdGhlIHBvc2l0aW9ucyB3aXRob3V0IHRoZSBvZmZzZXRzCgkJb3B0aW9uc1sgdGhpcyBdID0gWwoJCQlycG9zaXRpb24uZXhlYyggcG9zWyAwIF0gKVsgMCBdLAoJCQlycG9zaXRpb24uZXhlYyggcG9zWyAxIF0gKVsgMCBdCgkJXTsKCX0pOwoKCS8vIG5vcm1hbGl6ZSBjb2xsaXNpb24gb3B0aW9uCglpZiAoIGNvbGxpc2lvbi5sZW5ndGggPT09IDEgKSB7CgkJY29sbGlzaW9uWyAxIF0gPSBjb2xsaXNpb25bIDAgXTsKCX0KCglpZiAoIG9wdGlvbnMuYXRbIDAgXSA9PT0gInJpZ2h0IiApIHsKCQliYXNlUG9zaXRpb24ubGVmdCArPSB0YXJnZXRXaWR0aDsKCX0gZWxzZSBpZiAoIG9wdGlvbnMuYXRbIDAgXSA9PT0gImNlbnRlciIgKSB7CgkJYmFzZVBvc2l0aW9uLmxlZnQgKz0gdGFyZ2V0V2lkdGggLyAyOwoJfQoKCWlmICggb3B0aW9ucy5hdFsgMSBdID09PSAiYm90dG9tIiApIHsKCQliYXNlUG9zaXRpb24udG9wICs9IHRhcmdldEhlaWdodDsKCX0gZWxzZSBpZiAoIG9wdGlvbnMuYXRbIDEgXSA9PT0gImNlbnRlciIgKSB7CgkJYmFzZVBvc2l0aW9uLnRvcCArPSB0YXJnZXRIZWlnaHQgLyAyOwoJfQoKCWF0T2Zmc2V0ID0gZ2V0T2Zmc2V0cyggb2Zmc2V0cy5hdCwgdGFyZ2V0V2lkdGgsIHRhcmdldEhlaWdodCApOwoJYmFzZVBvc2l0aW9uLmxlZnQgKz0gYXRPZmZzZXRbIDAgXTsKCWJhc2VQb3NpdGlvbi50b3AgKz0gYXRPZmZzZXRbIDEgXTsKCglyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewoJCXZhciBjb2xsaXNpb25Qb3NpdGlvbiwgdXNpbmcsCgkJCWVsZW0gPSAkKCB0aGlzICksCgkJCWVsZW1XaWR0aCA9IGVsZW0ub3V0ZXJXaWR0aCgpLAoJCQllbGVtSGVpZ2h0ID0gZWxlbS5vdXRlckhlaWdodCgpLAoJCQltYXJnaW5MZWZ0ID0gcGFyc2VDc3MoIHRoaXMsICJtYXJnaW5MZWZ0IiApLAoJCQltYXJnaW5Ub3AgPSBwYXJzZUNzcyggdGhpcywgIm1hcmdpblRvcCIgKSwKCQkJY29sbGlzaW9uV2lkdGggPSBlbGVtV2lkdGggKyBtYXJnaW5MZWZ0ICsgcGFyc2VDc3MoIHRoaXMsICJtYXJnaW5SaWdodCIgKSArIHNjcm9sbEluZm8ud2lkdGgsCgkJCWNvbGxpc2lvbkhlaWdodCA9IGVsZW1IZWlnaHQgKyBtYXJnaW5Ub3AgKyBwYXJzZUNzcyggdGhpcywgIm1hcmdpbkJvdHRvbSIgKSArIHNjcm9sbEluZm8uaGVpZ2h0LAoJCQlwb3NpdGlvbiA9ICQuZXh0ZW5kKCB7fSwgYmFzZVBvc2l0aW9uICksCgkJCW15T2Zmc2V0ID0gZ2V0T2Zmc2V0cyggb2Zmc2V0cy5teSwgZWxlbS5vdXRlcldpZHRoKCksIGVsZW0ub3V0ZXJIZWlnaHQoKSApOwoKCQlpZiAoIG9wdGlvbnMubXlbIDAgXSA9PT0gInJpZ2h0IiApIHsKCQkJcG9zaXRpb24ubGVmdCAtPSBlbGVtV2lkdGg7CgkJfSBlbHNlIGlmICggb3B0aW9ucy5teVsgMCBdID09PSAiY2VudGVyIiApIHsKCQkJcG9zaXRpb24ubGVmdCAtPSBlbGVtV2lkdGggLyAyOwoJCX0KCgkJaWYgKCBvcHRpb25zLm15WyAxIF0gPT09ICJib3R0b20iICkgewoJCQlwb3NpdGlvbi50b3AgLT0gZWxlbUhlaWdodDsKCQl9IGVsc2UgaWYgKCBvcHRpb25zLm15WyAxIF0gPT09ICJjZW50ZXIiICkgewoJCQlwb3NpdGlvbi50b3AgLT0gZWxlbUhlaWdodCAvIDI7CgkJfQoKCQlwb3NpdGlvbi5sZWZ0ICs9IG15T2Zmc2V0WyAwIF07CgkJcG9zaXRpb24udG9wICs9IG15T2Zmc2V0WyAxIF07CgoJCS8vIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBmcmFjdGlvbnMsIHRoZW4gcm91bmQgZm9yIGNvbnNpc3RlbnQgcmVzdWx0cwoJCWlmICggIXN1cHBvcnRzT2Zmc2V0RnJhY3Rpb25zICkgewoJCQlwb3NpdGlvbi5sZWZ0ID0gcm91bmQoIHBvc2l0aW9uLmxlZnQgKTsKCQkJcG9zaXRpb24udG9wID0gcm91bmQoIHBvc2l0aW9uLnRvcCApOwoJCX0KCgkJY29sbGlzaW9uUG9zaXRpb24gPSB7CgkJCW1hcmdpbkxlZnQ6IG1hcmdpbkxlZnQsCgkJCW1hcmdpblRvcDogbWFyZ2luVG9wCgkJfTsKCgkJJC5lYWNoKCBbICJsZWZ0IiwgInRvcCIgXSwgZnVuY3Rpb24oIGksIGRpciApIHsKCQkJaWYgKCAkLnVpLnBvc2l0aW9uWyBjb2xsaXNpb25bIGkgXSBdICkgewoJCQkJJC51aS5wb3NpdGlvblsgY29sbGlzaW9uWyBpIF0gXVsgZGlyIF0oIHBvc2l0aW9uLCB7CgkJCQkJdGFyZ2V0V2lkdGg6IHRhcmdldFdpZHRoLAoJCQkJCXRhcmdldEhlaWdodDogdGFyZ2V0SGVpZ2h0LAoJCQkJCWVsZW1XaWR0aDogZWxlbVdpZHRoLAoJCQkJCWVsZW1IZWlnaHQ6IGVsZW1IZWlnaHQsCgkJCQkJY29sbGlzaW9uUG9zaXRpb246IGNvbGxpc2lvblBvc2l0aW9uLAoJCQkJCWNvbGxpc2lvbldpZHRoOiBjb2xsaXNpb25XaWR0aCwKCQkJCQljb2xsaXNpb25IZWlnaHQ6IGNvbGxpc2lvbkhlaWdodCwKCQkJCQlvZmZzZXQ6IFsgYXRPZmZzZXRbIDAgXSArIG15T2Zmc2V0WyAwIF0sIGF0T2Zmc2V0IFsgMSBdICsgbXlPZmZzZXRbIDEgXSBdLAoJCQkJCW15OiBvcHRpb25zLm15LAoJCQkJCWF0OiBvcHRpb25zLmF0LAoJCQkJCXdpdGhpbjogd2l0aGluLAoJCQkJCWVsZW06IGVsZW0KCQkJCX0pOwoJCQl9CgkJfSk7CgoJCWlmICggb3B0aW9ucy51c2luZyApIHsKCQkJLy8gYWRkcyBmZWVkYmFjayBhcyBzZWNvbmQgYXJndW1lbnQgdG8gdXNpbmcgY2FsbGJhY2ssIGlmIHByZXNlbnQKCQkJdXNpbmcgPSBmdW5jdGlvbiggcHJvcHMgKSB7CgkJCQl2YXIgbGVmdCA9IHRhcmdldE9mZnNldC5sZWZ0IC0gcG9zaXRpb24ubGVmdCwKCQkJCQlyaWdodCA9IGxlZnQgKyB0YXJnZXRXaWR0aCAtIGVsZW1XaWR0aCwKCQkJCQl0b3AgPSB0YXJnZXRPZmZzZXQudG9wIC0gcG9zaXRpb24udG9wLAoJCQkJCWJvdHRvbSA9IHRvcCArIHRhcmdldEhlaWdodCAtIGVsZW1IZWlnaHQsCgkJCQkJZmVlZGJhY2sgPSB7CgkJCQkJCXRhcmdldDogewoJCQkJCQkJZWxlbWVudDogdGFyZ2V0LAoJCQkJCQkJbGVmdDogdGFyZ2V0T2Zmc2V0LmxlZnQsCgkJCQkJCQl0b3A6IHRhcmdldE9mZnNldC50b3AsCgkJCQkJCQl3aWR0aDogdGFyZ2V0V2lkdGgsCgkJCQkJCQloZWlnaHQ6IHRhcmdldEhlaWdodAoJCQkJCQl9LAoJCQkJCQllbGVtZW50OiB7CgkJCQkJCQllbGVtZW50OiBlbGVtLAoJCQkJCQkJbGVmdDogcG9zaXRpb24ubGVmdCwKCQkJCQkJCXRvcDogcG9zaXRpb24udG9wLAoJCQkJCQkJd2lkdGg6IGVsZW1XaWR0aCwKCQkJCQkJCWhlaWdodDogZWxlbUhlaWdodAoJCQkJCQl9LAoJCQkJCQlob3Jpem9udGFsOiByaWdodCA8IDAgPyAibGVmdCIgOiBsZWZ0ID4gMCA/ICJyaWdodCIgOiAiY2VudGVyIiwKCQkJCQkJdmVydGljYWw6IGJvdHRvbSA8IDAgPyAidG9wIiA6IHRvcCA+IDAgPyAiYm90dG9tIiA6ICJtaWRkbGUiCgkJCQkJfTsKCQkJCWlmICggdGFyZ2V0V2lkdGggPCBlbGVtV2lkdGggJiYgYWJzKCBsZWZ0ICsgcmlnaHQgKSA8IHRhcmdldFdpZHRoICkgewoJCQkJCWZlZWRiYWNrLmhvcml6b250YWwgPSAiY2VudGVyIjsKCQkJCX0KCQkJCWlmICggdGFyZ2V0SGVpZ2h0IDwgZWxlbUhlaWdodCAmJiBhYnMoIHRvcCArIGJvdHRvbSApIDwgdGFyZ2V0SGVpZ2h0ICkgewoJCQkJCWZlZWRiYWNrLnZlcnRpY2FsID0gIm1pZGRsZSI7CgkJCQl9CgkJCQlpZiAoIG1heCggYWJzKCBsZWZ0ICksIGFicyggcmlnaHQgKSApID4gbWF4KCBhYnMoIHRvcCApLCBhYnMoIGJvdHRvbSApICkgKSB7CgkJCQkJZmVlZGJhY2suaW1wb3J0YW50ID0gImhvcml6b250YWwiOwoJCQkJfSBlbHNlIHsKCQkJCQlmZWVkYmFjay5pbXBvcnRhbnQgPSAidmVydGljYWwiOwoJCQkJfQoJCQkJb3B0aW9ucy51c2luZy5jYWxsKCB0aGlzLCBwcm9wcywgZmVlZGJhY2sgKTsKCQkJfTsKCQl9CgoJCWVsZW0ub2Zmc2V0KCAkLmV4dGVuZCggcG9zaXRpb24sIHsgdXNpbmc6IHVzaW5nIH0gKSApOwoJfSk7Cn07CgokLnVpLnBvc2l0aW9uID0gewoJZml0OiB7CgkJbGVmdDogZnVuY3Rpb24oIHBvc2l0aW9uLCBkYXRhICkgewoJCQl2YXIgd2l0aGluID0gZGF0YS53aXRoaW4sCgkJCQl3aXRoaW5PZmZzZXQgPSB3aXRoaW4uaXNXaW5kb3cgPyB3aXRoaW4uc2Nyb2xsTGVmdCA6IHdpdGhpbi5vZmZzZXQubGVmdCwKCQkJCW91dGVyV2lkdGggPSB3aXRoaW4ud2lkdGgsCgkJCQljb2xsaXNpb25Qb3NMZWZ0ID0gcG9zaXRpb24ubGVmdCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCwKCQkJCW92ZXJMZWZ0ID0gd2l0aGluT2Zmc2V0IC0gY29sbGlzaW9uUG9zTGVmdCwKCQkJCW92ZXJSaWdodCA9IGNvbGxpc2lvblBvc0xlZnQgKyBkYXRhLmNvbGxpc2lvbldpZHRoIC0gb3V0ZXJXaWR0aCAtIHdpdGhpbk9mZnNldCwKCQkJCW5ld092ZXJSaWdodDsKCgkJCS8vIGVsZW1lbnQgaXMgd2lkZXIgdGhhbiB3aXRoaW4KCQkJaWYgKCBkYXRhLmNvbGxpc2lvbldpZHRoID4gb3V0ZXJXaWR0aCApIHsKCQkJCS8vIGVsZW1lbnQgaXMgaW5pdGlhbGx5IG92ZXIgdGhlIGxlZnQgc2lkZSBvZiB3aXRoaW4KCQkJCWlmICggb3ZlckxlZnQgPiAwICYmIG92ZXJSaWdodCA8PSAwICkgewoJCQkJCW5ld092ZXJSaWdodCA9IHBvc2l0aW9uLmxlZnQgKyBvdmVyTGVmdCArIGRhdGEuY29sbGlzaW9uV2lkdGggLSBvdXRlcldpZHRoIC0gd2l0aGluT2Zmc2V0OwoJCQkJCXBvc2l0aW9uLmxlZnQgKz0gb3ZlckxlZnQgLSBuZXdPdmVyUmlnaHQ7CgkJCQkvLyBlbGVtZW50IGlzIGluaXRpYWxseSBvdmVyIHJpZ2h0IHNpZGUgb2Ygd2l0aGluCgkJCQl9IGVsc2UgaWYgKCBvdmVyUmlnaHQgPiAwICYmIG92ZXJMZWZ0IDw9IDAgKSB7CgkJCQkJcG9zaXRpb24ubGVmdCA9IHdpdGhpbk9mZnNldDsKCQkJCS8vIGVsZW1lbnQgaXMgaW5pdGlhbGx5IG92ZXIgYm90aCBsZWZ0IGFuZCByaWdodCBzaWRlcyBvZiB3aXRoaW4KCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCBvdmVyTGVmdCA+IG92ZXJSaWdodCApIHsKCQkJCQkJcG9zaXRpb24ubGVmdCA9IHdpdGhpbk9mZnNldCArIG91dGVyV2lkdGggLSBkYXRhLmNvbGxpc2lvbldpZHRoOwoJCQkJCX0gZWxzZSB7CgkJCQkJCXBvc2l0aW9uLmxlZnQgPSB3aXRoaW5PZmZzZXQ7CgkJCQkJfQoJCQkJfQoJCQkvLyB0b28gZmFyIGxlZnQgLT4gYWxpZ24gd2l0aCBsZWZ0IGVkZ2UKCQkJfSBlbHNlIGlmICggb3ZlckxlZnQgPiAwICkgewoJCQkJcG9zaXRpb24ubGVmdCArPSBvdmVyTGVmdDsKCQkJLy8gdG9vIGZhciByaWdodCAtPiBhbGlnbiB3aXRoIHJpZ2h0IGVkZ2UKCQkJfSBlbHNlIGlmICggb3ZlclJpZ2h0ID4gMCApIHsKCQkJCXBvc2l0aW9uLmxlZnQgLT0gb3ZlclJpZ2h0OwoJCQkvLyBhZGp1c3QgYmFzZWQgb24gcG9zaXRpb24gYW5kIG1hcmdpbgoJCQl9IGVsc2UgewoJCQkJcG9zaXRpb24ubGVmdCA9IG1heCggcG9zaXRpb24ubGVmdCAtIGNvbGxpc2lvblBvc0xlZnQsIHBvc2l0aW9uLmxlZnQgKTsKCQkJfQoJCX0sCgkJdG9wOiBmdW5jdGlvbiggcG9zaXRpb24sIGRhdGEgKSB7CgkJCXZhciB3aXRoaW4gPSBkYXRhLndpdGhpbiwKCQkJCXdpdGhpbk9mZnNldCA9IHdpdGhpbi5pc1dpbmRvdyA/IHdpdGhpbi5zY3JvbGxUb3AgOiB3aXRoaW4ub2Zmc2V0LnRvcCwKCQkJCW91dGVySGVpZ2h0ID0gZGF0YS53aXRoaW4uaGVpZ2h0LAoJCQkJY29sbGlzaW9uUG9zVG9wID0gcG9zaXRpb24udG9wIC0gZGF0YS5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsCgkJCQlvdmVyVG9wID0gd2l0aGluT2Zmc2V0IC0gY29sbGlzaW9uUG9zVG9wLAoJCQkJb3ZlckJvdHRvbSA9IGNvbGxpc2lvblBvc1RvcCArIGRhdGEuY29sbGlzaW9uSGVpZ2h0IC0gb3V0ZXJIZWlnaHQgLSB3aXRoaW5PZmZzZXQsCgkJCQluZXdPdmVyQm90dG9tOwoKCQkJLy8gZWxlbWVudCBpcyB0YWxsZXIgdGhhbiB3aXRoaW4KCQkJaWYgKCBkYXRhLmNvbGxpc2lvbkhlaWdodCA+IG91dGVySGVpZ2h0ICkgewoJCQkJLy8gZWxlbWVudCBpcyBpbml0aWFsbHkgb3ZlciB0aGUgdG9wIG9mIHdpdGhpbgoJCQkJaWYgKCBvdmVyVG9wID4gMCAmJiBvdmVyQm90dG9tIDw9IDAgKSB7CgkJCQkJbmV3T3ZlckJvdHRvbSA9IHBvc2l0aW9uLnRvcCArIG92ZXJUb3AgKyBkYXRhLmNvbGxpc2lvbkhlaWdodCAtIG91dGVySGVpZ2h0IC0gd2l0aGluT2Zmc2V0OwoJCQkJCXBvc2l0aW9uLnRvcCArPSBvdmVyVG9wIC0gbmV3T3ZlckJvdHRvbTsKCQkJCS8vIGVsZW1lbnQgaXMgaW5pdGlhbGx5IG92ZXIgYm90dG9tIG9mIHdpdGhpbgoJCQkJfSBlbHNlIGlmICggb3ZlckJvdHRvbSA+IDAgJiYgb3ZlclRvcCA8PSAwICkgewoJCQkJCXBvc2l0aW9uLnRvcCA9IHdpdGhpbk9mZnNldDsKCQkJCS8vIGVsZW1lbnQgaXMgaW5pdGlhbGx5IG92ZXIgYm90aCB0b3AgYW5kIGJvdHRvbSBvZiB3aXRoaW4KCQkJCX0gZWxzZSB7CgkJCQkJaWYgKCBvdmVyVG9wID4gb3ZlckJvdHRvbSApIHsKCQkJCQkJcG9zaXRpb24udG9wID0gd2l0aGluT2Zmc2V0ICsgb3V0ZXJIZWlnaHQgLSBkYXRhLmNvbGxpc2lvbkhlaWdodDsKCQkJCQl9IGVsc2UgewoJCQkJCQlwb3NpdGlvbi50b3AgPSB3aXRoaW5PZmZzZXQ7CgkJCQkJfQoJCQkJfQoJCQkvLyB0b28gZmFyIHVwIC0+IGFsaWduIHdpdGggdG9wCgkJCX0gZWxzZSBpZiAoIG92ZXJUb3AgPiAwICkgewoJCQkJcG9zaXRpb24udG9wICs9IG92ZXJUb3A7CgkJCS8vIHRvbyBmYXIgZG93biAtPiBhbGlnbiB3aXRoIGJvdHRvbSBlZGdlCgkJCX0gZWxzZSBpZiAoIG92ZXJCb3R0b20gPiAwICkgewoJCQkJcG9zaXRpb24udG9wIC09IG92ZXJCb3R0b207CgkJCS8vIGFkanVzdCBiYXNlZCBvbiBwb3NpdGlvbiBhbmQgbWFyZ2luCgkJCX0gZWxzZSB7CgkJCQlwb3NpdGlvbi50b3AgPSBtYXgoIHBvc2l0aW9uLnRvcCAtIGNvbGxpc2lvblBvc1RvcCwgcG9zaXRpb24udG9wICk7CgkJCX0KCQl9Cgl9LAoJZmxpcDogewoJCWxlZnQ6IGZ1bmN0aW9uKCBwb3NpdGlvbiwgZGF0YSApIHsKCQkJdmFyIHdpdGhpbiA9IGRhdGEud2l0aGluLAoJCQkJd2l0aGluT2Zmc2V0ID0gd2l0aGluLm9mZnNldC5sZWZ0ICsgd2l0aGluLnNjcm9sbExlZnQsCgkJCQlvdXRlcldpZHRoID0gd2l0aGluLndpZHRoLAoJCQkJb2Zmc2V0TGVmdCA9IHdpdGhpbi5pc1dpbmRvdyA/IHdpdGhpbi5zY3JvbGxMZWZ0IDogd2l0aGluLm9mZnNldC5sZWZ0LAoJCQkJY29sbGlzaW9uUG9zTGVmdCA9IHBvc2l0aW9uLmxlZnQgLSBkYXRhLmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQsCgkJCQlvdmVyTGVmdCA9IGNvbGxpc2lvblBvc0xlZnQgLSBvZmZzZXRMZWZ0LAoJCQkJb3ZlclJpZ2h0ID0gY29sbGlzaW9uUG9zTGVmdCArIGRhdGEuY29sbGlzaW9uV2lkdGggLSBvdXRlcldpZHRoIC0gb2Zmc2V0TGVmdCwKCQkJCW15T2Zmc2V0ID0gZGF0YS5teVsgMCBdID09PSAibGVmdCIgPwoJCQkJCS1kYXRhLmVsZW1XaWR0aCA6CgkJCQkJZGF0YS5teVsgMCBdID09PSAicmlnaHQiID8KCQkJCQkJZGF0YS5lbGVtV2lkdGggOgoJCQkJCQkwLAoJCQkJYXRPZmZzZXQgPSBkYXRhLmF0WyAwIF0gPT09ICJsZWZ0IiA/CgkJCQkJZGF0YS50YXJnZXRXaWR0aCA6CgkJCQkJZGF0YS5hdFsgMCBdID09PSAicmlnaHQiID8KCQkJCQkJLWRhdGEudGFyZ2V0V2lkdGggOgoJCQkJCQkwLAoJCQkJb2Zmc2V0ID0gLTIgKiBkYXRhLm9mZnNldFsgMCBdLAoJCQkJbmV3T3ZlclJpZ2h0LAoJCQkJbmV3T3ZlckxlZnQ7CgoJCQlpZiAoIG92ZXJMZWZ0IDwgMCApIHsKCQkJCW5ld092ZXJSaWdodCA9IHBvc2l0aW9uLmxlZnQgKyBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0ICsgZGF0YS5jb2xsaXNpb25XaWR0aCAtIG91dGVyV2lkdGggLSB3aXRoaW5PZmZzZXQ7CgkJCQlpZiAoIG5ld092ZXJSaWdodCA8IDAgfHwgbmV3T3ZlclJpZ2h0IDwgYWJzKCBvdmVyTGVmdCApICkgewoJCQkJCXBvc2l0aW9uLmxlZnQgKz0gbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJCX0KCQkJfSBlbHNlIGlmICggb3ZlclJpZ2h0ID4gMCApIHsKCQkJCW5ld092ZXJMZWZ0ID0gcG9zaXRpb24ubGVmdCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luTGVmdCArIG15T2Zmc2V0ICsgYXRPZmZzZXQgKyBvZmZzZXQgLSBvZmZzZXRMZWZ0OwoJCQkJaWYgKCBuZXdPdmVyTGVmdCA+IDAgfHwgYWJzKCBuZXdPdmVyTGVmdCApIDwgb3ZlclJpZ2h0ICkgewoJCQkJCXBvc2l0aW9uLmxlZnQgKz0gbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJCX0KCQkJfQoJCX0sCgkJdG9wOiBmdW5jdGlvbiggcG9zaXRpb24sIGRhdGEgKSB7CgkJCXZhciB3aXRoaW4gPSBkYXRhLndpdGhpbiwKCQkJCXdpdGhpbk9mZnNldCA9IHdpdGhpbi5vZmZzZXQudG9wICsgd2l0aGluLnNjcm9sbFRvcCwKCQkJCW91dGVySGVpZ2h0ID0gd2l0aGluLmhlaWdodCwKCQkJCW9mZnNldFRvcCA9IHdpdGhpbi5pc1dpbmRvdyA/IHdpdGhpbi5zY3JvbGxUb3AgOiB3aXRoaW4ub2Zmc2V0LnRvcCwKCQkJCWNvbGxpc2lvblBvc1RvcCA9IHBvc2l0aW9uLnRvcCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wLAoJCQkJb3ZlclRvcCA9IGNvbGxpc2lvblBvc1RvcCAtIG9mZnNldFRvcCwKCQkJCW92ZXJCb3R0b20gPSBjb2xsaXNpb25Qb3NUb3AgKyBkYXRhLmNvbGxpc2lvbkhlaWdodCAtIG91dGVySGVpZ2h0IC0gb2Zmc2V0VG9wLAoJCQkJdG9wID0gZGF0YS5teVsgMSBdID09PSAidG9wIiwKCQkJCW15T2Zmc2V0ID0gdG9wID8KCQkJCQktZGF0YS5lbGVtSGVpZ2h0IDoKCQkJCQlkYXRhLm15WyAxIF0gPT09ICJib3R0b20iID8KCQkJCQkJZGF0YS5lbGVtSGVpZ2h0IDoKCQkJCQkJMCwKCQkJCWF0T2Zmc2V0ID0gZGF0YS5hdFsgMSBdID09PSAidG9wIiA/CgkJCQkJZGF0YS50YXJnZXRIZWlnaHQgOgoJCQkJCWRhdGEuYXRbIDEgXSA9PT0gImJvdHRvbSIgPwoJCQkJCQktZGF0YS50YXJnZXRIZWlnaHQgOgoJCQkJCQkwLAoJCQkJb2Zmc2V0ID0gLTIgKiBkYXRhLm9mZnNldFsgMSBdLAoJCQkJbmV3T3ZlclRvcCwKCQkJCW5ld092ZXJCb3R0b207CgkJCWlmICggb3ZlclRvcCA8IDAgKSB7CgkJCQluZXdPdmVyQm90dG9tID0gcG9zaXRpb24udG9wICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldCArIGRhdGEuY29sbGlzaW9uSGVpZ2h0IC0gb3V0ZXJIZWlnaHQgLSB3aXRoaW5PZmZzZXQ7CgkJCQlpZiAoICggcG9zaXRpb24udG9wICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldCkgPiBvdmVyVG9wICYmICggbmV3T3ZlckJvdHRvbSA8IDAgfHwgbmV3T3ZlckJvdHRvbSA8IGFicyggb3ZlclRvcCApICkgKSB7CgkJCQkJcG9zaXRpb24udG9wICs9IG15T2Zmc2V0ICsgYXRPZmZzZXQgKyBvZmZzZXQ7CgkJCQl9CgkJCX0gZWxzZSBpZiAoIG92ZXJCb3R0b20gPiAwICkgewoJCQkJbmV3T3ZlclRvcCA9IHBvc2l0aW9uLnRvcCAtIGRhdGEuY29sbGlzaW9uUG9zaXRpb24ubWFyZ2luVG9wICsgbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldCAtIG9mZnNldFRvcDsKCQkJCWlmICggKCBwb3NpdGlvbi50b3AgKyBteU9mZnNldCArIGF0T2Zmc2V0ICsgb2Zmc2V0KSA+IG92ZXJCb3R0b20gJiYgKCBuZXdPdmVyVG9wID4gMCB8fCBhYnMoIG5ld092ZXJUb3AgKSA8IG92ZXJCb3R0b20gKSApIHsKCQkJCQlwb3NpdGlvbi50b3AgKz0gbXlPZmZzZXQgKyBhdE9mZnNldCArIG9mZnNldDsKCQkJCX0KCQkJfQoJCX0KCX0sCglmbGlwZml0OiB7CgkJbGVmdDogZnVuY3Rpb24oKSB7CgkJCSQudWkucG9zaXRpb24uZmxpcC5sZWZ0LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJJC51aS5wb3NpdGlvbi5maXQubGVmdC5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJfSwKCQl0b3A6IGZ1bmN0aW9uKCkgewoJCQkkLnVpLnBvc2l0aW9uLmZsaXAudG9wLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJJC51aS5wb3NpdGlvbi5maXQudG9wLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl9Cgl9Cn07CgovLyBmcmFjdGlvbiBzdXBwb3J0IHRlc3QKKGZ1bmN0aW9uKCkgewoJdmFyIHRlc3RFbGVtZW50LCB0ZXN0RWxlbWVudFBhcmVudCwgdGVzdEVsZW1lbnRTdHlsZSwgb2Zmc2V0TGVmdCwgaSwKCQlib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoICJib2R5IiApWyAwIF0sCgkJZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggImRpdiIgKTsKCgkvL0NyZWF0ZSBhICJmYWtlIGJvZHkiIGZvciB0ZXN0aW5nIGJhc2VkIG9uIG1ldGhvZCB1c2VkIGluIGpRdWVyeS5zdXBwb3J0Cgl0ZXN0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIGJvZHkgPyAiZGl2IiA6ICJib2R5IiApOwoJdGVzdEVsZW1lbnRTdHlsZSA9IHsKCQl2aXNpYmlsaXR5OiAiaGlkZGVuIiwKCQl3aWR0aDogMCwKCQloZWlnaHQ6IDAsCgkJYm9yZGVyOiAwLAoJCW1hcmdpbjogMCwKCQliYWNrZ3JvdW5kOiAibm9uZSIKCX07CglpZiAoIGJvZHkgKSB7CgkJJC5leHRlbmQoIHRlc3RFbGVtZW50U3R5bGUsIHsKCQkJcG9zaXRpb246ICJhYnNvbHV0ZSIsCgkJCWxlZnQ6ICItMTAwMHB4IiwKCQkJdG9wOiAiLTEwMDBweCIKCQl9KTsKCX0KCWZvciAoIGkgaW4gdGVzdEVsZW1lbnRTdHlsZSApIHsKCQl0ZXN0RWxlbWVudC5zdHlsZVsgaSBdID0gdGVzdEVsZW1lbnRTdHlsZVsgaSBdOwoJfQoJdGVzdEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGRpdiApOwoJdGVzdEVsZW1lbnRQYXJlbnQgPSBib2R5IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCXRlc3RFbGVtZW50UGFyZW50Lmluc2VydEJlZm9yZSggdGVzdEVsZW1lbnQsIHRlc3RFbGVtZW50UGFyZW50LmZpcnN0Q2hpbGQgKTsKCglkaXYuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDEwLjc0MzIyMjJweDsiOwoKCW9mZnNldExlZnQgPSAkKCBkaXYgKS5vZmZzZXQoKS5sZWZ0OwoJc3VwcG9ydHNPZmZzZXRGcmFjdGlvbnMgPSBvZmZzZXRMZWZ0ID4gMTAgJiYgb2Zmc2V0TGVmdCA8IDExOwoKCXRlc3RFbGVtZW50LmlubmVySFRNTCA9ICIiOwoJdGVzdEVsZW1lbnRQYXJlbnQucmVtb3ZlQ2hpbGQoIHRlc3RFbGVtZW50ICk7Cn0pKCk7Cgp9KSgpOwoKdmFyIHBvc2l0aW9uID0gJC51aS5wb3NpdGlvbjsKCgovKiEKICogalF1ZXJ5IFVJIERyYWdnYWJsZSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9kcmFnZ2FibGUvCiAqLwoKCiQud2lkZ2V0KCJ1aS5kcmFnZ2FibGUiLCAkLnVpLm1vdXNlLCB7Cgl2ZXJzaW9uOiAiMS4xMS4wIiwKCXdpZGdldEV2ZW50UHJlZml4OiAiZHJhZyIsCglvcHRpb25zOiB7CgkJYWRkQ2xhc3NlczogdHJ1ZSwKCQlhcHBlbmRUbzogInBhcmVudCIsCgkJYXhpczogZmFsc2UsCgkJY29ubmVjdFRvU29ydGFibGU6IGZhbHNlLAoJCWNvbnRhaW5tZW50OiBmYWxzZSwKCQljdXJzb3I6ICJhdXRvIiwKCQljdXJzb3JBdDogZmFsc2UsCgkJZ3JpZDogZmFsc2UsCgkJaGFuZGxlOiBmYWxzZSwKCQloZWxwZXI6ICJvcmlnaW5hbCIsCgkJaWZyYW1lRml4OiBmYWxzZSwKCQlvcGFjaXR5OiBmYWxzZSwKCQlyZWZyZXNoUG9zaXRpb25zOiBmYWxzZSwKCQlyZXZlcnQ6IGZhbHNlLAoJCXJldmVydER1cmF0aW9uOiA1MDAsCgkJc2NvcGU6ICJkZWZhdWx0IiwKCQlzY3JvbGw6IHRydWUsCgkJc2Nyb2xsU2Vuc2l0aXZpdHk6IDIwLAoJCXNjcm9sbFNwZWVkOiAyMCwKCQlzbmFwOiBmYWxzZSwKCQlzbmFwTW9kZTogImJvdGgiLAoJCXNuYXBUb2xlcmFuY2U6IDIwLAoJCXN0YWNrOiBmYWxzZSwKCQl6SW5kZXg6IGZhbHNlLAoKCQkvLyBjYWxsYmFja3MKCQlkcmFnOiBudWxsLAoJCXN0YXJ0OiBudWxsLAoJCXN0b3A6IG51bGwKCX0sCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCgkJaWYgKHRoaXMub3B0aW9ucy5oZWxwZXIgPT09ICJvcmlnaW5hbCIgJiYgISgvXig/OnJ8YXxmKS8pLnRlc3QodGhpcy5lbGVtZW50LmNzcygicG9zaXRpb24iKSkpIHsKCQkJdGhpcy5lbGVtZW50WzBdLnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKCQl9CgkJaWYgKHRoaXMub3B0aW9ucy5hZGRDbGFzc2VzKXsKCQkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUiKTsKCQl9CgkJaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCl7CgkJCXRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWRpc2FibGVkIik7CgkJfQoJCXRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpOwoKCQl0aGlzLl9tb3VzZUluaXQoKTsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCQlpZiAoIGtleSA9PT0gImhhbmRsZSIgKSB7CgkJCXRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpOwoJCX0KCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCWlmICggKCB0aGlzLmhlbHBlciB8fCB0aGlzLmVsZW1lbnQgKS5pcyggIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciICkgKSB7CgkJCXRoaXMuZGVzdHJveU9uQ2xlYXIgPSB0cnVlOwoJCQlyZXR1cm47CgkJfQoJCXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyggInVpLWRyYWdnYWJsZSB1aS1kcmFnZ2FibGUtZHJhZ2dpbmcgdWktZHJhZ2dhYmxlLWRpc2FibGVkIiApOwoJCXRoaXMuX3JlbW92ZUhhbmRsZUNsYXNzTmFtZSgpOwoJCXRoaXMuX21vdXNlRGVzdHJveSgpOwoJfSwKCglfbW91c2VDYXB0dXJlOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50WyAwIF0sCgkJCW8gPSB0aGlzLm9wdGlvbnM7CgoJCS8vIHN1cHBvcnQ6IElFOQoJCS8vIElFOSB0aHJvd3MgYW4gIlVuc3BlY2lmaWVkIGVycm9yIiBhY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBmcm9tIGFuIDxpZnJhbWU+CgkJdHJ5IHsKCQkJLy8gU3VwcG9ydDogSUU5KwoJCQkvLyBJZiB0aGUgPGJvZHk+IGlzIGJsdXJyZWQsIElFIHdpbGwgc3dpdGNoIHdpbmRvd3MsIHNlZSAjOTUyMAoJCQlpZiAoIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAiYm9keSIgKSB7CgkJCQkvLyBCbHVyIGFueSBlbGVtZW50IHRoYXQgY3VycmVudGx5IGhhcyBmb2N1cywgc2VlICM0MjYxCgkJCQkkKCBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICkuYmx1cigpOwoJCQl9CgkJfSBjYXRjaCAoIGVycm9yICkge30KCgkJLy8gYW1vbmcgb3RoZXJzLCBwcmV2ZW50IGEgZHJhZyBvbiBhIHJlc2l6YWJsZS1oYW5kbGUKCQlpZiAodGhpcy5oZWxwZXIgfHwgby5kaXNhYmxlZCB8fCAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5sZW5ndGggPiAwKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCS8vUXVpdCBpZiB3ZSdyZSBub3Qgb24gYSB2YWxpZCBoYW5kbGUKCQl0aGlzLmhhbmRsZSA9IHRoaXMuX2dldEhhbmRsZShldmVudCk7CgkJaWYgKCF0aGlzLmhhbmRsZSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkkKG8uaWZyYW1lRml4ID09PSB0cnVlID8gImlmcmFtZSIgOiBvLmlmcmFtZUZpeCkuZWFjaChmdW5jdGlvbigpIHsKCQkJJCgiPGRpdiBjbGFzcz0ndWktZHJhZ2dhYmxlLWlmcmFtZUZpeCcgc3R5bGU9J2JhY2tncm91bmQ6ICNmZmY7Jz48L2Rpdj4iKQoJCQkuY3NzKHsKCQkJCXdpZHRoOiB0aGlzLm9mZnNldFdpZHRoICsgInB4IiwgaGVpZ2h0OiB0aGlzLm9mZnNldEhlaWdodCArICJweCIsCgkJCQlwb3NpdGlvbjogImFic29sdXRlIiwgb3BhY2l0eTogIjAuMDAxIiwgekluZGV4OiAxMDAwCgkJCX0pCgkJCS5jc3MoJCh0aGlzKS5vZmZzZXQoKSkKCQkJLmFwcGVuZFRvKCJib2R5Iik7CgkJfSk7CgoJCXJldHVybiB0cnVlOwoKCX0sCgoJX21vdXNlU3RhcnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zOwoKCQkvL0NyZWF0ZSBhbmQgYXBwZW5kIHRoZSB2aXNpYmxlIGhlbHBlcgoJCXRoaXMuaGVscGVyID0gdGhpcy5fY3JlYXRlSGVscGVyKGV2ZW50KTsKCgkJdGhpcy5oZWxwZXIuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpOwoKCQkvL0NhY2hlIHRoZSBoZWxwZXIgc2l6ZQoJCXRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKTsKCgkJLy9JZiBkZG1hbmFnZXIgaXMgdXNlZCBmb3IgZHJvcHBhYmxlcywgc2V0IHRoZSBnbG9iYWwgZHJhZ2dhYmxlCgkJaWYgKCQudWkuZGRtYW5hZ2VyKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmN1cnJlbnQgPSB0aGlzOwoJCX0KCgkJLyoKCQkgKiAtIFBvc2l0aW9uIGdlbmVyYXRpb24gLQoJCSAqIFRoaXMgYmxvY2sgZ2VuZXJhdGVzIGV2ZXJ5dGhpbmcgcG9zaXRpb24gcmVsYXRlZCAtIGl0J3MgdGhlIGNvcmUgb2YgZHJhZ2dhYmxlcy4KCQkgKi8KCgkJLy9DYWNoZSB0aGUgbWFyZ2lucyBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudAoJCXRoaXMuX2NhY2hlTWFyZ2lucygpOwoKCQkvL1N0b3JlIHRoZSBoZWxwZXIncyBjc3MgcG9zaXRpb24KCQl0aGlzLmNzc1Bvc2l0aW9uID0gdGhpcy5oZWxwZXIuY3NzKCAicG9zaXRpb24iICk7CgkJdGhpcy5zY3JvbGxQYXJlbnQgPSB0aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKTsKCQl0aGlzLm9mZnNldFBhcmVudCA9IHRoaXMuaGVscGVyLm9mZnNldFBhcmVudCgpOwoJCXRoaXMub2Zmc2V0UGFyZW50Q3NzUG9zaXRpb24gPSB0aGlzLm9mZnNldFBhcmVudC5jc3MoICJwb3NpdGlvbiIgKTsKCgkJLy9UaGUgZWxlbWVudCdzIGFic29sdXRlIHBvc2l0aW9uIG9uIHRoZSBwYWdlIG1pbnVzIG1hcmdpbnMKCQl0aGlzLm9mZnNldCA9IHRoaXMucG9zaXRpb25BYnMgPSB0aGlzLmVsZW1lbnQub2Zmc2V0KCk7CgkJdGhpcy5vZmZzZXQgPSB7CgkJCXRvcDogdGhpcy5vZmZzZXQudG9wIC0gdGhpcy5tYXJnaW5zLnRvcCwKCQkJbGVmdDogdGhpcy5vZmZzZXQubGVmdCAtIHRoaXMubWFyZ2lucy5sZWZ0CgkJfTsKCgkJLy9SZXNldCBzY3JvbGwgY2FjaGUKCQl0aGlzLm9mZnNldC5zY3JvbGwgPSBmYWxzZTsKCgkJJC5leHRlbmQodGhpcy5vZmZzZXQsIHsKCQkJY2xpY2s6IHsgLy9XaGVyZSB0aGUgY2xpY2sgaGFwcGVuZWQsIHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50CgkJCQlsZWZ0OiBldmVudC5wYWdlWCAtIHRoaXMub2Zmc2V0LmxlZnQsCgkJCQl0b3A6IGV2ZW50LnBhZ2VZIC0gdGhpcy5vZmZzZXQudG9wCgkJCX0sCgkJCXBhcmVudDogdGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCksCgkJCXJlbGF0aXZlOiB0aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpIC8vVGhpcyBpcyBhIHJlbGF0aXZlIHRvIGFic29sdXRlIHBvc2l0aW9uIG1pbnVzIHRoZSBhY3R1YWwgcG9zaXRpb24gY2FsY3VsYXRpb24gLSBvbmx5IHVzZWQgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgaGVscGVyCgkJfSk7CgoJCS8vR2VuZXJhdGUgdGhlIG9yaWdpbmFsIHBvc2l0aW9uCgkJdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbiA9IHRoaXMuX2dlbmVyYXRlUG9zaXRpb24oIGV2ZW50LCBmYWxzZSApOwoJCXRoaXMub3JpZ2luYWxQYWdlWCA9IGV2ZW50LnBhZ2VYOwoJCXRoaXMub3JpZ2luYWxQYWdlWSA9IGV2ZW50LnBhZ2VZOwoKCQkvL0FkanVzdCB0aGUgbW91c2Ugb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBoZWxwZXIgaWYgImN1cnNvckF0IiBpcyBzdXBwbGllZAoJCShvLmN1cnNvckF0ICYmIHRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoby5jdXJzb3JBdCkpOwoKCQkvL1NldCBhIGNvbnRhaW5tZW50IGlmIGdpdmVuIGluIHRoZSBvcHRpb25zCgkJdGhpcy5fc2V0Q29udGFpbm1lbnQoKTsKCgkJLy9UcmlnZ2VyIGV2ZW50ICsgY2FsbGJhY2tzCgkJaWYgKHRoaXMuX3RyaWdnZXIoInN0YXJ0IiwgZXZlbnQpID09PSBmYWxzZSkgewoJCQl0aGlzLl9jbGVhcigpOwoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvL1JlY2FjaGUgdGhlIGhlbHBlciBzaXplCgkJdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpOwoKCQkvL1ByZXBhcmUgdGhlIGRyb3BwYWJsZSBvZmZzZXRzCgkJaWYgKCQudWkuZGRtYW5hZ2VyICYmICFvLmRyb3BCZWhhdmlvdXIpIHsKCQkJJC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcywgZXZlbnQpOwoJCX0KCgkJdGhpcy5fbW91c2VEcmFnKGV2ZW50LCB0cnVlKTsgLy9FeGVjdXRlIHRoZSBkcmFnIG9uY2UgLSB0aGlzIGNhdXNlcyB0aGUgaGVscGVyIG5vdCB0byBiZSB2aXNpYmxlIGJlZm9yZSBnZXR0aW5nIGl0cyBjb3JyZWN0IHBvc2l0aW9uCgoJCS8vSWYgdGhlIGRkbWFuYWdlciBpcyB1c2VkIGZvciBkcm9wcGFibGVzLCBpbmZvcm0gdGhlIG1hbmFnZXIgdGhhdCBkcmFnZ2luZyBoYXMgc3RhcnRlZCAoc2VlICM1MDAzKQoJCWlmICggJC51aS5kZG1hbmFnZXIgKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmRyYWdTdGFydCh0aGlzLCBldmVudCk7CgkJfQoKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJX21vdXNlRHJhZzogZnVuY3Rpb24oZXZlbnQsIG5vUHJvcGFnYXRpb24pIHsKCQkvLyByZXNldCBhbnkgbmVjZXNzYXJ5IGNhY2hlZCBwcm9wZXJ0aWVzIChzZWUgIzUwMDkpCgkJaWYgKCB0aGlzLm9mZnNldFBhcmVudENzc1Bvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQl0aGlzLm9mZnNldC5wYXJlbnQgPSB0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKTsKCQl9CgoJCS8vQ29tcHV0ZSB0aGUgaGVscGVycyBwb3NpdGlvbgoJCXRoaXMucG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKCBldmVudCwgdHJ1ZSApOwoJCXRoaXMucG9zaXRpb25BYnMgPSB0aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKTsKCgkJLy9DYWxsIHBsdWdpbnMgYW5kIGNhbGxiYWNrcyBhbmQgdXNlIHRoZSByZXN1bHRpbmcgcG9zaXRpb24gaWYgc29tZXRoaW5nIGlzIHJldHVybmVkCgkJaWYgKCFub1Byb3BhZ2F0aW9uKSB7CgkJCXZhciB1aSA9IHRoaXMuX3VpSGFzaCgpOwoJCQlpZiAodGhpcy5fdHJpZ2dlcigiZHJhZyIsIGV2ZW50LCB1aSkgPT09IGZhbHNlKSB7CgkJCQl0aGlzLl9tb3VzZVVwKHt9KTsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl0aGlzLnBvc2l0aW9uID0gdWkucG9zaXRpb247CgkJfQoKCQl0aGlzLmhlbHBlclsgMCBdLnN0eWxlLmxlZnQgPSB0aGlzLnBvc2l0aW9uLmxlZnQgKyAicHgiOwoJCXRoaXMuaGVscGVyWyAwIF0uc3R5bGUudG9wID0gdGhpcy5wb3NpdGlvbi50b3AgKyAicHgiOwoKCQlpZiAoJC51aS5kZG1hbmFnZXIpIHsKCQkJJC51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLCBldmVudCk7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZVN0b3A6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCS8vSWYgd2UgYXJlIHVzaW5nIGRyb3BwYWJsZXMsIGluZm9ybSB0aGUgbWFuYWdlciBhYm91dCB0aGUgZHJvcAoJCXZhciB0aGF0ID0gdGhpcywKCQkJZHJvcHBlZCA9IGZhbHNlOwoJCWlmICgkLnVpLmRkbWFuYWdlciAmJiAhdGhpcy5vcHRpb25zLmRyb3BCZWhhdmlvdXIpIHsKCQkJZHJvcHBlZCA9ICQudWkuZGRtYW5hZ2VyLmRyb3AodGhpcywgZXZlbnQpOwoJCX0KCgkJLy9pZiBhIGRyb3AgY29tZXMgZnJvbSBvdXRzaWRlIChhIHNvcnRhYmxlKQoJCWlmICh0aGlzLmRyb3BwZWQpIHsKCQkJZHJvcHBlZCA9IHRoaXMuZHJvcHBlZDsKCQkJdGhpcy5kcm9wcGVkID0gZmFsc2U7CgkJfQoKCQlpZiAoKHRoaXMub3B0aW9ucy5yZXZlcnQgPT09ICJpbnZhbGlkIiAmJiAhZHJvcHBlZCkgfHwgKHRoaXMub3B0aW9ucy5yZXZlcnQgPT09ICJ2YWxpZCIgJiYgZHJvcHBlZCkgfHwgdGhpcy5vcHRpb25zLnJldmVydCA9PT0gdHJ1ZSB8fCAoJC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5yZXZlcnQpICYmIHRoaXMub3B0aW9ucy5yZXZlcnQuY2FsbCh0aGlzLmVsZW1lbnQsIGRyb3BwZWQpKSkgewoJCQkkKHRoaXMuaGVscGVyKS5hbmltYXRlKHRoaXMub3JpZ2luYWxQb3NpdGlvbiwgcGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uLCAxMCksIGZ1bmN0aW9uKCkgewoJCQkJaWYgKHRoYXQuX3RyaWdnZXIoInN0b3AiLCBldmVudCkgIT09IGZhbHNlKSB7CgkJCQkJdGhhdC5fY2xlYXIoKTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIHsKCQkJaWYgKHRoaXMuX3RyaWdnZXIoInN0b3AiLCBldmVudCkgIT09IGZhbHNlKSB7CgkJCQl0aGlzLl9jbGVhcigpOwoJCQl9CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZVVwOiBmdW5jdGlvbihldmVudCkgewoJCS8vUmVtb3ZlIGZyYW1lIGhlbHBlcnMKCQkkKCJkaXYudWktZHJhZ2dhYmxlLWlmcmFtZUZpeCIpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKTsKCQl9KTsKCgkJLy9JZiB0aGUgZGRtYW5hZ2VyIGlzIHVzZWQgZm9yIGRyb3BwYWJsZXMsIGluZm9ybSB0aGUgbWFuYWdlciB0aGF0IGRyYWdnaW5nIGhhcyBzdG9wcGVkIChzZWUgIzUwMDMpCgkJaWYgKCAkLnVpLmRkbWFuYWdlciApIHsKCQkJJC51aS5kZG1hbmFnZXIuZHJhZ1N0b3AodGhpcywgZXZlbnQpOwoJCX0KCgkJLy8gVGhlIGludGVyYWN0aW9uIGlzIG92ZXI7IHdoZXRoZXIgb3Igbm90IHRoZSBjbGljayByZXN1bHRlZCBpbiBhIGRyYWcsIGZvY3VzIHRoZSBlbGVtZW50CgkJdGhpcy5lbGVtZW50LmZvY3VzKCk7CgoJCXJldHVybiAkLnVpLm1vdXNlLnByb3RvdHlwZS5fbW91c2VVcC5jYWxsKHRoaXMsIGV2ZW50KTsKCX0sCgoJY2FuY2VsOiBmdW5jdGlvbigpIHsKCgkJaWYgKHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIikpIHsKCQkJdGhpcy5fbW91c2VVcCh7fSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5fY2xlYXIoKTsKCQl9CgoJCXJldHVybiB0aGlzOwoKCX0sCgoJX2dldEhhbmRsZTogZnVuY3Rpb24oZXZlbnQpIHsKCQlyZXR1cm4gdGhpcy5vcHRpb25zLmhhbmRsZSA/CgkJCSEhJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMub3B0aW9ucy5oYW5kbGUgKSApLmxlbmd0aCA6CgkJCXRydWU7Cgl9LAoKCV9zZXRIYW5kbGVDbGFzc05hbWU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuX3JlbW92ZUhhbmRsZUNsYXNzTmFtZSgpOwoJCSQoIHRoaXMub3B0aW9ucy5oYW5kbGUgfHwgdGhpcy5lbGVtZW50ICkuYWRkQ2xhc3MoICJ1aS1kcmFnZ2FibGUtaGFuZGxlIiApOwoJfSwKCglfcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQuZmluZCggIi51aS1kcmFnZ2FibGUtaGFuZGxlIiApCgkJCS5hZGRCYWNrKCkKCQkJLnJlbW92ZUNsYXNzKCAidWktZHJhZ2dhYmxlLWhhbmRsZSIgKTsKCX0sCgoJX2NyZWF0ZUhlbHBlcjogZnVuY3Rpb24oZXZlbnQpIHsKCgkJdmFyIG8gPSB0aGlzLm9wdGlvbnMsCgkJCWhlbHBlciA9ICQuaXNGdW5jdGlvbihvLmhlbHBlcikgPyAkKG8uaGVscGVyLmFwcGx5KHRoaXMuZWxlbWVudFsgMCBdLCBbIGV2ZW50IF0pKSA6IChvLmhlbHBlciA9PT0gImNsb25lIiA/IHRoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIikgOiB0aGlzLmVsZW1lbnQpOwoKCQlpZiAoIWhlbHBlci5wYXJlbnRzKCJib2R5IikubGVuZ3RoKSB7CgkJCWhlbHBlci5hcHBlbmRUbygoby5hcHBlbmRUbyA9PT0gInBhcmVudCIgPyB0aGlzLmVsZW1lbnRbMF0ucGFyZW50Tm9kZSA6IG8uYXBwZW5kVG8pKTsKCQl9CgoJCWlmIChoZWxwZXJbMF0gIT09IHRoaXMuZWxlbWVudFswXSAmJiAhKC8oZml4ZWR8YWJzb2x1dGUpLykudGVzdChoZWxwZXIuY3NzKCJwb3NpdGlvbiIpKSkgewoJCQloZWxwZXIuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpOwoJCX0KCgkJcmV0dXJuIGhlbHBlcjsKCgl9LAoKCV9hZGp1c3RPZmZzZXRGcm9tSGVscGVyOiBmdW5jdGlvbihvYmopIHsKCQlpZiAodHlwZW9mIG9iaiA9PT0gInN0cmluZyIpIHsKCQkJb2JqID0gb2JqLnNwbGl0KCIgIik7CgkJfQoJCWlmICgkLmlzQXJyYXkob2JqKSkgewoJCQlvYmogPSB7IGxlZnQ6ICtvYmpbMF0sIHRvcDogK29ialsxXSB8fCAwIH07CgkJfQoJCWlmICgibGVmdCIgaW4gb2JqKSB7CgkJCXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPSBvYmoubGVmdCArIHRoaXMubWFyZ2lucy5sZWZ0OwoJCX0KCQlpZiAoInJpZ2h0IiBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2subGVmdCA9IHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLSBvYmoucmlnaHQgKyB0aGlzLm1hcmdpbnMubGVmdDsKCQl9CgkJaWYgKCJ0b3AiIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay50b3AgPSBvYmoudG9wICsgdGhpcy5tYXJnaW5zLnRvcDsKCQl9CgkJaWYgKCJib3R0b20iIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay50b3AgPSB0aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAtIG9iai5ib3R0b20gKyB0aGlzLm1hcmdpbnMudG9wOwoJCX0KCX0sCgoJX2lzUm9vdE5vZGU6IGZ1bmN0aW9uKCBlbGVtZW50ICkgewoJCXJldHVybiAoIC8oaHRtbHxib2R5KS9pICkudGVzdCggZWxlbWVudC50YWdOYW1lICkgfHwgZWxlbWVudCA9PT0gdGhpcy5kb2N1bWVudFsgMCBdOwoJfSwKCglfZ2V0UGFyZW50T2Zmc2V0OiBmdW5jdGlvbigpIHsKCgkJLy9HZXQgdGhlIG9mZnNldFBhcmVudCBhbmQgY2FjaGUgaXRzIHBvc2l0aW9uCgkJdmFyIHBvID0gdGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCksCgkJCWRvY3VtZW50ID0gdGhpcy5kb2N1bWVudFsgMCBdOwoKCQkvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIHdlIG5lZWQgdG8gbW9kaWZ5IGEgb2Zmc2V0IGNhbGN1bGF0ZWQgb24gc3RhcnQsIHNpbmNlIHRoZSBmb2xsb3dpbmcgaGFwcGVuZWQ6CgkJLy8gMS4gVGhlIHBvc2l0aW9uIG9mIHRoZSBoZWxwZXIgaXMgYWJzb2x1dGUsIHNvIGl0J3MgcG9zaXRpb24gaXMgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgbmV4dCBwb3NpdGlvbmVkIHBhcmVudAoJCS8vIDIuIFRoZSBhY3R1YWwgb2Zmc2V0IHBhcmVudCBpcyBhIGNoaWxkIG9mIHRoZSBzY3JvbGwgcGFyZW50LCBhbmQgdGhlIHNjcm9sbCBwYXJlbnQgaXNuJ3QgdGhlIGRvY3VtZW50LCB3aGljaCBtZWFucyB0aGF0CgkJLy8gICAgdGhlIHNjcm9sbCBpcyBpbmNsdWRlZCBpbiB0aGUgaW5pdGlhbCBjYWxjdWxhdGlvbiBvZiB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQsIGFuZCBuZXZlciByZWNhbGN1bGF0ZWQgdXBvbiBkcmFnCgkJaWYgKHRoaXMuY3NzUG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgJiYgdGhpcy5zY3JvbGxQYXJlbnRbMF0gIT09IGRvY3VtZW50ICYmICQuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sIHRoaXMub2Zmc2V0UGFyZW50WzBdKSkgewoJCQlwby5sZWZ0ICs9IHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTsKCQkJcG8udG9wICs9IHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOwoJCX0KCgkJaWYgKCB0aGlzLl9pc1Jvb3ROb2RlKCB0aGlzLm9mZnNldFBhcmVudFsgMCBdICkgKSB7CgkJCXBvID0geyB0b3A6IDAsIGxlZnQ6IDAgfTsKCQl9CgoJCXJldHVybiB7CgkJCXRvcDogcG8udG9wICsgKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCkgfHwgMCksCgkJCWxlZnQ6IHBvLmxlZnQgKyAocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCkgfHwgMCkKCQl9OwoKCX0sCgoJX2dldFJlbGF0aXZlT2Zmc2V0OiBmdW5jdGlvbigpIHsKCQlpZiAoIHRoaXMuY3NzUG9zaXRpb24gIT09ICJyZWxhdGl2ZSIgKSB7CgkJCXJldHVybiB7IHRvcDogMCwgbGVmdDogMCB9OwoJCX0KCgkJdmFyIHAgPSB0aGlzLmVsZW1lbnQucG9zaXRpb24oKSwKCQkJc2Nyb2xsSXNSb290Tm9kZSA9IHRoaXMuX2lzUm9vdE5vZGUoIHRoaXMuc2Nyb2xsUGFyZW50WyAwIF0gKTsKCgkJcmV0dXJuIHsKCQkJdG9wOiBwLnRvcCAtICggcGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCAidG9wIiApLCAxMCkgfHwgMCApICsgKCAhc2Nyb2xsSXNSb290Tm9kZSA/IHRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpIDogMCApLAoJCQlsZWZ0OiBwLmxlZnQgLSAoIHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcyggImxlZnQiICksIDEwKSB8fCAwICkgKyAoICFzY3JvbGxJc1Jvb3ROb2RlID8gdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpIDogMCApCgkJfTsKCgl9LAoKCV9jYWNoZU1hcmdpbnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMubWFyZ2lucyA9IHsKCQkJbGVmdDogKHBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSwxMCkgfHwgMCksCgkJCXRvcDogKHBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLDEwKSB8fCAwKSwKCQkJcmlnaHQ6IChwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLDEwKSB8fCAwKSwKCQkJYm90dG9tOiAocGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luQm90dG9tIiksMTApIHx8IDApCgkJfTsKCX0sCgoJX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGVscGVyUHJvcG9ydGlvbnMgPSB7CgkJCXdpZHRoOiB0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksCgkJCWhlaWdodDogdGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKQoJCX07Cgl9LAoKCV9zZXRDb250YWlubWVudDogZnVuY3Rpb24oKSB7CgoJCXZhciBvdmVyLCBjLCBjZSwKCQkJbyA9IHRoaXMub3B0aW9ucywKCQkJZG9jdW1lbnQgPSB0aGlzLmRvY3VtZW50WyAwIF07CgoJCXRoaXMucmVsYXRpdmVfY29udGFpbmVyID0gbnVsbDsKCgkJaWYgKCAhby5jb250YWlubWVudCApIHsKCQkJdGhpcy5jb250YWlubWVudCA9IG51bGw7CgkJCXJldHVybjsKCQl9CgoJCWlmICggby5jb250YWlubWVudCA9PT0gIndpbmRvdyIgKSB7CgkJCXRoaXMuY29udGFpbm1lbnQgPSBbCgkJCQkkKCB3aW5kb3cgKS5zY3JvbGxMZWZ0KCkgLSB0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0IC0gdGhpcy5vZmZzZXQucGFyZW50LmxlZnQsCgkJCQkkKCB3aW5kb3cgKS5zY3JvbGxUb3AoKSAtIHRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCAtIHRoaXMub2Zmc2V0LnBhcmVudC50b3AsCgkJCQkkKCB3aW5kb3cgKS5zY3JvbGxMZWZ0KCkgKyAkKCB3aW5kb3cgKS53aWR0aCgpIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAtIHRoaXMubWFyZ2lucy5sZWZ0LAoJCQkJJCggd2luZG93ICkuc2Nyb2xsVG9wKCkgKyAoICQoIHdpbmRvdyApLmhlaWdodCgpIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQgKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0IC0gdGhpcy5tYXJnaW5zLnRvcAoJCQldOwoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG8uY29udGFpbm1lbnQgPT09ICJkb2N1bWVudCIpIHsKCQkJdGhpcy5jb250YWlubWVudCA9IFsKCQkJCTAsCgkJCQkwLAoJCQkJJCggZG9jdW1lbnQgKS53aWR0aCgpIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAtIHRoaXMubWFyZ2lucy5sZWZ0LAoJCQkJKCAkKCBkb2N1bWVudCApLmhlaWdodCgpIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQgKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0IC0gdGhpcy5tYXJnaW5zLnRvcAoJCQldOwoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIG8uY29udGFpbm1lbnQuY29uc3RydWN0b3IgPT09IEFycmF5ICkgewoJCQl0aGlzLmNvbnRhaW5tZW50ID0gby5jb250YWlubWVudDsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBvLmNvbnRhaW5tZW50ID09PSAicGFyZW50IiApIHsKCQkJby5jb250YWlubWVudCA9IHRoaXMuaGVscGVyWyAwIF0ucGFyZW50Tm9kZTsKCQl9CgoJCWMgPSAkKCBvLmNvbnRhaW5tZW50ICk7CgkJY2UgPSBjWyAwIF07CgoJCWlmICggIWNlICkgewoJCQlyZXR1cm47CgkJfQoKCQlvdmVyID0gYy5jc3MoICJvdmVyZmxvdyIgKSAhPT0gImhpZGRlbiI7CgoJCXRoaXMuY29udGFpbm1lbnQgPSBbCgkJCSggcGFyc2VJbnQoIGMuY3NzKCAiYm9yZGVyTGVmdFdpZHRoIiApLCAxMCApIHx8IDAgKSArICggcGFyc2VJbnQoIGMuY3NzKCAicGFkZGluZ0xlZnQiICksIDEwICkgfHwgMCApLAoJCQkoIHBhcnNlSW50KCBjLmNzcyggImJvcmRlclRvcFdpZHRoIiApLCAxMCApIHx8IDAgKSArICggcGFyc2VJbnQoIGMuY3NzKCAicGFkZGluZ1RvcCIgKSwgMTAgKSB8fCAwICksCgkJCSggb3ZlciA/IE1hdGgubWF4KCBjZS5zY3JvbGxXaWR0aCwgY2Uub2Zmc2V0V2lkdGggKSA6IGNlLm9mZnNldFdpZHRoICkgLSAoIHBhcnNlSW50KCBjLmNzcyggImJvcmRlclJpZ2h0V2lkdGgiICksIDEwICkgfHwgMCApIC0gKCBwYXJzZUludCggYy5jc3MoICJwYWRkaW5nUmlnaHQiICksIDEwICkgfHwgMCApIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAtIHRoaXMubWFyZ2lucy5sZWZ0IC0gdGhpcy5tYXJnaW5zLnJpZ2h0LAoJCQkoIG92ZXIgPyBNYXRoLm1heCggY2Uuc2Nyb2xsSGVpZ2h0LCBjZS5vZmZzZXRIZWlnaHQgKSA6IGNlLm9mZnNldEhlaWdodCApIC0gKCBwYXJzZUludCggYy5jc3MoICJib3JkZXJCb3R0b21XaWR0aCIgKSwgMTAgKSB8fCAwICkgLSAoIHBhcnNlSW50KCBjLmNzcyggInBhZGRpbmdCb3R0b20iICksIDEwICkgfHwgMCApIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSB0aGlzLm1hcmdpbnMudG9wICAtIHRoaXMubWFyZ2lucy5ib3R0b20KCQldOwoJCXRoaXMucmVsYXRpdmVfY29udGFpbmVyID0gYzsKCX0sCgoJX2NvbnZlcnRQb3NpdGlvblRvOiBmdW5jdGlvbihkLCBwb3MpIHsKCgkJaWYgKCFwb3MpIHsKCQkJcG9zID0gdGhpcy5wb3NpdGlvbjsKCQl9CgoJCXZhciBtb2QgPSBkID09PSAiYWJzb2x1dGUiID8gMSA6IC0xLAoJCQlzY3JvbGxJc1Jvb3ROb2RlID0gdGhpcy5faXNSb290Tm9kZSggdGhpcy5zY3JvbGxQYXJlbnRbIDAgXSApOwoKCQlyZXR1cm4gewoJCQl0b3A6ICgKCQkJCXBvcy50b3AJKwkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCAqIG1vZCArCQkJCQkJCQkJCS8vIE9ubHkgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgbm9kZXM6IFJlbGF0aXZlIG9mZnNldCBmcm9tIGVsZW1lbnQgdG8gb2Zmc2V0IHBhcmVudAoJCQkJdGhpcy5vZmZzZXQucGFyZW50LnRvcCAqIG1vZCAtCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQncyBvZmZzZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQkoICggdGhpcy5jc3NQb3NpdGlvbiA9PT0gImZpeGVkIiA/IC10aGlzLm9mZnNldC5zY3JvbGwudG9wIDogKCBzY3JvbGxJc1Jvb3ROb2RlID8gMCA6IHRoaXMub2Zmc2V0LnNjcm9sbC50b3AgKSApICogbW9kKQoJCQkpLAoJCQlsZWZ0OiAoCgkJCQlwb3MubGVmdCArCQkJCQkJCQkJCQkJCQkJCS8vIFRoZSBhYnNvbHV0ZSBtb3VzZSBwb3NpdGlvbgoJCQkJdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCAqIG1vZCArCQkJCQkJCQkJCS8vIE9ubHkgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgbm9kZXM6IFJlbGF0aXZlIG9mZnNldCBmcm9tIGVsZW1lbnQgdG8gb2Zmc2V0IHBhcmVudAoJCQkJdGhpcy5vZmZzZXQucGFyZW50LmxlZnQgKiBtb2QJLQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJKCAoIHRoaXMuY3NzUG9zaXRpb24gPT09ICJmaXhlZCIgPyAtdGhpcy5vZmZzZXQuc2Nyb2xsLmxlZnQgOiAoIHNjcm9sbElzUm9vdE5vZGUgPyAwIDogdGhpcy5vZmZzZXQuc2Nyb2xsLmxlZnQgKSApICogbW9kKQoJCQkpCgkJfTsKCgl9LAoKCV9nZW5lcmF0ZVBvc2l0aW9uOiBmdW5jdGlvbiggZXZlbnQsIGNvbnN0cmFpblBvc2l0aW9uICkgewoKCQl2YXIgY29udGFpbm1lbnQsIGNvLCB0b3AsIGxlZnQsCgkJCW8gPSB0aGlzLm9wdGlvbnMsCgkJCXNjcm9sbElzUm9vdE5vZGUgPSB0aGlzLl9pc1Jvb3ROb2RlKCB0aGlzLnNjcm9sbFBhcmVudFsgMCBdICksCgkJCXBhZ2VYID0gZXZlbnQucGFnZVgsCgkJCXBhZ2VZID0gZXZlbnQucGFnZVk7CgoJCS8vIENhY2hlIHRoZSBzY3JvbGwKCQlpZiAoICFzY3JvbGxJc1Jvb3ROb2RlIHx8ICF0aGlzLm9mZnNldC5zY3JvbGwgKSB7CgkJCXRoaXMub2Zmc2V0LnNjcm9sbCA9IHsKCQkJCXRvcDogdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksCgkJCQlsZWZ0OiB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCkKCQkJfTsKCQl9CgoJCS8qCgkJICogLSBQb3NpdGlvbiBjb25zdHJhaW5pbmcgLQoJCSAqIENvbnN0cmFpbiB0aGUgcG9zaXRpb24gdG8gYSBtaXggb2YgZ3JpZCwgY29udGFpbm1lbnQuCgkJICovCgoJCS8vIElmIHdlIGFyZSBub3QgZHJhZ2dpbmcgeWV0LCB3ZSB3b24ndCBjaGVjayBmb3Igb3B0aW9ucwoJCWlmICggY29uc3RyYWluUG9zaXRpb24gKSB7CgkJCWlmICggdGhpcy5jb250YWlubWVudCApIHsKCQkJCWlmICggdGhpcy5yZWxhdGl2ZV9jb250YWluZXIgKXsKCQkJCQljbyA9IHRoaXMucmVsYXRpdmVfY29udGFpbmVyLm9mZnNldCgpOwoJCQkJCWNvbnRhaW5tZW50ID0gWwoJCQkJCQl0aGlzLmNvbnRhaW5tZW50WyAwIF0gKyBjby5sZWZ0LAoJCQkJCQl0aGlzLmNvbnRhaW5tZW50WyAxIF0gKyBjby50b3AsCgkJCQkJCXRoaXMuY29udGFpbm1lbnRbIDIgXSArIGNvLmxlZnQsCgkJCQkJCXRoaXMuY29udGFpbm1lbnRbIDMgXSArIGNvLnRvcAoJCQkJCV07CgkJCQl9IGVsc2UgewoJCQkJCWNvbnRhaW5tZW50ID0gdGhpcy5jb250YWlubWVudDsKCQkJCX0KCgkJCQlpZiAoZXZlbnQucGFnZVggLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0IDwgY29udGFpbm1lbnRbMF0pIHsKCQkJCQlwYWdlWCA9IGNvbnRhaW5tZW50WzBdICsgdGhpcy5vZmZzZXQuY2xpY2subGVmdDsKCQkJCX0KCQkJCWlmIChldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA8IGNvbnRhaW5tZW50WzFdKSB7CgkJCQkJcGFnZVkgPSBjb250YWlubWVudFsxXSArIHRoaXMub2Zmc2V0LmNsaWNrLnRvcDsKCQkJCX0KCQkJCWlmIChldmVudC5wYWdlWCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPiBjb250YWlubWVudFsyXSkgewoJCQkJCXBhZ2VYID0gY29udGFpbm1lbnRbMl0gKyB0aGlzLm9mZnNldC5jbGljay5sZWZ0OwoJCQkJfQoJCQkJaWYgKGV2ZW50LnBhZ2VZIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID4gY29udGFpbm1lbnRbM10pIHsKCQkJCQlwYWdlWSA9IGNvbnRhaW5tZW50WzNdICsgdGhpcy5vZmZzZXQuY2xpY2sudG9wOwoJCQkJfQoJCQl9CgoJCQlpZiAoby5ncmlkKSB7CgkJCQkvL0NoZWNrIGZvciBncmlkIGVsZW1lbnRzIHNldCB0byAwIHRvIHByZXZlbnQgZGl2aWRlIGJ5IDAgZXJyb3IgY2F1c2luZyBpbnZhbGlkIGFyZ3VtZW50IGVycm9ycyBpbiBJRSAoc2VlIHRpY2tldCAjNjk1MCkKCQkJCXRvcCA9IG8uZ3JpZFsxXSA/IHRoaXMub3JpZ2luYWxQYWdlWSArIE1hdGgucm91bmQoKHBhZ2VZIC0gdGhpcy5vcmlnaW5hbFBhZ2VZKSAvIG8uZ3JpZFsxXSkgKiBvLmdyaWRbMV0gOiB0aGlzLm9yaWdpbmFsUGFnZVk7CgkJCQlwYWdlWSA9IGNvbnRhaW5tZW50ID8gKCh0b3AgLSB0aGlzLm9mZnNldC5jbGljay50b3AgPj0gY29udGFpbm1lbnRbMV0gfHwgdG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID4gY29udGFpbm1lbnRbM10pID8gdG9wIDogKCh0b3AgLSB0aGlzLm9mZnNldC5jbGljay50b3AgPj0gY29udGFpbm1lbnRbMV0pID8gdG9wIC0gby5ncmlkWzFdIDogdG9wICsgby5ncmlkWzFdKSkgOiB0b3A7CgoJCQkJbGVmdCA9IG8uZ3JpZFswXSA/IHRoaXMub3JpZ2luYWxQYWdlWCArIE1hdGgucm91bmQoKHBhZ2VYIC0gdGhpcy5vcmlnaW5hbFBhZ2VYKSAvIG8uZ3JpZFswXSkgKiBvLmdyaWRbMF0gOiB0aGlzLm9yaWdpbmFsUGFnZVg7CgkJCQlwYWdlWCA9IGNvbnRhaW5tZW50ID8gKChsZWZ0IC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA+PSBjb250YWlubWVudFswXSB8fCBsZWZ0IC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA+IGNvbnRhaW5tZW50WzJdKSA/IGxlZnQgOiAoKGxlZnQgLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0ID49IGNvbnRhaW5tZW50WzBdKSA/IGxlZnQgLSBvLmdyaWRbMF0gOiBsZWZ0ICsgby5ncmlkWzBdKSkgOiBsZWZ0OwoJCQl9CgoJCQlpZiAoIG8uYXhpcyA9PT0gInkiICkgewoJCQkJcGFnZVggPSB0aGlzLm9yaWdpbmFsUGFnZVg7CgkJCX0KCgkJCWlmICggby5heGlzID09PSAieCIgKSB7CgkJCQlwYWdlWSA9IHRoaXMub3JpZ2luYWxQYWdlWTsKCQkJfQoJCX0KCgkJcmV0dXJuIHsKCQkJdG9wOiAoCgkJCQlwYWdlWSAtCQkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LmNsaWNrLnRvcAktCQkJCQkJCQkJCQkJLy8gQ2xpY2sgb2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgZWxlbWVudCkKCQkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCAtCQkJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQudG9wICsJCQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRoaXMub2Zmc2V0LnNjcm9sbC50b3AgOiAoIHNjcm9sbElzUm9vdE5vZGUgPyAwIDogdGhpcy5vZmZzZXQuc2Nyb2xsLnRvcCApICkKCQkJKSwKCQkJbGVmdDogKAoJCQkJcGFnZVggLQkJCQkJCQkJCQkJCQkJCQkJLy8gVGhlIGFic29sdXRlIG1vdXNlIHBvc2l0aW9uCgkJCQl0aGlzLm9mZnNldC5jbGljay5sZWZ0IC0JCQkJCQkJCQkJCQkvLyBDbGljayBvZmZzZXQgKHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50KQoJCQkJdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdCAtCQkJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQubGVmdCArCQkJCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSggdGhpcy5jc3NQb3NpdGlvbiA9PT0gImZpeGVkIiA/IC10aGlzLm9mZnNldC5zY3JvbGwubGVmdCA6ICggc2Nyb2xsSXNSb290Tm9kZSA/IDAgOiB0aGlzLm9mZnNldC5zY3JvbGwubGVmdCApICkKCQkJKQoJCX07CgoJfSwKCglfY2xlYXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKTsKCQlpZiAodGhpcy5oZWxwZXJbMF0gIT09IHRoaXMuZWxlbWVudFswXSAmJiAhdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsKSB7CgkJCXRoaXMuaGVscGVyLnJlbW92ZSgpOwoJCX0KCQl0aGlzLmhlbHBlciA9IG51bGw7CgkJdGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsID0gZmFsc2U7CgkJaWYgKCB0aGlzLmRlc3Ryb3lPbkNsZWFyICkgewoJCQl0aGlzLmRlc3Ryb3koKTsKCQl9Cgl9LAoKCS8vIEZyb20gbm93IG9uIGJ1bGsgc3R1ZmYgLSBtYWlubHkgaGVscGVycwoKCV90cmlnZ2VyOiBmdW5jdGlvbih0eXBlLCBldmVudCwgdWkpIHsKCQl1aSA9IHVpIHx8IHRoaXMuX3VpSGFzaCgpOwoJCSQudWkucGx1Z2luLmNhbGwoIHRoaXMsIHR5cGUsIFsgZXZlbnQsIHVpLCB0aGlzIF0sIHRydWUgKTsKCQkvL1RoZSBhYnNvbHV0ZSBwb3NpdGlvbiBoYXMgdG8gYmUgcmVjYWxjdWxhdGVkIGFmdGVyIHBsdWdpbnMKCQlpZiAodHlwZSA9PT0gImRyYWciKSB7CgkJCXRoaXMucG9zaXRpb25BYnMgPSB0aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKTsKCQl9CgkJcmV0dXJuICQuV2lkZ2V0LnByb3RvdHlwZS5fdHJpZ2dlci5jYWxsKHRoaXMsIHR5cGUsIGV2ZW50LCB1aSk7Cgl9LAoKCXBsdWdpbnM6IHt9LAoKCV91aUhhc2g6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCWhlbHBlcjogdGhpcy5oZWxwZXIsCgkJCXBvc2l0aW9uOiB0aGlzLnBvc2l0aW9uLAoJCQlvcmlnaW5hbFBvc2l0aW9uOiB0aGlzLm9yaWdpbmFsUG9zaXRpb24sCgkJCW9mZnNldDogdGhpcy5wb3NpdGlvbkFicwoJCX07Cgl9Cgp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgImNvbm5lY3RUb1NvcnRhYmxlIiwgewoJc3RhcnQ6IGZ1bmN0aW9uKCBldmVudCwgdWksIGluc3QgKSB7CgoJCXZhciBvID0gaW5zdC5vcHRpb25zLAoJCQl1aVNvcnRhYmxlID0gJC5leHRlbmQoe30sIHVpLCB7IGl0ZW06IGluc3QuZWxlbWVudCB9KTsKCQlpbnN0LnNvcnRhYmxlcyA9IFtdOwoJCSQoby5jb25uZWN0VG9Tb3J0YWJsZSkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNvcnRhYmxlID0gJCggdGhpcyApLnNvcnRhYmxlKCAiaW5zdGFuY2UiICk7CgkJCWlmIChzb3J0YWJsZSAmJiAhc29ydGFibGUub3B0aW9ucy5kaXNhYmxlZCkgewoJCQkJaW5zdC5zb3J0YWJsZXMucHVzaCh7CgkJCQkJaW5zdGFuY2U6IHNvcnRhYmxlLAoJCQkJCXNob3VsZFJldmVydDogc29ydGFibGUub3B0aW9ucy5yZXZlcnQKCQkJCX0pOwoJCQkJc29ydGFibGUucmVmcmVzaFBvc2l0aW9ucygpOwkvLyBDYWxsIHRoZSBzb3J0YWJsZSdzIHJlZnJlc2hQb3NpdGlvbnMgYXQgZHJhZyBzdGFydCB0byByZWZyZXNoIHRoZSBjb250YWluZXJDYWNoZSBzaW5jZSB0aGUgc29ydGFibGUgY29udGFpbmVyIGNhY2hlIGlzIHVzZWQgaW4gZHJhZyBhbmQgbmVlZHMgdG8gYmUgdXAgdG8gZGF0ZSAodGhpcyB3aWxsIGVuc3VyZSBpdCdzIGluaXRpYWxpc2VkIGFzIHdlbGwgYXMgYmVpbmcga2VwdCBpbiBzdGVwIHdpdGggYW55IGNoYW5nZXMgdGhhdCBtaWdodCBoYXZlIGhhcHBlbmVkIG9uIHRoZSBwYWdlKS4KCQkJCXNvcnRhYmxlLl90cmlnZ2VyKCJhY3RpdmF0ZSIsIGV2ZW50LCB1aVNvcnRhYmxlKTsKCQkJfQoJCX0pOwoKCX0sCglzdG9wOiBmdW5jdGlvbiggZXZlbnQsIHVpLCBpbnN0ICkgewoKCQkvL0lmIHdlIGFyZSBzdGlsbCBvdmVyIHRoZSBzb3J0YWJsZSwgd2UgZmFrZSB0aGUgc3RvcCBldmVudCBvZiB0aGUgc29ydGFibGUsIGJ1dCBhbHNvIHJlbW92ZSBoZWxwZXIKCQl2YXIgdWlTb3J0YWJsZSA9ICQuZXh0ZW5kKCB7fSwgdWksIHsKCQkJaXRlbTogaW5zdC5lbGVtZW50CgkJfSk7CgoJCSQuZWFjaChpbnN0LnNvcnRhYmxlcywgZnVuY3Rpb24oKSB7CgkJCWlmICh0aGlzLmluc3RhbmNlLmlzT3ZlcikgewoKCQkJCXRoaXMuaW5zdGFuY2UuaXNPdmVyID0gMDsKCgkJCQlpbnN0LmNhbmNlbEhlbHBlclJlbW92YWwgPSB0cnVlOyAvL0Rvbid0IHJlbW92ZSB0aGUgaGVscGVyIGluIHRoZSBkcmFnZ2FibGUgaW5zdGFuY2UKCQkJCXRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbCA9IGZhbHNlOyAvL1JlbW92ZSBpdCBpbiB0aGUgc29ydGFibGUgaW5zdGFuY2UgKHNvIHNvcnRhYmxlIHBsdWdpbnMgbGlrZSByZXZlcnQgc3RpbGwgd29yaykKCgkJCQkvL1RoZSBzb3J0YWJsZSByZXZlcnQgaXMgc3VwcG9ydGVkLCBhbmQgd2UgaGF2ZSB0byBzZXQgYSB0ZW1wb3JhcnkgZHJvcHBlZCB2YXJpYWJsZSBvbiB0aGUgZHJhZ2dhYmxlIHRvIHN1cHBvcnQgcmV2ZXJ0OiAidmFsaWQvaW52YWxpZCIKCQkJCWlmICh0aGlzLnNob3VsZFJldmVydCkgewoJCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5yZXZlcnQgPSB0aGlzLnNob3VsZFJldmVydDsKCQkJCX0KCgkJCQkvL1RyaWdnZXIgdGhlIHN0b3Agb2YgdGhlIHNvcnRhYmxlCgkJCQl0aGlzLmluc3RhbmNlLl9tb3VzZVN0b3AoZXZlbnQpOwoKCQkJCXRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXIgPSB0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlcjsKCgkJCQkvL0lmIHRoZSBoZWxwZXIgaGFzIGJlZW4gdGhlIG9yaWdpbmFsIGl0ZW0sIHJlc3RvcmUgcHJvcGVydGllcyBpbiB0aGUgc29ydGFibGUKCQkJCWlmIChpbnN0Lm9wdGlvbnMuaGVscGVyID09PSAib3JpZ2luYWwiKSB7CgkJCQkJdGhpcy5pbnN0YW5jZS5jdXJyZW50SXRlbS5jc3MoeyB0b3A6ICJhdXRvIiwgbGVmdDogImF1dG8iIH0pOwoJCQkJfQoKCQkJfSBlbHNlIHsKCQkJCXRoaXMuaW5zdGFuY2UuY2FuY2VsSGVscGVyUmVtb3ZhbCA9IGZhbHNlOyAvL1JlbW92ZSB0aGUgaGVscGVyIGluIHRoZSBzb3J0YWJsZSBpbnN0YW5jZQoJCQkJdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsIGV2ZW50LCB1aVNvcnRhYmxlKTsKCQkJfQoKCQl9KTsKCgl9LAoJZHJhZzogZnVuY3Rpb24oIGV2ZW50LCB1aSwgaW5zdCApIHsKCgkJdmFyIHRoYXQgPSB0aGlzOwoKCQkkLmVhY2goaW5zdC5zb3J0YWJsZXMsIGZ1bmN0aW9uKCkgewoKCQkJdmFyIGlubmVybW9zdEludGVyc2VjdGluZyA9IGZhbHNlLAoJCQkJdGhpc1NvcnRhYmxlID0gdGhpczsKCgkJCS8vQ29weSBvdmVyIHNvbWUgdmFyaWFibGVzIHRvIGFsbG93IGNhbGxpbmcgdGhlIHNvcnRhYmxlJ3MgbmF0aXZlIF9pbnRlcnNlY3RzV2l0aAoJCQl0aGlzLmluc3RhbmNlLnBvc2l0aW9uQWJzID0gaW5zdC5wb3NpdGlvbkFiczsKCQkJdGhpcy5pbnN0YW5jZS5oZWxwZXJQcm9wb3J0aW9ucyA9IGluc3QuaGVscGVyUHJvcG9ydGlvbnM7CgkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrID0gaW5zdC5vZmZzZXQuY2xpY2s7CgoJCQlpZiAodGhpcy5pbnN0YW5jZS5faW50ZXJzZWN0c1dpdGgodGhpcy5pbnN0YW5jZS5jb250YWluZXJDYWNoZSkpIHsKCQkJCWlubmVybW9zdEludGVyc2VjdGluZyA9IHRydWU7CgkJCQkkLmVhY2goaW5zdC5zb3J0YWJsZXMsIGZ1bmN0aW9uKCkgewoJCQkJCXRoaXMuaW5zdGFuY2UucG9zaXRpb25BYnMgPSBpbnN0LnBvc2l0aW9uQWJzOwoJCQkJCXRoaXMuaW5zdGFuY2UuaGVscGVyUHJvcG9ydGlvbnMgPSBpbnN0LmhlbHBlclByb3BvcnRpb25zOwoJCQkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrID0gaW5zdC5vZmZzZXQuY2xpY2s7CgkJCQkJaWYgKHRoaXMgIT09IHRoaXNTb3J0YWJsZSAmJgoJCQkJCQl0aGlzLmluc3RhbmNlLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmluc3RhbmNlLmNvbnRhaW5lckNhY2hlKSAmJgoJCQkJCQkkLmNvbnRhaW5zKHRoaXNTb3J0YWJsZS5pbnN0YW5jZS5lbGVtZW50WzBdLCB0aGlzLmluc3RhbmNlLmVsZW1lbnRbMF0pCgkJCQkJKSB7CgkJCQkJCWlubmVybW9zdEludGVyc2VjdGluZyA9IGZhbHNlOwoJCQkJCX0KCQkJCQlyZXR1cm4gaW5uZXJtb3N0SW50ZXJzZWN0aW5nOwoJCQkJfSk7CgkJCX0KCgkJCWlmIChpbm5lcm1vc3RJbnRlcnNlY3RpbmcpIHsKCQkJCS8vSWYgaXQgaW50ZXJzZWN0cywgd2UgdXNlIGEgbGl0dGxlIGlzT3ZlciB2YXJpYWJsZSBhbmQgc2V0IGl0IG9uY2UsIHNvIG91ciBtb3ZlLWluIHN0dWZmIGdldHMgZmlyZWQgb25seSBvbmNlCgkJCQlpZiAoIXRoaXMuaW5zdGFuY2UuaXNPdmVyKSB7CgoJCQkJCXRoaXMuaW5zdGFuY2UuaXNPdmVyID0gMTsKCQkJCQkvL05vdyB3ZSBmYWtlIHRoZSBzdGFydCBvZiBkcmFnZ2luZyBmb3IgdGhlIHNvcnRhYmxlIGluc3RhbmNlLAoJCQkJCS8vYnkgY2xvbmluZyB0aGUgbGlzdCBncm91cCBpdGVtLCBhcHBlbmRpbmcgaXQgdG8gdGhlIHNvcnRhYmxlIGFuZCB1c2luZyBpdCBhcyBpbnN0LmN1cnJlbnRJdGVtCgkJCQkJLy9XZSBjYW4gdGhlbiBmaXJlIHRoZSBzdGFydCBldmVudCBvZiB0aGUgc29ydGFibGUgd2l0aCBvdXIgcGFzc2VkIGJyb3dzZXIgZXZlbnQsIGFuZCBvdXIgb3duIGhlbHBlciAoc28gaXQgZG9lc24ndCBjcmVhdGUgYSBuZXcgb25lKQoJCQkJCXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0gPSAkKHRoYXQpLmNsb25lKCkucmVtb3ZlQXR0cigiaWQiKS5hcHBlbmRUbyh0aGlzLmluc3RhbmNlLmVsZW1lbnQpLmRhdGEoInVpLXNvcnRhYmxlLWl0ZW0iLCB0cnVlKTsKCQkJCQl0aGlzLmluc3RhbmNlLm9wdGlvbnMuX2hlbHBlciA9IHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oZWxwZXI7IC8vU3RvcmUgaGVscGVyIG9wdGlvbiB0byBsYXRlciByZXN0b3JlIGl0CgkJCQkJdGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlciA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdWkuaGVscGVyWzBdOyB9OwoKCQkJCQlldmVudC50YXJnZXQgPSB0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtWzBdOwoJCQkJCXRoaXMuaW5zdGFuY2UuX21vdXNlQ2FwdHVyZShldmVudCwgdHJ1ZSk7CgkJCQkJdGhpcy5pbnN0YW5jZS5fbW91c2VTdGFydChldmVudCwgdHJ1ZSwgdHJ1ZSk7CgoJCQkJCS8vQmVjYXVzZSB0aGUgYnJvd3NlciBldmVudCBpcyB3YXkgb2ZmIHRoZSBuZXcgYXBwZW5kZWQgcG9ydGxldCwgd2UgbW9kaWZ5IGEgY291cGxlIG9mIHZhcmlhYmxlcyB0byByZWZsZWN0IHRoZSBjaGFuZ2VzCgkJCQkJdGhpcy5pbnN0YW5jZS5vZmZzZXQuY2xpY2sudG9wID0gaW5zdC5vZmZzZXQuY2xpY2sudG9wOwoJCQkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LmNsaWNrLmxlZnQgPSBpbnN0Lm9mZnNldC5jbGljay5sZWZ0OwoJCQkJCXRoaXMuaW5zdGFuY2Uub2Zmc2V0LnBhcmVudC5sZWZ0IC09IGluc3Qub2Zmc2V0LnBhcmVudC5sZWZ0IC0gdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LmxlZnQ7CgkJCQkJdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcCAtPSBpbnN0Lm9mZnNldC5wYXJlbnQudG9wIC0gdGhpcy5pbnN0YW5jZS5vZmZzZXQucGFyZW50LnRvcDsKCgkJCQkJaW5zdC5fdHJpZ2dlcigidG9Tb3J0YWJsZSIsIGV2ZW50KTsKCQkJCQlpbnN0LmRyb3BwZWQgPSB0aGlzLmluc3RhbmNlLmVsZW1lbnQ7IC8vZHJhZ2dhYmxlIHJldmVydCBuZWVkcyB0aGF0CgkJCQkJLy9oYWNrIHNvIHJlY2VpdmUvdXBkYXRlIGNhbGxiYWNrcyB3b3JrIChtb3N0bHkpCgkJCQkJaW5zdC5jdXJyZW50SXRlbSA9IGluc3QuZWxlbWVudDsKCQkJCQl0aGlzLmluc3RhbmNlLmZyb21PdXRzaWRlID0gaW5zdDsKCgkJCQl9CgoJCQkJLy9Qcm92aWRlZCB3ZSBkaWQgYWxsIHRoZSBwcmV2aW91cyBzdGVwcywgd2UgY2FuIGZpcmUgdGhlIGRyYWcgZXZlbnQgb2YgdGhlIHNvcnRhYmxlIG9uIGV2ZXJ5IGRyYWdnYWJsZSBkcmFnLCB3aGVuIGl0IGludGVyc2VjdHMgd2l0aCB0aGUgc29ydGFibGUKCQkJCWlmICh0aGlzLmluc3RhbmNlLmN1cnJlbnRJdGVtKSB7CgkJCQkJdGhpcy5pbnN0YW5jZS5fbW91c2VEcmFnKGV2ZW50KTsKCQkJCX0KCgkJCX0gZWxzZSB7CgoJCQkJLy9JZiBpdCBkb2Vzbid0IGludGVyc2VjdCB3aXRoIHRoZSBzb3J0YWJsZSwgYW5kIGl0IGludGVyc2VjdGVkIGJlZm9yZSwKCQkJCS8vd2UgZmFrZSB0aGUgZHJhZyBzdG9wIG9mIHRoZSBzb3J0YWJsZSwgYnV0IG1ha2Ugc3VyZSBpdCBkb2Vzbid0IHJlbW92ZSB0aGUgaGVscGVyIGJ5IHVzaW5nIGNhbmNlbEhlbHBlclJlbW92YWwKCQkJCWlmICh0aGlzLmluc3RhbmNlLmlzT3ZlcikgewoKCQkJCQl0aGlzLmluc3RhbmNlLmlzT3ZlciA9IDA7CgkJCQkJdGhpcy5pbnN0YW5jZS5jYW5jZWxIZWxwZXJSZW1vdmFsID0gdHJ1ZTsKCgkJCQkJLy9QcmV2ZW50IHJldmVydGluZyBvbiB0aGlzIGZvcmNlZCBzdG9wCgkJCQkJdGhpcy5pbnN0YW5jZS5vcHRpb25zLnJldmVydCA9IGZhbHNlOwoKCQkJCQkvLyBUaGUgb3V0IGV2ZW50IG5lZWRzIHRvIGJlIHRyaWdnZXJlZCBpbmRlcGVuZGVudGx5CgkJCQkJdGhpcy5pbnN0YW5jZS5fdHJpZ2dlcigib3V0IiwgZXZlbnQsIHRoaXMuaW5zdGFuY2UuX3VpSGFzaCh0aGlzLmluc3RhbmNlKSk7CgoJCQkJCXRoaXMuaW5zdGFuY2UuX21vdXNlU3RvcChldmVudCwgdHJ1ZSk7CgkJCQkJdGhpcy5pbnN0YW5jZS5vcHRpb25zLmhlbHBlciA9IHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5faGVscGVyOwoKCQkJCQkvL05vdyB3ZSByZW1vdmUgb3VyIGN1cnJlbnRJdGVtLCB0aGUgbGlzdCBncm91cCBjbG9uZSBhZ2FpbiwgYW5kIHRoZSBwbGFjZWhvbGRlciwgYW5kIGFuaW1hdGUgdGhlIGhlbHBlciBiYWNrIHRvIGl0J3Mgb3JpZ2luYWwgc2l6ZQoJCQkJCXRoaXMuaW5zdGFuY2UuY3VycmVudEl0ZW0ucmVtb3ZlKCk7CgkJCQkJaWYgKHRoaXMuaW5zdGFuY2UucGxhY2Vob2xkZXIpIHsKCQkJCQkJdGhpcy5pbnN0YW5jZS5wbGFjZWhvbGRlci5yZW1vdmUoKTsKCQkJCQl9CgoJCQkJCWluc3QuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsIGV2ZW50KTsKCQkJCQlpbnN0LmRyb3BwZWQgPSBmYWxzZTsgLy9kcmFnZ2FibGUgcmV2ZXJ0IG5lZWRzIHRoYXQKCQkJCX0KCgkJCX0KCgkJfSk7CgoJfQp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgImN1cnNvciIsIHsKCXN0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIHVpLCBpbnN0YW5jZSApIHsKCQl2YXIgdCA9ICQoICJib2R5IiApLAoJCQlvID0gaW5zdGFuY2Uub3B0aW9uczsKCgkJaWYgKHQuY3NzKCJjdXJzb3IiKSkgewoJCQlvLl9jdXJzb3IgPSB0LmNzcygiY3Vyc29yIik7CgkJfQoJCXQuY3NzKCJjdXJzb3IiLCBvLmN1cnNvcik7Cgl9LAoJc3RvcDogZnVuY3Rpb24oIGV2ZW50LCB1aSwgaW5zdGFuY2UgKSB7CgkJdmFyIG8gPSBpbnN0YW5jZS5vcHRpb25zOwoJCWlmIChvLl9jdXJzb3IpIHsKCQkJJCgiYm9keSIpLmNzcygiY3Vyc29yIiwgby5fY3Vyc29yKTsKCQl9Cgl9Cn0pOwoKJC51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCAib3BhY2l0eSIsIHsKCXN0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIHVpLCBpbnN0YW5jZSApIHsKCQl2YXIgdCA9ICQoIHVpLmhlbHBlciApLAoJCQlvID0gaW5zdGFuY2Uub3B0aW9uczsKCQlpZiAodC5jc3MoIm9wYWNpdHkiKSkgewoJCQlvLl9vcGFjaXR5ID0gdC5jc3MoIm9wYWNpdHkiKTsKCQl9CgkJdC5jc3MoIm9wYWNpdHkiLCBvLm9wYWNpdHkpOwoJfSwKCXN0b3A6IGZ1bmN0aW9uKCBldmVudCwgdWksIGluc3RhbmNlICkgewoJCXZhciBvID0gaW5zdGFuY2Uub3B0aW9uczsKCQlpZiAoby5fb3BhY2l0eSkgewoJCQkkKHVpLmhlbHBlcikuY3NzKCJvcGFjaXR5Iiwgby5fb3BhY2l0eSk7CgkJfQoJfQp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgInNjcm9sbCIsIHsKCXN0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIHVpLCBpICkgewoJCWlmICggaS5zY3JvbGxQYXJlbnRbIDAgXSAhPT0gaS5kb2N1bWVudFsgMCBdICYmIGkuc2Nyb2xsUGFyZW50WyAwIF0udGFnTmFtZSAhPT0gIkhUTUwiICkgewoJCQlpLm92ZXJmbG93T2Zmc2V0ID0gaS5zY3JvbGxQYXJlbnQub2Zmc2V0KCk7CgkJfQoJfSwKCWRyYWc6IGZ1bmN0aW9uKCBldmVudCwgdWksIGkgICkgewoKCQl2YXIgbyA9IGkub3B0aW9ucywKCQkJc2Nyb2xsZWQgPSBmYWxzZSwKCQkJZG9jdW1lbnQgPSBpLmRvY3VtZW50WyAwIF07CgoJCWlmICggaS5zY3JvbGxQYXJlbnRbIDAgXSAhPT0gZG9jdW1lbnQgJiYgaS5zY3JvbGxQYXJlbnRbIDAgXS50YWdOYW1lICE9PSAiSFRNTCIgKSB7CgkJCWlmICghby5heGlzIHx8IG8uYXhpcyAhPT0gIngiKSB7CgkJCQlpZiAoKGkub3ZlcmZsb3dPZmZzZXQudG9wICsgaS5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0KSAtIGV2ZW50LnBhZ2VZIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCWkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCA9IHNjcm9sbGVkID0gaS5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wICsgby5zY3JvbGxTcGVlZDsKCQkJCX0gZWxzZSBpZiAoZXZlbnQucGFnZVkgLSBpLm92ZXJmbG93T2Zmc2V0LnRvcCA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgPSBzY3JvbGxlZCA9IGkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCAtIG8uc2Nyb2xsU3BlZWQ7CgkJCQl9CgkJCX0KCgkJCWlmICghby5heGlzIHx8IG8uYXhpcyAhPT0gInkiKSB7CgkJCQlpZiAoKGkub3ZlcmZsb3dPZmZzZXQubGVmdCArIGkuc2Nyb2xsUGFyZW50WzBdLm9mZnNldFdpZHRoKSAtIGV2ZW50LnBhZ2VYIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCWkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgPSBzY3JvbGxlZCA9IGkuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQgKyBvLnNjcm9sbFNwZWVkOwoJCQkJfSBlbHNlIGlmIChldmVudC5wYWdlWCAtIGkub3ZlcmZsb3dPZmZzZXQubGVmdCA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ID0gc2Nyb2xsZWQgPSBpLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0IC0gby5zY3JvbGxTcGVlZDsKCQkJCX0KCQkJfQoKCQl9IGVsc2UgewoKCQkJaWYgKCFvLmF4aXMgfHwgby5heGlzICE9PSAieCIpIHsKCQkJCWlmIChldmVudC5wYWdlWSAtICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIC0gby5zY3JvbGxTcGVlZCk7CgkJCQl9IGVsc2UgaWYgKCQod2luZG93KS5oZWlnaHQoKSAtIChldmVudC5wYWdlWSAtICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArIG8uc2Nyb2xsU3BlZWQpOwoJCQkJfQoJCQl9CgoJCQlpZiAoIW8uYXhpcyB8fCBvLmF4aXMgIT09ICJ5IikgewoJCQkJaWYgKGV2ZW50LnBhZ2VYIC0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgLSBvLnNjcm9sbFNwZWVkKTsKCQkJCX0gZWxzZSBpZiAoJCh3aW5kb3cpLndpZHRoKCkgLSAoZXZlbnQucGFnZVggLSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyBvLnNjcm9sbFNwZWVkKTsKCQkJCX0KCQkJfQoKCQl9CgoJCWlmIChzY3JvbGxlZCAhPT0gZmFsc2UgJiYgJC51aS5kZG1hbmFnZXIgJiYgIW8uZHJvcEJlaGF2aW91cikgewoJCQkkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyhpLCBldmVudCk7CgkJfQoKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJzbmFwIiwgewoJc3RhcnQ6IGZ1bmN0aW9uKCBldmVudCwgdWksIGkgKSB7CgoJCXZhciBvID0gaS5vcHRpb25zOwoKCQlpLnNuYXBFbGVtZW50cyA9IFtdOwoKCQkkKG8uc25hcC5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nID8gKCBvLnNuYXAuaXRlbXMgfHwgIjpkYXRhKHVpLWRyYWdnYWJsZSkiICkgOiBvLnNuYXApLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciAkdCA9ICQodGhpcyksCgkJCQkkbyA9ICR0Lm9mZnNldCgpOwoJCQlpZiAodGhpcyAhPT0gaS5lbGVtZW50WzBdKSB7CgkJCQlpLnNuYXBFbGVtZW50cy5wdXNoKHsKCQkJCQlpdGVtOiB0aGlzLAoJCQkJCXdpZHRoOiAkdC5vdXRlcldpZHRoKCksIGhlaWdodDogJHQub3V0ZXJIZWlnaHQoKSwKCQkJCQl0b3A6ICRvLnRvcCwgbGVmdDogJG8ubGVmdAoJCQkJfSk7CgkJCX0KCQl9KTsKCgl9LAoJZHJhZzogZnVuY3Rpb24oIGV2ZW50LCB1aSwgaW5zdCApIHsKCgkJdmFyIHRzLCBicywgbHMsIHJzLCBsLCByLCB0LCBiLCBpLCBmaXJzdCwKCQkJbyA9IGluc3Qub3B0aW9ucywKCQkJZCA9IG8uc25hcFRvbGVyYW5jZSwKCQkJeDEgPSB1aS5vZmZzZXQubGVmdCwgeDIgPSB4MSArIGluc3QuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgsCgkJCXkxID0gdWkub2Zmc2V0LnRvcCwgeTIgPSB5MSArIGluc3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0OwoKCQlmb3IgKGkgPSBpbnN0LnNuYXBFbGVtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgoJCQlsID0gaW5zdC5zbmFwRWxlbWVudHNbaV0ubGVmdDsKCQkJciA9IGwgKyBpbnN0LnNuYXBFbGVtZW50c1tpXS53aWR0aDsKCQkJdCA9IGluc3Quc25hcEVsZW1lbnRzW2ldLnRvcDsKCQkJYiA9IHQgKyBpbnN0LnNuYXBFbGVtZW50c1tpXS5oZWlnaHQ7CgoJCQlpZiAoIHgyIDwgbCAtIGQgfHwgeDEgPiByICsgZCB8fCB5MiA8IHQgLSBkIHx8IHkxID4gYiArIGQgfHwgISQuY29udGFpbnMoIGluc3Quc25hcEVsZW1lbnRzWyBpIF0uaXRlbS5vd25lckRvY3VtZW50LCBpbnN0LnNuYXBFbGVtZW50c1sgaSBdLml0ZW0gKSApIHsKCQkJCWlmIChpbnN0LnNuYXBFbGVtZW50c1tpXS5zbmFwcGluZykgewoJCQkJCShpbnN0Lm9wdGlvbnMuc25hcC5yZWxlYXNlICYmIGluc3Qub3B0aW9ucy5zbmFwLnJlbGVhc2UuY2FsbChpbnN0LmVsZW1lbnQsIGV2ZW50LCAkLmV4dGVuZChpbnN0Ll91aUhhc2goKSwgeyBzbmFwSXRlbTogaW5zdC5zbmFwRWxlbWVudHNbaV0uaXRlbSB9KSkpOwoJCQkJfQoJCQkJaW5zdC5zbmFwRWxlbWVudHNbaV0uc25hcHBpbmcgPSBmYWxzZTsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQlpZiAoby5zbmFwTW9kZSAhPT0gImlubmVyIikgewoJCQkJdHMgPSBNYXRoLmFicyh0IC0geTIpIDw9IGQ7CgkJCQlicyA9IE1hdGguYWJzKGIgLSB5MSkgPD0gZDsKCQkJCWxzID0gTWF0aC5hYnMobCAtIHgyKSA8PSBkOwoJCQkJcnMgPSBNYXRoLmFicyhyIC0geDEpIDw9IGQ7CgkJCQlpZiAodHMpIHsKCQkJCQl1aS5wb3NpdGlvbi50b3AgPSBpbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLCB7IHRvcDogdCAtIGluc3QuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LCBsZWZ0OiAwIH0pLnRvcCAtIGluc3QubWFyZ2lucy50b3A7CgkJCQl9CgkJCQlpZiAoYnMpIHsKCQkJCQl1aS5wb3NpdGlvbi50b3AgPSBpbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLCB7IHRvcDogYiwgbGVmdDogMCB9KS50b3AgLSBpbnN0Lm1hcmdpbnMudG9wOwoJCQkJfQoJCQkJaWYgKGxzKSB7CgkJCQkJdWkucG9zaXRpb24ubGVmdCA9IGluc3QuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiAwLCBsZWZ0OiBsIC0gaW5zdC5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCB9KS5sZWZ0IC0gaW5zdC5tYXJnaW5zLmxlZnQ7CgkJCQl9CgkJCQlpZiAocnMpIHsKCQkJCQl1aS5wb3NpdGlvbi5sZWZ0ID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IDAsIGxlZnQ6IHIgfSkubGVmdCAtIGluc3QubWFyZ2lucy5sZWZ0OwoJCQkJfQoJCQl9CgoJCQlmaXJzdCA9ICh0cyB8fCBicyB8fCBscyB8fCBycyk7CgoJCQlpZiAoby5zbmFwTW9kZSAhPT0gIm91dGVyIikgewoJCQkJdHMgPSBNYXRoLmFicyh0IC0geTEpIDw9IGQ7CgkJCQlicyA9IE1hdGguYWJzKGIgLSB5MikgPD0gZDsKCQkJCWxzID0gTWF0aC5hYnMobCAtIHgxKSA8PSBkOwoJCQkJcnMgPSBNYXRoLmFicyhyIC0geDIpIDw9IGQ7CgkJCQlpZiAodHMpIHsKCQkJCQl1aS5wb3NpdGlvbi50b3AgPSBpbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLCB7IHRvcDogdCwgbGVmdDogMCB9KS50b3AgLSBpbnN0Lm1hcmdpbnMudG9wOwoJCQkJfQoJCQkJaWYgKGJzKSB7CgkJCQkJdWkucG9zaXRpb24udG9wID0gaW5zdC5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIiwgeyB0b3A6IGIgLSBpbnN0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodCwgbGVmdDogMCB9KS50b3AgLSBpbnN0Lm1hcmdpbnMudG9wOwoJCQkJfQoJCQkJaWYgKGxzKSB7CgkJCQkJdWkucG9zaXRpb24ubGVmdCA9IGluc3QuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIsIHsgdG9wOiAwLCBsZWZ0OiBsIH0pLmxlZnQgLSBpbnN0Lm1hcmdpbnMubGVmdDsKCQkJCX0KCQkJCWlmIChycykgewoJCQkJCXVpLnBvc2l0aW9uLmxlZnQgPSBpbnN0Ll9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLCB7IHRvcDogMCwgbGVmdDogciAtIGluc3QuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggfSkubGVmdCAtIGluc3QubWFyZ2lucy5sZWZ0OwoJCQkJfQoJCQl9CgoJCQlpZiAoIWluc3Quc25hcEVsZW1lbnRzW2ldLnNuYXBwaW5nICYmICh0cyB8fCBicyB8fCBscyB8fCBycyB8fCBmaXJzdCkpIHsKCQkJCShpbnN0Lm9wdGlvbnMuc25hcC5zbmFwICYmIGluc3Qub3B0aW9ucy5zbmFwLnNuYXAuY2FsbChpbnN0LmVsZW1lbnQsIGV2ZW50LCAkLmV4dGVuZChpbnN0Ll91aUhhc2goKSwgeyBzbmFwSXRlbTogaW5zdC5zbmFwRWxlbWVudHNbaV0uaXRlbSB9KSkpOwoJCQl9CgkJCWluc3Quc25hcEVsZW1lbnRzW2ldLnNuYXBwaW5nID0gKHRzIHx8IGJzIHx8IGxzIHx8IHJzIHx8IGZpcnN0KTsKCgkJfQoKCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsICJzdGFjayIsIHsKCXN0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIHVpLCBpbnN0YW5jZSApIHsKCQl2YXIgbWluLAoJCQlvID0gaW5zdGFuY2Uub3B0aW9ucywKCQkJZ3JvdXAgPSAkLm1ha2VBcnJheSgkKG8uc3RhY2spKS5zb3J0KGZ1bmN0aW9uKGEsYikgewoJCQkJcmV0dXJuIChwYXJzZUludCgkKGEpLmNzcygiekluZGV4IiksMTApIHx8IDApIC0gKHBhcnNlSW50KCQoYikuY3NzKCJ6SW5kZXgiKSwxMCkgfHwgMCk7CgkJCX0pOwoKCQlpZiAoIWdyb3VwLmxlbmd0aCkgeyByZXR1cm47IH0KCgkJbWluID0gcGFyc2VJbnQoJChncm91cFswXSkuY3NzKCJ6SW5kZXgiKSwgMTApIHx8IDA7CgkJJChncm91cCkuZWFjaChmdW5jdGlvbihpKSB7CgkJCSQodGhpcykuY3NzKCJ6SW5kZXgiLCBtaW4gKyBpKTsKCQl9KTsKCQl0aGlzLmNzcygiekluZGV4IiwgKG1pbiArIGdyb3VwLmxlbmd0aCkpOwoJfQp9KTsKCiQudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwgInpJbmRleCIsIHsKCXN0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIHVpLCBpbnN0YW5jZSApIHsKCQl2YXIgdCA9ICQoIHVpLmhlbHBlciApLAoJCQlvID0gaW5zdGFuY2Uub3B0aW9uczsKCgkJaWYgKHQuY3NzKCJ6SW5kZXgiKSkgewoJCQlvLl96SW5kZXggPSB0LmNzcygiekluZGV4Iik7CgkJfQoJCXQuY3NzKCJ6SW5kZXgiLCBvLnpJbmRleCk7Cgl9LAoJc3RvcDogZnVuY3Rpb24oIGV2ZW50LCB1aSwgaW5zdGFuY2UgKSB7CgkJdmFyIG8gPSBpbnN0YW5jZS5vcHRpb25zOwoKCQlpZiAoby5fekluZGV4KSB7CgkJCSQodWkuaGVscGVyKS5jc3MoInpJbmRleCIsIG8uX3pJbmRleCk7CgkJfQoJfQp9KTsKCnZhciBkcmFnZ2FibGUgPSAkLnVpLmRyYWdnYWJsZTsKCgovKiEKICogalF1ZXJ5IFVJIERyb3BwYWJsZSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9kcm9wcGFibGUvCiAqLwoKCiQud2lkZ2V0KCAidWkuZHJvcHBhYmxlIiwgewoJdmVyc2lvbjogIjEuMTEuMCIsCgl3aWRnZXRFdmVudFByZWZpeDogImRyb3AiLAoJb3B0aW9uczogewoJCWFjY2VwdDogIioiLAoJCWFjdGl2ZUNsYXNzOiBmYWxzZSwKCQlhZGRDbGFzc2VzOiB0cnVlLAoJCWdyZWVkeTogZmFsc2UsCgkJaG92ZXJDbGFzczogZmFsc2UsCgkJc2NvcGU6ICJkZWZhdWx0IiwKCQl0b2xlcmFuY2U6ICJpbnRlcnNlY3QiLAoKCQkvLyBjYWxsYmFja3MKCQlhY3RpdmF0ZTogbnVsbCwKCQlkZWFjdGl2YXRlOiBudWxsLAoJCWRyb3A6IG51bGwsCgkJb3V0OiBudWxsLAoJCW92ZXI6IG51bGwKCX0sCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCgkJdmFyIHByb3BvcnRpb25zLAoJCQlvID0gdGhpcy5vcHRpb25zLAoJCQlhY2NlcHQgPSBvLmFjY2VwdDsKCgkJdGhpcy5pc292ZXIgPSBmYWxzZTsKCQl0aGlzLmlzb3V0ID0gdHJ1ZTsKCgkJdGhpcy5hY2NlcHQgPSAkLmlzRnVuY3Rpb24oIGFjY2VwdCApID8gYWNjZXB0IDogZnVuY3Rpb24oIGQgKSB7CgkJCXJldHVybiBkLmlzKCBhY2NlcHQgKTsKCQl9OwoKCQl0aGlzLnByb3BvcnRpb25zID0gZnVuY3Rpb24oIC8qIHZhbHVlVG9Xcml0ZSAqLyApIHsKCQkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQkJLy8gU3RvcmUgdGhlIGRyb3BwYWJsZSdzIHByb3BvcnRpb25zCgkJCQlwcm9wb3J0aW9ucyA9IGFyZ3VtZW50c1sgMCBdOwoJCQl9IGVsc2UgewoJCQkJLy8gUmV0cmlldmUgb3IgZGVyaXZlIHRoZSBkcm9wcGFibGUncyBwcm9wb3J0aW9ucwoJCQkJcmV0dXJuIHByb3BvcnRpb25zID8KCQkJCQlwcm9wb3J0aW9ucyA6CgkJCQkJcHJvcG9ydGlvbnMgPSB7CgkJCQkJCXdpZHRoOiB0aGlzLmVsZW1lbnRbIDAgXS5vZmZzZXRXaWR0aCwKCQkJCQkJaGVpZ2h0OiB0aGlzLmVsZW1lbnRbIDAgXS5vZmZzZXRIZWlnaHQKCQkJCQl9OwoJCQl9CgkJfTsKCgkJdGhpcy5fYWRkVG9NYW5hZ2VyKCBvLnNjb3BlICk7CgoJCW8uYWRkQ2xhc3NlcyAmJiB0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoICJ1aS1kcm9wcGFibGUiICk7CgoJfSwKCglfYWRkVG9NYW5hZ2VyOiBmdW5jdGlvbiggc2NvcGUgKSB7CgkJLy8gQWRkIHRoZSByZWZlcmVuY2UgYW5kIHBvc2l0aW9ucyB0byB0aGUgbWFuYWdlcgoJCSQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbIHNjb3BlIF0gPSAkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzWyBzY29wZSBdIHx8IFtdOwoJCSQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbIHNjb3BlIF0ucHVzaCggdGhpcyApOwoJfSwKCglfc3BsaWNlOiBmdW5jdGlvbiggZHJvcCApIHsKCQl2YXIgaSA9IDA7CgkJZm9yICggOyBpIDwgZHJvcC5sZW5ndGg7IGkrKyApIHsKCQkJaWYgKCBkcm9wWyBpIF0gPT09IHRoaXMgKSB7CgkJCQlkcm9wLnNwbGljZSggaSwgMSApOwoJCQl9CgkJfQoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdmFyIGRyb3AgPSAkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzWyB0aGlzLm9wdGlvbnMuc2NvcGUgXTsKCgkJdGhpcy5fc3BsaWNlKCBkcm9wICk7CgoJCXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyggInVpLWRyb3BwYWJsZSB1aS1kcm9wcGFibGUtZGlzYWJsZWQiICk7Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoKCQlpZiAoIGtleSA9PT0gImFjY2VwdCIgKSB7CgkJCXRoaXMuYWNjZXB0ID0gJC5pc0Z1bmN0aW9uKCB2YWx1ZSApID8gdmFsdWUgOiBmdW5jdGlvbiggZCApIHsKCQkJCXJldHVybiBkLmlzKCB2YWx1ZSApOwoJCQl9OwoJCX0gZWxzZSBpZiAoIGtleSA9PT0gInNjb3BlIiApIHsKCQkJdmFyIGRyb3AgPSAkLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzWyB0aGlzLm9wdGlvbnMuc2NvcGUgXTsKCgkJCXRoaXMuX3NwbGljZSggZHJvcCApOwoJCQl0aGlzLl9hZGRUb01hbmFnZXIoIHZhbHVlICk7CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoJfSwKCglfYWN0aXZhdGU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgZHJhZ2dhYmxlID0gJC51aS5kZG1hbmFnZXIuY3VycmVudDsKCQlpZiAoIHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyApIHsKCQkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCB0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MgKTsKCQl9CgkJaWYgKCBkcmFnZ2FibGUgKXsKCQkJdGhpcy5fdHJpZ2dlciggImFjdGl2YXRlIiwgZXZlbnQsIHRoaXMudWkoIGRyYWdnYWJsZSApICk7CgkJfQoJfSwKCglfZGVhY3RpdmF0ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBkcmFnZ2FibGUgPSAkLnVpLmRkbWFuYWdlci5jdXJyZW50OwoJCWlmICggdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzICkgewoJCQl0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoIHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyApOwoJCX0KCQlpZiAoIGRyYWdnYWJsZSApewoJCQl0aGlzLl90cmlnZ2VyKCAiZGVhY3RpdmF0ZSIsIGV2ZW50LCB0aGlzLnVpKCBkcmFnZ2FibGUgKSApOwoJCX0KCX0sCgoJX292ZXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCgkJdmFyIGRyYWdnYWJsZSA9ICQudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7CgoJCS8vIEJhaWwgaWYgZHJhZ2dhYmxlIGFuZCBkcm9wcGFibGUgYXJlIHNhbWUgZWxlbWVudAoJCWlmICggIWRyYWdnYWJsZSB8fCAoIGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudCApWyAwIF0gPT09IHRoaXMuZWxlbWVudFsgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIHRoaXMuYWNjZXB0LmNhbGwoIHRoaXMuZWxlbWVudFsgMCBdLCAoIGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudCApICkgKSB7CgkJCWlmICggdGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MgKSB7CgkJCQl0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoIHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzICk7CgkJCX0KCQkJdGhpcy5fdHJpZ2dlciggIm92ZXIiLCBldmVudCwgdGhpcy51aSggZHJhZ2dhYmxlICkgKTsKCQl9CgoJfSwKCglfb3V0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgoJCXZhciBkcmFnZ2FibGUgPSAkLnVpLmRkbWFuYWdlci5jdXJyZW50OwoKCQkvLyBCYWlsIGlmIGRyYWdnYWJsZSBhbmQgZHJvcHBhYmxlIGFyZSBzYW1lIGVsZW1lbnQKCQlpZiAoICFkcmFnZ2FibGUgfHwgKCBkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxlLmVsZW1lbnQgKVsgMCBdID09PSB0aGlzLmVsZW1lbnRbIDAgXSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCB0aGlzLmFjY2VwdC5jYWxsKCB0aGlzLmVsZW1lbnRbIDAgXSwgKCBkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxlLmVsZW1lbnQgKSApICkgewoJCQlpZiAoIHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzICkgewoJCQkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCB0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyApOwoJCQl9CgkJCXRoaXMuX3RyaWdnZXIoICJvdXQiLCBldmVudCwgdGhpcy51aSggZHJhZ2dhYmxlICkgKTsKCQl9CgoJfSwKCglfZHJvcDogZnVuY3Rpb24oIGV2ZW50LCBjdXN0b20gKSB7CgoJCXZhciBkcmFnZ2FibGUgPSBjdXN0b20gfHwgJC51aS5kZG1hbmFnZXIuY3VycmVudCwKCQkJY2hpbGRyZW5JbnRlcnNlY3Rpb24gPSBmYWxzZTsKCgkJLy8gQmFpbCBpZiBkcmFnZ2FibGUgYW5kIGRyb3BwYWJsZSBhcmUgc2FtZSBlbGVtZW50CgkJaWYgKCAhZHJhZ2dhYmxlIHx8ICggZHJhZ2dhYmxlLmN1cnJlbnRJdGVtIHx8IGRyYWdnYWJsZS5lbGVtZW50IClbIDAgXSA9PT0gdGhpcy5lbGVtZW50WyAwIF0gKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCXRoaXMuZWxlbWVudC5maW5kKCAiOmRhdGEodWktZHJvcHBhYmxlKSIgKS5ub3QoICIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIiApLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBpbnN0ID0gJCggdGhpcyApLmRyb3BwYWJsZSggImluc3RhbmNlIiApOwoJCQlpZiAoCgkJCQlpbnN0Lm9wdGlvbnMuZ3JlZWR5ICYmCgkJCQkhaW5zdC5vcHRpb25zLmRpc2FibGVkICYmCgkJCQlpbnN0Lm9wdGlvbnMuc2NvcGUgPT09IGRyYWdnYWJsZS5vcHRpb25zLnNjb3BlICYmCgkJCQlpbnN0LmFjY2VwdC5jYWxsKCBpbnN0LmVsZW1lbnRbIDAgXSwgKCBkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxlLmVsZW1lbnQgKSApICYmCgkJCQkkLnVpLmludGVyc2VjdCggZHJhZ2dhYmxlLCAkLmV4dGVuZCggaW5zdCwgeyBvZmZzZXQ6IGluc3QuZWxlbWVudC5vZmZzZXQoKSB9ICksIGluc3Qub3B0aW9ucy50b2xlcmFuY2UgKQoJCQkpIHsgY2hpbGRyZW5JbnRlcnNlY3Rpb24gPSB0cnVlOyByZXR1cm4gZmFsc2U7IH0KCQl9KTsKCQlpZiAoIGNoaWxkcmVuSW50ZXJzZWN0aW9uICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlpZiAoIHRoaXMuYWNjZXB0LmNhbGwoIHRoaXMuZWxlbWVudFsgMCBdLCAoIGRyYWdnYWJsZS5jdXJyZW50SXRlbSB8fCBkcmFnZ2FibGUuZWxlbWVudCApICkgKSB7CgkJCWlmICggdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzICkgewoJCQkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCB0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MgKTsKCQkJfQoJCQlpZiAoIHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzICkgewoJCQkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCB0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyApOwoJCQl9CgkJCXRoaXMuX3RyaWdnZXIoICJkcm9wIiwgZXZlbnQsIHRoaXMudWkoIGRyYWdnYWJsZSApICk7CgkJCXJldHVybiB0aGlzLmVsZW1lbnQ7CgkJfQoKCQlyZXR1cm4gZmFsc2U7CgoJfSwKCgl1aTogZnVuY3Rpb24oIGMgKSB7CgkJcmV0dXJuIHsKCQkJZHJhZ2dhYmxlOiAoIGMuY3VycmVudEl0ZW0gfHwgYy5lbGVtZW50ICksCgkJCWhlbHBlcjogYy5oZWxwZXIsCgkJCXBvc2l0aW9uOiBjLnBvc2l0aW9uLAoJCQlvZmZzZXQ6IGMucG9zaXRpb25BYnMKCQl9OwoJfQoKfSk7CgokLnVpLmludGVyc2VjdCA9IChmdW5jdGlvbigpIHsKCWZ1bmN0aW9uIGlzT3ZlckF4aXMoIHgsIHJlZmVyZW5jZSwgc2l6ZSApIHsKCQlyZXR1cm4gKCB4ID49IHJlZmVyZW5jZSApICYmICggeCA8ICggcmVmZXJlbmNlICsgc2l6ZSApICk7Cgl9CgoJcmV0dXJuIGZ1bmN0aW9uKCBkcmFnZ2FibGUsIGRyb3BwYWJsZSwgdG9sZXJhbmNlTW9kZSApIHsKCgkJaWYgKCAhZHJvcHBhYmxlLm9mZnNldCApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdmFyIGRyYWdnYWJsZUxlZnQsIGRyYWdnYWJsZVRvcCwKCQkJeDEgPSAoIGRyYWdnYWJsZS5wb3NpdGlvbkFicyB8fCBkcmFnZ2FibGUucG9zaXRpb24uYWJzb2x1dGUgKS5sZWZ0LAoJCQl5MSA9ICggZHJhZ2dhYmxlLnBvc2l0aW9uQWJzIHx8IGRyYWdnYWJsZS5wb3NpdGlvbi5hYnNvbHV0ZSApLnRvcCwKCQkJeDIgPSB4MSArIGRyYWdnYWJsZS5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCwKCQkJeTIgPSB5MSArIGRyYWdnYWJsZS5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsCgkJCWwgPSBkcm9wcGFibGUub2Zmc2V0LmxlZnQsCgkJCXQgPSBkcm9wcGFibGUub2Zmc2V0LnRvcCwKCQkJciA9IGwgKyBkcm9wcGFibGUucHJvcG9ydGlvbnMoKS53aWR0aCwKCQkJYiA9IHQgKyBkcm9wcGFibGUucHJvcG9ydGlvbnMoKS5oZWlnaHQ7CgoJCXN3aXRjaCAoIHRvbGVyYW5jZU1vZGUgKSB7CgkJY2FzZSAiZml0IjoKCQkJcmV0dXJuICggbCA8PSB4MSAmJiB4MiA8PSByICYmIHQgPD0geTEgJiYgeTIgPD0gYiApOwoJCWNhc2UgImludGVyc2VjdCI6CgkJCXJldHVybiAoIGwgPCB4MSArICggZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC8gMiApICYmIC8vIFJpZ2h0IEhhbGYKCQkJCXgyIC0gKCBkcmFnZ2FibGUuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLyAyICkgPCByICYmIC8vIExlZnQgSGFsZgoJCQkJdCA8IHkxICsgKCBkcmFnZ2FibGUuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0IC8gMiApICYmIC8vIEJvdHRvbSBIYWxmCgkJCQl5MiAtICggZHJhZ2dhYmxlLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCAvIDIgKSA8IGIgKTsgLy8gVG9wIEhhbGYKCQljYXNlICJwb2ludGVyIjoKCQkJZHJhZ2dhYmxlTGVmdCA9ICggKCBkcmFnZ2FibGUucG9zaXRpb25BYnMgfHwgZHJhZ2dhYmxlLnBvc2l0aW9uLmFic29sdXRlICkubGVmdCArICggZHJhZ2dhYmxlLmNsaWNrT2Zmc2V0IHx8IGRyYWdnYWJsZS5vZmZzZXQuY2xpY2sgKS5sZWZ0ICk7CgkJCWRyYWdnYWJsZVRvcCA9ICggKCBkcmFnZ2FibGUucG9zaXRpb25BYnMgfHwgZHJhZ2dhYmxlLnBvc2l0aW9uLmFic29sdXRlICkudG9wICsgKCBkcmFnZ2FibGUuY2xpY2tPZmZzZXQgfHwgZHJhZ2dhYmxlLm9mZnNldC5jbGljayApLnRvcCApOwoJCQlyZXR1cm4gaXNPdmVyQXhpcyggZHJhZ2dhYmxlVG9wLCB0LCBkcm9wcGFibGUucHJvcG9ydGlvbnMoKS5oZWlnaHQgKSAmJiBpc092ZXJBeGlzKCBkcmFnZ2FibGVMZWZ0LCBsLCBkcm9wcGFibGUucHJvcG9ydGlvbnMoKS53aWR0aCApOwoJCWNhc2UgInRvdWNoIjoKCQkJcmV0dXJuICgKCQkJCSggeTEgPj0gdCAmJiB5MSA8PSBiICkgfHwgLy8gVG9wIGVkZ2UgdG91Y2hpbmcKCQkJCSggeTIgPj0gdCAmJiB5MiA8PSBiICkgfHwgLy8gQm90dG9tIGVkZ2UgdG91Y2hpbmcKCQkJCSggeTEgPCB0ICYmIHkyID4gYiApIC8vIFN1cnJvdW5kZWQgdmVydGljYWxseQoJCQkpICYmICgKCQkJCSggeDEgPj0gbCAmJiB4MSA8PSByICkgfHwgLy8gTGVmdCBlZGdlIHRvdWNoaW5nCgkJCQkoIHgyID49IGwgJiYgeDIgPD0gciApIHx8IC8vIFJpZ2h0IGVkZ2UgdG91Y2hpbmcKCQkJCSggeDEgPCBsICYmIHgyID4gciApIC8vIFN1cnJvdW5kZWQgaG9yaXpvbnRhbGx5CgkJCSk7CgkJZGVmYXVsdDoKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX07Cn0pKCk7CgovKgoJVGhpcyBtYW5hZ2VyIHRyYWNrcyBvZmZzZXRzIG9mIGRyYWdnYWJsZXMgYW5kIGRyb3BwYWJsZXMKKi8KJC51aS5kZG1hbmFnZXIgPSB7CgljdXJyZW50OiBudWxsLAoJZHJvcHBhYmxlczogeyAiZGVmYXVsdCI6IFtdIH0sCglwcmVwYXJlT2Zmc2V0czogZnVuY3Rpb24oIHQsIGV2ZW50ICkgewoKCQl2YXIgaSwgaiwKCQkJbSA9ICQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbIHQub3B0aW9ucy5zY29wZSBdIHx8IFtdLAoJCQl0eXBlID0gZXZlbnQgPyBldmVudC50eXBlIDogbnVsbCwgLy8gd29ya2Fyb3VuZCBmb3IgIzIzMTcKCQkJbGlzdCA9ICggdC5jdXJyZW50SXRlbSB8fCB0LmVsZW1lbnQgKS5maW5kKCAiOmRhdGEodWktZHJvcHBhYmxlKSIgKS5hZGRCYWNrKCk7CgoJCWRyb3BwYWJsZXNMb29wOiBmb3IgKCBpID0gMDsgaSA8IG0ubGVuZ3RoOyBpKysgKSB7CgoJCQkvLyBObyBkaXNhYmxlZCBhbmQgbm9uLWFjY2VwdGVkCgkJCWlmICggbVsgaSBdLm9wdGlvbnMuZGlzYWJsZWQgfHwgKCB0ICYmICFtWyBpIF0uYWNjZXB0LmNhbGwoIG1bIGkgXS5lbGVtZW50WyAwIF0sICggdC5jdXJyZW50SXRlbSB8fCB0LmVsZW1lbnQgKSApICkgKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLy8gRmlsdGVyIG91dCBlbGVtZW50cyBpbiB0aGUgY3VycmVudCBkcmFnZ2VkIGl0ZW0KCQkJZm9yICggaiA9IDA7IGogPCBsaXN0Lmxlbmd0aDsgaisrICkgewoJCQkJaWYgKCBsaXN0WyBqIF0gPT09IG1bIGkgXS5lbGVtZW50WyAwIF0gKSB7CgkJCQkJbVsgaSBdLnByb3BvcnRpb25zKCkuaGVpZ2h0ID0gMDsKCQkJCQljb250aW51ZSBkcm9wcGFibGVzTG9vcDsKCQkJCX0KCQkJfQoKCQkJbVsgaSBdLnZpc2libGUgPSBtWyBpIF0uZWxlbWVudC5jc3MoICJkaXNwbGF5IiApICE9PSAibm9uZSI7CgkJCWlmICggIW1bIGkgXS52aXNpYmxlICkgewoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIEFjdGl2YXRlIHRoZSBkcm9wcGFibGUgaWYgdXNlZCBkaXJlY3RseSBmcm9tIGRyYWdnYWJsZXMKCQkJaWYgKCB0eXBlID09PSAibW91c2Vkb3duIiApIHsKCQkJCW1bIGkgXS5fYWN0aXZhdGUuY2FsbCggbVsgaSBdLCBldmVudCApOwoJCQl9CgoJCQltWyBpIF0ub2Zmc2V0ID0gbVsgaSBdLmVsZW1lbnQub2Zmc2V0KCk7CgkJCW1bIGkgXS5wcm9wb3J0aW9ucyh7IHdpZHRoOiBtWyBpIF0uZWxlbWVudFsgMCBdLm9mZnNldFdpZHRoLCBoZWlnaHQ6IG1bIGkgXS5lbGVtZW50WyAwIF0ub2Zmc2V0SGVpZ2h0IH0pOwoKCQl9CgoJfSwKCWRyb3A6IGZ1bmN0aW9uKCBkcmFnZ2FibGUsIGV2ZW50ICkgewoKCQl2YXIgZHJvcHBlZCA9IGZhbHNlOwoJCS8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGRyb3BwYWJsZXMgaW4gY2FzZSB0aGUgbGlzdCBjaGFuZ2VzIGR1cmluZyB0aGUgZHJvcCAoIzkxMTYpCgkJJC5lYWNoKCAoICQudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbIGRyYWdnYWJsZS5vcHRpb25zLnNjb3BlIF0gfHwgW10gKS5zbGljZSgpLCBmdW5jdGlvbigpIHsKCgkJCWlmICggIXRoaXMub3B0aW9ucyApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoICF0aGlzLm9wdGlvbnMuZGlzYWJsZWQgJiYgdGhpcy52aXNpYmxlICYmICQudWkuaW50ZXJzZWN0KCBkcmFnZ2FibGUsIHRoaXMsIHRoaXMub3B0aW9ucy50b2xlcmFuY2UgKSApIHsKCQkJCWRyb3BwZWQgPSB0aGlzLl9kcm9wLmNhbGwoIHRoaXMsIGV2ZW50ICkgfHwgZHJvcHBlZDsKCQkJfQoKCQkJaWYgKCAhdGhpcy5vcHRpb25zLmRpc2FibGVkICYmIHRoaXMudmlzaWJsZSAmJiB0aGlzLmFjY2VwdC5jYWxsKCB0aGlzLmVsZW1lbnRbIDAgXSwgKCBkcmFnZ2FibGUuY3VycmVudEl0ZW0gfHwgZHJhZ2dhYmxlLmVsZW1lbnQgKSApICkgewoJCQkJdGhpcy5pc291dCA9IHRydWU7CgkJCQl0aGlzLmlzb3ZlciA9IGZhbHNlOwoJCQkJdGhpcy5fZGVhY3RpdmF0ZS5jYWxsKCB0aGlzLCBldmVudCApOwoJCQl9CgoJCX0pOwoJCXJldHVybiBkcm9wcGVkOwoKCX0sCglkcmFnU3RhcnQ6IGZ1bmN0aW9uKCBkcmFnZ2FibGUsIGV2ZW50ICkgewoJCS8vIExpc3RlbiBmb3Igc2Nyb2xsaW5nIHNvIHRoYXQgaWYgdGhlIGRyYWdnaW5nIGNhdXNlcyBzY3JvbGxpbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcm9wcGFibGVzIGNhbiBiZSByZWNhbGN1bGF0ZWQgKHNlZSAjNTAwMykKCQlkcmFnZ2FibGUuZWxlbWVudC5wYXJlbnRzVW50aWwoICJib2R5IiApLmJpbmQoICJzY3JvbGwuZHJvcHBhYmxlIiwgZnVuY3Rpb24oKSB7CgkJCWlmICggIWRyYWdnYWJsZS5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnMgKSB7CgkJCQkkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyggZHJhZ2dhYmxlLCBldmVudCApOwoJCQl9CgkJfSk7Cgl9LAoJZHJhZzogZnVuY3Rpb24oIGRyYWdnYWJsZSwgZXZlbnQgKSB7CgoJCS8vIElmIHlvdSBoYXZlIGEgaGlnaGx5IGR5bmFtaWMgcGFnZSwgeW91IG1pZ2h0IHRyeSB0aGlzIG9wdGlvbi4gSXQgcmVuZGVycyBwb3NpdGlvbnMgZXZlcnkgdGltZSB5b3UgbW92ZSB0aGUgbW91c2UuCgkJaWYgKCBkcmFnZ2FibGUub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zICkgewoJCQkkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyggZHJhZ2dhYmxlLCBldmVudCApOwoJCX0KCgkJLy8gUnVuIHRocm91Z2ggYWxsIGRyb3BwYWJsZXMgYW5kIGNoZWNrIHRoZWlyIHBvc2l0aW9ucyBiYXNlZCBvbiBzcGVjaWZpYyB0b2xlcmFuY2Ugb3B0aW9ucwoJCSQuZWFjaCggJC51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1sgZHJhZ2dhYmxlLm9wdGlvbnMuc2NvcGUgXSB8fCBbXSwgZnVuY3Rpb24oKSB7CgoJCQlpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCB8fCB0aGlzLmdyZWVkeUNoaWxkIHx8ICF0aGlzLnZpc2libGUgKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXZhciBwYXJlbnRJbnN0YW5jZSwgc2NvcGUsIHBhcmVudCwKCQkJCWludGVyc2VjdHMgPSAkLnVpLmludGVyc2VjdCggZHJhZ2dhYmxlLCB0aGlzLCB0aGlzLm9wdGlvbnMudG9sZXJhbmNlICksCgkJCQljID0gIWludGVyc2VjdHMgJiYgdGhpcy5pc292ZXIgPyAiaXNvdXQiIDogKCBpbnRlcnNlY3RzICYmICF0aGlzLmlzb3ZlciA/ICJpc292ZXIiIDogbnVsbCApOwoJCQlpZiAoICFjICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIHRoaXMub3B0aW9ucy5ncmVlZHkgKSB7CgkJCQkvLyBmaW5kIGRyb3BwYWJsZSBwYXJlbnRzIHdpdGggc2FtZSBzY29wZQoJCQkJc2NvcGUgPSB0aGlzLm9wdGlvbnMuc2NvcGU7CgkJCQlwYXJlbnQgPSB0aGlzLmVsZW1lbnQucGFyZW50cyggIjpkYXRhKHVpLWRyb3BwYWJsZSkiICkuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJCXJldHVybiAkKCB0aGlzICkuZHJvcHBhYmxlKCAiaW5zdGFuY2UiICkub3B0aW9ucy5zY29wZSA9PT0gc2NvcGU7CgkJCQl9KTsKCgkJCQlpZiAoIHBhcmVudC5sZW5ndGggKSB7CgkJCQkJcGFyZW50SW5zdGFuY2UgPSAkKCBwYXJlbnRbIDAgXSApLmRyb3BwYWJsZSggImluc3RhbmNlIiApOwoJCQkJCXBhcmVudEluc3RhbmNlLmdyZWVkeUNoaWxkID0gKCBjID09PSAiaXNvdmVyIiApOwoJCQkJfQoJCQl9CgoJCQkvLyB3ZSBqdXN0IG1vdmVkIGludG8gYSBncmVlZHkgY2hpbGQKCQkJaWYgKCBwYXJlbnRJbnN0YW5jZSAmJiBjID09PSAiaXNvdmVyIiApIHsKCQkJCXBhcmVudEluc3RhbmNlLmlzb3ZlciA9IGZhbHNlOwoJCQkJcGFyZW50SW5zdGFuY2UuaXNvdXQgPSB0cnVlOwoJCQkJcGFyZW50SW5zdGFuY2UuX291dC5jYWxsKCBwYXJlbnRJbnN0YW5jZSwgZXZlbnQgKTsKCQkJfQoKCQkJdGhpc1sgYyBdID0gdHJ1ZTsKCQkJdGhpc1tjID09PSAiaXNvdXQiID8gImlzb3ZlciIgOiAiaXNvdXQiXSA9IGZhbHNlOwoJCQl0aGlzW2MgPT09ICJpc292ZXIiID8gIl9vdmVyIiA6ICJfb3V0Il0uY2FsbCggdGhpcywgZXZlbnQgKTsKCgkJCS8vIHdlIGp1c3QgbW92ZWQgb3V0IG9mIGEgZ3JlZWR5IGNoaWxkCgkJCWlmICggcGFyZW50SW5zdGFuY2UgJiYgYyA9PT0gImlzb3V0IiApIHsKCQkJCXBhcmVudEluc3RhbmNlLmlzb3V0ID0gZmFsc2U7CgkJCQlwYXJlbnRJbnN0YW5jZS5pc292ZXIgPSB0cnVlOwoJCQkJcGFyZW50SW5zdGFuY2UuX292ZXIuY2FsbCggcGFyZW50SW5zdGFuY2UsIGV2ZW50ICk7CgkJCX0KCQl9KTsKCgl9LAoJZHJhZ1N0b3A6IGZ1bmN0aW9uKCBkcmFnZ2FibGUsIGV2ZW50ICkgewoJCWRyYWdnYWJsZS5lbGVtZW50LnBhcmVudHNVbnRpbCggImJvZHkiICkudW5iaW5kKCAic2Nyb2xsLmRyb3BwYWJsZSIgKTsKCQkvLyBDYWxsIHByZXBhcmVPZmZzZXRzIG9uZSBmaW5hbCB0aW1lIHNpbmNlIElFIGRvZXMgbm90IGZpcmUgcmV0dXJuIHNjcm9sbCBldmVudHMgd2hlbiBvdmVyZmxvdyB3YXMgY2F1c2VkIGJ5IGRyYWcgKHNlZSAjNTAwMykKCQlpZiAoICFkcmFnZ2FibGUub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zICkgewoJCQkkLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyggZHJhZ2dhYmxlLCBldmVudCApOwoJCX0KCX0KfTsKCnZhciBkcm9wcGFibGUgPSAkLnVpLmRyb3BwYWJsZTsKCgovKiEKICogalF1ZXJ5IFVJIFJlc2l6YWJsZSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9yZXNpemFibGUvCiAqLwoKCiQud2lkZ2V0KCJ1aS5yZXNpemFibGUiLCAkLnVpLm1vdXNlLCB7Cgl2ZXJzaW9uOiAiMS4xMS4wIiwKCXdpZGdldEV2ZW50UHJlZml4OiAicmVzaXplIiwKCW9wdGlvbnM6IHsKCQlhbHNvUmVzaXplOiBmYWxzZSwKCQlhbmltYXRlOiBmYWxzZSwKCQlhbmltYXRlRHVyYXRpb246ICJzbG93IiwKCQlhbmltYXRlRWFzaW5nOiAic3dpbmciLAoJCWFzcGVjdFJhdGlvOiBmYWxzZSwKCQlhdXRvSGlkZTogZmFsc2UsCgkJY29udGFpbm1lbnQ6IGZhbHNlLAoJCWdob3N0OiBmYWxzZSwKCQlncmlkOiBmYWxzZSwKCQloYW5kbGVzOiAiZSxzLHNlIiwKCQloZWxwZXI6IGZhbHNlLAoJCW1heEhlaWdodDogbnVsbCwKCQltYXhXaWR0aDogbnVsbCwKCQltaW5IZWlnaHQ6IDEwLAoJCW1pbldpZHRoOiAxMCwKCQkvLyBTZWUgIzc5NjAKCQl6SW5kZXg6IDkwLAoKCQkvLyBjYWxsYmFja3MKCQlyZXNpemU6IG51bGwsCgkJc3RhcnQ6IG51bGwsCgkJc3RvcDogbnVsbAoJfSwKCglfbnVtOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJcmV0dXJuIHBhcnNlSW50KCB2YWx1ZSwgMTAgKSB8fCAwOwoJfSwKCglfaXNOdW1iZXI6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQlyZXR1cm4gIWlzTmFOKCBwYXJzZUludCggdmFsdWUgLCAxMCApICk7Cgl9LAoKCV9oYXNTY3JvbGw6IGZ1bmN0aW9uKCBlbCwgYSApIHsKCgkJaWYgKCAkKCBlbCApLmNzcyggIm92ZXJmbG93IiApID09PSAiaGlkZGVuIikgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQl2YXIgc2Nyb2xsID0gKCBhICYmIGEgPT09ICJsZWZ0IiApID8gInNjcm9sbExlZnQiIDogInNjcm9sbFRvcCIsCgkJCWhhcyA9IGZhbHNlOwoKCQlpZiAoIGVsWyBzY3JvbGwgXSA+IDAgKSB7CgkJCXJldHVybiB0cnVlOwoJCX0KCgkJLy8gVE9ETzogZGV0ZXJtaW5lIHdoaWNoIGNhc2VzIGFjdHVhbGx5IGNhdXNlIHRoaXMgdG8gaGFwcGVuCgkJLy8gaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIHRoZSBzY3JvbGwgc2V0LCBzZWUgaWYgaXQncyBwb3NzaWJsZSB0bwoJCS8vIHNldCB0aGUgc2Nyb2xsCgkJZWxbIHNjcm9sbCBdID0gMTsKCQloYXMgPSAoIGVsWyBzY3JvbGwgXSA+IDAgKTsKCQllbFsgc2Nyb2xsIF0gPSAwOwoJCXJldHVybiBoYXM7Cgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoKCQl2YXIgbiwgaSwgaGFuZGxlLCBheGlzLCBobmFtZSwKCQkJdGhhdCA9IHRoaXMsCgkJCW8gPSB0aGlzLm9wdGlvbnM7CgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1yZXNpemFibGUiKTsKCgkJJC5leHRlbmQodGhpcywgewoJCQlfYXNwZWN0UmF0aW86ICEhKG8uYXNwZWN0UmF0aW8pLAoJCQlhc3BlY3RSYXRpbzogby5hc3BlY3RSYXRpbywKCQkJb3JpZ2luYWxFbGVtZW50OiB0aGlzLmVsZW1lbnQsCgkJCV9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzOiBbXSwKCQkJX2hlbHBlcjogby5oZWxwZXIgfHwgby5naG9zdCB8fCBvLmFuaW1hdGUgPyBvLmhlbHBlciB8fCAidWktcmVzaXphYmxlLWhlbHBlciIgOiBudWxsCgkJfSk7CgoJCS8vIFdyYXAgdGhlIGVsZW1lbnQgaWYgaXQgY2Fubm90IGhvbGQgY2hpbGQgbm9kZXMKCQlpZih0aGlzLmVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL2NhbnZhc3x0ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9ufGltZy9pKSkgewoKCQkJdGhpcy5lbGVtZW50LndyYXAoCgkJCQkkKCI8ZGl2IGNsYXNzPSd1aS13cmFwcGVyJyBzdHlsZT0nb3ZlcmZsb3c6IGhpZGRlbjsnPjwvZGl2PiIpLmNzcyh7CgkJCQkJcG9zaXRpb246IHRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIiksCgkJCQkJd2lkdGg6IHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksCgkJCQkJaGVpZ2h0OiB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSwKCQkJCQl0b3A6IHRoaXMuZWxlbWVudC5jc3MoInRvcCIpLAoJCQkJCWxlZnQ6IHRoaXMuZWxlbWVudC5jc3MoImxlZnQiKQoJCQkJfSkKCQkJKTsKCgkJCXRoaXMuZWxlbWVudCA9IHRoaXMuZWxlbWVudC5wYXJlbnQoKS5kYXRhKAoJCQkJInVpLXJlc2l6YWJsZSIsIHRoaXMuZWxlbWVudC5yZXNpemFibGUoICJpbnN0YW5jZSIgKQoJCQkpOwoKCQkJdGhpcy5lbGVtZW50SXNXcmFwcGVyID0gdHJ1ZTsKCgkJCXRoaXMuZWxlbWVudC5jc3MoeyBtYXJnaW5MZWZ0OiB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSwgbWFyZ2luVG9wOiB0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLCBtYXJnaW5SaWdodDogdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLCBtYXJnaW5Cb3R0b206IHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luQm90dG9tIikgfSk7CgkJCXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7IG1hcmdpbkxlZnQ6IDAsIG1hcmdpblRvcDogMCwgbWFyZ2luUmlnaHQ6IDAsIG1hcmdpbkJvdHRvbTogMH0pOwoJCQkvLyBzdXBwb3J0OiBTYWZhcmkKCQkJLy8gUHJldmVudCBTYWZhcmkgdGV4dGFyZWEgcmVzaXplCgkJCXRoaXMub3JpZ2luYWxSZXNpemVTdHlsZSA9IHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIik7CgkJCXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiwgIm5vbmUiKTsKCgkJCXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMucHVzaCh0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoeyBwb3NpdGlvbjogInN0YXRpYyIsIHpvb206IDEsIGRpc3BsYXk6ICJibG9jayIgfSkpOwoKCQkJLy8gc3VwcG9ydDogSUU5CgkJCS8vIGF2b2lkIElFIGp1bXAgKGhhcmQgc2V0IHRoZSBtYXJnaW4pCgkJCXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7IG1hcmdpbjogdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW4iKSB9KTsKCgkJCXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCk7CgkJfQoKCQl0aGlzLmhhbmRsZXMgPSBvLmhhbmRsZXMgfHwgKCEkKCIudWktcmVzaXphYmxlLWhhbmRsZSIsIHRoaXMuZWxlbWVudCkubGVuZ3RoID8gImUscyxzZSIgOiB7IG46ICIudWktcmVzaXphYmxlLW4iLCBlOiAiLnVpLXJlc2l6YWJsZS1lIiwgczogIi51aS1yZXNpemFibGUtcyIsIHc6ICIudWktcmVzaXphYmxlLXciLCBzZTogIi51aS1yZXNpemFibGUtc2UiLCBzdzogIi51aS1yZXNpemFibGUtc3ciLCBuZTogIi51aS1yZXNpemFibGUtbmUiLCBudzogIi51aS1yZXNpemFibGUtbnciIH0pOwoJCWlmKHRoaXMuaGFuZGxlcy5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7CgoJCQlpZiAoIHRoaXMuaGFuZGxlcyA9PT0gImFsbCIpIHsKCQkJCXRoaXMuaGFuZGxlcyA9ICJuLGUscyx3LHNlLHN3LG5lLG53IjsKCQkJfQoKCQkJbiA9IHRoaXMuaGFuZGxlcy5zcGxpdCgiLCIpOwoJCQl0aGlzLmhhbmRsZXMgPSB7fTsKCgkJCWZvcihpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHsKCgkJCQloYW5kbGUgPSAkLnRyaW0obltpXSk7CgkJCQlobmFtZSA9ICJ1aS1yZXNpemFibGUtIitoYW5kbGU7CgkJCQlheGlzID0gJCgiPGRpdiBjbGFzcz0ndWktcmVzaXphYmxlLWhhbmRsZSAiICsgaG5hbWUgKyAiJz48L2Rpdj4iKTsKCgkJCQlheGlzLmNzcyh7IHpJbmRleDogby56SW5kZXggfSk7CgoJCQkJLy8gVE9ETyA6IFdoYXQncyBnb2luZyBvbiBoZXJlPwoJCQkJaWYgKCJzZSIgPT09IGhhbmRsZSkgewoJCQkJCWF4aXMuYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UiKTsKCQkJCX0KCgkJCQl0aGlzLmhhbmRsZXNbaGFuZGxlXSA9ICIudWktcmVzaXphYmxlLSIraGFuZGxlOwoJCQkJdGhpcy5lbGVtZW50LmFwcGVuZChheGlzKTsKCQkJfQoKCQl9CgoJCXRoaXMuX3JlbmRlckF4aXMgPSBmdW5jdGlvbih0YXJnZXQpIHsKCgkJCXZhciBpLCBheGlzLCBwYWRQb3MsIHBhZFdyYXBwZXI7CgoJCQl0YXJnZXQgPSB0YXJnZXQgfHwgdGhpcy5lbGVtZW50OwoKCQkJZm9yKGkgaW4gdGhpcy5oYW5kbGVzKSB7CgoJCQkJaWYodGhpcy5oYW5kbGVzW2ldLmNvbnN0cnVjdG9yID09PSBTdHJpbmcpIHsKCQkJCQl0aGlzLmhhbmRsZXNbaV0gPSB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oIHRoaXMuaGFuZGxlc1sgaSBdICkuZmlyc3QoKS5zaG93KCk7CgkJCQl9CgoJCQkJaWYgKHRoaXMuZWxlbWVudElzV3JhcHBlciAmJiB0aGlzLm9yaWdpbmFsRWxlbWVudFswXS5ub2RlTmFtZS5tYXRjaCgvdGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbi9pKSkgewoKCQkJCQlheGlzID0gJCh0aGlzLmhhbmRsZXNbaV0sIHRoaXMuZWxlbWVudCk7CgoJCQkJCXBhZFdyYXBwZXIgPSAvc3d8bmV8bnd8c2V8bnxzLy50ZXN0KGkpID8gYXhpcy5vdXRlckhlaWdodCgpIDogYXhpcy5vdXRlcldpZHRoKCk7CgoJCQkJCXBhZFBvcyA9IFsgInBhZGRpbmciLAoJCQkJCQkvbmV8bnd8bi8udGVzdChpKSA/ICJUb3AiIDoKCQkJCQkJL3NlfHN3fHMvLnRlc3QoaSkgPyAiQm90dG9tIiA6CgkJCQkJCS9eZSQvLnRlc3QoaSkgPyAiUmlnaHQiIDogIkxlZnQiIF0uam9pbigiIik7CgoJCQkJCXRhcmdldC5jc3MocGFkUG9zLCBwYWRXcmFwcGVyKTsKCgkJCQkJdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKTsKCgkJCQl9CgoJCQkJLy8gVE9ETzogV2hhdCdzIHRoYXQgZ29vZCBmb3I/IFRoZXJlJ3Mgbm90IGFueXRoaW5nIHRvIGJlIGV4ZWN1dGVkIGxlZnQKCQkJCWlmKCEkKHRoaXMuaGFuZGxlc1tpXSkubGVuZ3RoKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCX0KCQl9OwoKCQkvLyBUT0RPOiBtYWtlIHJlbmRlckF4aXMgYSBwcm90b3R5cGUgZnVuY3Rpb24KCQl0aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCk7CgoJCXRoaXMuX2hhbmRsZXMgPSAkKCIudWktcmVzaXphYmxlLWhhbmRsZSIsIHRoaXMuZWxlbWVudCkKCQkJLmRpc2FibGVTZWxlY3Rpb24oKTsKCgkJdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKSB7CgkJCWlmICghdGhhdC5yZXNpemluZykgewoJCQkJaWYgKHRoaXMuY2xhc3NOYW1lKSB7CgkJCQkJYXhpcyA9IHRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpOwoJCQkJfQoJCQkJdGhhdC5heGlzID0gYXhpcyAmJiBheGlzWzFdID8gYXhpc1sxXSA6ICJzZSI7CgkJCX0KCQl9KTsKCgkJaWYgKG8uYXV0b0hpZGUpIHsKCQkJdGhpcy5faGFuZGxlcy5oaWRlKCk7CgkJCSQodGhpcy5lbGVtZW50KQoJCQkJLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKQoJCQkJLm1vdXNlZW50ZXIoZnVuY3Rpb24oKSB7CgkJCQkJaWYgKG8uZGlzYWJsZWQpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQkkKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKTsKCQkJCQl0aGF0Ll9oYW5kbGVzLnNob3coKTsKCQkJCX0pCgkJCQkubW91c2VsZWF2ZShmdW5jdGlvbigpewoJCQkJCWlmIChvLmRpc2FibGVkKSB7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJaWYgKCF0aGF0LnJlc2l6aW5nKSB7CgkJCQkJCSQodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpOwoJCQkJCQl0aGF0Ll9oYW5kbGVzLmhpZGUoKTsKCQkJCQl9CgkJCQl9KTsKCQl9CgoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoKCQl0aGlzLl9tb3VzZURlc3Ryb3koKTsKCgkJdmFyIHdyYXBwZXIsCgkJCV9kZXN0cm95ID0gZnVuY3Rpb24oZXhwKSB7CgkJCQkkKGV4cCkucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikKCQkJCQkucmVtb3ZlRGF0YSgicmVzaXphYmxlIikucmVtb3ZlRGF0YSgidWktcmVzaXphYmxlIikudW5iaW5kKCIucmVzaXphYmxlIikuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5yZW1vdmUoKTsKCQkJfTsKCgkJLy8gVE9ETzogVW53cmFwIGF0IHNhbWUgRE9NIHBvc2l0aW9uCgkJaWYgKHRoaXMuZWxlbWVudElzV3JhcHBlcikgewoJCQlfZGVzdHJveSh0aGlzLmVsZW1lbnQpOwoJCQl3cmFwcGVyID0gdGhpcy5lbGVtZW50OwoJCQl0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoewoJCQkJcG9zaXRpb246IHdyYXBwZXIuY3NzKCJwb3NpdGlvbiIpLAoJCQkJd2lkdGg6IHdyYXBwZXIub3V0ZXJXaWR0aCgpLAoJCQkJaGVpZ2h0OiB3cmFwcGVyLm91dGVySGVpZ2h0KCksCgkJCQl0b3A6IHdyYXBwZXIuY3NzKCJ0b3AiKSwKCQkJCWxlZnQ6IHdyYXBwZXIuY3NzKCJsZWZ0IikKCQkJfSkuaW5zZXJ0QWZ0ZXIoIHdyYXBwZXIgKTsKCQkJd3JhcHBlci5yZW1vdmUoKTsKCQl9CgoJCXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiwgdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKTsKCQlfZGVzdHJveSh0aGlzLm9yaWdpbmFsRWxlbWVudCk7CgoJCXJldHVybiB0aGlzOwoJfSwKCglfbW91c2VDYXB0dXJlOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBpLCBoYW5kbGUsCgkJCWNhcHR1cmUgPSBmYWxzZTsKCgkJZm9yIChpIGluIHRoaXMuaGFuZGxlcykgewoJCQloYW5kbGUgPSAkKHRoaXMuaGFuZGxlc1tpXSlbMF07CgkJCWlmIChoYW5kbGUgPT09IGV2ZW50LnRhcmdldCB8fCAkLmNvbnRhaW5zKGhhbmRsZSwgZXZlbnQudGFyZ2V0KSkgewoJCQkJY2FwdHVyZSA9IHRydWU7CgkJCX0KCQl9CgoJCXJldHVybiAhdGhpcy5vcHRpb25zLmRpc2FibGVkICYmIGNhcHR1cmU7Cgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgY3VybGVmdCwgY3VydG9wLCBjdXJzb3IsCgkJCW8gPSB0aGlzLm9wdGlvbnMsCgkJCWVsID0gdGhpcy5lbGVtZW50OwoKCQl0aGlzLnJlc2l6aW5nID0gdHJ1ZTsKCgkJdGhpcy5fcmVuZGVyUHJveHkoKTsKCgkJY3VybGVmdCA9IHRoaXMuX251bSh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSk7CgkJY3VydG9wID0gdGhpcy5fbnVtKHRoaXMuaGVscGVyLmNzcygidG9wIikpOwoKCQlpZiAoby5jb250YWlubWVudCkgewoJCQljdXJsZWZ0ICs9ICQoby5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpIHx8IDA7CgkJCWN1cnRvcCArPSAkKG8uY29udGFpbm1lbnQpLnNjcm9sbFRvcCgpIHx8IDA7CgkJfQoKCQl0aGlzLm9mZnNldCA9IHRoaXMuaGVscGVyLm9mZnNldCgpOwoJCXRoaXMucG9zaXRpb24gPSB7IGxlZnQ6IGN1cmxlZnQsIHRvcDogY3VydG9wIH07CgkJdGhpcy5zaXplID0gdGhpcy5faGVscGVyID8geyB3aWR0aDogdGhpcy5oZWxwZXIud2lkdGgoKSwgaGVpZ2h0OiB0aGlzLmhlbHBlci5oZWlnaHQoKSB9IDogeyB3aWR0aDogZWwud2lkdGgoKSwgaGVpZ2h0OiBlbC5oZWlnaHQoKSB9OwoJCXRoaXMub3JpZ2luYWxTaXplID0gdGhpcy5faGVscGVyID8geyB3aWR0aDogZWwub3V0ZXJXaWR0aCgpLCBoZWlnaHQ6IGVsLm91dGVySGVpZ2h0KCkgfSA6IHsgd2lkdGg6IGVsLndpZHRoKCksIGhlaWdodDogZWwuaGVpZ2h0KCkgfTsKCQl0aGlzLm9yaWdpbmFsUG9zaXRpb24gPSB7IGxlZnQ6IGN1cmxlZnQsIHRvcDogY3VydG9wIH07CgkJdGhpcy5zaXplRGlmZiA9IHsgd2lkdGg6IGVsLm91dGVyV2lkdGgoKSAtIGVsLndpZHRoKCksIGhlaWdodDogZWwub3V0ZXJIZWlnaHQoKSAtIGVsLmhlaWdodCgpIH07CgkJdGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb24gPSB7IGxlZnQ6IGV2ZW50LnBhZ2VYLCB0b3A6IGV2ZW50LnBhZ2VZIH07CgoJCXRoaXMuYXNwZWN0UmF0aW8gPSAodHlwZW9mIG8uYXNwZWN0UmF0aW8gPT09ICJudW1iZXIiKSA/IG8uYXNwZWN0UmF0aW8gOiAoKHRoaXMub3JpZ2luYWxTaXplLndpZHRoIC8gdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0KSB8fCAxKTsKCgkJY3Vyc29yID0gJCgiLnVpLXJlc2l6YWJsZS0iICsgdGhpcy5heGlzKS5jc3MoImN1cnNvciIpOwoJCSQoImJvZHkiKS5jc3MoImN1cnNvciIsIGN1cnNvciA9PT0gImF1dG8iID8gdGhpcy5heGlzICsgIi1yZXNpemUiIDogY3Vyc29yKTsKCgkJZWwuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpOwoJCXRoaXMuX3Byb3BhZ2F0ZSgic3RhcnQiLCBldmVudCk7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXZhciBkYXRhLAoJCQllbCA9IHRoaXMuaGVscGVyLCBwcm9wcyA9IHt9LAoJCQlzbXAgPSB0aGlzLm9yaWdpbmFsTW91c2VQb3NpdGlvbiwKCQkJYSA9IHRoaXMuYXhpcywKCQkJZHggPSAoZXZlbnQucGFnZVgtc21wLmxlZnQpfHwwLAoJCQlkeSA9IChldmVudC5wYWdlWS1zbXAudG9wKXx8MCwKCQkJdHJpZ2dlciA9IHRoaXMuX2NoYW5nZVthXTsKCgkJdGhpcy5wcmV2UG9zaXRpb24gPSB7CgkJCXRvcDogdGhpcy5wb3NpdGlvbi50b3AsCgkJCWxlZnQ6IHRoaXMucG9zaXRpb24ubGVmdAoJCX07CgkJdGhpcy5wcmV2U2l6ZSA9IHsKCQkJd2lkdGg6IHRoaXMuc2l6ZS53aWR0aCwKCQkJaGVpZ2h0OiB0aGlzLnNpemUuaGVpZ2h0CgkJfTsKCgkJaWYgKCF0cmlnZ2VyKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWRhdGEgPSB0cmlnZ2VyLmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSk7CgoJCXRoaXMuX3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzKGV2ZW50LnNoaWZ0S2V5KTsKCQlpZiAodGhpcy5fYXNwZWN0UmF0aW8gfHwgZXZlbnQuc2hpZnRLZXkpIHsKCQkJZGF0YSA9IHRoaXMuX3VwZGF0ZVJhdGlvKGRhdGEsIGV2ZW50KTsKCQl9CgoJCWRhdGEgPSB0aGlzLl9yZXNwZWN0U2l6ZShkYXRhLCBldmVudCk7CgoJCXRoaXMuX3VwZGF0ZUNhY2hlKGRhdGEpOwoKCQl0aGlzLl9wcm9wYWdhdGUoInJlc2l6ZSIsIGV2ZW50KTsKCgkJaWYgKCB0aGlzLnBvc2l0aW9uLnRvcCAhPT0gdGhpcy5wcmV2UG9zaXRpb24udG9wICkgewoJCQlwcm9wcy50b3AgPSB0aGlzLnBvc2l0aW9uLnRvcCArICJweCI7CgkJfQoJCWlmICggdGhpcy5wb3NpdGlvbi5sZWZ0ICE9PSB0aGlzLnByZXZQb3NpdGlvbi5sZWZ0ICkgewoJCQlwcm9wcy5sZWZ0ID0gdGhpcy5wb3NpdGlvbi5sZWZ0ICsgInB4IjsKCQl9CgkJaWYgKCB0aGlzLnNpemUud2lkdGggIT09IHRoaXMucHJldlNpemUud2lkdGggKSB7CgkJCXByb3BzLndpZHRoID0gdGhpcy5zaXplLndpZHRoICsgInB4IjsKCQl9CgkJaWYgKCB0aGlzLnNpemUuaGVpZ2h0ICE9PSB0aGlzLnByZXZTaXplLmhlaWdodCApIHsKCQkJcHJvcHMuaGVpZ2h0ID0gdGhpcy5zaXplLmhlaWdodCArICJweCI7CgkJfQoJCWVsLmNzcyggcHJvcHMgKTsKCgkJaWYgKCAhdGhpcy5faGVscGVyICYmIHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoICkgewoJCQl0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpOwoJCX0KCgkJaWYgKCAhJC5pc0VtcHR5T2JqZWN0KCBwcm9wcyApICkgewoJCQl0aGlzLl90cmlnZ2VyKCAicmVzaXplIiwgZXZlbnQsIHRoaXMudWkoKSApOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoJfSwKCglfbW91c2VTdG9wOiBmdW5jdGlvbihldmVudCkgewoKCQl0aGlzLnJlc2l6aW5nID0gZmFsc2U7CgkJdmFyIHByLCBpc3RhLCBzb2Zmc2V0aCwgc29mZnNldHcsIHMsIGxlZnQsIHRvcCwKCQkJbyA9IHRoaXMub3B0aW9ucywgdGhhdCA9IHRoaXM7CgoJCWlmKHRoaXMuX2hlbHBlcikgewoKCQkJcHIgPSB0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzOwoJCQlpc3RhID0gcHIubGVuZ3RoICYmICgvdGV4dGFyZWEvaSkudGVzdChwclswXS5ub2RlTmFtZSk7CgkJCXNvZmZzZXRoID0gaXN0YSAmJiB0aGlzLl9oYXNTY3JvbGwocHJbMF0sICJsZWZ0IikgLyogVE9ETyAtIGp1bXAgaGVpZ2h0ICovID8gMCA6IHRoYXQuc2l6ZURpZmYuaGVpZ2h0OwoJCQlzb2Zmc2V0dyA9IGlzdGEgPyAwIDogdGhhdC5zaXplRGlmZi53aWR0aDsKCgkJCXMgPSB7IHdpZHRoOiAodGhhdC5oZWxwZXIud2lkdGgoKSAgLSBzb2Zmc2V0dyksIGhlaWdodDogKHRoYXQuaGVscGVyLmhlaWdodCgpIC0gc29mZnNldGgpIH07CgkJCWxlZnQgPSAocGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygibGVmdCIpLCAxMCkgKyAodGhhdC5wb3NpdGlvbi5sZWZ0IC0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uLmxlZnQpKSB8fCBudWxsOwoJCQl0b3AgPSAocGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygidG9wIiksIDEwKSArICh0aGF0LnBvc2l0aW9uLnRvcCAtIHRoYXQub3JpZ2luYWxQb3NpdGlvbi50b3ApKSB8fCBudWxsOwoKCQkJaWYgKCFvLmFuaW1hdGUpIHsKCQkJCXRoaXMuZWxlbWVudC5jc3MoJC5leHRlbmQocywgeyB0b3A6IHRvcCwgbGVmdDogbGVmdCB9KSk7CgkJCX0KCgkJCXRoYXQuaGVscGVyLmhlaWdodCh0aGF0LnNpemUuaGVpZ2h0KTsKCQkJdGhhdC5oZWxwZXIud2lkdGgodGhhdC5zaXplLndpZHRoKTsKCgkJCWlmICh0aGlzLl9oZWxwZXIgJiYgIW8uYW5pbWF0ZSkgewoJCQkJdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKTsKCQkJfQoJCX0KCgkJJCgiYm9keSIpLmNzcygiY3Vyc29yIiwgImF1dG8iKTsKCgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKTsKCgkJdGhpcy5fcHJvcGFnYXRlKCJzdG9wIiwgZXZlbnQpOwoKCQlpZiAodGhpcy5faGVscGVyKSB7CgkJCXRoaXMuaGVscGVyLnJlbW92ZSgpOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoKCX0sCgoJX3VwZGF0ZVZpcnR1YWxCb3VuZGFyaWVzOiBmdW5jdGlvbihmb3JjZUFzcGVjdFJhdGlvKSB7CgkJdmFyIHBNaW5XaWR0aCwgcE1heFdpZHRoLCBwTWluSGVpZ2h0LCBwTWF4SGVpZ2h0LCBiLAoJCQlvID0gdGhpcy5vcHRpb25zOwoKCQliID0gewoJCQltaW5XaWR0aDogdGhpcy5faXNOdW1iZXIoby5taW5XaWR0aCkgPyBvLm1pbldpZHRoIDogMCwKCQkJbWF4V2lkdGg6IHRoaXMuX2lzTnVtYmVyKG8ubWF4V2lkdGgpID8gby5tYXhXaWR0aCA6IEluZmluaXR5LAoJCQltaW5IZWlnaHQ6IHRoaXMuX2lzTnVtYmVyKG8ubWluSGVpZ2h0KSA/IG8ubWluSGVpZ2h0IDogMCwKCQkJbWF4SGVpZ2h0OiB0aGlzLl9pc051bWJlcihvLm1heEhlaWdodCkgPyBvLm1heEhlaWdodCA6IEluZmluaXR5CgkJfTsKCgkJaWYodGhpcy5fYXNwZWN0UmF0aW8gfHwgZm9yY2VBc3BlY3RSYXRpbykgewoJCQlwTWluV2lkdGggPSBiLm1pbkhlaWdodCAqIHRoaXMuYXNwZWN0UmF0aW87CgkJCXBNaW5IZWlnaHQgPSBiLm1pbldpZHRoIC8gdGhpcy5hc3BlY3RSYXRpbzsKCQkJcE1heFdpZHRoID0gYi5tYXhIZWlnaHQgKiB0aGlzLmFzcGVjdFJhdGlvOwoJCQlwTWF4SGVpZ2h0ID0gYi5tYXhXaWR0aCAvIHRoaXMuYXNwZWN0UmF0aW87CgoJCQlpZihwTWluV2lkdGggPiBiLm1pbldpZHRoKSB7CgkJCQliLm1pbldpZHRoID0gcE1pbldpZHRoOwoJCQl9CgkJCWlmKHBNaW5IZWlnaHQgPiBiLm1pbkhlaWdodCkgewoJCQkJYi5taW5IZWlnaHQgPSBwTWluSGVpZ2h0OwoJCQl9CgkJCWlmKHBNYXhXaWR0aCA8IGIubWF4V2lkdGgpIHsKCQkJCWIubWF4V2lkdGggPSBwTWF4V2lkdGg7CgkJCX0KCQkJaWYocE1heEhlaWdodCA8IGIubWF4SGVpZ2h0KSB7CgkJCQliLm1heEhlaWdodCA9IHBNYXhIZWlnaHQ7CgkJCX0KCQl9CgkJdGhpcy5fdkJvdW5kYXJpZXMgPSBiOwoJfSwKCglfdXBkYXRlQ2FjaGU6IGZ1bmN0aW9uKGRhdGEpIHsKCQl0aGlzLm9mZnNldCA9IHRoaXMuaGVscGVyLm9mZnNldCgpOwoJCWlmICh0aGlzLl9pc051bWJlcihkYXRhLmxlZnQpKSB7CgkJCXRoaXMucG9zaXRpb24ubGVmdCA9IGRhdGEubGVmdDsKCQl9CgkJaWYgKHRoaXMuX2lzTnVtYmVyKGRhdGEudG9wKSkgewoJCQl0aGlzLnBvc2l0aW9uLnRvcCA9IGRhdGEudG9wOwoJCX0KCQlpZiAodGhpcy5faXNOdW1iZXIoZGF0YS5oZWlnaHQpKSB7CgkJCXRoaXMuc2l6ZS5oZWlnaHQgPSBkYXRhLmhlaWdodDsKCQl9CgkJaWYgKHRoaXMuX2lzTnVtYmVyKGRhdGEud2lkdGgpKSB7CgkJCXRoaXMuc2l6ZS53aWR0aCA9IGRhdGEud2lkdGg7CgkJfQoJfSwKCglfdXBkYXRlUmF0aW86IGZ1bmN0aW9uKCBkYXRhICkgewoKCQl2YXIgY3BvcyA9IHRoaXMucG9zaXRpb24sCgkJCWNzaXplID0gdGhpcy5zaXplLAoJCQlhID0gdGhpcy5heGlzOwoKCQlpZiAodGhpcy5faXNOdW1iZXIoZGF0YS5oZWlnaHQpKSB7CgkJCWRhdGEud2lkdGggPSAoZGF0YS5oZWlnaHQgKiB0aGlzLmFzcGVjdFJhdGlvKTsKCQl9IGVsc2UgaWYgKHRoaXMuX2lzTnVtYmVyKGRhdGEud2lkdGgpKSB7CgkJCWRhdGEuaGVpZ2h0ID0gKGRhdGEud2lkdGggLyB0aGlzLmFzcGVjdFJhdGlvKTsKCQl9CgoJCWlmIChhID09PSAic3ciKSB7CgkJCWRhdGEubGVmdCA9IGNwb3MubGVmdCArIChjc2l6ZS53aWR0aCAtIGRhdGEud2lkdGgpOwoJCQlkYXRhLnRvcCA9IG51bGw7CgkJfQoJCWlmIChhID09PSAibnciKSB7CgkJCWRhdGEudG9wID0gY3Bvcy50b3AgKyAoY3NpemUuaGVpZ2h0IC0gZGF0YS5oZWlnaHQpOwoJCQlkYXRhLmxlZnQgPSBjcG9zLmxlZnQgKyAoY3NpemUud2lkdGggLSBkYXRhLndpZHRoKTsKCQl9CgoJCXJldHVybiBkYXRhOwoJfSwKCglfcmVzcGVjdFNpemU6IGZ1bmN0aW9uKCBkYXRhICkgewoKCQl2YXIgbyA9IHRoaXMuX3ZCb3VuZGFyaWVzLAoJCQlhID0gdGhpcy5heGlzLAoJCQlpc21heHcgPSB0aGlzLl9pc051bWJlcihkYXRhLndpZHRoKSAmJiBvLm1heFdpZHRoICYmIChvLm1heFdpZHRoIDwgZGF0YS53aWR0aCksIGlzbWF4aCA9IHRoaXMuX2lzTnVtYmVyKGRhdGEuaGVpZ2h0KSAmJiBvLm1heEhlaWdodCAmJiAoby5tYXhIZWlnaHQgPCBkYXRhLmhlaWdodCksCgkJCWlzbWludyA9IHRoaXMuX2lzTnVtYmVyKGRhdGEud2lkdGgpICYmIG8ubWluV2lkdGggJiYgKG8ubWluV2lkdGggPiBkYXRhLndpZHRoKSwgaXNtaW5oID0gdGhpcy5faXNOdW1iZXIoZGF0YS5oZWlnaHQpICYmIG8ubWluSGVpZ2h0ICYmIChvLm1pbkhlaWdodCA+IGRhdGEuaGVpZ2h0KSwKCQkJZHcgPSB0aGlzLm9yaWdpbmFsUG9zaXRpb24ubGVmdCArIHRoaXMub3JpZ2luYWxTaXplLndpZHRoLAoJCQlkaCA9IHRoaXMucG9zaXRpb24udG9wICsgdGhpcy5zaXplLmhlaWdodCwKCQkJY3cgPSAvc3d8bnd8dy8udGVzdChhKSwgY2ggPSAvbnd8bmV8bi8udGVzdChhKTsKCQlpZiAoaXNtaW53KSB7CgkJCWRhdGEud2lkdGggPSBvLm1pbldpZHRoOwoJCX0KCQlpZiAoaXNtaW5oKSB7CgkJCWRhdGEuaGVpZ2h0ID0gby5taW5IZWlnaHQ7CgkJfQoJCWlmIChpc21heHcpIHsKCQkJZGF0YS53aWR0aCA9IG8ubWF4V2lkdGg7CgkJfQoJCWlmIChpc21heGgpIHsKCQkJZGF0YS5oZWlnaHQgPSBvLm1heEhlaWdodDsKCQl9CgoJCWlmIChpc21pbncgJiYgY3cpIHsKCQkJZGF0YS5sZWZ0ID0gZHcgLSBvLm1pbldpZHRoOwoJCX0KCQlpZiAoaXNtYXh3ICYmIGN3KSB7CgkJCWRhdGEubGVmdCA9IGR3IC0gby5tYXhXaWR0aDsKCQl9CgkJaWYgKGlzbWluaCAmJiBjaCkgewoJCQlkYXRhLnRvcCA9IGRoIC0gby5taW5IZWlnaHQ7CgkJfQoJCWlmIChpc21heGggJiYgY2gpIHsKCQkJZGF0YS50b3AgPSBkaCAtIG8ubWF4SGVpZ2h0OwoJCX0KCgkJLy8gRml4aW5nIGp1bXAgZXJyb3Igb24gdG9wL2xlZnQgLSBidWcgIzIzMzAKCQlpZiAoIWRhdGEud2lkdGggJiYgIWRhdGEuaGVpZ2h0ICYmICFkYXRhLmxlZnQgJiYgZGF0YS50b3ApIHsKCQkJZGF0YS50b3AgPSBudWxsOwoJCX0gZWxzZSBpZiAoIWRhdGEud2lkdGggJiYgIWRhdGEuaGVpZ2h0ICYmICFkYXRhLnRvcCAmJiBkYXRhLmxlZnQpIHsKCQkJZGF0YS5sZWZ0ID0gbnVsbDsKCQl9CgoJCXJldHVybiBkYXRhOwoJfSwKCglfcHJvcG9ydGlvbmFsbHlSZXNpemU6IGZ1bmN0aW9uKCkgewoKCQlpZiAoIXRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKSB7CgkJCXJldHVybjsKCQl9CgoJCXZhciBpLCBqLCBib3JkZXJzLCBwYWRkaW5ncywgcHJlbCwKCQkJZWxlbWVudCA9IHRoaXMuaGVscGVyIHx8IHRoaXMuZWxlbWVudDsKCgkJZm9yICggaT0wOyBpIDwgdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5sZW5ndGg7IGkrKykgewoKCQkJcHJlbCA9IHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHNbaV07CgoJCQlpZiAoIXRoaXMuYm9yZGVyRGlmKSB7CgkJCQl0aGlzLmJvcmRlckRpZiA9IFtdOwoJCQkJYm9yZGVycyA9IFtwcmVsLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwgcHJlbC5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSwgcHJlbC5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksIHByZWwuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV07CgkJCQlwYWRkaW5ncyA9IFtwcmVsLmNzcygicGFkZGluZ1RvcCIpLCBwcmVsLmNzcygicGFkZGluZ1JpZ2h0IiksIHByZWwuY3NzKCJwYWRkaW5nQm90dG9tIiksIHByZWwuY3NzKCJwYWRkaW5nTGVmdCIpXTsKCgkJCQlmb3IgKCBqID0gMDsgaiA8IGJvcmRlcnMubGVuZ3RoOyBqKysgKSB7CgkJCQkJdGhpcy5ib3JkZXJEaWZbIGogXSA9ICggcGFyc2VJbnQoIGJvcmRlcnNbIGogXSwgMTAgKSB8fCAwICkgKyAoIHBhcnNlSW50KCBwYWRkaW5nc1sgaiBdLCAxMCApIHx8IDAgKTsKCQkJCX0KCQkJfQoKCQkJcHJlbC5jc3MoewoJCQkJaGVpZ2h0OiAoZWxlbWVudC5oZWlnaHQoKSAtIHRoaXMuYm9yZGVyRGlmWzBdIC0gdGhpcy5ib3JkZXJEaWZbMl0pIHx8IDAsCgkJCQl3aWR0aDogKGVsZW1lbnQud2lkdGgoKSAtIHRoaXMuYm9yZGVyRGlmWzFdIC0gdGhpcy5ib3JkZXJEaWZbM10pIHx8IDAKCQkJfSk7CgoJCX0KCgl9LAoKCV9yZW5kZXJQcm94eTogZnVuY3Rpb24oKSB7CgoJCXZhciBlbCA9IHRoaXMuZWxlbWVudCwgbyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLmVsZW1lbnRPZmZzZXQgPSBlbC5vZmZzZXQoKTsKCgkJaWYodGhpcy5faGVscGVyKSB7CgoJCQl0aGlzLmhlbHBlciA9IHRoaXMuaGVscGVyIHx8ICQoIjxkaXYgc3R5bGU9J292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PiIpOwoKCQkJdGhpcy5oZWxwZXIuYWRkQ2xhc3ModGhpcy5faGVscGVyKS5jc3MoewoJCQkJd2lkdGg6IHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkgLSAxLAoJCQkJaGVpZ2h0OiB0aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSAtIDEsCgkJCQlwb3NpdGlvbjogImFic29sdXRlIiwKCQkJCWxlZnQ6IHRoaXMuZWxlbWVudE9mZnNldC5sZWZ0ICsicHgiLAoJCQkJdG9wOiB0aGlzLmVsZW1lbnRPZmZzZXQudG9wICsicHgiLAoJCQkJekluZGV4OiArK28uekluZGV4IC8vVE9ETzogRG9uJ3QgbW9kaWZ5IG9wdGlvbgoJCQl9KTsKCgkJCXRoaXMuaGVscGVyCgkJCQkuYXBwZW5kVG8oImJvZHkiKQoJCQkJLmRpc2FibGVTZWxlY3Rpb24oKTsKCgkJfSBlbHNlIHsKCQkJdGhpcy5oZWxwZXIgPSB0aGlzLmVsZW1lbnQ7CgkJfQoKCX0sCgoJX2NoYW5nZTogewoJCWU6IGZ1bmN0aW9uKGV2ZW50LCBkeCkgewoJCQlyZXR1cm4geyB3aWR0aDogdGhpcy5vcmlnaW5hbFNpemUud2lkdGggKyBkeCB9OwoJCX0sCgkJdzogZnVuY3Rpb24oZXZlbnQsIGR4KSB7CgkJCXZhciBjcyA9IHRoaXMub3JpZ2luYWxTaXplLCBzcCA9IHRoaXMub3JpZ2luYWxQb3NpdGlvbjsKCQkJcmV0dXJuIHsgbGVmdDogc3AubGVmdCArIGR4LCB3aWR0aDogY3Mud2lkdGggLSBkeCB9OwoJCX0sCgkJbjogZnVuY3Rpb24oZXZlbnQsIGR4LCBkeSkgewoJCQl2YXIgY3MgPSB0aGlzLm9yaWdpbmFsU2l6ZSwgc3AgPSB0aGlzLm9yaWdpbmFsUG9zaXRpb247CgkJCXJldHVybiB7IHRvcDogc3AudG9wICsgZHksIGhlaWdodDogY3MuaGVpZ2h0IC0gZHkgfTsKCQl9LAoJCXM6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuIHsgaGVpZ2h0OiB0aGlzLm9yaWdpbmFsU2l6ZS5oZWlnaHQgKyBkeSB9OwoJCX0sCgkJc2U6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuICQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSkpOwoJCX0sCgkJc3c6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuICQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSkpOwoJCX0sCgkJbmU6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuICQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXMuX2NoYW5nZS5lLmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSkpOwoJCX0sCgkJbnc6IGZ1bmN0aW9uKGV2ZW50LCBkeCwgZHkpIHsKCQkJcmV0dXJuICQuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsIFtldmVudCwgZHgsIGR5XSkpOwoJCX0KCX0sCgoJX3Byb3BhZ2F0ZTogZnVuY3Rpb24obiwgZXZlbnQpIHsKCQkkLnVpLnBsdWdpbi5jYWxsKHRoaXMsIG4sIFtldmVudCwgdGhpcy51aSgpXSk7CgkJKG4gIT09ICJyZXNpemUiICYmIHRoaXMuX3RyaWdnZXIobiwgZXZlbnQsIHRoaXMudWkoKSkpOwoJfSwKCglwbHVnaW5zOiB7fSwKCgl1aTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHsKCQkJb3JpZ2luYWxFbGVtZW50OiB0aGlzLm9yaWdpbmFsRWxlbWVudCwKCQkJZWxlbWVudDogdGhpcy5lbGVtZW50LAoJCQloZWxwZXI6IHRoaXMuaGVscGVyLAoJCQlwb3NpdGlvbjogdGhpcy5wb3NpdGlvbiwKCQkJc2l6ZTogdGhpcy5zaXplLAoJCQlvcmlnaW5hbFNpemU6IHRoaXMub3JpZ2luYWxTaXplLAoJCQlvcmlnaW5hbFBvc2l0aW9uOiB0aGlzLm9yaWdpbmFsUG9zaXRpb24sCgkJCXByZXZTaXplOiB0aGlzLnByZXZTaXplLAoJCQlwcmV2UG9zaXRpb246IHRoaXMucHJldlBvc2l0aW9uCgkJfTsKCX0KCn0pOwoKLyoKICogUmVzaXphYmxlIEV4dGVuc2lvbnMKICovCgokLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsICJhbmltYXRlIiwgewoKCXN0b3A6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgdGhhdCA9ICQodGhpcykucmVzaXphYmxlKCAiaW5zdGFuY2UiICksCgkJCW8gPSB0aGF0Lm9wdGlvbnMsCgkJCXByID0gdGhhdC5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cywKCQkJaXN0YSA9IHByLmxlbmd0aCAmJiAoL3RleHRhcmVhL2kpLnRlc3QocHJbMF0ubm9kZU5hbWUpLAoJCQlzb2Zmc2V0aCA9IGlzdGEgJiYgdGhhdC5faGFzU2Nyb2xsKHByWzBdLCAibGVmdCIpIC8qIFRPRE8gLSBqdW1wIGhlaWdodCAqLyA/IDAgOiB0aGF0LnNpemVEaWZmLmhlaWdodCwKCQkJc29mZnNldHcgPSBpc3RhID8gMCA6IHRoYXQuc2l6ZURpZmYud2lkdGgsCgkJCXN0eWxlID0geyB3aWR0aDogKHRoYXQuc2l6ZS53aWR0aCAtIHNvZmZzZXR3KSwgaGVpZ2h0OiAodGhhdC5zaXplLmhlaWdodCAtIHNvZmZzZXRoKSB9LAoJCQlsZWZ0ID0gKHBhcnNlSW50KHRoYXQuZWxlbWVudC5jc3MoImxlZnQiKSwgMTApICsgKHRoYXQucG9zaXRpb24ubGVmdCAtIHRoYXQub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KSkgfHwgbnVsbCwKCQkJdG9wID0gKHBhcnNlSW50KHRoYXQuZWxlbWVudC5jc3MoInRvcCIpLCAxMCkgKyAodGhhdC5wb3NpdGlvbi50b3AgLSB0aGF0Lm9yaWdpbmFsUG9zaXRpb24udG9wKSkgfHwgbnVsbDsKCgkJdGhhdC5lbGVtZW50LmFuaW1hdGUoCgkJCSQuZXh0ZW5kKHN0eWxlLCB0b3AgJiYgbGVmdCA/IHsgdG9wOiB0b3AsIGxlZnQ6IGxlZnQgfSA6IHt9KSwgewoJCQkJZHVyYXRpb246IG8uYW5pbWF0ZUR1cmF0aW9uLAoJCQkJZWFzaW5nOiBvLmFuaW1hdGVFYXNpbmcsCgkJCQlzdGVwOiBmdW5jdGlvbigpIHsKCgkJCQkJdmFyIGRhdGEgPSB7CgkJCQkJCXdpZHRoOiBwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCJ3aWR0aCIpLCAxMCksCgkJCQkJCWhlaWdodDogcGFyc2VJbnQodGhhdC5lbGVtZW50LmNzcygiaGVpZ2h0IiksIDEwKSwKCQkJCQkJdG9wOiBwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCJ0b3AiKSwgMTApLAoJCQkJCQlsZWZ0OiBwYXJzZUludCh0aGF0LmVsZW1lbnQuY3NzKCJsZWZ0IiksIDEwKQoJCQkJCX07CgoJCQkJCWlmIChwciAmJiBwci5sZW5ndGgpIHsKCQkJCQkJJChwclswXSkuY3NzKHsgd2lkdGg6IGRhdGEud2lkdGgsIGhlaWdodDogZGF0YS5oZWlnaHQgfSk7CgkJCQkJfQoKCQkJCQkvLyBwcm9wYWdhdGluZyByZXNpemUsIGFuZCB1cGRhdGluZyB2YWx1ZXMgZm9yIGVhY2ggYW5pbWF0aW9uIHN0ZXAKCQkJCQl0aGF0Ll91cGRhdGVDYWNoZShkYXRhKTsKCQkJCQl0aGF0Ll9wcm9wYWdhdGUoInJlc2l6ZSIsIGV2ZW50KTsKCgkJCQl9CgkJCX0KCQkpOwoJfQoKfSk7CgokLnVpLnBsdWdpbi5hZGQoICJyZXNpemFibGUiLCAiY29udGFpbm1lbnQiLCB7CgoJc3RhcnQ6IGZ1bmN0aW9uKCkgewoJCXZhciBlbGVtZW50LCBwLCBjbywgY2gsIGN3LCB3aWR0aCwgaGVpZ2h0LAoJCQl0aGF0ID0gJCggdGhpcyApLnJlc2l6YWJsZSggImluc3RhbmNlIiApLAoJCQlvID0gdGhhdC5vcHRpb25zLAoJCQllbCA9IHRoYXQuZWxlbWVudCwKCQkJb2MgPSBvLmNvbnRhaW5tZW50LAoJCQljZSA9ICggb2MgaW5zdGFuY2VvZiAkICkgPyBvYy5nZXQoIDAgKSA6ICggL3BhcmVudC8udGVzdCggb2MgKSApID8gZWwucGFyZW50KCkuZ2V0KCAwICkgOiBvYzsKCgkJaWYgKCAhY2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoYXQuY29udGFpbmVyRWxlbWVudCA9ICQoIGNlICk7CgoJCWlmICggL2RvY3VtZW50Ly50ZXN0KCBvYyApIHx8IG9jID09PSBkb2N1bWVudCApIHsKCQkJdGhhdC5jb250YWluZXJPZmZzZXQgPSB7CgkJCQlsZWZ0OiAwLAoJCQkJdG9wOiAwCgkJCX07CgkJCXRoYXQuY29udGFpbmVyUG9zaXRpb24gPSB7CgkJCQlsZWZ0OiAwLAoJCQkJdG9wOiAwCgkJCX07CgoJCQl0aGF0LnBhcmVudERhdGEgPSB7CgkJCQllbGVtZW50OiAkKCBkb2N1bWVudCApLAoJCQkJbGVmdDogMCwKCQkJCXRvcDogMCwKCQkJCXdpZHRoOiAkKCBkb2N1bWVudCApLndpZHRoKCksCgkJCQloZWlnaHQ6ICQoIGRvY3VtZW50ICkuaGVpZ2h0KCkgfHwgZG9jdW1lbnQuYm9keS5wYXJlbnROb2RlLnNjcm9sbEhlaWdodAoJCQl9OwoJCX0gZWxzZSB7CgkJCWVsZW1lbnQgPSAkKCBjZSApOwoJCQlwID0gW107CgkJCSQoWyAiVG9wIiwgIlJpZ2h0IiwgIkxlZnQiLCAiQm90dG9tIiBdKS5lYWNoKGZ1bmN0aW9uKCBpLCBuYW1lICkgewoJCQkJcFsgaSBdID0gdGhhdC5fbnVtKCBlbGVtZW50LmNzcyggInBhZGRpbmciICsgbmFtZSApICk7CgkJCX0pOwoKCQkJdGhhdC5jb250YWluZXJPZmZzZXQgPSBlbGVtZW50Lm9mZnNldCgpOwoJCQl0aGF0LmNvbnRhaW5lclBvc2l0aW9uID0gZWxlbWVudC5wb3NpdGlvbigpOwoJCQl0aGF0LmNvbnRhaW5lclNpemUgPSB7CgkJCQloZWlnaHQ6ICggZWxlbWVudC5pbm5lckhlaWdodCgpIC0gcFsgMyBdICksCgkJCQl3aWR0aDogKCBlbGVtZW50LmlubmVyV2lkdGgoKSAtIHBbIDEgXSApCgkJCX07CgoJCQljbyA9IHRoYXQuY29udGFpbmVyT2Zmc2V0OwoJCQljaCA9IHRoYXQuY29udGFpbmVyU2l6ZS5oZWlnaHQ7CgkJCWN3ID0gdGhhdC5jb250YWluZXJTaXplLndpZHRoOwoJCQl3aWR0aCA9ICggdGhhdC5faGFzU2Nyb2xsICggY2UsICJsZWZ0IiApID8gY2Uuc2Nyb2xsV2lkdGggOiBjdyApOwoJCQloZWlnaHQgPSAoIHRoYXQuX2hhc1Njcm9sbCAoIGNlICkgPyBjZS5zY3JvbGxIZWlnaHQgOiBjaCApIDsKCgkJCXRoYXQucGFyZW50RGF0YSA9IHsKCQkJCWVsZW1lbnQ6IGNlLAoJCQkJbGVmdDogY28ubGVmdCwKCQkJCXRvcDogY28udG9wLAoJCQkJd2lkdGg6IHdpZHRoLAoJCQkJaGVpZ2h0OiBoZWlnaHQKCQkJfTsKCQl9Cgl9LAoKCXJlc2l6ZTogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQl2YXIgd29zZXQsIGhvc2V0LCBpc1BhcmVudCwgaXNPZmZzZXRSZWxhdGl2ZSwKCQkJdGhhdCA9ICQoIHRoaXMgKS5yZXNpemFibGUoICJpbnN0YW5jZSIgKSwKCQkJbyA9IHRoYXQub3B0aW9ucywKCQkJY28gPSB0aGF0LmNvbnRhaW5lck9mZnNldCwKCQkJY3AgPSB0aGF0LnBvc2l0aW9uLAoJCQlwUmF0aW8gPSB0aGF0Ll9hc3BlY3RSYXRpbyB8fCBldmVudC5zaGlmdEtleSwKCQkJY29wID0gewoJCQkJdG9wOiAwLAoJCQkJbGVmdDogMAoJCQl9LAoJCQljZSA9IHRoYXQuY29udGFpbmVyRWxlbWVudCwKCQkJY29udGludWVSZXNpemUgPSB0cnVlOwoKCQlpZiAoIGNlWyAwIF0gIT09IGRvY3VtZW50ICYmICggL3N0YXRpYy8gKS50ZXN0KCBjZS5jc3MoICJwb3NpdGlvbiIgKSApICkgewoJCQljb3AgPSBjbzsKCQl9CgoJCWlmICggY3AubGVmdCA8ICggdGhhdC5faGVscGVyID8gY28ubGVmdCA6IDAgKSApIHsKCQkJdGhhdC5zaXplLndpZHRoID0gdGhhdC5zaXplLndpZHRoICsgKCB0aGF0Ll9oZWxwZXIgPyAoIHRoYXQucG9zaXRpb24ubGVmdCAtIGNvLmxlZnQgKSA6ICggdGhhdC5wb3NpdGlvbi5sZWZ0IC0gY29wLmxlZnQgKSApOwoJCQlpZiAoIHBSYXRpbyApIHsKCQkJCXRoYXQuc2l6ZS5oZWlnaHQgPSB0aGF0LnNpemUud2lkdGggLyB0aGF0LmFzcGVjdFJhdGlvOwoJCQkJY29udGludWVSZXNpemUgPSBmYWxzZTsKCQkJfQoJCQl0aGF0LnBvc2l0aW9uLmxlZnQgPSBvLmhlbHBlciA/IGNvLmxlZnQgOiAwOwoJCX0KCgkJaWYgKCBjcC50b3AgPCAoIHRoYXQuX2hlbHBlciA/IGNvLnRvcCA6IDAgKSApIHsKCQkJdGhhdC5zaXplLmhlaWdodCA9IHRoYXQuc2l6ZS5oZWlnaHQgKyAoIHRoYXQuX2hlbHBlciA/ICggdGhhdC5wb3NpdGlvbi50b3AgLSBjby50b3AgKSA6IHRoYXQucG9zaXRpb24udG9wICk7CgkJCWlmICggcFJhdGlvICkgewoJCQkJdGhhdC5zaXplLndpZHRoID0gdGhhdC5zaXplLmhlaWdodCAqIHRoYXQuYXNwZWN0UmF0aW87CgkJCQljb250aW51ZVJlc2l6ZSA9IGZhbHNlOwoJCQl9CgkJCXRoYXQucG9zaXRpb24udG9wID0gdGhhdC5faGVscGVyID8gY28udG9wIDogMDsKCQl9CgoJCXRoYXQub2Zmc2V0LmxlZnQgPSB0aGF0LnBhcmVudERhdGEubGVmdCArIHRoYXQucG9zaXRpb24ubGVmdDsKCQl0aGF0Lm9mZnNldC50b3AgPSB0aGF0LnBhcmVudERhdGEudG9wICsgdGhhdC5wb3NpdGlvbi50b3A7CgoJCXdvc2V0ID0gTWF0aC5hYnMoICggdGhhdC5faGVscGVyID8gdGhhdC5vZmZzZXQubGVmdCAtIGNvcC5sZWZ0IDogKCB0aGF0Lm9mZnNldC5sZWZ0IC0gY28ubGVmdCApICkgKyB0aGF0LnNpemVEaWZmLndpZHRoICk7CgkJaG9zZXQgPSBNYXRoLmFicyggKCB0aGF0Ll9oZWxwZXIgPyB0aGF0Lm9mZnNldC50b3AgLSBjb3AudG9wIDogKCB0aGF0Lm9mZnNldC50b3AgLSBjby50b3AgKSApICsgdGhhdC5zaXplRGlmZi5oZWlnaHQgKTsKCgkJaXNQYXJlbnQgPSB0aGF0LmNvbnRhaW5lckVsZW1lbnQuZ2V0KCAwICkgPT09IHRoYXQuZWxlbWVudC5wYXJlbnQoKS5nZXQoIDAgKTsKCQlpc09mZnNldFJlbGF0aXZlID0gL3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KCB0aGF0LmNvbnRhaW5lckVsZW1lbnQuY3NzKCAicG9zaXRpb24iICkgKTsKCgkJaWYgKCBpc1BhcmVudCAmJiBpc09mZnNldFJlbGF0aXZlICkgewoJCQl3b3NldCAtPSBNYXRoLmFicyggdGhhdC5wYXJlbnREYXRhLmxlZnQgKTsKCQl9CgoJCWlmICggd29zZXQgKyB0aGF0LnNpemUud2lkdGggPj0gdGhhdC5wYXJlbnREYXRhLndpZHRoICkgewoJCQl0aGF0LnNpemUud2lkdGggPSB0aGF0LnBhcmVudERhdGEud2lkdGggLSB3b3NldDsKCQkJaWYgKCBwUmF0aW8gKSB7CgkJCQl0aGF0LnNpemUuaGVpZ2h0ID0gdGhhdC5zaXplLndpZHRoIC8gdGhhdC5hc3BlY3RSYXRpbzsKCQkJCWNvbnRpbnVlUmVzaXplID0gZmFsc2U7CgkJCX0KCQl9CgoJCWlmICggaG9zZXQgKyB0aGF0LnNpemUuaGVpZ2h0ID49IHRoYXQucGFyZW50RGF0YS5oZWlnaHQgKSB7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSB0aGF0LnBhcmVudERhdGEuaGVpZ2h0IC0gaG9zZXQ7CgkJCWlmICggcFJhdGlvICkgewoJCQkJdGhhdC5zaXplLndpZHRoID0gdGhhdC5zaXplLmhlaWdodCAqIHRoYXQuYXNwZWN0UmF0aW87CgkJCQljb250aW51ZVJlc2l6ZSA9IGZhbHNlOwoJCQl9CgkJfQoKCQlpZiAoICFjb250aW51ZVJlc2l6ZSApewoJCQl0aGF0LnBvc2l0aW9uLmxlZnQgPSB1aS5wcmV2UG9zaXRpb24ubGVmdDsKCQkJdGhhdC5wb3NpdGlvbi50b3AgPSB1aS5wcmV2UG9zaXRpb24udG9wOwoJCQl0aGF0LnNpemUud2lkdGggPSB1aS5wcmV2U2l6ZS53aWR0aDsKCQkJdGhhdC5zaXplLmhlaWdodCA9IHVpLnByZXZTaXplLmhlaWdodDsKCQl9Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uKCl7CgkJdmFyIHRoYXQgPSAkKCB0aGlzICkucmVzaXphYmxlKCAiaW5zdGFuY2UiICksCgkJCW8gPSB0aGF0Lm9wdGlvbnMsCgkJCWNvID0gdGhhdC5jb250YWluZXJPZmZzZXQsCgkJCWNvcCA9IHRoYXQuY29udGFpbmVyUG9zaXRpb24sCgkJCWNlID0gdGhhdC5jb250YWluZXJFbGVtZW50LAoJCQloZWxwZXIgPSAkKCB0aGF0LmhlbHBlciApLAoJCQlobyA9IGhlbHBlci5vZmZzZXQoKSwKCQkJdyA9IGhlbHBlci5vdXRlcldpZHRoKCkgLSB0aGF0LnNpemVEaWZmLndpZHRoLAoJCQloID0gaGVscGVyLm91dGVySGVpZ2h0KCkgLSB0aGF0LnNpemVEaWZmLmhlaWdodDsKCgkJaWYgKCB0aGF0Ll9oZWxwZXIgJiYgIW8uYW5pbWF0ZSAmJiAoIC9yZWxhdGl2ZS8gKS50ZXN0KCBjZS5jc3MoICJwb3NpdGlvbiIgKSApICkgewoJCQkkKCB0aGlzICkuY3NzKHsKCQkJCWxlZnQ6IGhvLmxlZnQgLSBjb3AubGVmdCAtIGNvLmxlZnQsCgkJCQl3aWR0aDogdywKCQkJCWhlaWdodDogaAoJCQl9KTsKCQl9CgoJCWlmICggdGhhdC5faGVscGVyICYmICFvLmFuaW1hdGUgJiYgKCAvc3RhdGljLyApLnRlc3QoIGNlLmNzcyggInBvc2l0aW9uIiApICkgKSB7CgkJCSQoIHRoaXMgKS5jc3MoewoJCQkJbGVmdDogaG8ubGVmdCAtIGNvcC5sZWZ0IC0gY28ubGVmdCwKCQkJCXdpZHRoOiB3LAoJCQkJaGVpZ2h0OiBoCgkJCX0pOwoJCX0KCX0KfSk7CgokLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsICJhbHNvUmVzaXplIiwgewoKCXN0YXJ0OiBmdW5jdGlvbiAoKSB7CgkJdmFyIHRoYXQgPSAkKHRoaXMpLnJlc2l6YWJsZSggImluc3RhbmNlIiApLAoJCQlvID0gdGhhdC5vcHRpb25zLAoJCQlfc3RvcmUgPSBmdW5jdGlvbiAoZXhwKSB7CgkJCQkkKGV4cCkuZWFjaChmdW5jdGlvbigpIHsKCQkJCQl2YXIgZWwgPSAkKHRoaXMpOwoJCQkJCWVsLmRhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIiwgewoJCQkJCQl3aWR0aDogcGFyc2VJbnQoZWwud2lkdGgoKSwgMTApLCBoZWlnaHQ6IHBhcnNlSW50KGVsLmhlaWdodCgpLCAxMCksCgkJCQkJCWxlZnQ6IHBhcnNlSW50KGVsLmNzcygibGVmdCIpLCAxMCksIHRvcDogcGFyc2VJbnQoZWwuY3NzKCJ0b3AiKSwgMTApCgkJCQkJfSk7CgkJCQl9KTsKCQkJfTsKCgkJaWYgKHR5cGVvZihvLmFsc29SZXNpemUpID09PSAib2JqZWN0IiAmJiAhby5hbHNvUmVzaXplLnBhcmVudE5vZGUpIHsKCQkJaWYgKG8uYWxzb1Jlc2l6ZS5sZW5ndGgpIHsgby5hbHNvUmVzaXplID0gby5hbHNvUmVzaXplWzBdOyBfc3RvcmUoby5hbHNvUmVzaXplKTsgfQoJCQllbHNlIHsgJC5lYWNoKG8uYWxzb1Jlc2l6ZSwgZnVuY3Rpb24gKGV4cCkgeyBfc3RvcmUoZXhwKTsgfSk7IH0KCQl9ZWxzZXsKCQkJX3N0b3JlKG8uYWxzb1Jlc2l6ZSk7CgkJfQoJfSwKCglyZXNpemU6IGZ1bmN0aW9uIChldmVudCwgdWkpIHsKCQl2YXIgdGhhdCA9ICQodGhpcykucmVzaXphYmxlKCAiaW5zdGFuY2UiICksCgkJCW8gPSB0aGF0Lm9wdGlvbnMsCgkJCW9zID0gdGhhdC5vcmlnaW5hbFNpemUsCgkJCW9wID0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uLAoJCQlkZWx0YSA9IHsKCQkJCWhlaWdodDogKHRoYXQuc2l6ZS5oZWlnaHQgLSBvcy5oZWlnaHQpIHx8IDAsIHdpZHRoOiAodGhhdC5zaXplLndpZHRoIC0gb3Mud2lkdGgpIHx8IDAsCgkJCQl0b3A6ICh0aGF0LnBvc2l0aW9uLnRvcCAtIG9wLnRvcCkgfHwgMCwgbGVmdDogKHRoYXQucG9zaXRpb24ubGVmdCAtIG9wLmxlZnQpIHx8IDAKCQkJfSwKCgkJCV9hbHNvUmVzaXplID0gZnVuY3Rpb24gKGV4cCwgYykgewoJCQkJJChleHApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJdmFyIGVsID0gJCh0aGlzKSwgc3RhcnQgPSAkKHRoaXMpLmRhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIiksIHN0eWxlID0ge30sCgkJCQkJCWNzcyA9IGMgJiYgYy5sZW5ndGggPyBjIDogZWwucGFyZW50cyh1aS5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aCA/IFsid2lkdGgiLCAiaGVpZ2h0Il0gOiBbIndpZHRoIiwgImhlaWdodCIsICJ0b3AiLCAibGVmdCJdOwoKCQkJCQkkLmVhY2goY3NzLCBmdW5jdGlvbiAoaSwgcHJvcCkgewoJCQkJCQl2YXIgc3VtID0gKHN0YXJ0W3Byb3BdfHwwKSArIChkZWx0YVtwcm9wXXx8MCk7CgkJCQkJCWlmIChzdW0gJiYgc3VtID49IDApIHsKCQkJCQkJCXN0eWxlW3Byb3BdID0gc3VtIHx8IG51bGw7CgkJCQkJCX0KCQkJCQl9KTsKCgkJCQkJZWwuY3NzKHN0eWxlKTsKCQkJCX0pOwoJCQl9OwoKCQlpZiAodHlwZW9mKG8uYWxzb1Jlc2l6ZSkgPT09ICJvYmplY3QiICYmICFvLmFsc29SZXNpemUubm9kZVR5cGUpIHsKCQkJJC5lYWNoKG8uYWxzb1Jlc2l6ZSwgZnVuY3Rpb24gKGV4cCwgYykgeyBfYWxzb1Jlc2l6ZShleHAsIGMpOyB9KTsKCQl9ZWxzZXsKCQkJX2Fsc29SZXNpemUoby5hbHNvUmVzaXplKTsKCQl9Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uICgpIHsKCQkkKHRoaXMpLnJlbW92ZURhdGEoInJlc2l6YWJsZS1hbHNvcmVzaXplIik7Cgl9Cn0pOwoKJC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCAiZ2hvc3QiLCB7CgoJc3RhcnQ6IGZ1bmN0aW9uKCkgewoKCQl2YXIgdGhhdCA9ICQodGhpcykucmVzaXphYmxlKCAiaW5zdGFuY2UiICksIG8gPSB0aGF0Lm9wdGlvbnMsIGNzID0gdGhhdC5zaXplOwoKCQl0aGF0Lmdob3N0ID0gdGhhdC5vcmlnaW5hbEVsZW1lbnQuY2xvbmUoKTsKCQl0aGF0Lmdob3N0CgkJCS5jc3MoeyBvcGFjaXR5OiAwLjI1LCBkaXNwbGF5OiAiYmxvY2siLCBwb3NpdGlvbjogInJlbGF0aXZlIiwgaGVpZ2h0OiBjcy5oZWlnaHQsIHdpZHRoOiBjcy53aWR0aCwgbWFyZ2luOiAwLCBsZWZ0OiAwLCB0b3A6IDAgfSkKCQkJLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtZ2hvc3QiKQoJCQkuYWRkQ2xhc3ModHlwZW9mIG8uZ2hvc3QgPT09ICJzdHJpbmciID8gby5naG9zdCA6ICIiKTsKCgkJdGhhdC5naG9zdC5hcHBlbmRUbyh0aGF0LmhlbHBlcik7CgoJfSwKCglyZXNpemU6IGZ1bmN0aW9uKCl7CgkJdmFyIHRoYXQgPSAkKHRoaXMpLnJlc2l6YWJsZSggImluc3RhbmNlIiApOwoJCWlmICh0aGF0Lmdob3N0KSB7CgkJCXRoYXQuZ2hvc3QuY3NzKHsgcG9zaXRpb246ICJyZWxhdGl2ZSIsIGhlaWdodDogdGhhdC5zaXplLmhlaWdodCwgd2lkdGg6IHRoYXQuc2l6ZS53aWR0aCB9KTsKCQl9Cgl9LAoKCXN0b3A6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5yZXNpemFibGUoICJpbnN0YW5jZSIgKTsKCQlpZiAodGhhdC5naG9zdCAmJiB0aGF0LmhlbHBlcikgewoJCQl0aGF0LmhlbHBlci5nZXQoMCkucmVtb3ZlQ2hpbGQodGhhdC5naG9zdC5nZXQoMCkpOwoJCX0KCX0KCn0pOwoKJC51aS5wbHVnaW4uYWRkKCJyZXNpemFibGUiLCAiZ3JpZCIsIHsKCglyZXNpemU6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gJCh0aGlzKS5yZXNpemFibGUoICJpbnN0YW5jZSIgKSwKCQkJbyA9IHRoYXQub3B0aW9ucywKCQkJY3MgPSB0aGF0LnNpemUsCgkJCW9zID0gdGhhdC5vcmlnaW5hbFNpemUsCgkJCW9wID0gdGhhdC5vcmlnaW5hbFBvc2l0aW9uLAoJCQlhID0gdGhhdC5heGlzLAoJCQlncmlkID0gdHlwZW9mIG8uZ3JpZCA9PT0gIm51bWJlciIgPyBbby5ncmlkLCBvLmdyaWRdIDogby5ncmlkLAoJCQlncmlkWCA9IChncmlkWzBdfHwxKSwKCQkJZ3JpZFkgPSAoZ3JpZFsxXXx8MSksCgkJCW94ID0gTWF0aC5yb3VuZCgoY3Mud2lkdGggLSBvcy53aWR0aCkgLyBncmlkWCkgKiBncmlkWCwKCQkJb3kgPSBNYXRoLnJvdW5kKChjcy5oZWlnaHQgLSBvcy5oZWlnaHQpIC8gZ3JpZFkpICogZ3JpZFksCgkJCW5ld1dpZHRoID0gb3Mud2lkdGggKyBveCwKCQkJbmV3SGVpZ2h0ID0gb3MuaGVpZ2h0ICsgb3ksCgkJCWlzTWF4V2lkdGggPSBvLm1heFdpZHRoICYmIChvLm1heFdpZHRoIDwgbmV3V2lkdGgpLAoJCQlpc01heEhlaWdodCA9IG8ubWF4SGVpZ2h0ICYmIChvLm1heEhlaWdodCA8IG5ld0hlaWdodCksCgkJCWlzTWluV2lkdGggPSBvLm1pbldpZHRoICYmIChvLm1pbldpZHRoID4gbmV3V2lkdGgpLAoJCQlpc01pbkhlaWdodCA9IG8ubWluSGVpZ2h0ICYmIChvLm1pbkhlaWdodCA+IG5ld0hlaWdodCk7CgoJCW8uZ3JpZCA9IGdyaWQ7CgoJCWlmIChpc01pbldpZHRoKSB7CgkJCW5ld1dpZHRoID0gbmV3V2lkdGggKyBncmlkWDsKCQl9CgkJaWYgKGlzTWluSGVpZ2h0KSB7CgkJCW5ld0hlaWdodCA9IG5ld0hlaWdodCArIGdyaWRZOwoJCX0KCQlpZiAoaXNNYXhXaWR0aCkgewoJCQluZXdXaWR0aCA9IG5ld1dpZHRoIC0gZ3JpZFg7CgkJfQoJCWlmIChpc01heEhlaWdodCkgewoJCQluZXdIZWlnaHQgPSBuZXdIZWlnaHQgLSBncmlkWTsKCQl9CgoJCWlmICgvXihzZXxzfGUpJC8udGVzdChhKSkgewoJCQl0aGF0LnNpemUud2lkdGggPSBuZXdXaWR0aDsKCQkJdGhhdC5zaXplLmhlaWdodCA9IG5ld0hlaWdodDsKCQl9IGVsc2UgaWYgKC9eKG5lKSQvLnRlc3QoYSkpIHsKCQkJdGhhdC5zaXplLndpZHRoID0gbmV3V2lkdGg7CgkJCXRoYXQuc2l6ZS5oZWlnaHQgPSBuZXdIZWlnaHQ7CgkJCXRoYXQucG9zaXRpb24udG9wID0gb3AudG9wIC0gb3k7CgkJfSBlbHNlIGlmICgvXihzdykkLy50ZXN0KGEpKSB7CgkJCXRoYXQuc2l6ZS53aWR0aCA9IG5ld1dpZHRoOwoJCQl0aGF0LnNpemUuaGVpZ2h0ID0gbmV3SGVpZ2h0OwoJCQl0aGF0LnBvc2l0aW9uLmxlZnQgPSBvcC5sZWZ0IC0gb3g7CgkJfSBlbHNlIHsKCQkJaWYgKCBuZXdIZWlnaHQgLSBncmlkWSA+IDAgKSB7CgkJCQl0aGF0LnNpemUuaGVpZ2h0ID0gbmV3SGVpZ2h0OwoJCQkJdGhhdC5wb3NpdGlvbi50b3AgPSBvcC50b3AgLSBveTsKCQkJfSBlbHNlIHsKCQkJCXRoYXQuc2l6ZS5oZWlnaHQgPSBncmlkWTsKCQkJCXRoYXQucG9zaXRpb24udG9wID0gb3AudG9wICsgb3MuaGVpZ2h0IC0gZ3JpZFk7CgkJCX0KCQkJaWYgKCBuZXdXaWR0aCAtIGdyaWRYID4gMCApIHsKCQkJCXRoYXQuc2l6ZS53aWR0aCA9IG5ld1dpZHRoOwoJCQkJdGhhdC5wb3NpdGlvbi5sZWZ0ID0gb3AubGVmdCAtIG94OwoJCQl9IGVsc2UgewoJCQkJdGhhdC5zaXplLndpZHRoID0gZ3JpZFg7CgkJCQl0aGF0LnBvc2l0aW9uLmxlZnQgPSBvcC5sZWZ0ICsgb3Mud2lkdGggLSBncmlkWDsKCQkJfQoJCX0KCX0KCn0pOwoKdmFyIHJlc2l6YWJsZSA9ICQudWkucmVzaXphYmxlOwoKCi8qIQogKiBqUXVlcnkgVUkgU2VsZWN0YWJsZSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9zZWxlY3RhYmxlLwogKi8KCgp2YXIgc2VsZWN0YWJsZSA9ICQud2lkZ2V0KCJ1aS5zZWxlY3RhYmxlIiwgJC51aS5tb3VzZSwgewoJdmVyc2lvbjogIjEuMTEuMCIsCglvcHRpb25zOiB7CgkJYXBwZW5kVG86ICJib2R5IiwKCQlhdXRvUmVmcmVzaDogdHJ1ZSwKCQlkaXN0YW5jZTogMCwKCQlmaWx0ZXI6ICIqIiwKCQl0b2xlcmFuY2U6ICJ0b3VjaCIsCgoJCS8vIGNhbGxiYWNrcwoJCXNlbGVjdGVkOiBudWxsLAoJCXNlbGVjdGluZzogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsLAoJCXVuc2VsZWN0ZWQ6IG51bGwsCgkJdW5zZWxlY3Rpbmc6IG51bGwKCX0sCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl2YXIgc2VsZWN0ZWVzLAoJCQl0aGF0ID0gdGhpczsKCgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zZWxlY3RhYmxlIik7CgoJCXRoaXMuZHJhZ2dlZCA9IGZhbHNlOwoKCQkvLyBjYWNoZSBzZWxlY3RlZSBjaGlsZHJlbiBiYXNlZCBvbiBmaWx0ZXIKCQl0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbigpIHsKCQkJc2VsZWN0ZWVzID0gJCh0aGF0Lm9wdGlvbnMuZmlsdGVyLCB0aGF0LmVsZW1lbnRbMF0pOwoJCQlzZWxlY3RlZXMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIik7CgkJCXNlbGVjdGVlcy5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJdmFyICR0aGlzID0gJCh0aGlzKSwKCQkJCQlwb3MgPSAkdGhpcy5vZmZzZXQoKTsKCQkJCSQuZGF0YSh0aGlzLCAic2VsZWN0YWJsZS1pdGVtIiwgewoJCQkJCWVsZW1lbnQ6IHRoaXMsCgkJCQkJJGVsZW1lbnQ6ICR0aGlzLAoJCQkJCWxlZnQ6IHBvcy5sZWZ0LAoJCQkJCXRvcDogcG9zLnRvcCwKCQkJCQlyaWdodDogcG9zLmxlZnQgKyAkdGhpcy5vdXRlcldpZHRoKCksCgkJCQkJYm90dG9tOiBwb3MudG9wICsgJHRoaXMub3V0ZXJIZWlnaHQoKSwKCQkJCQlzdGFydHNlbGVjdGVkOiBmYWxzZSwKCQkJCQlzZWxlY3RlZDogJHRoaXMuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksCgkJCQkJc2VsZWN0aW5nOiAkdGhpcy5oYXNDbGFzcygidWktc2VsZWN0aW5nIiksCgkJCQkJdW5zZWxlY3Rpbmc6ICR0aGlzLmhhc0NsYXNzKCJ1aS11bnNlbGVjdGluZyIpCgkJCQl9KTsKCQkJfSk7CgkJfTsKCQl0aGlzLnJlZnJlc2goKTsKCgkJdGhpcy5zZWxlY3RlZXMgPSBzZWxlY3RlZXMuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIik7CgoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCQl0aGlzLmhlbHBlciA9ICQoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuc2VsZWN0ZWVzCgkJCS5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKQoJCQkucmVtb3ZlRGF0YSgic2VsZWN0YWJsZS1pdGVtIik7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcygidWktc2VsZWN0YWJsZSB1aS1zZWxlY3RhYmxlLWRpc2FibGVkIik7CgkJdGhpcy5fbW91c2VEZXN0cm95KCk7Cgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVudCkgewoJCXZhciB0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5vcG9zID0gWyBldmVudC5wYWdlWCwgZXZlbnQucGFnZVkgXTsKCgkJaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLnNlbGVjdGVlcyA9ICQob3B0aW9ucy5maWx0ZXIsIHRoaXMuZWxlbWVudFswXSk7CgoJCXRoaXMuX3RyaWdnZXIoInN0YXJ0IiwgZXZlbnQpOwoKCQkkKG9wdGlvbnMuYXBwZW5kVG8pLmFwcGVuZCh0aGlzLmhlbHBlcik7CgkJLy8gcG9zaXRpb24gaGVscGVyIChsYXNzbykKCQl0aGlzLmhlbHBlci5jc3MoewoJCQkibGVmdCI6IGV2ZW50LnBhZ2VYLAoJCQkidG9wIjogZXZlbnQucGFnZVksCgkJCSJ3aWR0aCI6IDAsCgkJCSJoZWlnaHQiOiAwCgkJfSk7CgoJCWlmIChvcHRpb25zLmF1dG9SZWZyZXNoKSB7CgkJCXRoaXMucmVmcmVzaCgpOwoJCX0KCgkJdGhpcy5zZWxlY3RlZXMuZmlsdGVyKCIudWktc2VsZWN0ZWQiKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZWN0ZWUgPSAkLmRhdGEodGhpcywgInNlbGVjdGFibGUtaXRlbSIpOwoJCQlzZWxlY3RlZS5zdGFydHNlbGVjdGVkID0gdHJ1ZTsKCQkJaWYgKCFldmVudC5tZXRhS2V5ICYmICFldmVudC5jdHJsS2V5KSB7CgkJCQlzZWxlY3RlZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTsKCQkJCXNlbGVjdGVlLnNlbGVjdGVkID0gZmFsc2U7CgkJCQlzZWxlY3RlZS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKTsKCQkJCXNlbGVjdGVlLnVuc2VsZWN0aW5nID0gdHJ1ZTsKCQkJCS8vIHNlbGVjdGFibGUgVU5TRUxFQ1RJTkcgY2FsbGJhY2sKCQkJCXRoYXQuX3RyaWdnZXIoInVuc2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQl1bnNlbGVjdGluZzogc2VsZWN0ZWUuZWxlbWVudAoJCQkJfSk7CgkJCX0KCQl9KTsKCgkJJChldmVudC50YXJnZXQpLnBhcmVudHMoKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGRvU2VsZWN0LAoJCQkJc2VsZWN0ZWUgPSAkLmRhdGEodGhpcywgInNlbGVjdGFibGUtaXRlbSIpOwoJCQlpZiAoc2VsZWN0ZWUpIHsKCQkJCWRvU2VsZWN0ID0gKCFldmVudC5tZXRhS2V5ICYmICFldmVudC5jdHJsS2V5KSB8fCAhc2VsZWN0ZWUuJGVsZW1lbnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIik7CgkJCQlzZWxlY3RlZS4kZWxlbWVudAoJCQkJCS5yZW1vdmVDbGFzcyhkb1NlbGVjdCA/ICJ1aS11bnNlbGVjdGluZyIgOiAidWktc2VsZWN0ZWQiKQoJCQkJCS5hZGRDbGFzcyhkb1NlbGVjdCA/ICJ1aS1zZWxlY3RpbmciIDogInVpLXVuc2VsZWN0aW5nIik7CgkJCQlzZWxlY3RlZS51bnNlbGVjdGluZyA9ICFkb1NlbGVjdDsKCQkJCXNlbGVjdGVlLnNlbGVjdGluZyA9IGRvU2VsZWN0OwoJCQkJc2VsZWN0ZWUuc2VsZWN0ZWQgPSBkb1NlbGVjdDsKCQkJCS8vIHNlbGVjdGFibGUgKFVOKVNFTEVDVElORyBjYWxsYmFjawoJCQkJaWYgKGRvU2VsZWN0KSB7CgkJCQkJdGhhdC5fdHJpZ2dlcigic2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQkJc2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQkJfSk7CgkJCQl9IGVsc2UgewoJCQkJCXRoYXQuX3RyaWdnZXIoInVuc2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQkJdW5zZWxlY3Rpbmc6IHNlbGVjdGVlLmVsZW1lbnQKCQkJCQl9KTsKCQkJCX0KCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCX0pOwoKCX0sCgoJX21vdXNlRHJhZzogZnVuY3Rpb24oZXZlbnQpIHsKCgkJdGhpcy5kcmFnZ2VkID0gdHJ1ZTsKCgkJaWYgKHRoaXMub3B0aW9ucy5kaXNhYmxlZCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgdG1wLAoJCQl0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJeDEgPSB0aGlzLm9wb3NbMF0sCgkJCXkxID0gdGhpcy5vcG9zWzFdLAoJCQl4MiA9IGV2ZW50LnBhZ2VYLAoJCQl5MiA9IGV2ZW50LnBhZ2VZOwoKCQlpZiAoeDEgPiB4MikgeyB0bXAgPSB4MjsgeDIgPSB4MTsgeDEgPSB0bXA7IH0KCQlpZiAoeTEgPiB5MikgeyB0bXAgPSB5MjsgeTIgPSB5MTsgeTEgPSB0bXA7IH0KCQl0aGlzLmhlbHBlci5jc3MoeyBsZWZ0OiB4MSwgdG9wOiB5MSwgd2lkdGg6IHgyIC0geDEsIGhlaWdodDogeTIgLSB5MSB9KTsKCgkJdGhpcy5zZWxlY3RlZXMuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iKSwKCQkJCWhpdCA9IGZhbHNlOwoKCQkJLy9wcmV2ZW50IGhlbHBlciBmcm9tIGJlaW5nIHNlbGVjdGVkIGlmIGFwcGVuZFRvOiBzZWxlY3RhYmxlCgkJCWlmICghc2VsZWN0ZWUgfHwgc2VsZWN0ZWUuZWxlbWVudCA9PT0gdGhhdC5lbGVtZW50WzBdKSB7CgkJCQlyZXR1cm47CgkJCX0KCgkJCWlmIChvcHRpb25zLnRvbGVyYW5jZSA9PT0gInRvdWNoIikgewoJCQkJaGl0ID0gKCAhKHNlbGVjdGVlLmxlZnQgPiB4MiB8fCBzZWxlY3RlZS5yaWdodCA8IHgxIHx8IHNlbGVjdGVlLnRvcCA+IHkyIHx8IHNlbGVjdGVlLmJvdHRvbSA8IHkxKSApOwoJCQl9IGVsc2UgaWYgKG9wdGlvbnMudG9sZXJhbmNlID09PSAiZml0IikgewoJCQkJaGl0ID0gKHNlbGVjdGVlLmxlZnQgPiB4MSAmJiBzZWxlY3RlZS5yaWdodCA8IHgyICYmIHNlbGVjdGVlLnRvcCA+IHkxICYmIHNlbGVjdGVlLmJvdHRvbSA8IHkyKTsKCQkJfQoKCQkJaWYgKGhpdCkgewoJCQkJLy8gU0VMRUNUCgkJCQlpZiAoc2VsZWN0ZWUuc2VsZWN0ZWQpIHsKCQkJCQlzZWxlY3RlZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWQiKTsKCQkJCQlzZWxlY3RlZS5zZWxlY3RlZCA9IGZhbHNlOwoJCQkJfQoJCQkJaWYgKHNlbGVjdGVlLnVuc2VsZWN0aW5nKSB7CgkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7CgkJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSBmYWxzZTsKCQkJCX0KCQkJCWlmICghc2VsZWN0ZWUuc2VsZWN0aW5nKSB7CgkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGluZyIpOwoJCQkJCXNlbGVjdGVlLnNlbGVjdGluZyA9IHRydWU7CgkJCQkJLy8gc2VsZWN0YWJsZSBTRUxFQ1RJTkcgY2FsbGJhY2sKCQkJCQl0aGF0Ll90cmlnZ2VyKCJzZWxlY3RpbmciLCBldmVudCwgewoJCQkJCQlzZWxlY3Rpbmc6IHNlbGVjdGVlLmVsZW1lbnQKCQkJCQl9KTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCS8vIFVOU0VMRUNUCgkJCQlpZiAoc2VsZWN0ZWUuc2VsZWN0aW5nKSB7CgkJCQkJaWYgKChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpICYmIHNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQpIHsKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpOwoJCQkJCQlzZWxlY3RlZS5zZWxlY3RpbmcgPSBmYWxzZTsKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIik7CgkJCQkJCXNlbGVjdGVlLnNlbGVjdGVkID0gdHJ1ZTsKCQkJCQl9IGVsc2UgewoJCQkJCQlzZWxlY3RlZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktc2VsZWN0aW5nIik7CgkJCQkJCXNlbGVjdGVlLnNlbGVjdGluZyA9IGZhbHNlOwoJCQkJCQlpZiAoc2VsZWN0ZWUuc3RhcnRzZWxlY3RlZCkgewoJCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIik7CgkJCQkJCQlzZWxlY3RlZS51bnNlbGVjdGluZyA9IHRydWU7CgkJCQkJCX0KCQkJCQkJLy8gc2VsZWN0YWJsZSBVTlNFTEVDVElORyBjYWxsYmFjawoJCQkJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGluZyIsIGV2ZW50LCB7CgkJCQkJCQl1bnNlbGVjdGluZzogc2VsZWN0ZWUuZWxlbWVudAoJCQkJCQl9KTsKCQkJCQl9CgkJCQl9CgkJCQlpZiAoc2VsZWN0ZWUuc2VsZWN0ZWQpIHsKCQkJCQlpZiAoIWV2ZW50Lm1ldGFLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIXNlbGVjdGVlLnN0YXJ0c2VsZWN0ZWQpIHsKCQkJCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIik7CgkJCQkJCXNlbGVjdGVlLnNlbGVjdGVkID0gZmFsc2U7CgoJCQkJCQlzZWxlY3RlZS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKTsKCQkJCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSB0cnVlOwoJCQkJCQkvLyBzZWxlY3RhYmxlIFVOU0VMRUNUSU5HIGNhbGxiYWNrCgkJCQkJCXRoYXQuX3RyaWdnZXIoInVuc2VsZWN0aW5nIiwgZXZlbnQsIHsKCQkJCQkJCXVuc2VsZWN0aW5nOiBzZWxlY3RlZS5lbGVtZW50CgkJCQkJCX0pOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0pOwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZVN0b3A6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQl0aGlzLmRyYWdnZWQgPSBmYWxzZTsKCgkJJCgiLnVpLXVuc2VsZWN0aW5nIiwgdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgc2VsZWN0ZWUgPSAkLmRhdGEodGhpcywgInNlbGVjdGFibGUtaXRlbSIpOwoJCQlzZWxlY3RlZS4kZWxlbWVudC5yZW1vdmVDbGFzcygidWktdW5zZWxlY3RpbmciKTsKCQkJc2VsZWN0ZWUudW5zZWxlY3RpbmcgPSBmYWxzZTsKCQkJc2VsZWN0ZWUuc3RhcnRzZWxlY3RlZCA9IGZhbHNlOwoJCQl0aGF0Ll90cmlnZ2VyKCJ1bnNlbGVjdGVkIiwgZXZlbnQsIHsKCQkJCXVuc2VsZWN0ZWQ6IHNlbGVjdGVlLmVsZW1lbnQKCQkJfSk7CgkJfSk7CgkJJCgiLnVpLXNlbGVjdGluZyIsIHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIHNlbGVjdGVlID0gJC5kYXRhKHRoaXMsICJzZWxlY3RhYmxlLWl0ZW0iKTsKCQkJc2VsZWN0ZWUuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLmFkZENsYXNzKCJ1aS1zZWxlY3RlZCIpOwoJCQlzZWxlY3RlZS5zZWxlY3RpbmcgPSBmYWxzZTsKCQkJc2VsZWN0ZWUuc2VsZWN0ZWQgPSB0cnVlOwoJCQlzZWxlY3RlZS5zdGFydHNlbGVjdGVkID0gdHJ1ZTsKCQkJdGhhdC5fdHJpZ2dlcigic2VsZWN0ZWQiLCBldmVudCwgewoJCQkJc2VsZWN0ZWQ6IHNlbGVjdGVlLmVsZW1lbnQKCQkJfSk7CgkJfSk7CgkJdGhpcy5fdHJpZ2dlcigic3RvcCIsIGV2ZW50KTsKCgkJdGhpcy5oZWxwZXIucmVtb3ZlKCk7CgoJCXJldHVybiBmYWxzZTsKCX0KCn0pOwoKCi8qIQogKiBqUXVlcnkgVUkgU29ydGFibGUgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vc29ydGFibGUvCiAqLwoKCnZhciBzb3J0YWJsZSA9ICQud2lkZ2V0KCJ1aS5zb3J0YWJsZSIsICQudWkubW91c2UsIHsKCXZlcnNpb246ICIxLjExLjAiLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICJzb3J0IiwKCXJlYWR5OiBmYWxzZSwKCW9wdGlvbnM6IHsKCQlhcHBlbmRUbzogInBhcmVudCIsCgkJYXhpczogZmFsc2UsCgkJY29ubmVjdFdpdGg6IGZhbHNlLAoJCWNvbnRhaW5tZW50OiBmYWxzZSwKCQljdXJzb3I6ICJhdXRvIiwKCQljdXJzb3JBdDogZmFsc2UsCgkJZHJvcE9uRW1wdHk6IHRydWUsCgkJZm9yY2VQbGFjZWhvbGRlclNpemU6IGZhbHNlLAoJCWZvcmNlSGVscGVyU2l6ZTogZmFsc2UsCgkJZ3JpZDogZmFsc2UsCgkJaGFuZGxlOiBmYWxzZSwKCQloZWxwZXI6ICJvcmlnaW5hbCIsCgkJaXRlbXM6ICI+ICoiLAoJCW9wYWNpdHk6IGZhbHNlLAoJCXBsYWNlaG9sZGVyOiBmYWxzZSwKCQlyZXZlcnQ6IGZhbHNlLAoJCXNjcm9sbDogdHJ1ZSwKCQlzY3JvbGxTZW5zaXRpdml0eTogMjAsCgkJc2Nyb2xsU3BlZWQ6IDIwLAoJCXNjb3BlOiAiZGVmYXVsdCIsCgkJdG9sZXJhbmNlOiAiaW50ZXJzZWN0IiwKCQl6SW5kZXg6IDEwMDAsCgoJCS8vIGNhbGxiYWNrcwoJCWFjdGl2YXRlOiBudWxsLAoJCWJlZm9yZVN0b3A6IG51bGwsCgkJY2hhbmdlOiBudWxsLAoJCWRlYWN0aXZhdGU6IG51bGwsCgkJb3V0OiBudWxsLAoJCW92ZXI6IG51bGwsCgkJcmVjZWl2ZTogbnVsbCwKCQlyZW1vdmU6IG51bGwsCgkJc29ydDogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsLAoJCXVwZGF0ZTogbnVsbAoJfSwKCglfaXNPdmVyQXhpczogZnVuY3Rpb24oIHgsIHJlZmVyZW5jZSwgc2l6ZSApIHsKCQlyZXR1cm4gKCB4ID49IHJlZmVyZW5jZSApICYmICggeCA8ICggcmVmZXJlbmNlICsgc2l6ZSApICk7Cgl9LAoKCV9pc0Zsb2F0aW5nOiBmdW5jdGlvbiggaXRlbSApIHsKCQlyZXR1cm4gKC9sZWZ0fHJpZ2h0LykudGVzdChpdGVtLmNzcygiZmxvYXQiKSkgfHwgKC9pbmxpbmV8dGFibGUtY2VsbC8pLnRlc3QoaXRlbS5jc3MoImRpc3BsYXkiKSk7Cgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoKCQl2YXIgbyA9IHRoaXMub3B0aW9uczsKCQl0aGlzLmNvbnRhaW5lckNhY2hlID0ge307CgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zb3J0YWJsZSIpOwoKCQkvL0dldCB0aGUgaXRlbXMKCQl0aGlzLnJlZnJlc2goKTsKCgkJLy9MZXQncyBkZXRlcm1pbmUgaWYgdGhlIGl0ZW1zIGFyZSBiZWluZyBkaXNwbGF5ZWQgaG9yaXpvbnRhbGx5CgkJdGhpcy5mbG9hdGluZyA9IHRoaXMuaXRlbXMubGVuZ3RoID8gby5heGlzID09PSAieCIgfHwgdGhpcy5faXNGbG9hdGluZyh0aGlzLml0ZW1zWzBdLml0ZW0pIDogZmFsc2U7CgoJCS8vTGV0J3MgZGV0ZXJtaW5lIHRoZSBwYXJlbnQncyBvZmZzZXQKCQl0aGlzLm9mZnNldCA9IHRoaXMuZWxlbWVudC5vZmZzZXQoKTsKCgkJLy9Jbml0aWFsaXplIG1vdXNlIGV2ZW50cyBmb3IgaW50ZXJhY3Rpb24KCQl0aGlzLl9tb3VzZUluaXQoKTsKCgkJdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCk7CgoJCS8vV2UncmUgcmVhZHkgdG8gZ28KCQl0aGlzLnJlYWR5ID0gdHJ1ZTsKCgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgoJCWlmICgga2V5ID09PSAiaGFuZGxlIiApIHsKCQkJdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCk7CgkJfQoJfSwKCglfc2V0SGFuZGxlQ2xhc3NOYW1lOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQuZmluZCggIi51aS1zb3J0YWJsZS1oYW5kbGUiICkucmVtb3ZlQ2xhc3MoICJ1aS1zb3J0YWJsZS1oYW5kbGUiICk7CgkJJC5lYWNoKCB0aGlzLml0ZW1zLCBmdW5jdGlvbigpIHsKCQkJKCB0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGFuZGxlID8KCQkJCXRoaXMuaXRlbS5maW5kKCB0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGFuZGxlICkgOiB0aGlzLml0ZW0gKQoJCQkJLmFkZENsYXNzKCAidWktc29ydGFibGUtaGFuZGxlIiApOwoJCX0pOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcyggInVpLXNvcnRhYmxlIHVpLXNvcnRhYmxlLWRpc2FibGVkIiApCgkJCS5maW5kKCAiLnVpLXNvcnRhYmxlLWhhbmRsZSIgKQoJCQkJLnJlbW92ZUNsYXNzKCAidWktc29ydGFibGUtaGFuZGxlIiApOwoJCXRoaXMuX21vdXNlRGVzdHJveSgpOwoKCQlmb3IgKCB2YXIgaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0gKSB7CgkJCXRoaXMuaXRlbXNbaV0uaXRlbS5yZW1vdmVEYXRhKHRoaXMud2lkZ2V0TmFtZSArICItaXRlbSIpOwoJCX0KCgkJcmV0dXJuIHRoaXM7Cgl9LAoKCV9tb3VzZUNhcHR1cmU6IGZ1bmN0aW9uKGV2ZW50LCBvdmVycmlkZUhhbmRsZSkgewoJCXZhciBjdXJyZW50SXRlbSA9IG51bGwsCgkJCXZhbGlkSGFuZGxlID0gZmFsc2UsCgkJCXRoYXQgPSB0aGlzOwoKCQlpZiAodGhpcy5yZXZlcnRpbmcpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYodGhpcy5vcHRpb25zLmRpc2FibGVkIHx8IHRoaXMub3B0aW9ucy50eXBlID09PSAic3RhdGljIikgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvL1dlIGhhdmUgdG8gcmVmcmVzaCB0aGUgaXRlbXMgZGF0YSBvbmNlIGZpcnN0CgkJdGhpcy5fcmVmcmVzaEl0ZW1zKGV2ZW50KTsKCgkJLy9GaW5kIG91dCBpZiB0aGUgY2xpY2tlZCBub2RlIChvciBvbmUgb2YgaXRzIHBhcmVudHMpIGlzIGEgYWN0dWFsIGl0ZW0gaW4gdGhpcy5pdGVtcwoJCSQoZXZlbnQudGFyZ2V0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJaWYoJC5kYXRhKHRoaXMsIHRoYXQud2lkZ2V0TmFtZSArICItaXRlbSIpID09PSB0aGF0KSB7CgkJCQljdXJyZW50SXRlbSA9ICQodGhpcyk7CgkJCQlyZXR1cm4gZmFsc2U7CgkJCX0KCQl9KTsKCQlpZigkLmRhdGEoZXZlbnQudGFyZ2V0LCB0aGF0LndpZGdldE5hbWUgKyAiLWl0ZW0iKSA9PT0gdGhhdCkgewoJCQljdXJyZW50SXRlbSA9ICQoZXZlbnQudGFyZ2V0KTsKCQl9CgoJCWlmKCFjdXJyZW50SXRlbSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmKHRoaXMub3B0aW9ucy5oYW5kbGUgJiYgIW92ZXJyaWRlSGFuZGxlKSB7CgkJCSQodGhpcy5vcHRpb25zLmhhbmRsZSwgY3VycmVudEl0ZW0pLmZpbmQoIioiKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJCWlmKHRoaXMgPT09IGV2ZW50LnRhcmdldCkgewoJCQkJCXZhbGlkSGFuZGxlID0gdHJ1ZTsKCQkJCX0KCQkJfSk7CgkJCWlmKCF2YWxpZEhhbmRsZSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJfQoKCQl0aGlzLmN1cnJlbnRJdGVtID0gY3VycmVudEl0ZW07CgkJdGhpcy5fcmVtb3ZlQ3VycmVudHNGcm9tSXRlbXMoKTsKCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV9tb3VzZVN0YXJ0OiBmdW5jdGlvbihldmVudCwgb3ZlcnJpZGVIYW5kbGUsIG5vQWN0aXZhdGlvbikgewoKCQl2YXIgaSwgYm9keSwKCQkJbyA9IHRoaXMub3B0aW9uczsKCgkJdGhpcy5jdXJyZW50Q29udGFpbmVyID0gdGhpczsKCgkJLy9XZSBvbmx5IG5lZWQgdG8gY2FsbCByZWZyZXNoUG9zaXRpb25zLCBiZWNhdXNlIHRoZSByZWZyZXNoSXRlbXMgY2FsbCBoYXMgYmVlbiBtb3ZlZCB0byBtb3VzZUNhcHR1cmUKCQl0aGlzLnJlZnJlc2hQb3NpdGlvbnMoKTsKCgkJLy9DcmVhdGUgYW5kIGFwcGVuZCB0aGUgdmlzaWJsZSBoZWxwZXIKCQl0aGlzLmhlbHBlciA9IHRoaXMuX2NyZWF0ZUhlbHBlcihldmVudCk7CgoJCS8vQ2FjaGUgdGhlIGhlbHBlciBzaXplCgkJdGhpcy5fY2FjaGVIZWxwZXJQcm9wb3J0aW9ucygpOwoKCQkvKgoJCSAqIC0gUG9zaXRpb24gZ2VuZXJhdGlvbiAtCgkJICogVGhpcyBibG9jayBnZW5lcmF0ZXMgZXZlcnl0aGluZyBwb3NpdGlvbiByZWxhdGVkIC0gaXQncyB0aGUgY29yZSBvZiBkcmFnZ2FibGVzLgoJCSAqLwoKCQkvL0NhY2hlIHRoZSBtYXJnaW5zIG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50CgkJdGhpcy5fY2FjaGVNYXJnaW5zKCk7CgoJCS8vR2V0IHRoZSBuZXh0IHNjcm9sbGluZyBwYXJlbnQKCQl0aGlzLnNjcm9sbFBhcmVudCA9IHRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCgpOwoKCQkvL1RoZSBlbGVtZW50J3MgYWJzb2x1dGUgcG9zaXRpb24gb24gdGhlIHBhZ2UgbWludXMgbWFyZ2lucwoJCXRoaXMub2Zmc2V0ID0gdGhpcy5jdXJyZW50SXRlbS5vZmZzZXQoKTsKCQl0aGlzLm9mZnNldCA9IHsKCQkJdG9wOiB0aGlzLm9mZnNldC50b3AgLSB0aGlzLm1hcmdpbnMudG9wLAoJCQlsZWZ0OiB0aGlzLm9mZnNldC5sZWZ0IC0gdGhpcy5tYXJnaW5zLmxlZnQKCQl9OwoKCQkkLmV4dGVuZCh0aGlzLm9mZnNldCwgewoJCQljbGljazogeyAvL1doZXJlIHRoZSBjbGljayBoYXBwZW5lZCwgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQKCQkJCWxlZnQ6IGV2ZW50LnBhZ2VYIC0gdGhpcy5vZmZzZXQubGVmdCwKCQkJCXRvcDogZXZlbnQucGFnZVkgLSB0aGlzLm9mZnNldC50b3AKCQkJfSwKCQkJcGFyZW50OiB0aGlzLl9nZXRQYXJlbnRPZmZzZXQoKSwKCQkJcmVsYXRpdmU6IHRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCkgLy9UaGlzIGlzIGEgcmVsYXRpdmUgdG8gYWJzb2x1dGUgcG9zaXRpb24gbWludXMgdGhlIGFjdHVhbCBwb3NpdGlvbiBjYWxjdWxhdGlvbiAtIG9ubHkgdXNlZCBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBoZWxwZXIKCQl9KTsKCgkJLy8gT25seSBhZnRlciB3ZSBnb3QgdGhlIG9mZnNldCwgd2UgY2FuIGNoYW5nZSB0aGUgaGVscGVyJ3MgcG9zaXRpb24gdG8gYWJzb2x1dGUKCQkvLyBUT0RPOiBTdGlsbCBuZWVkIHRvIGZpZ3VyZSBvdXQgYSB3YXkgdG8gbWFrZSByZWxhdGl2ZSBzb3J0aW5nIHBvc3NpYmxlCgkJdGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpOwoJCXRoaXMuY3NzUG9zaXRpb24gPSB0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIik7CgoJCS8vR2VuZXJhdGUgdGhlIG9yaWdpbmFsIHBvc2l0aW9uCgkJdGhpcy5vcmlnaW5hbFBvc2l0aW9uID0gdGhpcy5fZ2VuZXJhdGVQb3NpdGlvbihldmVudCk7CgkJdGhpcy5vcmlnaW5hbFBhZ2VYID0gZXZlbnQucGFnZVg7CgkJdGhpcy5vcmlnaW5hbFBhZ2VZID0gZXZlbnQucGFnZVk7CgoJCS8vQWRqdXN0IHRoZSBtb3VzZSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGhlbHBlciBpZiAiY3Vyc29yQXQiIGlzIHN1cHBsaWVkCgkJKG8uY3Vyc29yQXQgJiYgdGhpcy5fYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcihvLmN1cnNvckF0KSk7CgoJCS8vQ2FjaGUgdGhlIGZvcm1lciBET00gcG9zaXRpb24KCQl0aGlzLmRvbVBvc2l0aW9uID0geyBwcmV2OiB0aGlzLmN1cnJlbnRJdGVtLnByZXYoKVswXSwgcGFyZW50OiB0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdIH07CgoJCS8vSWYgdGhlIGhlbHBlciBpcyBub3QgdGhlIG9yaWdpbmFsLCBoaWRlIHRoZSBvcmlnaW5hbCBzbyBpdCdzIG5vdCBwbGF5aW5nIGFueSByb2xlIGR1cmluZyB0aGUgZHJhZywgd29uJ3QgY2F1c2UgYW55dGhpbmcgYmFkIHRoaXMgd2F5CgkJaWYodGhpcy5oZWxwZXJbMF0gIT09IHRoaXMuY3VycmVudEl0ZW1bMF0pIHsKCQkJdGhpcy5jdXJyZW50SXRlbS5oaWRlKCk7CgkJfQoKCQkvL0NyZWF0ZSB0aGUgcGxhY2Vob2xkZXIKCQl0aGlzLl9jcmVhdGVQbGFjZWhvbGRlcigpOwoKCQkvL1NldCBhIGNvbnRhaW5tZW50IGlmIGdpdmVuIGluIHRoZSBvcHRpb25zCgkJaWYoby5jb250YWlubWVudCkgewoJCQl0aGlzLl9zZXRDb250YWlubWVudCgpOwoJCX0KCgkJaWYoIG8uY3Vyc29yICYmIG8uY3Vyc29yICE9PSAiYXV0byIgKSB7IC8vIGN1cnNvciBvcHRpb24KCQkJYm9keSA9IHRoaXMuZG9jdW1lbnQuZmluZCggImJvZHkiICk7CgoJCQkvLyBzdXBwb3J0OiBJRQoJCQl0aGlzLnN0b3JlZEN1cnNvciA9IGJvZHkuY3NzKCAiY3Vyc29yIiApOwoJCQlib2R5LmNzcyggImN1cnNvciIsIG8uY3Vyc29yICk7CgoJCQl0aGlzLnN0b3JlZFN0eWxlc2hlZXQgPSAkKCAiPHN0eWxlPip7IGN1cnNvcjogIitvLmN1cnNvcisiICFpbXBvcnRhbnQ7IH08L3N0eWxlPiIgKS5hcHBlbmRUbyggYm9keSApOwoJCX0KCgkJaWYoby5vcGFjaXR5KSB7IC8vIG9wYWNpdHkgb3B0aW9uCgkJCWlmICh0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSkgewoJCQkJdGhpcy5fc3RvcmVkT3BhY2l0eSA9IHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIpOwoJCQl9CgkJCXRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsIG8ub3BhY2l0eSk7CgkJfQoKCQlpZihvLnpJbmRleCkgeyAvLyB6SW5kZXggb3B0aW9uCgkJCWlmICh0aGlzLmhlbHBlci5jc3MoInpJbmRleCIpKSB7CgkJCQl0aGlzLl9zdG9yZWRaSW5kZXggPSB0aGlzLmhlbHBlci5jc3MoInpJbmRleCIpOwoJCQl9CgkJCXRoaXMuaGVscGVyLmNzcygiekluZGV4Iiwgby56SW5kZXgpOwoJCX0KCgkJLy9QcmVwYXJlIHNjcm9sbGluZwoJCWlmKHRoaXMuc2Nyb2xsUGFyZW50WzBdICE9PSBkb2N1bWVudCAmJiB0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lICE9PSAiSFRNTCIpIHsKCQkJdGhpcy5vdmVyZmxvd09mZnNldCA9IHRoaXMuc2Nyb2xsUGFyZW50Lm9mZnNldCgpOwoJCX0KCgkJLy9DYWxsIGNhbGxiYWNrcwoJCXRoaXMuX3RyaWdnZXIoInN0YXJ0IiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCgkJLy9SZWNhY2hlIHRoZSBoZWxwZXIgc2l6ZQoJCWlmKCF0aGlzLl9wcmVzZXJ2ZUhlbHBlclByb3BvcnRpb25zKSB7CgkJCXRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKTsKCQl9CgoKCQkvL1Bvc3QgImFjdGl2YXRlIiBldmVudHMgdG8gcG9zc2libGUgY29udGFpbmVycwoJCWlmKCAhbm9BY3RpdmF0aW9uICkgewoJCQlmb3IgKCBpID0gdGhpcy5jb250YWluZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkgewoJCQkJdGhpcy5jb250YWluZXJzWyBpIF0uX3RyaWdnZXIoICJhY3RpdmF0ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2goIHRoaXMgKSApOwoJCQl9CgkJfQoKCQkvL1ByZXBhcmUgcG9zc2libGUgZHJvcHBhYmxlcwoJCWlmKCQudWkuZGRtYW5hZ2VyKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmN1cnJlbnQgPSB0aGlzOwoJCX0KCgkJaWYgKCQudWkuZGRtYW5hZ2VyICYmICFvLmRyb3BCZWhhdmlvdXIpIHsKCQkJJC51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcywgZXZlbnQpOwoJCX0KCgkJdGhpcy5kcmFnZ2luZyA9IHRydWU7CgoJCXRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKTsKCQl0aGlzLl9tb3VzZURyYWcoZXZlbnQpOyAvL0V4ZWN1dGUgdGhlIGRyYWcgb25jZSAtIHRoaXMgY2F1c2VzIHRoZSBoZWxwZXIgbm90IHRvIGJlIHZpc2libGUgYmVmb3JlIGdldHRpbmcgaXRzIGNvcnJlY3QgcG9zaXRpb24KCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIGksIGl0ZW0sIGl0ZW1FbGVtZW50LCBpbnRlcnNlY3Rpb24sCgkJCW8gPSB0aGlzLm9wdGlvbnMsCgkJCXNjcm9sbGVkID0gZmFsc2U7CgoJCS8vQ29tcHV0ZSB0aGUgaGVscGVycyBwb3NpdGlvbgoJCXRoaXMucG9zaXRpb24gPSB0aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKGV2ZW50KTsKCQl0aGlzLnBvc2l0aW9uQWJzID0gdGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7CgoJCWlmICghdGhpcy5sYXN0UG9zaXRpb25BYnMpIHsKCQkJdGhpcy5sYXN0UG9zaXRpb25BYnMgPSB0aGlzLnBvc2l0aW9uQWJzOwoJCX0KCgkJLy9EbyBzY3JvbGxpbmcKCQlpZih0aGlzLm9wdGlvbnMuc2Nyb2xsKSB7CgkJCWlmKHRoaXMuc2Nyb2xsUGFyZW50WzBdICE9PSBkb2N1bWVudCAmJiB0aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lICE9PSAiSFRNTCIpIHsKCgkJCQlpZigodGhpcy5vdmVyZmxvd09mZnNldC50b3AgKyB0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQpIC0gZXZlbnQucGFnZVkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KSB7CgkJCQkJdGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wID0gc2Nyb2xsZWQgPSB0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgKyBvLnNjcm9sbFNwZWVkOwoJCQkJfSBlbHNlIGlmKGV2ZW50LnBhZ2VZIC0gdGhpcy5vdmVyZmxvd09mZnNldC50b3AgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KSB7CgkJCQkJdGhpcy5zY3JvbGxQYXJlbnRbMF0uc2Nyb2xsVG9wID0gc2Nyb2xsZWQgPSB0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxUb3AgLSBvLnNjcm9sbFNwZWVkOwoJCQkJfQoKCQkJCWlmKCh0aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQgKyB0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRXaWR0aCkgLSBldmVudC5wYWdlWCA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQl0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ID0gc2Nyb2xsZWQgPSB0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ICsgby5zY3JvbGxTcGVlZDsKCQkJCX0gZWxzZSBpZihldmVudC5wYWdlWCAtIHRoaXMub3ZlcmZsb3dPZmZzZXQubGVmdCA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQl0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0ID0gc2Nyb2xsZWQgPSB0aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0IC0gby5zY3JvbGxTcGVlZDsKCQkJCX0KCgkJCX0gZWxzZSB7CgoJCQkJaWYoZXZlbnQucGFnZVkgLSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSAtIG8uc2Nyb2xsU3BlZWQpOwoJCQkJfSBlbHNlIGlmKCQod2luZG93KS5oZWlnaHQoKSAtIChldmVudC5wYWdlWSAtICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpKSA8IG8uc2Nyb2xsU2Vuc2l0aXZpdHkpIHsKCQkJCQlzY3JvbGxlZCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArIG8uc2Nyb2xsU3BlZWQpOwoJCQkJfQoKCQkJCWlmKGV2ZW50LnBhZ2VYIC0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpIDwgby5zY3JvbGxTZW5zaXRpdml0eSkgewoJCQkJCXNjcm9sbGVkID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgLSBvLnNjcm9sbFNwZWVkKTsKCQkJCX0gZWxzZSBpZigkKHdpbmRvdykud2lkdGgoKSAtIChldmVudC5wYWdlWCAtICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSkgPCBvLnNjcm9sbFNlbnNpdGl2aXR5KSB7CgkJCQkJc2Nyb2xsZWQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSArIG8uc2Nyb2xsU3BlZWQpOwoJCQkJfQoKCQkJfQoKCQkJaWYoc2Nyb2xsZWQgIT09IGZhbHNlICYmICQudWkuZGRtYW5hZ2VyICYmICFvLmRyb3BCZWhhdmlvdXIpIHsKCQkJCSQudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHRoaXMsIGV2ZW50KTsKCQkJfQoJCX0KCgkJLy9SZWdlbmVyYXRlIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiB1c2VkIGZvciBwb3NpdGlvbiBjaGVja3MKCQl0aGlzLnBvc2l0aW9uQWJzID0gdGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIik7CgoJCS8vU2V0IHRoZSBoZWxwZXIgcG9zaXRpb24KCQlpZighdGhpcy5vcHRpb25zLmF4aXMgfHwgdGhpcy5vcHRpb25zLmF4aXMgIT09ICJ5IikgewoJCQl0aGlzLmhlbHBlclswXS5zdHlsZS5sZWZ0ID0gdGhpcy5wb3NpdGlvbi5sZWZ0KyJweCI7CgkJfQoJCWlmKCF0aGlzLm9wdGlvbnMuYXhpcyB8fCB0aGlzLm9wdGlvbnMuYXhpcyAhPT0gIngiKSB7CgkJCXRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcCA9IHRoaXMucG9zaXRpb24udG9wKyJweCI7CgkJfQoKCQkvL1JlYXJyYW5nZQoJCWZvciAoaSA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKCgkJCS8vQ2FjaGUgdmFyaWFibGVzIGFuZCBpbnRlcnNlY3Rpb24sIGNvbnRpbnVlIGlmIG5vIGludGVyc2VjdGlvbgoJCQlpdGVtID0gdGhpcy5pdGVtc1tpXTsKCQkJaXRlbUVsZW1lbnQgPSBpdGVtLml0ZW1bMF07CgkJCWludGVyc2VjdGlvbiA9IHRoaXMuX2ludGVyc2VjdHNXaXRoUG9pbnRlcihpdGVtKTsKCQkJaWYgKCFpbnRlcnNlY3Rpb24pIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQkvLyBPbmx5IHB1dCB0aGUgcGxhY2Vob2xkZXIgaW5zaWRlIHRoZSBjdXJyZW50IENvbnRhaW5lciwgc2tpcCBhbGwKCQkJLy8gaXRlbXMgZnJvbSBvdGhlciBjb250YWluZXJzLiBUaGlzIHdvcmtzIGJlY2F1c2Ugd2hlbiBtb3ZpbmcKCQkJLy8gYW4gaXRlbSBmcm9tIG9uZSBjb250YWluZXIgdG8gYW5vdGhlciB0aGUKCQkJLy8gY3VycmVudENvbnRhaW5lciBpcyBzd2l0Y2hlZCBiZWZvcmUgdGhlIHBsYWNlaG9sZGVyIGlzIG1vdmVkLgoJCQkvLwoJCQkvLyBXaXRob3V0IHRoaXMsIG1vdmluZyBpdGVtcyBpbiAic3ViLXNvcnRhYmxlcyIgY2FuIGNhdXNlCgkJCS8vIHRoZSBwbGFjZWhvbGRlciB0byBqaXR0ZXIgYmV0d2VlbiB0aGUgb3V0ZXIgYW5kIGlubmVyIGNvbnRhaW5lci4KCQkJaWYgKGl0ZW0uaW5zdGFuY2UgIT09IHRoaXMuY3VycmVudENvbnRhaW5lcikgewoJCQkJY29udGludWU7CgkJCX0KCgkJCS8vIGNhbm5vdCBpbnRlcnNlY3Qgd2l0aCBpdHNlbGYKCQkJLy8gbm8gdXNlbGVzcyBhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGRvbmUgYmVmb3JlCgkJCS8vIG5vIGFjdGlvbiBpZiB0aGUgaXRlbSBtb3ZlZCBpcyB0aGUgcGFyZW50IG9mIHRoZSBpdGVtIGNoZWNrZWQKCQkJaWYgKGl0ZW1FbGVtZW50ICE9PSB0aGlzLmN1cnJlbnRJdGVtWzBdICYmCgkJCQl0aGlzLnBsYWNlaG9sZGVyW2ludGVyc2VjdGlvbiA9PT0gMSA/ICJuZXh0IiA6ICJwcmV2Il0oKVswXSAhPT0gaXRlbUVsZW1lbnQgJiYKCQkJCSEkLmNvbnRhaW5zKHRoaXMucGxhY2Vob2xkZXJbMF0sIGl0ZW1FbGVtZW50KSAmJgoJCQkJKHRoaXMub3B0aW9ucy50eXBlID09PSAic2VtaS1keW5hbWljIiA/ICEkLmNvbnRhaW5zKHRoaXMuZWxlbWVudFswXSwgaXRlbUVsZW1lbnQpIDogdHJ1ZSkKCQkJKSB7CgoJCQkJdGhpcy5kaXJlY3Rpb24gPSBpbnRlcnNlY3Rpb24gPT09IDEgPyAiZG93biIgOiAidXAiOwoKCQkJCWlmICh0aGlzLm9wdGlvbnMudG9sZXJhbmNlID09PSAicG9pbnRlciIgfHwgdGhpcy5faW50ZXJzZWN0c1dpdGhTaWRlcyhpdGVtKSkgewoJCQkJCXRoaXMuX3JlYXJyYW5nZShldmVudCwgaXRlbSk7CgkJCQl9IGVsc2UgewoJCQkJCWJyZWFrOwoJCQkJfQoKCQkJCXRoaXMuX3RyaWdnZXIoImNoYW5nZSIsIGV2ZW50LCB0aGlzLl91aUhhc2goKSk7CgkJCQlicmVhazsKCQkJfQoJCX0KCgkJLy9Qb3N0IGV2ZW50cyB0byBjb250YWluZXJzCgkJdGhpcy5fY29udGFjdENvbnRhaW5lcnMoZXZlbnQpOwoKCQkvL0ludGVyY29ubmVjdCB3aXRoIGRyb3BwYWJsZXMKCQlpZigkLnVpLmRkbWFuYWdlcikgewoJCQkkLnVpLmRkbWFuYWdlci5kcmFnKHRoaXMsIGV2ZW50KTsKCQl9CgoJCS8vQ2FsbCBjYWxsYmFja3MKCQl0aGlzLl90cmlnZ2VyKCJzb3J0IiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCgkJdGhpcy5sYXN0UG9zaXRpb25BYnMgPSB0aGlzLnBvc2l0aW9uQWJzOwoJCXJldHVybiBmYWxzZTsKCgl9LAoKCV9tb3VzZVN0b3A6IGZ1bmN0aW9uKGV2ZW50LCBub1Byb3BhZ2F0aW9uKSB7CgoJCWlmKCFldmVudCkgewoJCQlyZXR1cm47CgkJfQoKCQkvL0lmIHdlIGFyZSB1c2luZyBkcm9wcGFibGVzLCBpbmZvcm0gdGhlIG1hbmFnZXIgYWJvdXQgdGhlIGRyb3AKCQlpZiAoJC51aS5kZG1hbmFnZXIgJiYgIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyKSB7CgkJCSQudWkuZGRtYW5hZ2VyLmRyb3AodGhpcywgZXZlbnQpOwoJCX0KCgkJaWYodGhpcy5vcHRpb25zLnJldmVydCkgewoJCQl2YXIgdGhhdCA9IHRoaXMsCgkJCQljdXIgPSB0aGlzLnBsYWNlaG9sZGVyLm9mZnNldCgpLAoJCQkJYXhpcyA9IHRoaXMub3B0aW9ucy5heGlzLAoJCQkJYW5pbWF0aW9uID0ge307CgoJCQlpZiAoICFheGlzIHx8IGF4aXMgPT09ICJ4IiApIHsKCQkJCWFuaW1hdGlvbi5sZWZ0ID0gY3VyLmxlZnQgLSB0aGlzLm9mZnNldC5wYXJlbnQubGVmdCAtIHRoaXMubWFyZ2lucy5sZWZ0ICsgKHRoaXMub2Zmc2V0UGFyZW50WzBdID09PSBkb2N1bWVudC5ib2R5ID8gMCA6IHRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbExlZnQpOwoJCQl9CgkJCWlmICggIWF4aXMgfHwgYXhpcyA9PT0gInkiICkgewoJCQkJYW5pbWF0aW9uLnRvcCA9IGN1ci50b3AgLSB0aGlzLm9mZnNldC5wYXJlbnQudG9wIC0gdGhpcy5tYXJnaW5zLnRvcCArICh0aGlzLm9mZnNldFBhcmVudFswXSA9PT0gZG9jdW1lbnQuYm9keSA/IDAgOiB0aGlzLm9mZnNldFBhcmVudFswXS5zY3JvbGxUb3ApOwoJCQl9CgkJCXRoaXMucmV2ZXJ0aW5nID0gdHJ1ZTsKCQkJJCh0aGlzLmhlbHBlcikuYW5pbWF0ZSggYW5pbWF0aW9uLCBwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LCAxMCkgfHwgNTAwLCBmdW5jdGlvbigpIHsKCQkJCXRoYXQuX2NsZWFyKGV2ZW50KTsKCQkJfSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5fY2xlYXIoZXZlbnQsIG5vUHJvcGFnYXRpb24pOwoJCX0KCgkJcmV0dXJuIGZhbHNlOwoKCX0sCgoJY2FuY2VsOiBmdW5jdGlvbigpIHsKCgkJaWYodGhpcy5kcmFnZ2luZykgewoKCQkJdGhpcy5fbW91c2VVcCh7IHRhcmdldDogbnVsbCB9KTsKCgkJCWlmKHRoaXMub3B0aW9ucy5oZWxwZXIgPT09ICJvcmlnaW5hbCIpIHsKCQkJCXRoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5jdXJyZW50SXRlbS5zaG93KCk7CgkJCX0KCgkJCS8vUG9zdCBkZWFjdGl2YXRpbmcgZXZlbnRzIHRvIGNvbnRhaW5lcnMKCQkJZm9yICh2YXIgaSA9IHRoaXMuY29udGFpbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCQl0aGlzLmNvbnRhaW5lcnNbaV0uX3RyaWdnZXIoImRlYWN0aXZhdGUiLCBudWxsLCB0aGlzLl91aUhhc2godGhpcykpOwoJCQkJaWYodGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIpIHsKCQkJCQl0aGlzLmNvbnRhaW5lcnNbaV0uX3RyaWdnZXIoIm91dCIsIG51bGwsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCQkJdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAwOwoJCQkJfQoJCQl9CgoJCX0KCgkJaWYgKHRoaXMucGxhY2Vob2xkZXIpIHsKCQkJLy8kKHRoaXMucGxhY2Vob2xkZXJbMF0pLnJlbW92ZSgpOyB3b3VsZCBoYXZlIGJlZW4gdGhlIGpRdWVyeSB3YXkgLSB1bmZvcnR1bmF0ZWx5LCBpdCB1bmJpbmRzIEFMTCBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgbm9kZSEKCQkJaWYodGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlKSB7CgkJCQl0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk7CgkJCX0KCQkJaWYodGhpcy5vcHRpb25zLmhlbHBlciAhPT0gIm9yaWdpbmFsIiAmJiB0aGlzLmhlbHBlciAmJiB0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlKSB7CgkJCQl0aGlzLmhlbHBlci5yZW1vdmUoKTsKCQkJfQoKCQkJJC5leHRlbmQodGhpcywgewoJCQkJaGVscGVyOiBudWxsLAoJCQkJZHJhZ2dpbmc6IGZhbHNlLAoJCQkJcmV2ZXJ0aW5nOiBmYWxzZSwKCQkJCV9ub0ZpbmFsU29ydDogbnVsbAoJCQl9KTsKCgkJCWlmKHRoaXMuZG9tUG9zaXRpb24ucHJldikgewoJCQkJJCh0aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOwoJCQl9IGVsc2UgewoJCQkJJCh0aGlzLmRvbVBvc2l0aW9uLnBhcmVudCkucHJlcGVuZCh0aGlzLmN1cnJlbnRJdGVtKTsKCQkJfQoJCX0KCgkJcmV0dXJuIHRoaXM7CgoJfSwKCglzZXJpYWxpemU6IGZ1bmN0aW9uKG8pIHsKCgkJdmFyIGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShvICYmIG8uY29ubmVjdGVkKSwKCQkJc3RyID0gW107CgkJbyA9IG8gfHwge307CgoJCSQoaXRlbXMpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciByZXMgPSAoJChvLml0ZW0gfHwgdGhpcykuYXR0cihvLmF0dHJpYnV0ZSB8fCAiaWQiKSB8fCAiIikubWF0Y2goby5leHByZXNzaW9uIHx8ICgvKC4rKVtcLT1fXSguKykvKSk7CgkJCWlmIChyZXMpIHsKCQkJCXN0ci5wdXNoKChvLmtleSB8fCByZXNbMV0rIltdIikrIj0iKyhvLmtleSAmJiBvLmV4cHJlc3Npb24gPyByZXNbMV0gOiByZXNbMl0pKTsKCQkJfQoJCX0pOwoKCQlpZighc3RyLmxlbmd0aCAmJiBvLmtleSkgewoJCQlzdHIucHVzaChvLmtleSArICI9Iik7CgkJfQoKCQlyZXR1cm4gc3RyLmpvaW4oIiYiKTsKCgl9LAoKCXRvQXJyYXk6IGZ1bmN0aW9uKG8pIHsKCgkJdmFyIGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXNBc2pRdWVyeShvICYmIG8uY29ubmVjdGVkKSwKCQkJcmV0ID0gW107CgoJCW8gPSBvIHx8IHt9OwoKCQlpdGVtcy5lYWNoKGZ1bmN0aW9uKCkgeyByZXQucHVzaCgkKG8uaXRlbSB8fCB0aGlzKS5hdHRyKG8uYXR0cmlidXRlIHx8ICJpZCIpIHx8ICIiKTsgfSk7CgkJcmV0dXJuIHJldDsKCgl9LAoKCS8qIEJlIGNhcmVmdWwgd2l0aCB0aGUgZm9sbG93aW5nIGNvcmUgZnVuY3Rpb25zICovCglfaW50ZXJzZWN0c1dpdGg6IGZ1bmN0aW9uKGl0ZW0pIHsKCgkJdmFyIHgxID0gdGhpcy5wb3NpdGlvbkFicy5sZWZ0LAoJCQl4MiA9IHgxICsgdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCwKCQkJeTEgPSB0aGlzLnBvc2l0aW9uQWJzLnRvcCwKCQkJeTIgPSB5MSArIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LAoJCQlsID0gaXRlbS5sZWZ0LAoJCQlyID0gbCArIGl0ZW0ud2lkdGgsCgkJCXQgPSBpdGVtLnRvcCwKCQkJYiA9IHQgKyBpdGVtLmhlaWdodCwKCQkJZHlDbGljayA9IHRoaXMub2Zmc2V0LmNsaWNrLnRvcCwKCQkJZHhDbGljayA9IHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsCgkJCWlzT3ZlckVsZW1lbnRIZWlnaHQgPSAoIHRoaXMub3B0aW9ucy5heGlzID09PSAieCIgKSB8fCAoICggeTEgKyBkeUNsaWNrICkgPiB0ICYmICggeTEgKyBkeUNsaWNrICkgPCBiICksCgkJCWlzT3ZlckVsZW1lbnRXaWR0aCA9ICggdGhpcy5vcHRpb25zLmF4aXMgPT09ICJ5IiApIHx8ICggKCB4MSArIGR4Q2xpY2sgKSA+IGwgJiYgKCB4MSArIGR4Q2xpY2sgKSA8IHIgKSwKCQkJaXNPdmVyRWxlbWVudCA9IGlzT3ZlckVsZW1lbnRIZWlnaHQgJiYgaXNPdmVyRWxlbWVudFdpZHRoOwoKCQlpZiAoIHRoaXMub3B0aW9ucy50b2xlcmFuY2UgPT09ICJwb2ludGVyIiB8fAoJCQl0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVyRm9yQ29udGFpbmVycyB8fAoJCQkodGhpcy5vcHRpb25zLnRvbGVyYW5jZSAhPT0gInBvaW50ZXIiICYmIHRoaXMuaGVscGVyUHJvcG9ydGlvbnNbdGhpcy5mbG9hdGluZyA/ICJ3aWR0aCIgOiAiaGVpZ2h0Il0gPiBpdGVtW3RoaXMuZmxvYXRpbmcgPyAid2lkdGgiIDogImhlaWdodCJdKQoJCSkgewoJCQlyZXR1cm4gaXNPdmVyRWxlbWVudDsKCQl9IGVsc2UgewoKCQkJcmV0dXJuIChsIDwgeDEgKyAodGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAvIDIpICYmIC8vIFJpZ2h0IEhhbGYKCQkJCXgyIC0gKHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLyAyKSA8IHIgJiYgLy8gTGVmdCBIYWxmCgkJCQl0IDwgeTEgKyAodGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLyAyKSAmJiAvLyBCb3R0b20gSGFsZgoJCQkJeTIgLSAodGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLyAyKSA8IGIgKTsgLy8gVG9wIEhhbGYKCgkJfQoJfSwKCglfaW50ZXJzZWN0c1dpdGhQb2ludGVyOiBmdW5jdGlvbihpdGVtKSB7CgoJCXZhciBpc092ZXJFbGVtZW50SGVpZ2h0ID0gKHRoaXMub3B0aW9ucy5heGlzID09PSAieCIpIHx8IHRoaXMuX2lzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy50b3AgKyB0aGlzLm9mZnNldC5jbGljay50b3AsIGl0ZW0udG9wLCBpdGVtLmhlaWdodCksCgkJCWlzT3ZlckVsZW1lbnRXaWR0aCA9ICh0aGlzLm9wdGlvbnMuYXhpcyA9PT0gInkiKSB8fCB0aGlzLl9pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMubGVmdCArIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQsIGl0ZW0ubGVmdCwgaXRlbS53aWR0aCksCgkJCWlzT3ZlckVsZW1lbnQgPSBpc092ZXJFbGVtZW50SGVpZ2h0ICYmIGlzT3ZlckVsZW1lbnRXaWR0aCwKCQkJdmVydGljYWxEaXJlY3Rpb24gPSB0aGlzLl9nZXREcmFnVmVydGljYWxEaXJlY3Rpb24oKSwKCQkJaG9yaXpvbnRhbERpcmVjdGlvbiA9IHRoaXMuX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uKCk7CgoJCWlmICghaXNPdmVyRWxlbWVudCkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQlyZXR1cm4gdGhpcy5mbG9hdGluZyA/CgkJCSggKChob3Jpem9udGFsRGlyZWN0aW9uICYmIGhvcml6b250YWxEaXJlY3Rpb24gPT09ICJyaWdodCIpIHx8IHZlcnRpY2FsRGlyZWN0aW9uID09PSAiZG93biIpID8gMiA6IDEgKQoJCQk6ICggdmVydGljYWxEaXJlY3Rpb24gJiYgKHZlcnRpY2FsRGlyZWN0aW9uID09PSAiZG93biIgPyAyIDogMSkgKTsKCgl9LAoKCV9pbnRlcnNlY3RzV2l0aFNpZGVzOiBmdW5jdGlvbihpdGVtKSB7CgoJCXZhciBpc092ZXJCb3R0b21IYWxmID0gdGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCArIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCwgaXRlbS50b3AgKyAoaXRlbS5oZWlnaHQvMiksIGl0ZW0uaGVpZ2h0KSwKCQkJaXNPdmVyUmlnaHRIYWxmID0gdGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLmxlZnQgKyB0aGlzLm9mZnNldC5jbGljay5sZWZ0LCBpdGVtLmxlZnQgKyAoaXRlbS53aWR0aC8yKSwgaXRlbS53aWR0aCksCgkJCXZlcnRpY2FsRGlyZWN0aW9uID0gdGhpcy5fZ2V0RHJhZ1ZlcnRpY2FsRGlyZWN0aW9uKCksCgkJCWhvcml6b250YWxEaXJlY3Rpb24gPSB0aGlzLl9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbigpOwoKCQlpZiAodGhpcy5mbG9hdGluZyAmJiBob3Jpem9udGFsRGlyZWN0aW9uKSB7CgkJCXJldHVybiAoKGhvcml6b250YWxEaXJlY3Rpb24gPT09ICJyaWdodCIgJiYgaXNPdmVyUmlnaHRIYWxmKSB8fCAoaG9yaXpvbnRhbERpcmVjdGlvbiA9PT0gImxlZnQiICYmICFpc092ZXJSaWdodEhhbGYpKTsKCQl9IGVsc2UgewoJCQlyZXR1cm4gdmVydGljYWxEaXJlY3Rpb24gJiYgKCh2ZXJ0aWNhbERpcmVjdGlvbiA9PT0gImRvd24iICYmIGlzT3ZlckJvdHRvbUhhbGYpIHx8ICh2ZXJ0aWNhbERpcmVjdGlvbiA9PT0gInVwIiAmJiAhaXNPdmVyQm90dG9tSGFsZikpOwoJCX0KCgl9LAoKCV9nZXREcmFnVmVydGljYWxEaXJlY3Rpb246IGZ1bmN0aW9uKCkgewoJCXZhciBkZWx0YSA9IHRoaXMucG9zaXRpb25BYnMudG9wIC0gdGhpcy5sYXN0UG9zaXRpb25BYnMudG9wOwoJCXJldHVybiBkZWx0YSAhPT0gMCAmJiAoZGVsdGEgPiAwID8gImRvd24iIDogInVwIik7Cgl9LAoKCV9nZXREcmFnSG9yaXpvbnRhbERpcmVjdGlvbjogZnVuY3Rpb24oKSB7CgkJdmFyIGRlbHRhID0gdGhpcy5wb3NpdGlvbkFicy5sZWZ0IC0gdGhpcy5sYXN0UG9zaXRpb25BYnMubGVmdDsKCQlyZXR1cm4gZGVsdGEgIT09IDAgJiYgKGRlbHRhID4gMCA/ICJyaWdodCIgOiAibGVmdCIpOwoJfSwKCglyZWZyZXNoOiBmdW5jdGlvbihldmVudCkgewoJCXRoaXMuX3JlZnJlc2hJdGVtcyhldmVudCk7CgkJdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCk7CgkJdGhpcy5yZWZyZXNoUG9zaXRpb25zKCk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCV9jb25uZWN0V2l0aDogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJcmV0dXJuIG9wdGlvbnMuY29ubmVjdFdpdGguY29uc3RydWN0b3IgPT09IFN0cmluZyA/IFtvcHRpb25zLmNvbm5lY3RXaXRoXSA6IG9wdGlvbnMuY29ubmVjdFdpdGg7Cgl9LAoKCV9nZXRJdGVtc0FzalF1ZXJ5OiBmdW5jdGlvbihjb25uZWN0ZWQpIHsKCgkJdmFyIGksIGosIGN1ciwgaW5zdCwKCQkJaXRlbXMgPSBbXSwKCQkJcXVlcmllcyA9IFtdLAoJCQljb25uZWN0V2l0aCA9IHRoaXMuX2Nvbm5lY3RXaXRoKCk7CgoJCWlmKGNvbm5lY3RXaXRoICYmIGNvbm5lY3RlZCkgewoJCQlmb3IgKGkgPSBjb25uZWN0V2l0aC5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCQljdXIgPSAkKGNvbm5lY3RXaXRoW2ldKTsKCQkJCWZvciAoIGogPSBjdXIubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pewoJCQkJCWluc3QgPSAkLmRhdGEoY3VyW2pdLCB0aGlzLndpZGdldEZ1bGxOYW1lKTsKCQkJCQlpZihpbnN0ICYmIGluc3QgIT09IHRoaXMgJiYgIWluc3Qub3B0aW9ucy5kaXNhYmxlZCkgewoJCQkJCQlxdWVyaWVzLnB1c2goWyQuaXNGdW5jdGlvbihpbnN0Lm9wdGlvbnMuaXRlbXMpID8gaW5zdC5vcHRpb25zLml0ZW1zLmNhbGwoaW5zdC5lbGVtZW50KSA6ICQoaW5zdC5vcHRpb25zLml0ZW1zLCBpbnN0LmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksIGluc3RdKTsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9CgoJCXF1ZXJpZXMucHVzaChbJC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcykgPyB0aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnQsIG51bGwsIHsgb3B0aW9uczogdGhpcy5vcHRpb25zLCBpdGVtOiB0aGlzLmN1cnJlbnRJdGVtIH0pIDogJCh0aGlzLm9wdGlvbnMuaXRlbXMsIHRoaXMuZWxlbWVudCkubm90KCIudWktc29ydGFibGUtaGVscGVyIikubm90KCIudWktc29ydGFibGUtcGxhY2Vob2xkZXIiKSwgdGhpc10pOwoKCQlmdW5jdGlvbiBhZGRJdGVtcygpIHsKCQkJaXRlbXMucHVzaCggdGhpcyApOwoJCX0KCQlmb3IgKGkgPSBxdWVyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJcXVlcmllc1tpXVswXS5lYWNoKCBhZGRJdGVtcyApOwoJCX0KCgkJcmV0dXJuICQoaXRlbXMpOwoKCX0sCgoJX3JlbW92ZUN1cnJlbnRzRnJvbUl0ZW1zOiBmdW5jdGlvbigpIHsKCgkJdmFyIGxpc3QgPSB0aGlzLmN1cnJlbnRJdGVtLmZpbmQoIjpkYXRhKCIgKyB0aGlzLndpZGdldE5hbWUgKyAiLWl0ZW0pIik7CgoJCXRoaXMuaXRlbXMgPSAkLmdyZXAodGhpcy5pdGVtcywgZnVuY3Rpb24gKGl0ZW0pIHsKCQkJZm9yICh2YXIgaj0wOyBqIDwgbGlzdC5sZW5ndGg7IGorKykgewoJCQkJaWYobGlzdFtqXSA9PT0gaXRlbS5pdGVtWzBdKSB7CgkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0cnVlOwoJCX0pOwoKCX0sCgoJX3JlZnJlc2hJdGVtczogZnVuY3Rpb24oZXZlbnQpIHsKCgkJdGhpcy5pdGVtcyA9IFtdOwoJCXRoaXMuY29udGFpbmVycyA9IFt0aGlzXTsKCgkJdmFyIGksIGosIGN1ciwgaW5zdCwgdGFyZ2V0RGF0YSwgX3F1ZXJpZXMsIGl0ZW0sIHF1ZXJpZXNMZW5ndGgsCgkJCWl0ZW1zID0gdGhpcy5pdGVtcywKCQkJcXVlcmllcyA9IFtbJC5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcykgPyB0aGlzLm9wdGlvbnMuaXRlbXMuY2FsbCh0aGlzLmVsZW1lbnRbMF0sIGV2ZW50LCB7IGl0ZW06IHRoaXMuY3VycmVudEl0ZW0gfSkgOiAkKHRoaXMub3B0aW9ucy5pdGVtcywgdGhpcy5lbGVtZW50KSwgdGhpc11dLAoJCQljb25uZWN0V2l0aCA9IHRoaXMuX2Nvbm5lY3RXaXRoKCk7CgoJCWlmKGNvbm5lY3RXaXRoICYmIHRoaXMucmVhZHkpIHsgLy9TaG91bGRuJ3QgYmUgcnVuIHRoZSBmaXJzdCB0aW1lIHRocm91Z2ggZHVlIHRvIG1hc3NpdmUgc2xvdy1kb3duCgkJCWZvciAoaSA9IGNvbm5lY3RXaXRoLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCWN1ciA9ICQoY29ubmVjdFdpdGhbaV0pOwoJCQkJZm9yIChqID0gY3VyLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKXsKCQkJCQlpbnN0ID0gJC5kYXRhKGN1cltqXSwgdGhpcy53aWRnZXRGdWxsTmFtZSk7CgkJCQkJaWYoaW5zdCAmJiBpbnN0ICE9PSB0aGlzICYmICFpbnN0Lm9wdGlvbnMuZGlzYWJsZWQpIHsKCQkJCQkJcXVlcmllcy5wdXNoKFskLmlzRnVuY3Rpb24oaW5zdC5vcHRpb25zLml0ZW1zKSA/IGluc3Qub3B0aW9ucy5pdGVtcy5jYWxsKGluc3QuZWxlbWVudFswXSwgZXZlbnQsIHsgaXRlbTogdGhpcy5jdXJyZW50SXRlbSB9KSA6ICQoaW5zdC5vcHRpb25zLml0ZW1zLCBpbnN0LmVsZW1lbnQpLCBpbnN0XSk7CgkJCQkJCXRoaXMuY29udGFpbmVycy5wdXNoKGluc3QpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJZm9yIChpID0gcXVlcmllcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewoJCQl0YXJnZXREYXRhID0gcXVlcmllc1tpXVsxXTsKCQkJX3F1ZXJpZXMgPSBxdWVyaWVzW2ldWzBdOwoKCQkJZm9yIChqPTAsIHF1ZXJpZXNMZW5ndGggPSBfcXVlcmllcy5sZW5ndGg7IGogPCBxdWVyaWVzTGVuZ3RoOyBqKyspIHsKCQkJCWl0ZW0gPSAkKF9xdWVyaWVzW2pdKTsKCgkJCQlpdGVtLmRhdGEodGhpcy53aWRnZXROYW1lICsgIi1pdGVtIiwgdGFyZ2V0RGF0YSk7IC8vIERhdGEgZm9yIHRhcmdldCBjaGVja2luZyAobW91c2UgbWFuYWdlcikKCgkJCQlpdGVtcy5wdXNoKHsKCQkJCQlpdGVtOiBpdGVtLAoJCQkJCWluc3RhbmNlOiB0YXJnZXREYXRhLAoJCQkJCXdpZHRoOiAwLCBoZWlnaHQ6IDAsCgkJCQkJbGVmdDogMCwgdG9wOiAwCgkJCQl9KTsKCQkJfQoJCX0KCgl9LAoKCXJlZnJlc2hQb3NpdGlvbnM6IGZ1bmN0aW9uKGZhc3QpIHsKCgkJLy9UaGlzIGhhcyB0byBiZSByZWRvbmUgYmVjYXVzZSBkdWUgdG8gdGhlIGl0ZW0gYmVpbmcgbW92ZWQgb3V0L2ludG8gdGhlIG9mZnNldFBhcmVudCwgdGhlIG9mZnNldFBhcmVudCdzIHBvc2l0aW9uIHdpbGwgY2hhbmdlCgkJaWYodGhpcy5vZmZzZXRQYXJlbnQgJiYgdGhpcy5oZWxwZXIpIHsKCQkJdGhpcy5vZmZzZXQucGFyZW50ID0gdGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCk7CgkJfQoKCQl2YXIgaSwgaXRlbSwgdCwgcDsKCgkJZm9yIChpID0gdGhpcy5pdGVtcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSl7CgkJCWl0ZW0gPSB0aGlzLml0ZW1zW2ldOwoKCQkJLy9XZSBpZ25vcmUgY2FsY3VsYXRpbmcgcG9zaXRpb25zIG9mIGFsbCBjb25uZWN0ZWQgY29udGFpbmVycyB3aGVuIHdlJ3JlIG5vdCBvdmVyIHRoZW0KCQkJaWYoaXRlbS5pbnN0YW5jZSAhPT0gdGhpcy5jdXJyZW50Q29udGFpbmVyICYmIHRoaXMuY3VycmVudENvbnRhaW5lciAmJiBpdGVtLml0ZW1bMF0gIT09IHRoaXMuY3VycmVudEl0ZW1bMF0pIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgoJCQl0ID0gdGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQgPyAkKHRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50LCBpdGVtLml0ZW0pIDogaXRlbS5pdGVtOwoKCQkJaWYgKCFmYXN0KSB7CgkJCQlpdGVtLndpZHRoID0gdC5vdXRlcldpZHRoKCk7CgkJCQlpdGVtLmhlaWdodCA9IHQub3V0ZXJIZWlnaHQoKTsKCQkJfQoKCQkJcCA9IHQub2Zmc2V0KCk7CgkJCWl0ZW0ubGVmdCA9IHAubGVmdDsKCQkJaXRlbS50b3AgPSBwLnRvcDsKCQl9CgoJCWlmKHRoaXMub3B0aW9ucy5jdXN0b20gJiYgdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycykgewoJCQl0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzLmNhbGwodGhpcyk7CgkJfSBlbHNlIHsKCQkJZm9yIChpID0gdGhpcy5jb250YWluZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJCXAgPSB0aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudC5vZmZzZXQoKTsKCQkJCXRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5sZWZ0ID0gcC5sZWZ0OwoJCQkJdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLnRvcCA9IHAudG9wOwoJCQkJdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLndpZHRoID0gdGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub3V0ZXJXaWR0aCgpOwoJCQkJdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLmhlaWdodCA9IHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50Lm91dGVySGVpZ2h0KCk7CgkJCX0KCQl9CgoJCXJldHVybiB0aGlzOwoJfSwKCglfY3JlYXRlUGxhY2Vob2xkZXI6IGZ1bmN0aW9uKHRoYXQpIHsKCQl0aGF0ID0gdGhhdCB8fCB0aGlzOwoJCXZhciBjbGFzc05hbWUsCgkJCW8gPSB0aGF0Lm9wdGlvbnM7CgoJCWlmKCFvLnBsYWNlaG9sZGVyIHx8IG8ucGxhY2Vob2xkZXIuY29uc3RydWN0b3IgPT09IFN0cmluZykgewoJCQljbGFzc05hbWUgPSBvLnBsYWNlaG9sZGVyOwoJCQlvLnBsYWNlaG9sZGVyID0gewoJCQkJZWxlbWVudDogZnVuY3Rpb24oKSB7CgoJCQkJCXZhciBub2RlTmFtZSA9IHRoYXQuY3VycmVudEl0ZW1bMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwKCQkJCQkJZWxlbWVudCA9ICQoICI8IiArIG5vZGVOYW1lICsgIj4iLCB0aGF0LmRvY3VtZW50WzBdICkKCQkJCQkJCS5hZGRDbGFzcyhjbGFzc05hbWUgfHwgdGhhdC5jdXJyZW50SXRlbVswXS5jbGFzc05hbWUrIiB1aS1zb3J0YWJsZS1wbGFjZWhvbGRlciIpCgkJCQkJCQkucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOwoKCQkJCQlpZiAoIG5vZGVOYW1lID09PSAidHIiICkgewoJCQkJCQl0aGF0LmN1cnJlbnRJdGVtLmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJCQkJCSQoICI8dGQ+JiMxNjA7PC90ZD4iLCB0aGF0LmRvY3VtZW50WzBdICkKCQkJCQkJCQkuYXR0ciggImNvbHNwYW4iLCAkKCB0aGlzICkuYXR0ciggImNvbHNwYW4iICkgfHwgMSApCgkJCQkJCQkJLmFwcGVuZFRvKCBlbGVtZW50ICk7CgkJCQkJCX0pOwoJCQkJCX0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSAiaW1nIiApIHsKCQkJCQkJZWxlbWVudC5hdHRyKCAic3JjIiwgdGhhdC5jdXJyZW50SXRlbS5hdHRyKCAic3JjIiApICk7CgkJCQkJfQoKCQkJCQlpZiAoICFjbGFzc05hbWUgKSB7CgkJCQkJCWVsZW1lbnQuY3NzKCAidmlzaWJpbGl0eSIsICJoaWRkZW4iICk7CgkJCQkJfQoKCQkJCQlyZXR1cm4gZWxlbWVudDsKCQkJCX0sCgkJCQl1cGRhdGU6IGZ1bmN0aW9uKGNvbnRhaW5lciwgcCkgewoKCQkJCQkvLyAxLiBJZiBhIGNsYXNzTmFtZSBpcyBzZXQgYXMgJ3BsYWNlaG9sZGVyIG9wdGlvbiwgd2UgZG9uJ3QgZm9yY2Ugc2l6ZXMgLSB0aGUgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHRoYXQKCQkJCQkvLyAyLiBUaGUgb3B0aW9uICdmb3JjZVBsYWNlaG9sZGVyU2l6ZSBjYW4gYmUgZW5hYmxlZCB0byBmb3JjZSBpdCBldmVuIGlmIGEgY2xhc3MgbmFtZSBpcyBzcGVjaWZpZWQKCQkJCQlpZihjbGFzc05hbWUgJiYgIW8uZm9yY2VQbGFjZWhvbGRlclNpemUpIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCgkJCQkJLy9JZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYSBhY3R1YWwgaGVpZ2h0IGJ5IGl0c2VsZiAod2l0aG91dCBzdHlsZXMgY29taW5nIGZyb20gYSBzdHlsZXNoZWV0KSwgaXQgcmVjZWl2ZXMgdGhlIGlubGluZSBoZWlnaHQgZnJvbSB0aGUgZHJhZ2dlZCBpdGVtCgkJCQkJaWYoIXAuaGVpZ2h0KCkpIHsgcC5oZWlnaHQodGhhdC5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpIC0gcGFyc2VJbnQodGhhdC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdUb3AiKXx8MCwgMTApIC0gcGFyc2VJbnQodGhhdC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdCb3R0b20iKXx8MCwgMTApKTsgfQoJCQkJCWlmKCFwLndpZHRoKCkpIHsgcC53aWR0aCh0aGF0LmN1cnJlbnRJdGVtLmlubmVyV2lkdGgoKSAtIHBhcnNlSW50KHRoYXQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nTGVmdCIpfHwwLCAxMCkgLSBwYXJzZUludCh0aGF0LmN1cnJlbnRJdGVtLmNzcygicGFkZGluZ1JpZ2h0Iil8fDAsIDEwKSk7IH0KCQkJCX0KCQkJfTsKCQl9CgoJCS8vQ3JlYXRlIHRoZSBwbGFjZWhvbGRlcgoJCXRoYXQucGxhY2Vob2xkZXIgPSAkKG8ucGxhY2Vob2xkZXIuZWxlbWVudC5jYWxsKHRoYXQuZWxlbWVudCwgdGhhdC5jdXJyZW50SXRlbSkpOwoKCQkvL0FwcGVuZCBpdCBhZnRlciB0aGUgYWN0dWFsIGN1cnJlbnQgaXRlbQoJCXRoYXQuY3VycmVudEl0ZW0uYWZ0ZXIodGhhdC5wbGFjZWhvbGRlcik7CgoJCS8vVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBwbGFjZWhvbGRlciAoVE9ETzogTG9naWMgdG8gZnV6enksIHNlZSBsaW5lIDMxNi8zMTcpCgkJby5wbGFjZWhvbGRlci51cGRhdGUodGhhdCwgdGhhdC5wbGFjZWhvbGRlcik7CgoJfSwKCglfY29udGFjdENvbnRhaW5lcnM6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJdmFyIGksIGosIGRpc3QsIGl0ZW1XaXRoTGVhc3REaXN0YW5jZSwgcG9zUHJvcGVydHksIHNpemVQcm9wZXJ0eSwgY3VyLCBuZWFyQm90dG9tLCBmbG9hdGluZywgYXhpcywKCQkJaW5uZXJtb3N0Q29udGFpbmVyID0gbnVsbCwKCQkJaW5uZXJtb3N0SW5kZXggPSBudWxsOwoKCQkvLyBnZXQgaW5uZXJtb3N0IGNvbnRhaW5lciB0aGF0IGludGVyc2VjdHMgd2l0aCBpdGVtCgkJZm9yIChpID0gdGhpcy5jb250YWluZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CgoJCQkvLyBuZXZlciBjb25zaWRlciBhIGNvbnRhaW5lciB0aGF0J3MgbG9jYXRlZCB3aXRoaW4gdGhlIGl0ZW0gaXRzZWxmCgkJCWlmKCQuY29udGFpbnModGhpcy5jdXJyZW50SXRlbVswXSwgdGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0pKSB7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJaWYodGhpcy5faW50ZXJzZWN0c1dpdGgodGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlKSkgewoKCQkJCS8vIGlmIHdlJ3ZlIGFscmVhZHkgZm91bmQgYSBjb250YWluZXIgYW5kIGl0J3MgbW9yZSAiaW5uZXIiIHRoYW4gdGhpcywgdGhlbiBjb250aW51ZQoJCQkJaWYoaW5uZXJtb3N0Q29udGFpbmVyICYmICQuY29udGFpbnModGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnRbMF0sIGlubmVybW9zdENvbnRhaW5lci5lbGVtZW50WzBdKSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoKCQkJCWlubmVybW9zdENvbnRhaW5lciA9IHRoaXMuY29udGFpbmVyc1tpXTsKCQkJCWlubmVybW9zdEluZGV4ID0gaTsKCgkJCX0gZWxzZSB7CgkJCQkvLyBjb250YWluZXIgZG9lc24ndCBpbnRlcnNlY3QuIHRyaWdnZXIgIm91dCIgZXZlbnQgaWYgbmVjZXNzYXJ5CgkJCQlpZih0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUub3ZlcikgewoJCQkJCXRoaXMuY29udGFpbmVyc1tpXS5fdHJpZ2dlcigib3V0IiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCQkJdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAwOwoJCQkJfQoJCQl9CgoJCX0KCgkJLy8gaWYgbm8gaW50ZXJzZWN0aW5nIGNvbnRhaW5lcnMgZm91bmQsIHJldHVybgoJCWlmKCFpbm5lcm1vc3RDb250YWluZXIpIHsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gbW92ZSB0aGUgaXRlbSBpbnRvIHRoZSBjb250YWluZXIgaWYgaXQncyBub3QgdGhlcmUgYWxyZWFkeQoJCWlmKHRoaXMuY29udGFpbmVycy5sZW5ndGggPT09IDEpIHsKCQkJaWYgKCF0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmNvbnRhaW5lckNhY2hlLm92ZXIpIHsKCQkJCXRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF0uX3RyaWdnZXIoIm92ZXIiLCBldmVudCwgdGhpcy5fdWlIYXNoKHRoaXMpKTsKCQkJCXRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF0uY29udGFpbmVyQ2FjaGUub3ZlciA9IDE7CgkJCX0KCQl9IGVsc2UgewoKCQkJLy9XaGVuIGVudGVyaW5nIGEgbmV3IGNvbnRhaW5lciwgd2Ugd2lsbCBmaW5kIHRoZSBpdGVtIHdpdGggdGhlIGxlYXN0IGRpc3RhbmNlIGFuZCBhcHBlbmQgb3VyIGl0ZW0gbmVhciBpdAoJCQlkaXN0ID0gMTAwMDA7CgkJCWl0ZW1XaXRoTGVhc3REaXN0YW5jZSA9IG51bGw7CgkJCWZsb2F0aW5nID0gaW5uZXJtb3N0Q29udGFpbmVyLmZsb2F0aW5nIHx8IHRoaXMuX2lzRmxvYXRpbmcodGhpcy5jdXJyZW50SXRlbSk7CgkJCXBvc1Byb3BlcnR5ID0gZmxvYXRpbmcgPyAibGVmdCIgOiAidG9wIjsKCQkJc2l6ZVByb3BlcnR5ID0gZmxvYXRpbmcgPyAid2lkdGgiIDogImhlaWdodCI7CgkJCWF4aXMgPSBmbG9hdGluZyA/ICJjbGllbnRYIiA6ICJjbGllbnRZIjsKCgkJCWZvciAoaiA9IHRoaXMuaXRlbXMubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHsKCQkJCWlmKCEkLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF0uZWxlbWVudFswXSwgdGhpcy5pdGVtc1tqXS5pdGVtWzBdKSkgewoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJaWYodGhpcy5pdGVtc1tqXS5pdGVtWzBdID09PSB0aGlzLmN1cnJlbnRJdGVtWzBdKSB7CgkJCQkJY29udGludWU7CgkJCQl9CgoJCQkJY3VyID0gdGhpcy5pdGVtc1tqXS5pdGVtLm9mZnNldCgpW3Bvc1Byb3BlcnR5XTsKCQkJCW5lYXJCb3R0b20gPSBmYWxzZTsKCQkJCWlmICggZXZlbnRbIGF4aXMgXSAtIGN1ciA+IHRoaXMuaXRlbXNbIGogXVsgc2l6ZVByb3BlcnR5IF0gLyAyICkgewoJCQkJCW5lYXJCb3R0b20gPSB0cnVlOwoJCQkJfQoKCQkJCWlmICggTWF0aC5hYnMoIGV2ZW50WyBheGlzIF0gLSBjdXIgKSA8IGRpc3QgKSB7CgkJCQkJZGlzdCA9IE1hdGguYWJzKCBldmVudFsgYXhpcyBdIC0gY3VyICk7CgkJCQkJaXRlbVdpdGhMZWFzdERpc3RhbmNlID0gdGhpcy5pdGVtc1sgaiBdOwoJCQkJCXRoaXMuZGlyZWN0aW9uID0gbmVhckJvdHRvbSA/ICJ1cCI6ICJkb3duIjsKCQkJCX0KCQkJfQoKCQkJLy9DaGVjayBpZiBkcm9wT25FbXB0eSBpcyBlbmFibGVkCgkJCWlmKCFpdGVtV2l0aExlYXN0RGlzdGFuY2UgJiYgIXRoaXMub3B0aW9ucy5kcm9wT25FbXB0eSkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZih0aGlzLmN1cnJlbnRDb250YWluZXIgPT09IHRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF0pIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaXRlbVdpdGhMZWFzdERpc3RhbmNlID8gdGhpcy5fcmVhcnJhbmdlKGV2ZW50LCBpdGVtV2l0aExlYXN0RGlzdGFuY2UsIG51bGwsIHRydWUpIDogdGhpcy5fcmVhcnJhbmdlKGV2ZW50LCBudWxsLCB0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLmVsZW1lbnQsIHRydWUpOwoJCQl0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoJCQl0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLl90cmlnZ2VyKCJjaGFuZ2UiLCBldmVudCwgdGhpcy5fdWlIYXNoKHRoaXMpKTsKCQkJdGhpcy5jdXJyZW50Q29udGFpbmVyID0gdGhpcy5jb250YWluZXJzW2lubmVybW9zdEluZGV4XTsKCgkJCS8vVXBkYXRlIHRoZSBwbGFjZWhvbGRlcgoJCQl0aGlzLm9wdGlvbnMucGxhY2Vob2xkZXIudXBkYXRlKHRoaXMuY3VycmVudENvbnRhaW5lciwgdGhpcy5wbGFjZWhvbGRlcik7CgoJCQl0aGlzLmNvbnRhaW5lcnNbaW5uZXJtb3N0SW5kZXhdLl90cmlnZ2VyKCJvdmVyIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7CgkJCXRoaXMuY29udGFpbmVyc1tpbm5lcm1vc3RJbmRleF0uY29udGFpbmVyQ2FjaGUub3ZlciA9IDE7CgkJfQoKCgl9LAoKCV9jcmVhdGVIZWxwZXI6IGZ1bmN0aW9uKGV2ZW50KSB7CgoJCXZhciBvID0gdGhpcy5vcHRpb25zLAoJCQloZWxwZXIgPSAkLmlzRnVuY3Rpb24oby5oZWxwZXIpID8gJChvLmhlbHBlci5hcHBseSh0aGlzLmVsZW1lbnRbMF0sIFtldmVudCwgdGhpcy5jdXJyZW50SXRlbV0pKSA6IChvLmhlbHBlciA9PT0gImNsb25lIiA/IHRoaXMuY3VycmVudEl0ZW0uY2xvbmUoKSA6IHRoaXMuY3VycmVudEl0ZW0pOwoKCQkvL0FkZCB0aGUgaGVscGVyIHRvIHRoZSBET00gaWYgdGhhdCBkaWRuJ3QgaGFwcGVuIGFscmVhZHkKCQlpZighaGVscGVyLnBhcmVudHMoImJvZHkiKS5sZW5ndGgpIHsKCQkJJChvLmFwcGVuZFRvICE9PSAicGFyZW50IiA/IG8uYXBwZW5kVG8gOiB0aGlzLmN1cnJlbnRJdGVtWzBdLnBhcmVudE5vZGUpWzBdLmFwcGVuZENoaWxkKGhlbHBlclswXSk7CgkJfQoKCQlpZihoZWxwZXJbMF0gPT09IHRoaXMuY3VycmVudEl0ZW1bMF0pIHsKCQkJdGhpcy5fc3RvcmVkQ1NTID0geyB3aWR0aDogdGhpcy5jdXJyZW50SXRlbVswXS5zdHlsZS53aWR0aCwgaGVpZ2h0OiB0aGlzLmN1cnJlbnRJdGVtWzBdLnN0eWxlLmhlaWdodCwgcG9zaXRpb246IHRoaXMuY3VycmVudEl0ZW0uY3NzKCJwb3NpdGlvbiIpLCB0b3A6IHRoaXMuY3VycmVudEl0ZW0uY3NzKCJ0b3AiKSwgbGVmdDogdGhpcy5jdXJyZW50SXRlbS5jc3MoImxlZnQiKSB9OwoJCX0KCgkJaWYoIWhlbHBlclswXS5zdHlsZS53aWR0aCB8fCBvLmZvcmNlSGVscGVyU2l6ZSkgewoJCQloZWxwZXIud2lkdGgodGhpcy5jdXJyZW50SXRlbS53aWR0aCgpKTsKCQl9CgkJaWYoIWhlbHBlclswXS5zdHlsZS5oZWlnaHQgfHwgby5mb3JjZUhlbHBlclNpemUpIHsKCQkJaGVscGVyLmhlaWdodCh0aGlzLmN1cnJlbnRJdGVtLmhlaWdodCgpKTsKCQl9CgoJCXJldHVybiBoZWxwZXI7CgoJfSwKCglfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjogZnVuY3Rpb24ob2JqKSB7CgkJaWYgKHR5cGVvZiBvYmogPT09ICJzdHJpbmciKSB7CgkJCW9iaiA9IG9iai5zcGxpdCgiICIpOwoJCX0KCQlpZiAoJC5pc0FycmF5KG9iaikpIHsKCQkJb2JqID0ge2xlZnQ6ICtvYmpbMF0sIHRvcDogK29ialsxXSB8fCAwfTsKCQl9CgkJaWYgKCJsZWZ0IiBpbiBvYmopIHsKCQkJdGhpcy5vZmZzZXQuY2xpY2subGVmdCA9IG9iai5sZWZ0ICsgdGhpcy5tYXJnaW5zLmxlZnQ7CgkJfQoJCWlmICgicmlnaHQiIGluIG9iaikgewoJCQl0aGlzLm9mZnNldC5jbGljay5sZWZ0ID0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aCAtIG9iai5yaWdodCArIHRoaXMubWFyZ2lucy5sZWZ0OwoJCX0KCQlpZiAoInRvcCIgaW4gb2JqKSB7CgkJCXRoaXMub2Zmc2V0LmNsaWNrLnRvcCA9IG9iai50b3AgKyB0aGlzLm1hcmdpbnMudG9wOwoJCX0KCQlpZiAoImJvdHRvbSIgaW4gb2JqKSB7CgkJCXRoaXMub2Zmc2V0LmNsaWNrLnRvcCA9IHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0IC0gb2JqLmJvdHRvbSArIHRoaXMubWFyZ2lucy50b3A7CgkJfQoJfSwKCglfZ2V0UGFyZW50T2Zmc2V0OiBmdW5jdGlvbigpIHsKCgoJCS8vR2V0IHRoZSBvZmZzZXRQYXJlbnQgYW5kIGNhY2hlIGl0cyBwb3NpdGlvbgoJCXRoaXMub2Zmc2V0UGFyZW50ID0gdGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCk7CgkJdmFyIHBvID0gdGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCk7CgoJCS8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgbmVlZCB0byBtb2RpZnkgYSBvZmZzZXQgY2FsY3VsYXRlZCBvbiBzdGFydCwgc2luY2UgdGhlIGZvbGxvd2luZyBoYXBwZW5lZDoKCQkvLyAxLiBUaGUgcG9zaXRpb24gb2YgdGhlIGhlbHBlciBpcyBhYnNvbHV0ZSwgc28gaXQncyBwb3NpdGlvbiBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBuZXh0IHBvc2l0aW9uZWQgcGFyZW50CgkJLy8gMi4gVGhlIGFjdHVhbCBvZmZzZXQgcGFyZW50IGlzIGEgY2hpbGQgb2YgdGhlIHNjcm9sbCBwYXJlbnQsIGFuZCB0aGUgc2Nyb2xsIHBhcmVudCBpc24ndCB0aGUgZG9jdW1lbnQsIHdoaWNoIG1lYW5zIHRoYXQKCQkvLyAgICB0aGUgc2Nyb2xsIGlzIGluY2x1ZGVkIGluIHRoZSBpbml0aWFsIGNhbGN1bGF0aW9uIG9mIHRoZSBvZmZzZXQgb2YgdGhlIHBhcmVudCwgYW5kIG5ldmVyIHJlY2FsY3VsYXRlZCB1cG9uIGRyYWcKCQlpZih0aGlzLmNzc1Bvc2l0aW9uID09PSAiYWJzb2x1dGUiICYmIHRoaXMuc2Nyb2xsUGFyZW50WzBdICE9PSBkb2N1bWVudCAmJiAkLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLCB0aGlzLm9mZnNldFBhcmVudFswXSkpIHsKCQkJcG8ubGVmdCArPSB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCk7CgkJCXBvLnRvcCArPSB0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTsKCQl9CgoJCS8vIFRoaXMgbmVlZHMgdG8gYmUgYWN0dWFsbHkgZG9uZSBmb3IgYWxsIGJyb3dzZXJzLCBzaW5jZSBwYWdlWC9wYWdlWSBpbmNsdWRlcyB0aGlzIGluZm9ybWF0aW9uCgkJLy8gd2l0aCBhbiB1Z2x5IElFIGZpeAoJCWlmKCB0aGlzLm9mZnNldFBhcmVudFswXSA9PT0gZG9jdW1lbnQuYm9keSB8fCAodGhpcy5vZmZzZXRQYXJlbnRbMF0udGFnTmFtZSAmJiB0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICJodG1sIiAmJiAkLnVpLmllKSkgewoJCQlwbyA9IHsgdG9wOiAwLCBsZWZ0OiAwIH07CgkJfQoKCQlyZXR1cm4gewoJCQl0b3A6IHBvLnRvcCArIChwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApIHx8IDApLAoJCQlsZWZ0OiBwby5sZWZ0ICsgKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApIHx8IDApCgkJfTsKCgl9LAoKCV9nZXRSZWxhdGl2ZU9mZnNldDogZnVuY3Rpb24oKSB7CgoJCWlmKHRoaXMuY3NzUG9zaXRpb24gPT09ICJyZWxhdGl2ZSIpIHsKCQkJdmFyIHAgPSB0aGlzLmN1cnJlbnRJdGVtLnBvc2l0aW9uKCk7CgkJCXJldHVybiB7CgkJCQl0b3A6IHAudG9wIC0gKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApIHx8IDApICsgdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCksCgkJCQlsZWZ0OiBwLmxlZnQgLSAocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApIHx8IDApICsgdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpCgkJCX07CgkJfSBlbHNlIHsKCQkJcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CgkJfQoKCX0sCgoJX2NhY2hlTWFyZ2luczogZnVuY3Rpb24oKSB7CgkJdGhpcy5tYXJnaW5zID0gewoJCQlsZWZ0OiAocGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQiKSwxMCkgfHwgMCksCgkJCXRvcDogKHBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5Ub3AiKSwxMCkgfHwgMCkKCQl9OwoJfSwKCglfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWxwZXJQcm9wb3J0aW9ucyA9IHsKCQkJd2lkdGg6IHRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSwKCQkJaGVpZ2h0OiB0aGlzLmhlbHBlci5vdXRlckhlaWdodCgpCgkJfTsKCX0sCgoJX3NldENvbnRhaW5tZW50OiBmdW5jdGlvbigpIHsKCgkJdmFyIGNlLCBjbywgb3ZlciwKCQkJbyA9IHRoaXMub3B0aW9uczsKCQlpZihvLmNvbnRhaW5tZW50ID09PSAicGFyZW50IikgewoJCQlvLmNvbnRhaW5tZW50ID0gdGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZTsKCQl9CgkJaWYoby5jb250YWlubWVudCA9PT0gImRvY3VtZW50IiB8fCBvLmNvbnRhaW5tZW50ID09PSAid2luZG93IikgewoJCQl0aGlzLmNvbnRhaW5tZW50ID0gWwoJCQkJMCAtIHRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQgLSB0aGlzLm9mZnNldC5wYXJlbnQubGVmdCwKCQkJCTAgLSB0aGlzLm9mZnNldC5yZWxhdGl2ZS50b3AgLSB0aGlzLm9mZnNldC5wYXJlbnQudG9wLAoJCQkJJChvLmNvbnRhaW5tZW50ID09PSAiZG9jdW1lbnQiID8gZG9jdW1lbnQgOiB3aW5kb3cpLndpZHRoKCkgLSB0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoIC0gdGhpcy5tYXJnaW5zLmxlZnQsCgkJCQkoJChvLmNvbnRhaW5tZW50ID09PSAiZG9jdW1lbnQiID8gZG9jdW1lbnQgOiB3aW5kb3cpLmhlaWdodCgpIHx8IGRvY3VtZW50LmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpIC0gdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQgLSB0aGlzLm1hcmdpbnMudG9wCgkJCV07CgkJfQoKCQlpZighKC9eKGRvY3VtZW50fHdpbmRvd3xwYXJlbnQpJC8pLnRlc3Qoby5jb250YWlubWVudCkpIHsKCQkJY2UgPSAkKG8uY29udGFpbm1lbnQpWzBdOwoJCQljbyA9ICQoby5jb250YWlubWVudCkub2Zmc2V0KCk7CgkJCW92ZXIgPSAoJChjZSkuY3NzKCJvdmVyZmxvdyIpICE9PSAiaGlkZGVuIik7CgoJCQl0aGlzLmNvbnRhaW5tZW50ID0gWwoJCQkJY28ubGVmdCArIChwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKSB8fCAwKSArIChwYXJzZUludCgkKGNlKS5jc3MoInBhZGRpbmdMZWZ0IiksMTApIHx8IDApIC0gdGhpcy5tYXJnaW5zLmxlZnQsCgkJCQljby50b3AgKyAocGFyc2VJbnQoJChjZSkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKSB8fCAwKSArIChwYXJzZUludCgkKGNlKS5jc3MoInBhZGRpbmdUb3AiKSwxMCkgfHwgMCkgLSB0aGlzLm1hcmdpbnMudG9wLAoJCQkJY28ubGVmdCsob3ZlciA/IE1hdGgubWF4KGNlLnNjcm9sbFdpZHRoLGNlLm9mZnNldFdpZHRoKSA6IGNlLm9mZnNldFdpZHRoKSAtIChwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKSB8fCAwKSAtIChwYXJzZUludCgkKGNlKS5jc3MoInBhZGRpbmdSaWdodCIpLDEwKSB8fCAwKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGggLSB0aGlzLm1hcmdpbnMubGVmdCwKCQkJCWNvLnRvcCsob3ZlciA/IE1hdGgubWF4KGNlLnNjcm9sbEhlaWdodCxjZS5vZmZzZXRIZWlnaHQpIDogY2Uub2Zmc2V0SGVpZ2h0KSAtIChwYXJzZUludCgkKGNlKS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApIHx8IDApIC0gKHBhcnNlSW50KCQoY2UpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKSB8fCAwKSAtIHRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0IC0gdGhpcy5tYXJnaW5zLnRvcAoJCQldOwoJCX0KCgl9LAoKCV9jb252ZXJ0UG9zaXRpb25UbzogZnVuY3Rpb24oZCwgcG9zKSB7CgoJCWlmKCFwb3MpIHsKCQkJcG9zID0gdGhpcy5wb3NpdGlvbjsKCQl9CgkJdmFyIG1vZCA9IGQgPT09ICJhYnNvbHV0ZSIgPyAxIDogLTEsCgkJCXNjcm9sbCA9IHRoaXMuY3NzUG9zaXRpb24gPT09ICJhYnNvbHV0ZSIgJiYgISh0aGlzLnNjcm9sbFBhcmVudFswXSAhPT0gZG9jdW1lbnQgJiYgJC5jb250YWlucyh0aGlzLnNjcm9sbFBhcmVudFswXSwgdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSA/IHRoaXMub2Zmc2V0UGFyZW50IDogdGhpcy5zY3JvbGxQYXJlbnQsCgkJCXNjcm9sbElzUm9vdE5vZGUgPSAoLyhodG1sfGJvZHkpL2kpLnRlc3Qoc2Nyb2xsWzBdLnRhZ05hbWUpOwoKCQlyZXR1cm4gewoJCQl0b3A6ICgKCQkJCXBvcy50b3AJKwkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCAqIG1vZCArCQkJCQkJCQkJCS8vIE9ubHkgZm9yIHJlbGF0aXZlIHBvc2l0aW9uZWQgbm9kZXM6IFJlbGF0aXZlIG9mZnNldCBmcm9tIGVsZW1lbnQgdG8gb2Zmc2V0IHBhcmVudAoJCQkJdGhpcy5vZmZzZXQucGFyZW50LnRvcCAqIG1vZCAtCQkJCQkJCQkJCQkvLyBUaGUgb2Zmc2V0UGFyZW50J3Mgb2Zmc2V0IHdpdGhvdXQgYm9yZGVycyAob2Zmc2V0ICsgYm9yZGVyKQoJCQkJKCAoIHRoaXMuY3NzUG9zaXRpb24gPT09ICJmaXhlZCIgPyAtdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsVG9wKCkgOiAoIHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbFRvcCgpICkgKSAqIG1vZCkKCQkJKSwKCQkJbGVmdDogKAoJCQkJcG9zLmxlZnQgKwkJCQkJCQkJCQkJCQkJCQkvLyBUaGUgYWJzb2x1dGUgbW91c2UgcG9zaXRpb24KCQkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQgKiBtb2QgKwkJCQkJCQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0ICogbW9kCS0JCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSggKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbExlZnQoKSApICogbW9kKQoJCQkpCgkJfTsKCgl9LAoKCV9nZW5lcmF0ZVBvc2l0aW9uOiBmdW5jdGlvbihldmVudCkgewoKCQl2YXIgdG9wLCBsZWZ0LAoJCQlvID0gdGhpcy5vcHRpb25zLAoJCQlwYWdlWCA9IGV2ZW50LnBhZ2VYLAoJCQlwYWdlWSA9IGV2ZW50LnBhZ2VZLAoJCQlzY3JvbGwgPSB0aGlzLmNzc1Bvc2l0aW9uID09PSAiYWJzb2x1dGUiICYmICEodGhpcy5zY3JvbGxQYXJlbnRbMF0gIT09IGRvY3VtZW50ICYmICQuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sIHRoaXMub2Zmc2V0UGFyZW50WzBdKSkgPyB0aGlzLm9mZnNldFBhcmVudCA6IHRoaXMuc2Nyb2xsUGFyZW50LCBzY3JvbGxJc1Jvb3ROb2RlID0gKC8oaHRtbHxib2R5KS9pKS50ZXN0KHNjcm9sbFswXS50YWdOYW1lKTsKCgkJLy8gVGhpcyBpcyBhbm90aGVyIHZlcnkgd2VpcmQgc3BlY2lhbCBjYXNlIHRoYXQgb25seSBoYXBwZW5zIGZvciByZWxhdGl2ZSBlbGVtZW50czoKCQkvLyAxLiBJZiB0aGUgY3NzIHBvc2l0aW9uIGlzIHJlbGF0aXZlCgkJLy8gMi4gYW5kIHRoZSBzY3JvbGwgcGFyZW50IGlzIHRoZSBkb2N1bWVudCBvciBzaW1pbGFyIHRvIHRoZSBvZmZzZXQgcGFyZW50CgkJLy8gd2UgaGF2ZSB0byByZWZyZXNoIHRoZSByZWxhdGl2ZSBvZmZzZXQgZHVyaW5nIHRoZSBzY3JvbGwgc28gdGhlcmUgYXJlIG5vIGp1bXBzCgkJaWYodGhpcy5jc3NQb3NpdGlvbiA9PT0gInJlbGF0aXZlIiAmJiAhKHRoaXMuc2Nyb2xsUGFyZW50WzBdICE9PSBkb2N1bWVudCAmJiB0aGlzLnNjcm9sbFBhcmVudFswXSAhPT0gdGhpcy5vZmZzZXRQYXJlbnRbMF0pKSB7CgkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlID0gdGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKTsKCQl9CgoJCS8qCgkJICogLSBQb3NpdGlvbiBjb25zdHJhaW5pbmcgLQoJCSAqIENvbnN0cmFpbiB0aGUgcG9zaXRpb24gdG8gYSBtaXggb2YgZ3JpZCwgY29udGFpbm1lbnQuCgkJICovCgoJCWlmKHRoaXMub3JpZ2luYWxQb3NpdGlvbikgeyAvL0lmIHdlIGFyZSBub3QgZHJhZ2dpbmcgeWV0LCB3ZSB3b24ndCBjaGVjayBmb3Igb3B0aW9ucwoKCQkJaWYodGhpcy5jb250YWlubWVudCkgewoJCQkJaWYoZXZlbnQucGFnZVggLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0IDwgdGhpcy5jb250YWlubWVudFswXSkgewoJCQkJCXBhZ2VYID0gdGhpcy5jb250YWlubWVudFswXSArIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ7CgkJCQl9CgkJCQlpZihldmVudC5wYWdlWSAtIHRoaXMub2Zmc2V0LmNsaWNrLnRvcCA8IHRoaXMuY29udGFpbm1lbnRbMV0pIHsKCQkJCQlwYWdlWSA9IHRoaXMuY29udGFpbm1lbnRbMV0gKyB0aGlzLm9mZnNldC5jbGljay50b3A7CgkJCQl9CgkJCQlpZihldmVudC5wYWdlWCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPiB0aGlzLmNvbnRhaW5tZW50WzJdKSB7CgkJCQkJcGFnZVggPSB0aGlzLmNvbnRhaW5tZW50WzJdICsgdGhpcy5vZmZzZXQuY2xpY2subGVmdDsKCQkJCX0KCQkJCWlmKGV2ZW50LnBhZ2VZIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID4gdGhpcy5jb250YWlubWVudFszXSkgewoJCQkJCXBhZ2VZID0gdGhpcy5jb250YWlubWVudFszXSArIHRoaXMub2Zmc2V0LmNsaWNrLnRvcDsKCQkJCX0KCQkJfQoKCQkJaWYoby5ncmlkKSB7CgkJCQl0b3AgPSB0aGlzLm9yaWdpbmFsUGFnZVkgKyBNYXRoLnJvdW5kKChwYWdlWSAtIHRoaXMub3JpZ2luYWxQYWdlWSkgLyBvLmdyaWRbMV0pICogby5ncmlkWzFdOwoJCQkJcGFnZVkgPSB0aGlzLmNvbnRhaW5tZW50ID8gKCAodG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wID49IHRoaXMuY29udGFpbm1lbnRbMV0gJiYgdG9wIC0gdGhpcy5vZmZzZXQuY2xpY2sudG9wIDw9IHRoaXMuY29udGFpbm1lbnRbM10pID8gdG9wIDogKCh0b3AgLSB0aGlzLm9mZnNldC5jbGljay50b3AgPj0gdGhpcy5jb250YWlubWVudFsxXSkgPyB0b3AgLSBvLmdyaWRbMV0gOiB0b3AgKyBvLmdyaWRbMV0pKSA6IHRvcDsKCgkJCQlsZWZ0ID0gdGhpcy5vcmlnaW5hbFBhZ2VYICsgTWF0aC5yb3VuZCgocGFnZVggLSB0aGlzLm9yaWdpbmFsUGFnZVgpIC8gby5ncmlkWzBdKSAqIG8uZ3JpZFswXTsKCQkJCXBhZ2VYID0gdGhpcy5jb250YWlubWVudCA/ICggKGxlZnQgLSB0aGlzLm9mZnNldC5jbGljay5sZWZ0ID49IHRoaXMuY29udGFpbm1lbnRbMF0gJiYgbGVmdCAtIHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQgPD0gdGhpcy5jb250YWlubWVudFsyXSkgPyBsZWZ0IDogKChsZWZ0IC0gdGhpcy5vZmZzZXQuY2xpY2subGVmdCA+PSB0aGlzLmNvbnRhaW5tZW50WzBdKSA/IGxlZnQgLSBvLmdyaWRbMF0gOiBsZWZ0ICsgby5ncmlkWzBdKSkgOiBsZWZ0OwoJCQl9CgoJCX0KCgkJcmV0dXJuIHsKCQkJdG9wOiAoCgkJCQlwYWdlWSAtCQkJCQkJCQkJCQkJCQkJCS8vIFRoZSBhYnNvbHV0ZSBtb3VzZSBwb3NpdGlvbgoJCQkJdGhpcy5vZmZzZXQuY2xpY2sudG9wIC0JCQkJCQkJCQkJCQkJLy8gQ2xpY2sgb2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgZWxlbWVudCkKCQkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcAktCQkJCQkJCQkJCQkvLyBPbmx5IGZvciByZWxhdGl2ZSBwb3NpdGlvbmVkIG5vZGVzOiBSZWxhdGl2ZSBvZmZzZXQgZnJvbSBlbGVtZW50IHRvIG9mZnNldCBwYXJlbnQKCQkJCXRoaXMub2Zmc2V0LnBhcmVudC50b3AgKwkJCQkJCQkJCQkJCS8vIFRoZSBvZmZzZXRQYXJlbnQncyBvZmZzZXQgd2l0aG91dCBib3JkZXJzIChvZmZzZXQgKyBib3JkZXIpCgkJCQkoICggdGhpcy5jc3NQb3NpdGlvbiA9PT0gImZpeGVkIiA/IC10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSA6ICggc2Nyb2xsSXNSb290Tm9kZSA/IDAgOiBzY3JvbGwuc2Nyb2xsVG9wKCkgKSApKQoJCQkpLAoJCQlsZWZ0OiAoCgkJCQlwYWdlWCAtCQkJCQkJCQkJCQkJCQkJCS8vIFRoZSBhYnNvbHV0ZSBtb3VzZSBwb3NpdGlvbgoJCQkJdGhpcy5vZmZzZXQuY2xpY2subGVmdCAtCQkJCQkJCQkJCQkJLy8gQ2xpY2sgb2Zmc2V0IChyZWxhdGl2ZSB0byB0aGUgZWxlbWVudCkKCQkJCXRoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQJLQkJCQkJCQkJCQkJLy8gT25seSBmb3IgcmVsYXRpdmUgcG9zaXRpb25lZCBub2RlczogUmVsYXRpdmUgb2Zmc2V0IGZyb20gZWxlbWVudCB0byBvZmZzZXQgcGFyZW50CgkJCQl0aGlzLm9mZnNldC5wYXJlbnQubGVmdCArCQkJCQkJCQkJCQkJLy8gVGhlIG9mZnNldFBhcmVudCdzIG9mZnNldCB3aXRob3V0IGJvcmRlcnMgKG9mZnNldCArIGJvcmRlcikKCQkJCSggKCB0aGlzLmNzc1Bvc2l0aW9uID09PSAiZml4ZWQiID8gLXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSA6IHNjcm9sbElzUm9vdE5vZGUgPyAwIDogc2Nyb2xsLnNjcm9sbExlZnQoKSApKQoJCQkpCgkJfTsKCgl9LAoKCV9yZWFycmFuZ2U6IGZ1bmN0aW9uKGV2ZW50LCBpLCBhLCBoYXJkUmVmcmVzaCkgewoKCQlhID8gYVswXS5hcHBlbmRDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKSA6IGkuaXRlbVswXS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnBsYWNlaG9sZGVyWzBdLCAodGhpcy5kaXJlY3Rpb24gPT09ICJkb3duIiA/IGkuaXRlbVswXSA6IGkuaXRlbVswXS5uZXh0U2libGluZykpOwoKCQkvL1ZhcmlvdXMgdGhpbmdzIGRvbmUgaGVyZSB0byBpbXByb3ZlIHRoZSBwZXJmb3JtYW5jZToKCQkvLyAxLiB3ZSBjcmVhdGUgYSBzZXRUaW1lb3V0LCB0aGF0IGNhbGxzIHJlZnJlc2hQb3NpdGlvbnMKCQkvLyAyLiBvbiB0aGUgaW5zdGFuY2UsIHdlIGhhdmUgYSBjb3VudGVyIHZhcmlhYmxlLCB0aGF0IGdldCdzIGhpZ2hlciBhZnRlciBldmVyeSBhcHBlbmQKCQkvLyAzLiBvbiB0aGUgbG9jYWwgc2NvcGUsIHdlIGNvcHkgdGhlIGNvdW50ZXIgdmFyaWFibGUsIGFuZCBjaGVjayBpbiB0aGUgdGltZW91dCwgaWYgaXQncyBzdGlsbCB0aGUgc2FtZQoJCS8vIDQuIHRoaXMgbGV0cyBvbmx5IHRoZSBsYXN0IGFkZGl0aW9uIHRvIHRoZSB0aW1lb3V0IHN0YWNrIHRocm91Z2gKCQl0aGlzLmNvdW50ZXIgPSB0aGlzLmNvdW50ZXIgPyArK3RoaXMuY291bnRlciA6IDE7CgkJdmFyIGNvdW50ZXIgPSB0aGlzLmNvdW50ZXI7CgoJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQlpZihjb3VudGVyID09PSB0aGlzLmNvdW50ZXIpIHsKCQkJCXRoaXMucmVmcmVzaFBvc2l0aW9ucyghaGFyZFJlZnJlc2gpOyAvL1ByZWNvbXB1dGUgYWZ0ZXIgZWFjaCBET00gaW5zZXJ0aW9uLCBOT1Qgb24gbW91c2Vtb3ZlCgkJCX0KCQl9KTsKCgl9LAoKCV9jbGVhcjogZnVuY3Rpb24oZXZlbnQsIG5vUHJvcGFnYXRpb24pIHsKCgkJdGhpcy5yZXZlcnRpbmcgPSBmYWxzZTsKCQkvLyBXZSBkZWxheSBhbGwgZXZlbnRzIHRoYXQgaGF2ZSB0byBiZSB0cmlnZ2VyZWQgdG8gYWZ0ZXIgdGhlIHBvaW50IHdoZXJlIHRoZSBwbGFjZWhvbGRlciBoYXMgYmVlbiByZW1vdmVkIGFuZAoJCS8vIGV2ZXJ5dGhpbmcgZWxzZSBub3JtYWxpemVkIGFnYWluCgkJdmFyIGksCgkJCWRlbGF5ZWRUcmlnZ2VycyA9IFtdOwoKCQkvLyBXZSBmaXJzdCBoYXZlIHRvIHVwZGF0ZSB0aGUgZG9tIHBvc2l0aW9uIG9mIHRoZSBhY3R1YWwgY3VycmVudEl0ZW0KCQkvLyBOb3RlOiBkb24ndCBkbyBpdCBpZiB0aGUgY3VycmVudCBpdGVtIGlzIGFscmVhZHkgcmVtb3ZlZCAoYnkgYSB1c2VyKSwgb3IgaXQgZ2V0cyByZWFwcGVuZGVkIChzZWUgIzQwODgpCgkJaWYoIXRoaXMuX25vRmluYWxTb3J0ICYmIHRoaXMuY3VycmVudEl0ZW0ucGFyZW50KCkubGVuZ3RoKSB7CgkJCXRoaXMucGxhY2Vob2xkZXIuYmVmb3JlKHRoaXMuY3VycmVudEl0ZW0pOwoJCX0KCQl0aGlzLl9ub0ZpbmFsU29ydCA9IG51bGw7CgoJCWlmKHRoaXMuaGVscGVyWzBdID09PSB0aGlzLmN1cnJlbnRJdGVtWzBdKSB7CgkJCWZvcihpIGluIHRoaXMuX3N0b3JlZENTUykgewoJCQkJaWYodGhpcy5fc3RvcmVkQ1NTW2ldID09PSAiYXV0byIgfHwgdGhpcy5fc3RvcmVkQ1NTW2ldID09PSAic3RhdGljIikgewoJCQkJCXRoaXMuX3N0b3JlZENTU1tpXSA9ICIiOwoJCQkJfQoJCQl9CgkJCXRoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOwoJCX0gZWxzZSB7CgkJCXRoaXMuY3VycmVudEl0ZW0uc2hvdygpOwoJCX0KCgkJaWYodGhpcy5mcm9tT3V0c2lkZSAmJiAhbm9Qcm9wYWdhdGlvbikgewoJCQlkZWxheWVkVHJpZ2dlcnMucHVzaChmdW5jdGlvbihldmVudCkgeyB0aGlzLl90cmlnZ2VyKCJyZWNlaXZlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzLmZyb21PdXRzaWRlKSk7IH0pOwoJCX0KCQlpZigodGhpcy5mcm9tT3V0c2lkZSB8fCB0aGlzLmRvbVBvc2l0aW9uLnByZXYgIT09IHRoaXMuY3VycmVudEl0ZW0ucHJldigpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdIHx8IHRoaXMuZG9tUG9zaXRpb24ucGFyZW50ICE9PSB0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpWzBdKSAmJiAhbm9Qcm9wYWdhdGlvbikgewoJCQlkZWxheWVkVHJpZ2dlcnMucHVzaChmdW5jdGlvbihldmVudCkgeyB0aGlzLl90cmlnZ2VyKCJ1cGRhdGUiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOyB9KTsgLy9UcmlnZ2VyIHVwZGF0ZSBjYWxsYmFjayBpZiB0aGUgRE9NIHBvc2l0aW9uIGhhcyBjaGFuZ2VkCgkJfQoKCQkvLyBDaGVjayBpZiB0aGUgaXRlbXMgQ29udGFpbmVyIGhhcyBDaGFuZ2VkIGFuZCB0cmlnZ2VyIGFwcHJvcHJpYXRlCgkJLy8gZXZlbnRzLgoJCWlmICh0aGlzICE9PSB0aGlzLmN1cnJlbnRDb250YWluZXIpIHsKCQkJaWYoIW5vUHJvcGFnYXRpb24pIHsKCQkJCWRlbGF5ZWRUcmlnZ2Vycy5wdXNoKGZ1bmN0aW9uKGV2ZW50KSB7IHRoaXMuX3RyaWdnZXIoInJlbW92ZSIsIGV2ZW50LCB0aGlzLl91aUhhc2goKSk7IH0pOwoJCQkJZGVsYXllZFRyaWdnZXJzLnB1c2goKGZ1bmN0aW9uKGMpIHsgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7IGMuX3RyaWdnZXIoInJlY2VpdmUiLCBldmVudCwgdGhpcy5fdWlIYXNoKHRoaXMpKTsgfTsgIH0pLmNhbGwodGhpcywgdGhpcy5jdXJyZW50Q29udGFpbmVyKSk7CgkJCQlkZWxheWVkVHJpZ2dlcnMucHVzaCgoZnVuY3Rpb24oYykgeyByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsgYy5fdHJpZ2dlcigidXBkYXRlIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCh0aGlzKSk7ICB9OyB9KS5jYWxsKHRoaXMsIHRoaXMuY3VycmVudENvbnRhaW5lcikpOwoJCQl9CgkJfQoKCgkJLy9Qb3N0IGV2ZW50cyB0byBjb250YWluZXJzCgkJZnVuY3Rpb24gZGVsYXlFdmVudCggdHlwZSwgaW5zdGFuY2UsIGNvbnRhaW5lciApIHsKCQkJcmV0dXJuIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWNvbnRhaW5lci5fdHJpZ2dlciggdHlwZSwgZXZlbnQsIGluc3RhbmNlLl91aUhhc2goIGluc3RhbmNlICkgKTsKCQkJfTsKCQl9CgkJZm9yIChpID0gdGhpcy5jb250YWluZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKXsKCQkJaWYgKCFub1Byb3BhZ2F0aW9uKSB7CgkJCQlkZWxheWVkVHJpZ2dlcnMucHVzaCggZGVsYXlFdmVudCggImRlYWN0aXZhdGUiLCB0aGlzLCB0aGlzLmNvbnRhaW5lcnNbIGkgXSApICk7CgkJCX0KCQkJaWYodGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIpIHsKCQkJCWRlbGF5ZWRUcmlnZ2Vycy5wdXNoKCBkZWxheUV2ZW50KCAib3V0IiwgdGhpcywgdGhpcy5jb250YWluZXJzWyBpIF0gKSApOwoJCQkJdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXIgPSAwOwoJCQl9CgkJfQoKCQkvL0RvIHdoYXQgd2FzIG9yaWdpbmFsbHkgaW4gcGx1Z2lucwoJCWlmICggdGhpcy5zdG9yZWRDdXJzb3IgKSB7CgkJCXRoaXMuZG9jdW1lbnQuZmluZCggImJvZHkiICkuY3NzKCAiY3Vyc29yIiwgdGhpcy5zdG9yZWRDdXJzb3IgKTsKCQkJdGhpcy5zdG9yZWRTdHlsZXNoZWV0LnJlbW92ZSgpOwoJCX0KCQlpZih0aGlzLl9zdG9yZWRPcGFjaXR5KSB7CgkJCXRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsIHRoaXMuX3N0b3JlZE9wYWNpdHkpOwoJCX0KCQlpZih0aGlzLl9zdG9yZWRaSW5kZXgpIHsKCQkJdGhpcy5oZWxwZXIuY3NzKCJ6SW5kZXgiLCB0aGlzLl9zdG9yZWRaSW5kZXggPT09ICJhdXRvIiA/ICIiIDogdGhpcy5fc3RvcmVkWkluZGV4KTsKCQl9CgoJCXRoaXMuZHJhZ2dpbmcgPSBmYWxzZTsKCQlpZih0aGlzLmNhbmNlbEhlbHBlclJlbW92YWwpIHsKCQkJaWYoIW5vUHJvcGFnYXRpb24pIHsKCQkJCXRoaXMuX3RyaWdnZXIoImJlZm9yZVN0b3AiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoJCQkJZm9yIChpPTA7IGkgPCBkZWxheWVkVHJpZ2dlcnMubGVuZ3RoOyBpKyspIHsKCQkJCQlkZWxheWVkVHJpZ2dlcnNbaV0uY2FsbCh0aGlzLCBldmVudCk7CgkJCQl9IC8vVHJpZ2dlciBhbGwgZGVsYXllZCBldmVudHMKCQkJCXRoaXMuX3RyaWdnZXIoInN0b3AiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoJCQl9CgoJCQl0aGlzLmZyb21PdXRzaWRlID0gZmFsc2U7CgkJCXJldHVybiBmYWxzZTsKCQl9CgoJCWlmKCFub1Byb3BhZ2F0aW9uKSB7CgkJCXRoaXMuX3RyaWdnZXIoImJlZm9yZVN0b3AiLCBldmVudCwgdGhpcy5fdWlIYXNoKCkpOwoJCX0KCgkJLy8kKHRoaXMucGxhY2Vob2xkZXJbMF0pLnJlbW92ZSgpOyB3b3VsZCBoYXZlIGJlZW4gdGhlIGpRdWVyeSB3YXkgLSB1bmZvcnR1bmF0ZWx5LCBpdCB1bmJpbmRzIEFMTCBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgbm9kZSEKCQl0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk7CgoJCWlmKHRoaXMuaGVscGVyWzBdICE9PSB0aGlzLmN1cnJlbnRJdGVtWzBdKSB7CgkJCXRoaXMuaGVscGVyLnJlbW92ZSgpOwoJCX0KCQl0aGlzLmhlbHBlciA9IG51bGw7CgoJCWlmKCFub1Byb3BhZ2F0aW9uKSB7CgkJCWZvciAoaT0wOyBpIDwgZGVsYXllZFRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7CgkJCQlkZWxheWVkVHJpZ2dlcnNbaV0uY2FsbCh0aGlzLCBldmVudCk7CgkJCX0gLy9UcmlnZ2VyIGFsbCBkZWxheWVkIGV2ZW50cwoJCQl0aGlzLl90cmlnZ2VyKCJzdG9wIiwgZXZlbnQsIHRoaXMuX3VpSGFzaCgpKTsKCQl9CgoJCXRoaXMuZnJvbU91dHNpZGUgPSBmYWxzZTsKCQlyZXR1cm4gdHJ1ZTsKCgl9LAoKCV90cmlnZ2VyOiBmdW5jdGlvbigpIHsKCQlpZiAoJC5XaWRnZXQucHJvdG90eXBlLl90cmlnZ2VyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPT09IGZhbHNlKSB7CgkJCXRoaXMuY2FuY2VsKCk7CgkJfQoJfSwKCglfdWlIYXNoOiBmdW5jdGlvbihfaW5zdCkgewoJCXZhciBpbnN0ID0gX2luc3QgfHwgdGhpczsKCQlyZXR1cm4gewoJCQloZWxwZXI6IGluc3QuaGVscGVyLAoJCQlwbGFjZWhvbGRlcjogaW5zdC5wbGFjZWhvbGRlciB8fCAkKFtdKSwKCQkJcG9zaXRpb246IGluc3QucG9zaXRpb24sCgkJCW9yaWdpbmFsUG9zaXRpb246IGluc3Qub3JpZ2luYWxQb3NpdGlvbiwKCQkJb2Zmc2V0OiBpbnN0LnBvc2l0aW9uQWJzLAoJCQlpdGVtOiBpbnN0LmN1cnJlbnRJdGVtLAoJCQlzZW5kZXI6IF9pbnN0ID8gX2luc3QuZWxlbWVudCA6IG51bGwKCQl9OwoJfQoKfSk7CgoKLyohCiAqIGpRdWVyeSBVSSBBY2NvcmRpb24gMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vYWNjb3JkaW9uLwogKi8KCgp2YXIgYWNjb3JkaW9uID0gJC53aWRnZXQoICJ1aS5hY2NvcmRpb24iLCB7Cgl2ZXJzaW9uOiAiMS4xMS4wIiwKCW9wdGlvbnM6IHsKCQlhY3RpdmU6IDAsCgkJYW5pbWF0ZToge30sCgkJY29sbGFwc2libGU6IGZhbHNlLAoJCWV2ZW50OiAiY2xpY2siLAoJCWhlYWRlcjogIj4gbGkgPiA6Zmlyc3QtY2hpbGQsPiA6bm90KGxpKTpldmVuIiwKCQloZWlnaHRTdHlsZTogImF1dG8iLAoJCWljb25zOiB7CgkJCWFjdGl2ZUhlYWRlcjogInVpLWljb24tdHJpYW5nbGUtMS1zIiwKCQkJaGVhZGVyOiAidWktaWNvbi10cmlhbmdsZS0xLWUiCgkJfSwKCgkJLy8gY2FsbGJhY2tzCgkJYWN0aXZhdGU6IG51bGwsCgkJYmVmb3JlQWN0aXZhdGU6IG51bGwKCX0sCgoJaGlkZVByb3BzOiB7CgkJYm9yZGVyVG9wV2lkdGg6ICJoaWRlIiwKCQlib3JkZXJCb3R0b21XaWR0aDogImhpZGUiLAoJCXBhZGRpbmdUb3A6ICJoaWRlIiwKCQlwYWRkaW5nQm90dG9tOiAiaGlkZSIsCgkJaGVpZ2h0OiAiaGlkZSIKCX0sCgoJc2hvd1Byb3BzOiB7CgkJYm9yZGVyVG9wV2lkdGg6ICJzaG93IiwKCQlib3JkZXJCb3R0b21XaWR0aDogInNob3ciLAoJCXBhZGRpbmdUb3A6ICJzaG93IiwKCQlwYWRkaW5nQm90dG9tOiAic2hvdyIsCgkJaGVpZ2h0OiAic2hvdyIKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJdGhpcy5wcmV2U2hvdyA9IHRoaXMucHJldkhpZGUgPSAkKCk7CgkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCAidWktYWNjb3JkaW9uIHVpLXdpZGdldCB1aS1oZWxwZXItcmVzZXQiICkKCQkJLy8gQVJJQQoJCQkuYXR0ciggInJvbGUiLCAidGFibGlzdCIgKTsKCgkJLy8gZG9uJ3QgYWxsb3cgY29sbGFwc2libGU6IGZhbHNlIGFuZCBhY3RpdmU6IGZhbHNlIC8gbnVsbAoJCWlmICggIW9wdGlvbnMuY29sbGFwc2libGUgJiYgKG9wdGlvbnMuYWN0aXZlID09PSBmYWxzZSB8fCBvcHRpb25zLmFjdGl2ZSA9PSBudWxsKSApIHsKCQkJb3B0aW9ucy5hY3RpdmUgPSAwOwoJCX0KCgkJdGhpcy5fcHJvY2Vzc1BhbmVscygpOwoJCS8vIGhhbmRsZSBuZWdhdGl2ZSB2YWx1ZXMKCQlpZiAoIG9wdGlvbnMuYWN0aXZlIDwgMCApIHsKCQkJb3B0aW9ucy5hY3RpdmUgKz0gdGhpcy5oZWFkZXJzLmxlbmd0aDsKCQl9CgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfZ2V0Q3JlYXRlRXZlbnREYXRhOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gewoJCQloZWFkZXI6IHRoaXMuYWN0aXZlLAoJCQlwYW5lbDogIXRoaXMuYWN0aXZlLmxlbmd0aCA/ICQoKSA6IHRoaXMuYWN0aXZlLm5leHQoKQoJCX07Cgl9LAoKCV9jcmVhdGVJY29uczogZnVuY3Rpb24oKSB7CgkJdmFyIGljb25zID0gdGhpcy5vcHRpb25zLmljb25zOwoJCWlmICggaWNvbnMgKSB7CgkJCSQoICI8c3Bhbj4iICkKCQkJCS5hZGRDbGFzcyggInVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiB1aS1pY29uICIgKyBpY29ucy5oZWFkZXIgKQoJCQkJLnByZXBlbmRUbyggdGhpcy5oZWFkZXJzICk7CgkJCXRoaXMuYWN0aXZlLmNoaWxkcmVuKCAiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIgKQoJCQkJLnJlbW92ZUNsYXNzKCBpY29ucy5oZWFkZXIgKQoJCQkJLmFkZENsYXNzKCBpY29ucy5hY3RpdmVIZWFkZXIgKTsKCQkJdGhpcy5oZWFkZXJzLmFkZENsYXNzKCAidWktYWNjb3JkaW9uLWljb25zIiApOwoJCX0KCX0sCgoJX2Rlc3Ryb3lJY29uczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWFkZXJzCgkJCS5yZW1vdmVDbGFzcyggInVpLWFjY29yZGlvbi1pY29ucyIgKQoJCQkuY2hpbGRyZW4oICIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIiApCgkJCQkucmVtb3ZlKCk7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl2YXIgY29udGVudHM7CgoJCS8vIGNsZWFuIHVwIG1haW4gZWxlbWVudAoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICk7CgoJCS8vIGNsZWFuIHVwIGhlYWRlcnMKCQl0aGlzLmhlYWRlcnMKCQkJLnJlbW92ZUNsYXNzKCAidWktYWNjb3JkaW9uLWhlYWRlciB1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1kZWZhdWx0ICIgKwoJCQkJInVpLWNvcm5lci1hbGwgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkIHVpLWNvcm5lci10b3AiICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1leHBhbmRlZCIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtc2VsZWN0ZWQiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLWNvbnRyb2xzIiApCgkJCS5yZW1vdmVBdHRyKCAidGFiSW5kZXgiICkKCQkJLnJlbW92ZVVuaXF1ZUlkKCk7CgoJCXRoaXMuX2Rlc3Ryb3lJY29ucygpOwoKCQkvLyBjbGVhbiB1cCBjb250ZW50IHBhbmVscwoJCWNvbnRlbnRzID0gdGhpcy5oZWFkZXJzLm5leHQoKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSAiICsKCQkJCSJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUgdWktc3RhdGUtZGlzYWJsZWQiICkKCQkJLmNzcyggImRpc3BsYXkiLCAiIiApCgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtaGlkZGVuIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1sYWJlbGxlZGJ5IiApCgkJCS5yZW1vdmVVbmlxdWVJZCgpOwoKCQlpZiAoIHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSAhPT0gImNvbnRlbnQiICkgewoJCQljb250ZW50cy5jc3MoICJoZWlnaHQiLCAiIiApOwoJCX0KCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJhY3RpdmUiICkgewoJCQkvLyBfYWN0aXZhdGUoKSB3aWxsIGhhbmRsZSBpbnZhbGlkIHZhbHVlcyBhbmQgdXBkYXRlIHRoaXMub3B0aW9ucwoJCQl0aGlzLl9hY3RpdmF0ZSggdmFsdWUgKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJldmVudCIgKSB7CgkJCWlmICggdGhpcy5vcHRpb25zLmV2ZW50ICkgewoJCQkJdGhpcy5fb2ZmKCB0aGlzLmhlYWRlcnMsIHRoaXMub3B0aW9ucy5ldmVudCApOwoJCQl9CgkJCXRoaXMuX3NldHVwRXZlbnRzKCB2YWx1ZSApOwoJCX0KCgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCgkJLy8gc2V0dGluZyBjb2xsYXBzaWJsZTogZmFsc2Ugd2hpbGUgY29sbGFwc2VkOyBvcGVuIGZpcnN0IHBhbmVsCgkJaWYgKCBrZXkgPT09ICJjb2xsYXBzaWJsZSIgJiYgIXZhbHVlICYmIHRoaXMub3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlICkgewoJCQl0aGlzLl9hY3RpdmF0ZSggMCApOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJpY29ucyIgKSB7CgkJCXRoaXMuX2Rlc3Ryb3lJY29ucygpOwoJCQlpZiAoIHZhbHVlICkgewoJCQkJdGhpcy5fY3JlYXRlSWNvbnMoKTsKCQkJfQoJCX0KCgkJLy8gIzUzMzIgLSBvcGFjaXR5IGRvZXNuJ3QgY2FzY2FkZSB0byBwb3NpdGlvbmVkIGVsZW1lbnRzIGluIElFCgkJLy8gc28gd2UgbmVlZCB0byBhZGQgdGhlIGRpc2FibGVkIGNsYXNzIHRvIHRoZSBoZWFkZXJzIGFuZCBwYW5lbHMKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy5lbGVtZW50CgkJCQkudG9nZ2xlQ2xhc3MoICJ1aS1zdGF0ZS1kaXNhYmxlZCIsICEhdmFsdWUgKQoJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgdmFsdWUgKTsKCQkJdGhpcy5oZWFkZXJzLmFkZCggdGhpcy5oZWFkZXJzLm5leHQoKSApCgkJCQkudG9nZ2xlQ2xhc3MoICJ1aS1zdGF0ZS1kaXNhYmxlZCIsICEhdmFsdWUgKTsKCQl9Cgl9LAoKCV9rZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCBldmVudC5hbHRLZXkgfHwgZXZlbnQuY3RybEtleSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyIGtleUNvZGUgPSAkLnVpLmtleUNvZGUsCgkJCWxlbmd0aCA9IHRoaXMuaGVhZGVycy5sZW5ndGgsCgkJCWN1cnJlbnRJbmRleCA9IHRoaXMuaGVhZGVycy5pbmRleCggZXZlbnQudGFyZ2V0ICksCgkJCXRvRm9jdXMgPSBmYWxzZTsKCgkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQkJY2FzZSBrZXlDb2RlLlJJR0hUOgoJCQljYXNlIGtleUNvZGUuRE9XTjoKCQkJCXRvRm9jdXMgPSB0aGlzLmhlYWRlcnNbICggY3VycmVudEluZGV4ICsgMSApICUgbGVuZ3RoIF07CgkJCQlicmVhazsKCQkJY2FzZSBrZXlDb2RlLkxFRlQ6CgkJCWNhc2Uga2V5Q29kZS5VUDoKCQkJCXRvRm9jdXMgPSB0aGlzLmhlYWRlcnNbICggY3VycmVudEluZGV4IC0gMSArIGxlbmd0aCApICUgbGVuZ3RoIF07CgkJCQlicmVhazsKCQkJY2FzZSBrZXlDb2RlLlNQQUNFOgoJCQljYXNlIGtleUNvZGUuRU5URVI6CgkJCQl0aGlzLl9ldmVudEhhbmRsZXIoIGV2ZW50ICk7CgkJCQlicmVhazsKCQkJY2FzZSBrZXlDb2RlLkhPTUU6CgkJCQl0b0ZvY3VzID0gdGhpcy5oZWFkZXJzWyAwIF07CgkJCQlicmVhazsKCQkJY2FzZSBrZXlDb2RlLkVORDoKCQkJCXRvRm9jdXMgPSB0aGlzLmhlYWRlcnNbIGxlbmd0aCAtIDEgXTsKCQkJCWJyZWFrOwoJCX0KCgkJaWYgKCB0b0ZvY3VzICkgewoJCQkkKCBldmVudC50YXJnZXQgKS5hdHRyKCAidGFiSW5kZXgiLCAtMSApOwoJCQkkKCB0b0ZvY3VzICkuYXR0ciggInRhYkluZGV4IiwgMCApOwoJCQl0b0ZvY3VzLmZvY3VzKCk7CgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJfQoJfSwKCglfcGFuZWxLZXlEb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuVVAgJiYgZXZlbnQuY3RybEtleSApIHsKCQkJJCggZXZlbnQuY3VycmVudFRhcmdldCApLnByZXYoKS5mb2N1cygpOwoJCX0KCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgkJdGhpcy5fcHJvY2Vzc1BhbmVscygpOwoKCQkvLyB3YXMgY29sbGFwc2VkIG9yIG5vIHBhbmVsCgkJaWYgKCAoIG9wdGlvbnMuYWN0aXZlID09PSBmYWxzZSAmJiBvcHRpb25zLmNvbGxhcHNpYmxlID09PSB0cnVlICkgfHwgIXRoaXMuaGVhZGVycy5sZW5ndGggKSB7CgkJCW9wdGlvbnMuYWN0aXZlID0gZmFsc2U7CgkJCXRoaXMuYWN0aXZlID0gJCgpOwoJCS8vIGFjdGl2ZSBmYWxzZSBvbmx5IHdoZW4gY29sbGFwc2libGUgaXMgdHJ1ZQoJCX0gZWxzZSBpZiAoIG9wdGlvbnMuYWN0aXZlID09PSBmYWxzZSApIHsKCQkJdGhpcy5fYWN0aXZhdGUoIDAgKTsKCQkvLyB3YXMgYWN0aXZlLCBidXQgYWN0aXZlIHBhbmVsIGlzIGdvbmUKCQl9IGVsc2UgaWYgKCB0aGlzLmFjdGl2ZS5sZW5ndGggJiYgISQuY29udGFpbnMoIHRoaXMuZWxlbWVudFsgMCBdLCB0aGlzLmFjdGl2ZVsgMCBdICkgKSB7CgkJCS8vIGFsbCByZW1haW5pbmcgcGFuZWwgYXJlIGRpc2FibGVkCgkJCWlmICggdGhpcy5oZWFkZXJzLmxlbmd0aCA9PT0gdGhpcy5oZWFkZXJzLmZpbmQoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLmxlbmd0aCApIHsKCQkJCW9wdGlvbnMuYWN0aXZlID0gZmFsc2U7CgkJCQl0aGlzLmFjdGl2ZSA9ICQoKTsKCQkJLy8gYWN0aXZhdGUgcHJldmlvdXMgcGFuZWwKCQkJfSBlbHNlIHsKCQkJCXRoaXMuX2FjdGl2YXRlKCBNYXRoLm1heCggMCwgb3B0aW9ucy5hY3RpdmUgLSAxICkgKTsKCQkJfQoJCS8vIHdhcyBhY3RpdmUsIGFjdGl2ZSBwYW5lbCBzdGlsbCBleGlzdHMKCQl9IGVsc2UgewoJCQkvLyBtYWtlIHN1cmUgYWN0aXZlIGluZGV4IGlzIGNvcnJlY3QKCQkJb3B0aW9ucy5hY3RpdmUgPSB0aGlzLmhlYWRlcnMuaW5kZXgoIHRoaXMuYWN0aXZlICk7CgkJfQoKCQl0aGlzLl9kZXN0cm95SWNvbnMoKTsKCgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfcHJvY2Vzc1BhbmVsczogZnVuY3Rpb24oKSB7CgkJdGhpcy5oZWFkZXJzID0gdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMub3B0aW9ucy5oZWFkZXIgKQoJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyIHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCIgKTsKCgkJdGhpcy5oZWFkZXJzLm5leHQoKQoJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIgKQoJCQkuZmlsdGVyKCAiOm5vdCgudWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlKSIgKQoJCQkuaGlkZSgpOwoJfSwKCglfcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIG1heEhlaWdodCwKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJaGVpZ2h0U3R5bGUgPSBvcHRpb25zLmhlaWdodFN0eWxlLAoJCQlwYXJlbnQgPSB0aGlzLmVsZW1lbnQucGFyZW50KCk7CgoJCXRoaXMuYWN0aXZlID0gdGhpcy5fZmluZEFjdGl2ZSggb3B0aW9ucy5hY3RpdmUgKQoJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUgdWktY29ybmVyLXRvcCIgKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApOwoJCXRoaXMuYWN0aXZlLm5leHQoKQoJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiICkKCQkJLnNob3coKTsKCgkJdGhpcy5oZWFkZXJzCgkJCS5hdHRyKCAicm9sZSIsICJ0YWIiICkKCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgaGVhZGVyID0gJCggdGhpcyApLAoJCQkJCWhlYWRlcklkID0gaGVhZGVyLnVuaXF1ZUlkKCkuYXR0ciggImlkIiApLAoJCQkJCXBhbmVsID0gaGVhZGVyLm5leHQoKSwKCQkJCQlwYW5lbElkID0gcGFuZWwudW5pcXVlSWQoKS5hdHRyKCAiaWQiICk7CgkJCQloZWFkZXIuYXR0ciggImFyaWEtY29udHJvbHMiLCBwYW5lbElkICk7CgkJCQlwYW5lbC5hdHRyKCAiYXJpYS1sYWJlbGxlZGJ5IiwgaGVhZGVySWQgKTsKCQkJfSkKCQkJLm5leHQoKQoJCQkJLmF0dHIoICJyb2xlIiwgInRhYnBhbmVsIiApOwoKCQl0aGlzLmhlYWRlcnMKCQkJLm5vdCggdGhpcy5hY3RpdmUgKQoJCQkuYXR0cih7CgkJCQkiYXJpYS1zZWxlY3RlZCI6ICJmYWxzZSIsCgkJCQkiYXJpYS1leHBhbmRlZCI6ICJmYWxzZSIsCgkJCQl0YWJJbmRleDogLTEKCQkJfSkKCQkJLm5leHQoKQoJCQkJLmF0dHIoewoJCQkJCSJhcmlhLWhpZGRlbiI6ICJ0cnVlIgoJCQkJfSkKCQkJCS5oaWRlKCk7CgoJCS8vIG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgaGVhZGVyIGlzIGluIHRoZSB0YWIgb3JkZXIKCQlpZiAoICF0aGlzLmFjdGl2ZS5sZW5ndGggKSB7CgkJCXRoaXMuaGVhZGVycy5lcSggMCApLmF0dHIoICJ0YWJJbmRleCIsIDAgKTsKCQl9IGVsc2UgewoJCQl0aGlzLmFjdGl2ZS5hdHRyKHsKCQkJCSJhcmlhLXNlbGVjdGVkIjogInRydWUiLAoJCQkJImFyaWEtZXhwYW5kZWQiOiAidHJ1ZSIsCgkJCQl0YWJJbmRleDogMAoJCQl9KQoJCQkubmV4dCgpCgkJCQkuYXR0cih7CgkJCQkJImFyaWEtaGlkZGVuIjogImZhbHNlIgoJCQkJfSk7CgkJfQoKCQl0aGlzLl9jcmVhdGVJY29ucygpOwoKCQl0aGlzLl9zZXR1cEV2ZW50cyggb3B0aW9ucy5ldmVudCApOwoKCQlpZiAoIGhlaWdodFN0eWxlID09PSAiZmlsbCIgKSB7CgkJCW1heEhlaWdodCA9IHBhcmVudC5oZWlnaHQoKTsKCQkJdGhpcy5lbGVtZW50LnNpYmxpbmdzKCAiOnZpc2libGUiICkuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBlbGVtID0gJCggdGhpcyApLAoJCQkJCXBvc2l0aW9uID0gZWxlbS5jc3MoICJwb3NpdGlvbiIgKTsKCgkJCQlpZiAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCW1heEhlaWdodCAtPSBlbGVtLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhpcy5oZWFkZXJzLmVhY2goZnVuY3Rpb24oKSB7CgkJCQltYXhIZWlnaHQgLT0gJCggdGhpcyApLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhpcy5oZWFkZXJzLm5leHQoKQoJCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQkJJCggdGhpcyApLmhlaWdodCggTWF0aC5tYXgoIDAsIG1heEhlaWdodCAtCgkJCQkJCSQoIHRoaXMgKS5pbm5lckhlaWdodCgpICsgJCggdGhpcyApLmhlaWdodCgpICkgKTsKCQkJCX0pCgkJCQkuY3NzKCAib3ZlcmZsb3ciLCAiYXV0byIgKTsKCQl9IGVsc2UgaWYgKCBoZWlnaHRTdHlsZSA9PT0gImF1dG8iICkgewoJCQltYXhIZWlnaHQgPSAwOwoJCQl0aGlzLmhlYWRlcnMubmV4dCgpCgkJCQkuZWFjaChmdW5jdGlvbigpIHsKCQkJCQltYXhIZWlnaHQgPSBNYXRoLm1heCggbWF4SGVpZ2h0LCAkKCB0aGlzICkuY3NzKCAiaGVpZ2h0IiwgIiIgKS5oZWlnaHQoKSApOwoJCQkJfSkKCQkJCS5oZWlnaHQoIG1heEhlaWdodCApOwoJCX0KCX0sCgoJX2FjdGl2YXRlOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJdmFyIGFjdGl2ZSA9IHRoaXMuX2ZpbmRBY3RpdmUoIGluZGV4IClbIDAgXTsKCgkJLy8gdHJ5aW5nIHRvIGFjdGl2YXRlIHRoZSBhbHJlYWR5IGFjdGl2ZSBwYW5lbAoJCWlmICggYWN0aXZlID09PSB0aGlzLmFjdGl2ZVsgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyB0cnlpbmcgdG8gY29sbGFwc2UsIHNpbXVsYXRlIGEgY2xpY2sgb24gdGhlIGN1cnJlbnRseSBhY3RpdmUgaGVhZGVyCgkJYWN0aXZlID0gYWN0aXZlIHx8IHRoaXMuYWN0aXZlWyAwIF07CgoJCXRoaXMuX2V2ZW50SGFuZGxlcih7CgkJCXRhcmdldDogYWN0aXZlLAoJCQljdXJyZW50VGFyZ2V0OiBhY3RpdmUsCgkJCXByZXZlbnREZWZhdWx0OiAkLm5vb3AKCQl9KTsKCX0sCgoJX2ZpbmRBY3RpdmU6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKCQlyZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSAibnVtYmVyIiA/IHRoaXMuaGVhZGVycy5lcSggc2VsZWN0b3IgKSA6ICQoKTsKCX0sCgoJX3NldHVwRXZlbnRzOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIGV2ZW50cyA9IHsKCQkJa2V5ZG93bjogIl9rZXlkb3duIgoJCX07CgkJaWYgKCBldmVudCApIHsKCQkJJC5lYWNoKCBldmVudC5zcGxpdCggIiAiICksIGZ1bmN0aW9uKCBpbmRleCwgZXZlbnROYW1lICkgewoJCQkJZXZlbnRzWyBldmVudE5hbWUgXSA9ICJfZXZlbnRIYW5kbGVyIjsKCQkJfSk7CgkJfQoKCQl0aGlzLl9vZmYoIHRoaXMuaGVhZGVycy5hZGQoIHRoaXMuaGVhZGVycy5uZXh0KCkgKSApOwoJCXRoaXMuX29uKCB0aGlzLmhlYWRlcnMsIGV2ZW50cyApOwoJCXRoaXMuX29uKCB0aGlzLmhlYWRlcnMubmV4dCgpLCB7IGtleWRvd246ICJfcGFuZWxLZXlEb3duIiB9KTsKCQl0aGlzLl9ob3ZlcmFibGUoIHRoaXMuaGVhZGVycyApOwoJCXRoaXMuX2ZvY3VzYWJsZSggdGhpcy5oZWFkZXJzICk7Cgl9LAoKCV9ldmVudEhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJYWN0aXZlID0gdGhpcy5hY3RpdmUsCgkJCWNsaWNrZWQgPSAkKCBldmVudC5jdXJyZW50VGFyZ2V0ICksCgkJCWNsaWNrZWRJc0FjdGl2ZSA9IGNsaWNrZWRbIDAgXSA9PT0gYWN0aXZlWyAwIF0sCgkJCWNvbGxhcHNpbmcgPSBjbGlja2VkSXNBY3RpdmUgJiYgb3B0aW9ucy5jb2xsYXBzaWJsZSwKCQkJdG9TaG93ID0gY29sbGFwc2luZyA/ICQoKSA6IGNsaWNrZWQubmV4dCgpLAoJCQl0b0hpZGUgPSBhY3RpdmUubmV4dCgpLAoJCQlldmVudERhdGEgPSB7CgkJCQlvbGRIZWFkZXI6IGFjdGl2ZSwKCQkJCW9sZFBhbmVsOiB0b0hpZGUsCgkJCQluZXdIZWFkZXI6IGNvbGxhcHNpbmcgPyAkKCkgOiBjbGlja2VkLAoJCQkJbmV3UGFuZWw6IHRvU2hvdwoJCQl9OwoKCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKCQlpZiAoCgkJCQkvLyBjbGljayBvbiBhY3RpdmUgaGVhZGVyLCBidXQgbm90IGNvbGxhcHNpYmxlCgkJCQkoIGNsaWNrZWRJc0FjdGl2ZSAmJiAhb3B0aW9ucy5jb2xsYXBzaWJsZSApIHx8CgkJCQkvLyBhbGxvdyBjYW5jZWxpbmcgYWN0aXZhdGlvbgoJCQkJKCB0aGlzLl90cmlnZ2VyKCAiYmVmb3JlQWN0aXZhdGUiLCBldmVudCwgZXZlbnREYXRhICkgPT09IGZhbHNlICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCW9wdGlvbnMuYWN0aXZlID0gY29sbGFwc2luZyA/IGZhbHNlIDogdGhpcy5oZWFkZXJzLmluZGV4KCBjbGlja2VkICk7CgoJCS8vIHdoZW4gdGhlIGNhbGwgdG8gLl90b2dnbGUoKSBjb21lcyBhZnRlciB0aGUgY2xhc3MgY2hhbmdlcwoJCS8vIGl0IGNhdXNlcyBhIHZlcnkgb2RkIGJ1ZyBpbiBJRSA4IChzZWUgIzY3MjApCgkJdGhpcy5hY3RpdmUgPSBjbGlja2VkSXNBY3RpdmUgPyAkKCkgOiBjbGlja2VkOwoJCXRoaXMuX3RvZ2dsZSggZXZlbnREYXRhICk7CgoJCS8vIHN3aXRjaCBjbGFzc2VzCgkJLy8gY29ybmVyIGNsYXNzZXMgb24gdGhlIHByZXZpb3VzbHkgYWN0aXZlIGhlYWRlciBzdGF5IGFmdGVyIHRoZSBhbmltYXRpb24KCQlhY3RpdmUucmVtb3ZlQ2xhc3MoICJ1aS1hY2NvcmRpb24taGVhZGVyLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiICk7CgkJaWYgKCBvcHRpb25zLmljb25zICkgewoJCQlhY3RpdmUuY2hpbGRyZW4oICIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIiApCgkJCQkucmVtb3ZlQ2xhc3MoIG9wdGlvbnMuaWNvbnMuYWN0aXZlSGVhZGVyICkKCQkJCS5hZGRDbGFzcyggb3B0aW9ucy5pY29ucy5oZWFkZXIgKTsKCQl9CgoJCWlmICggIWNsaWNrZWRJc0FjdGl2ZSApIHsKCQkJY2xpY2tlZAoJCQkJLnJlbW92ZUNsYXNzKCAidWktY29ybmVyLWFsbCIgKQoJCQkJLmFkZENsYXNzKCAidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiICk7CgkJCWlmICggb3B0aW9ucy5pY29ucyApIHsKCQkJCWNsaWNrZWQuY2hpbGRyZW4oICIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIiApCgkJCQkJLnJlbW92ZUNsYXNzKCBvcHRpb25zLmljb25zLmhlYWRlciApCgkJCQkJLmFkZENsYXNzKCBvcHRpb25zLmljb25zLmFjdGl2ZUhlYWRlciApOwoJCQl9CgoJCQljbGlja2VkCgkJCQkubmV4dCgpCgkJCQkuYWRkQ2xhc3MoICJ1aS1hY2NvcmRpb24tY29udGVudC1hY3RpdmUiICk7CgkJfQoJfSwKCglfdG9nZ2xlOiBmdW5jdGlvbiggZGF0YSApIHsKCQl2YXIgdG9TaG93ID0gZGF0YS5uZXdQYW5lbCwKCQkJdG9IaWRlID0gdGhpcy5wcmV2U2hvdy5sZW5ndGggPyB0aGlzLnByZXZTaG93IDogZGF0YS5vbGRQYW5lbDsKCgkJLy8gaGFuZGxlIGFjdGl2YXRpbmcgYSBwYW5lbCBkdXJpbmcgdGhlIGFuaW1hdGlvbiBmb3IgYW5vdGhlciBhY3RpdmF0aW9uCgkJdGhpcy5wcmV2U2hvdy5hZGQoIHRoaXMucHJldkhpZGUgKS5zdG9wKCB0cnVlLCB0cnVlICk7CgkJdGhpcy5wcmV2U2hvdyA9IHRvU2hvdzsKCQl0aGlzLnByZXZIaWRlID0gdG9IaWRlOwoKCQlpZiAoIHRoaXMub3B0aW9ucy5hbmltYXRlICkgewoJCQl0aGlzLl9hbmltYXRlKCB0b1Nob3csIHRvSGlkZSwgZGF0YSApOwoJCX0gZWxzZSB7CgkJCXRvSGlkZS5oaWRlKCk7CgkJCXRvU2hvdy5zaG93KCk7CgkJCXRoaXMuX3RvZ2dsZUNvbXBsZXRlKCBkYXRhICk7CgkJfQoKCQl0b0hpZGUuYXR0cih7CgkJCSJhcmlhLWhpZGRlbiI6ICJ0cnVlIgoJCX0pOwoJCXRvSGlkZS5wcmV2KCkuYXR0ciggImFyaWEtc2VsZWN0ZWQiLCAiZmFsc2UiICk7CgkJLy8gaWYgd2UncmUgc3dpdGNoaW5nIHBhbmVscywgcmVtb3ZlIHRoZSBvbGQgaGVhZGVyIGZyb20gdGhlIHRhYiBvcmRlcgoJCS8vIGlmIHdlJ3JlIG9wZW5pbmcgZnJvbSBjb2xsYXBzZWQgc3RhdGUsIHJlbW92ZSB0aGUgcHJldmlvdXMgaGVhZGVyIGZyb20gdGhlIHRhYiBvcmRlcgoJCS8vIGlmIHdlJ3JlIGNvbGxhcHNpbmcsIHRoZW4ga2VlcCB0aGUgY29sbGFwc2luZyBoZWFkZXIgaW4gdGhlIHRhYiBvcmRlcgoJCWlmICggdG9TaG93Lmxlbmd0aCAmJiB0b0hpZGUubGVuZ3RoICkgewoJCQl0b0hpZGUucHJldigpLmF0dHIoewoJCQkJInRhYkluZGV4IjogLTEsCgkJCQkiYXJpYS1leHBhbmRlZCI6ICJmYWxzZSIKCQkJfSk7CgkJfSBlbHNlIGlmICggdG9TaG93Lmxlbmd0aCApIHsKCQkJdGhpcy5oZWFkZXJzLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCXJldHVybiAkKCB0aGlzICkuYXR0ciggInRhYkluZGV4IiApID09PSAwOwoJCQl9KQoJCQkuYXR0ciggInRhYkluZGV4IiwgLTEgKTsKCQl9CgoJCXRvU2hvdwoJCQkuYXR0ciggImFyaWEtaGlkZGVuIiwgImZhbHNlIiApCgkJCS5wcmV2KCkKCQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJCQl0YWJJbmRleDogMCwKCQkJCQkiYXJpYS1leHBhbmRlZCI6ICJ0cnVlIgoJCQkJfSk7Cgl9LAoKCV9hbmltYXRlOiBmdW5jdGlvbiggdG9TaG93LCB0b0hpZGUsIGRhdGEgKSB7CgkJdmFyIHRvdGFsLCBlYXNpbmcsIGR1cmF0aW9uLAoJCQl0aGF0ID0gdGhpcywKCQkJYWRqdXN0ID0gMCwKCQkJZG93biA9IHRvU2hvdy5sZW5ndGggJiYKCQkJCSggIXRvSGlkZS5sZW5ndGggfHwgKCB0b1Nob3cuaW5kZXgoKSA8IHRvSGlkZS5pbmRleCgpICkgKSwKCQkJYW5pbWF0ZSA9IHRoaXMub3B0aW9ucy5hbmltYXRlIHx8IHt9LAoJCQlvcHRpb25zID0gZG93biAmJiBhbmltYXRlLmRvd24gfHwgYW5pbWF0ZSwKCQkJY29tcGxldGUgPSBmdW5jdGlvbigpIHsKCQkJCXRoYXQuX3RvZ2dsZUNvbXBsZXRlKCBkYXRhICk7CgkJCX07CgoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJudW1iZXIiICkgewoJCQlkdXJhdGlvbiA9IG9wdGlvbnM7CgkJfQoJCWlmICggdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciICkgewoJCQllYXNpbmcgPSBvcHRpb25zOwoJCX0KCQkvLyBmYWxsIGJhY2sgZnJvbSBvcHRpb25zIHRvIGFuaW1hdGlvbiBpbiBjYXNlIG9mIHBhcnRpYWwgZG93biBzZXR0aW5ncwoJCWVhc2luZyA9IGVhc2luZyB8fCBvcHRpb25zLmVhc2luZyB8fCBhbmltYXRlLmVhc2luZzsKCQlkdXJhdGlvbiA9IGR1cmF0aW9uIHx8IG9wdGlvbnMuZHVyYXRpb24gfHwgYW5pbWF0ZS5kdXJhdGlvbjsKCgkJaWYgKCAhdG9IaWRlLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRvU2hvdy5hbmltYXRlKCB0aGlzLnNob3dQcm9wcywgZHVyYXRpb24sIGVhc2luZywgY29tcGxldGUgKTsKCQl9CgkJaWYgKCAhdG9TaG93Lmxlbmd0aCApIHsKCQkJcmV0dXJuIHRvSGlkZS5hbmltYXRlKCB0aGlzLmhpZGVQcm9wcywgZHVyYXRpb24sIGVhc2luZywgY29tcGxldGUgKTsKCQl9CgoJCXRvdGFsID0gdG9TaG93LnNob3coKS5vdXRlckhlaWdodCgpOwoJCXRvSGlkZS5hbmltYXRlKCB0aGlzLmhpZGVQcm9wcywgewoJCQlkdXJhdGlvbjogZHVyYXRpb24sCgkJCWVhc2luZzogZWFzaW5nLAoJCQlzdGVwOiBmdW5jdGlvbiggbm93LCBmeCApIHsKCQkJCWZ4Lm5vdyA9IE1hdGgucm91bmQoIG5vdyApOwoJCQl9CgkJfSk7CgkJdG9TaG93CgkJCS5oaWRlKCkKCQkJLmFuaW1hdGUoIHRoaXMuc2hvd1Byb3BzLCB7CgkJCQlkdXJhdGlvbjogZHVyYXRpb24sCgkJCQllYXNpbmc6IGVhc2luZywKCQkJCWNvbXBsZXRlOiBjb21wbGV0ZSwKCQkJCXN0ZXA6IGZ1bmN0aW9uKCBub3csIGZ4ICkgewoJCQkJCWZ4Lm5vdyA9IE1hdGgucm91bmQoIG5vdyApOwoJCQkJCWlmICggZngucHJvcCAhPT0gImhlaWdodCIgKSB7CgkJCQkJCWFkanVzdCArPSBmeC5ub3c7CgkJCQkJfSBlbHNlIGlmICggdGhhdC5vcHRpb25zLmhlaWdodFN0eWxlICE9PSAiY29udGVudCIgKSB7CgkJCQkJCWZ4Lm5vdyA9IE1hdGgucm91bmQoIHRvdGFsIC0gdG9IaWRlLm91dGVySGVpZ2h0KCkgLSBhZGp1c3QgKTsKCQkJCQkJYWRqdXN0ID0gMDsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJfSwKCglfdG9nZ2xlQ29tcGxldGU6IGZ1bmN0aW9uKCBkYXRhICkgewoJCXZhciB0b0hpZGUgPSBkYXRhLm9sZFBhbmVsOwoKCQl0b0hpZGUKCQkJLnJlbW92ZUNsYXNzKCAidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIiApCgkJCS5wcmV2KCkKCQkJCS5yZW1vdmVDbGFzcyggInVpLWNvcm5lci10b3AiICkKCQkJCS5hZGRDbGFzcyggInVpLWNvcm5lci1hbGwiICk7CgoJCS8vIFdvcmsgYXJvdW5kIGZvciByZW5kZXJpbmcgYnVnIGluIElFICgjNTQyMSkKCQlpZiAoIHRvSGlkZS5sZW5ndGggKSB7CgkJCXRvSGlkZS5wYXJlbnQoKVsgMCBdLmNsYXNzTmFtZSA9IHRvSGlkZS5wYXJlbnQoKVsgMCBdLmNsYXNzTmFtZTsKCQl9CgkJdGhpcy5fdHJpZ2dlciggImFjdGl2YXRlIiwgbnVsbCwgZGF0YSApOwoJfQp9KTsKCgovKiEKICogalF1ZXJ5IFVJIE1lbnUgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vbWVudS8KICovCgoKdmFyIG1lbnUgPSAkLndpZGdldCggInVpLm1lbnUiLCB7Cgl2ZXJzaW9uOiAiMS4xMS4wIiwKCWRlZmF1bHRFbGVtZW50OiAiPHVsPiIsCglkZWxheTogMzAwLAoJb3B0aW9uczogewoJCWljb25zOiB7CgkJCXN1Ym1lbnU6ICJ1aS1pY29uLWNhcmF0LTEtZSIKCQl9LAoJCWl0ZW1zOiAiPiAqIiwKCQltZW51czogInVsIiwKCQlwb3NpdGlvbjogewoJCQlteTogImxlZnQtMSB0b3AiLAoJCQlhdDogInJpZ2h0IHRvcCIKCQl9LAoJCXJvbGU6ICJtZW51IiwKCgkJLy8gY2FsbGJhY2tzCgkJYmx1cjogbnVsbCwKCQlmb2N1czogbnVsbCwKCQlzZWxlY3Q6IG51bGwKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5hY3RpdmVNZW51ID0gdGhpcy5lbGVtZW50OwoKCQkvLyBGbGFnIHVzZWQgdG8gcHJldmVudCBmaXJpbmcgb2YgdGhlIGNsaWNrIGhhbmRsZXIKCQkvLyBhcyB0aGUgZXZlbnQgYnViYmxlcyB1cCB0aHJvdWdoIG5lc3RlZCBtZW51cwoJCXRoaXMubW91c2VIYW5kbGVkID0gZmFsc2U7CgkJdGhpcy5lbGVtZW50CgkJCS51bmlxdWVJZCgpCgkJCS5hZGRDbGFzcyggInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IiApCgkJCS50b2dnbGVDbGFzcyggInVpLW1lbnUtaWNvbnMiLCAhIXRoaXMuZWxlbWVudC5maW5kKCAiLnVpLWljb24iICkubGVuZ3RoICkKCQkJLmF0dHIoewoJCQkJcm9sZTogdGhpcy5vcHRpb25zLnJvbGUsCgkJCQl0YWJJbmRleDogMAoJCQl9KTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCXRoaXMuZWxlbWVudAoJCQkJLmFkZENsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkKCQkJCS5hdHRyKCAiYXJpYS1kaXNhYmxlZCIsICJ0cnVlIiApOwoJCX0KCgkJdGhpcy5fb24oewoJCQkvLyBQcmV2ZW50IGZvY3VzIGZyb20gc3RpY2tpbmcgdG8gbGlua3MgaW5zaWRlIG1lbnUgYWZ0ZXIgY2xpY2tpbmcKCQkJLy8gdGhlbSAoZm9jdXMgc2hvdWxkIGFsd2F5cyBzdGF5IG9uIFVMIGR1cmluZyBuYXZpZ2F0aW9uKS4KCQkJIm1vdXNlZG93biAudWktbWVudS1pdGVtIjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfSwKCQkJImNsaWNrIC51aS1tZW51LWl0ZW0iOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl2YXIgdGFyZ2V0ID0gJCggZXZlbnQudGFyZ2V0ICk7CgkJCQlpZiAoICF0aGlzLm1vdXNlSGFuZGxlZCAmJiB0YXJnZXQubm90KCAiLnVpLXN0YXRlLWRpc2FibGVkIiApLmxlbmd0aCApIHsKCQkJCQl0aGlzLnNlbGVjdCggZXZlbnQgKTsKCgkJCQkJLy8gT25seSBzZXQgdGhlIG1vdXNlSGFuZGxlZCBmbGFnIGlmIHRoZSBldmVudCB3aWxsIGJ1YmJsZSwgc2VlICM5NDY5LgoJCQkJCWlmICggIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7CgkJCQkJCXRoaXMubW91c2VIYW5kbGVkID0gdHJ1ZTsKCQkJCQl9CgoJCQkJCS8vIE9wZW4gc3VibWVudSBvbiBjbGljawoJCQkJCWlmICggdGFyZ2V0LmhhcyggIi51aS1tZW51IiApLmxlbmd0aCApIHsKCQkJCQkJdGhpcy5leHBhbmQoIGV2ZW50ICk7CgkJCQkJfSBlbHNlIGlmICggIXRoaXMuZWxlbWVudC5pcyggIjpmb2N1cyIgKSAmJiAkKCB0aGlzLmRvY3VtZW50WyAwIF0uYWN0aXZlRWxlbWVudCApLmNsb3Nlc3QoICIudWktbWVudSIgKS5sZW5ndGggKSB7CgoJCQkJCQkvLyBSZWRpcmVjdCBmb2N1cyB0byB0aGUgbWVudQoJCQkJCQl0aGlzLmVsZW1lbnQudHJpZ2dlciggImZvY3VzIiwgWyB0cnVlIF0gKTsKCgkJCQkJCS8vIElmIHRoZSBhY3RpdmUgaXRlbSBpcyBvbiB0aGUgdG9wIGxldmVsLCBsZXQgaXQgc3RheSBhY3RpdmUuCgkJCQkJCS8vIE90aGVyd2lzZSwgYmx1ciB0aGUgYWN0aXZlIGl0ZW0gc2luY2UgaXQgaXMgbm8gbG9uZ2VyIHZpc2libGUuCgkJCQkJCWlmICggdGhpcy5hY3RpdmUgJiYgdGhpcy5hY3RpdmUucGFyZW50cyggIi51aS1tZW51IiApLmxlbmd0aCA9PT0gMSApIHsKCQkJCQkJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQl9LAoJCQkibW91c2VlbnRlciAudWktbWVudS1pdGVtIjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJdmFyIHRhcmdldCA9ICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKTsKCQkJCS8vIFJlbW92ZSB1aS1zdGF0ZS1hY3RpdmUgY2xhc3MgZnJvbSBzaWJsaW5ncyBvZiB0aGUgbmV3bHkgZm9jdXNlZCBtZW51IGl0ZW0KCQkJCS8vIHRvIGF2b2lkIGEganVtcCBjYXVzZWQgYnkgYWRqYWNlbnQgZWxlbWVudHMgYm90aCBoYXZpbmcgYSBjbGFzcyB3aXRoIGEgYm9yZGVyCgkJCQl0YXJnZXQuc2libGluZ3MoICIudWktc3RhdGUtYWN0aXZlIiApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJdGhpcy5mb2N1cyggZXZlbnQsIHRhcmdldCApOwoJCQl9LAoJCQltb3VzZWxlYXZlOiAiY29sbGFwc2VBbGwiLAoJCQkibW91c2VsZWF2ZSAudWktbWVudSI6ICJjb2xsYXBzZUFsbCIsCgkJCWZvY3VzOiBmdW5jdGlvbiggZXZlbnQsIGtlZXBBY3RpdmVJdGVtICkgewoJCQkJLy8gSWYgdGhlcmUncyBhbHJlYWR5IGFuIGFjdGl2ZSBpdGVtLCBrZWVwIGl0IGFjdGl2ZQoJCQkJLy8gSWYgbm90LCBhY3RpdmF0ZSB0aGUgZmlyc3QgaXRlbQoJCQkJdmFyIGl0ZW0gPSB0aGlzLmFjdGl2ZSB8fCB0aGlzLmVsZW1lbnQuZmluZCggdGhpcy5vcHRpb25zLml0ZW1zICkuZXEoIDAgKTsKCgkJCQlpZiAoICFrZWVwQWN0aXZlSXRlbSApIHsKCQkJCQl0aGlzLmZvY3VzKCBldmVudCwgaXRlbSApOwoJCQkJfQoJCQl9LAoJCQlibHVyOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCQlpZiAoICEkLmNvbnRhaW5zKCB0aGlzLmVsZW1lbnRbMF0sIHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCApICkgewoJCQkJCQl0aGlzLmNvbGxhcHNlQWxsKCBldmVudCApOwoJCQkJCX0KCQkJCX0pOwoJCQl9LAoJCQlrZXlkb3duOiAiX2tleWRvd24iCgkJfSk7CgoJCXRoaXMucmVmcmVzaCgpOwoKCQkvLyBDbGlja3Mgb3V0c2lkZSBvZiBhIG1lbnUgY29sbGFwc2UgYW55IG9wZW4gbWVudXMKCQl0aGlzLl9vbiggdGhpcy5kb2N1bWVudCwgewoJCQljbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCB0aGlzLl9jbG9zZU9uRG9jdW1lbnRDbGljayggZXZlbnQgKSApIHsKCQkJCQl0aGlzLmNvbGxhcHNlQWxsKCBldmVudCApOwoJCQkJfQoKCQkJCS8vIFJlc2V0IHRoZSBtb3VzZUhhbmRsZWQgZmxhZwoJCQkJdGhpcy5tb3VzZUhhbmRsZWQgPSBmYWxzZTsKCQkJfQoJCX0pOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJLy8gRGVzdHJveSAoc3ViKW1lbnVzCgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1hY3RpdmVkZXNjZW5kYW50IiApCgkJCS5maW5kKCAiLnVpLW1lbnUiICkuYWRkQmFjaygpCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1tZW51LWljb25zIHVpLWZyb250IiApCgkJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJCS5yZW1vdmVBdHRyKCAidGFiSW5kZXgiICkKCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1sYWJlbGxlZGJ5IiApCgkJCQkucmVtb3ZlQXR0ciggImFyaWEtZXhwYW5kZWQiICkKCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oaWRkZW4iICkKCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkJLnJlbW92ZVVuaXF1ZUlkKCkKCQkJCS5zaG93KCk7CgoJCS8vIERlc3Ryb3kgbWVudSBpdGVtcwoJCXRoaXMuZWxlbWVudC5maW5kKCAiLnVpLW1lbnUtaXRlbSIgKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1tZW51LWl0ZW0iICkKCQkJLnJlbW92ZUF0dHIoICJyb2xlIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1kaXNhYmxlZCIgKQoJCQkucmVtb3ZlVW5pcXVlSWQoKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKQoJCQkucmVtb3ZlQXR0ciggInRhYkluZGV4IiApCgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtaGFzcG9wdXAiICkKCQkJLmNoaWxkcmVuKCkuZWFjaCggZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWxlbSA9ICQoIHRoaXMgKTsKCQkJCWlmICggZWxlbS5kYXRhKCAidWktbWVudS1zdWJtZW51LWNhcmF0IiApICkgewoJCQkJCWVsZW0ucmVtb3ZlKCk7CgkJCQl9CgkJCX0pOwoKCQkvLyBEZXN0cm95IG1lbnUgZGl2aWRlcnMKCQl0aGlzLmVsZW1lbnQuZmluZCggIi51aS1tZW51LWRpdmlkZXIiICkucmVtb3ZlQ2xhc3MoICJ1aS1tZW51LWRpdmlkZXIgdWktd2lkZ2V0LWNvbnRlbnQiICk7Cgl9LAoKCV9rZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIG1hdGNoLCBwcmV2LCBjaGFyYWN0ZXIsIHNraXAsIHJlZ2V4LAoJCQlwcmV2ZW50RGVmYXVsdCA9IHRydWU7CgoJCWZ1bmN0aW9uIGVzY2FwZSggdmFsdWUgKSB7CgkJCXJldHVybiB2YWx1ZS5yZXBsYWNlKCAvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywgIlxcJCYiICk7CgkJfQoKCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfVVA6CgkJCXRoaXMucHJldmlvdXNQYWdlKCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5QQUdFX0RPV046CgkJCXRoaXMubmV4dFBhZ2UoIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkhPTUU6CgkJCXRoaXMuX21vdmUoICJmaXJzdCIsICJmaXJzdCIsIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkVORDoKCQkJdGhpcy5fbW92ZSggImxhc3QiLCAibGFzdCIsIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLlVQOgoJCQl0aGlzLnByZXZpb3VzKCBldmVudCApOwoJCQlicmVhazsKCQljYXNlICQudWkua2V5Q29kZS5ET1dOOgoJCQl0aGlzLm5leHQoIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkxFRlQ6CgkJCXRoaXMuY29sbGFwc2UoIGV2ZW50ICk7CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLlJJR0hUOgoJCQlpZiAoIHRoaXMuYWN0aXZlICYmICF0aGlzLmFjdGl2ZS5pcyggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSApIHsKCQkJCXRoaXMuZXhwYW5kKCBldmVudCApOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgJC51aS5rZXlDb2RlLkVOVEVSOgoJCWNhc2UgJC51aS5rZXlDb2RlLlNQQUNFOgoJCQl0aGlzLl9hY3RpdmF0ZSggZXZlbnQgKTsKCQkJYnJlYWs7CgkJY2FzZSAkLnVpLmtleUNvZGUuRVNDQVBFOgoJCQl0aGlzLmNvbGxhcHNlKCBldmVudCApOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlwcmV2ZW50RGVmYXVsdCA9IGZhbHNlOwoJCQlwcmV2ID0gdGhpcy5wcmV2aW91c0ZpbHRlciB8fCAiIjsKCQkJY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSggZXZlbnQua2V5Q29kZSApOwoJCQlza2lwID0gZmFsc2U7CgoJCQljbGVhclRpbWVvdXQoIHRoaXMuZmlsdGVyVGltZXIgKTsKCgkJCWlmICggY2hhcmFjdGVyID09PSBwcmV2ICkgewoJCQkJc2tpcCA9IHRydWU7CgkJCX0gZWxzZSB7CgkJCQljaGFyYWN0ZXIgPSBwcmV2ICsgY2hhcmFjdGVyOwoJCQl9CgoJCQlyZWdleCA9IG5ldyBSZWdFeHAoICJeIiArIGVzY2FwZSggY2hhcmFjdGVyICksICJpIiApOwoJCQltYXRjaCA9IHRoaXMuYWN0aXZlTWVudS5maW5kKCB0aGlzLm9wdGlvbnMuaXRlbXMgKS5maWx0ZXIoZnVuY3Rpb24oKSB7CgkJCQlyZXR1cm4gcmVnZXgudGVzdCggJCggdGhpcyApLnRleHQoKSApOwoJCQl9KTsKCQkJbWF0Y2ggPSBza2lwICYmIG1hdGNoLmluZGV4KCB0aGlzLmFjdGl2ZS5uZXh0KCkgKSAhPT0gLTEgPwoJCQkJdGhpcy5hY3RpdmUubmV4dEFsbCggIi51aS1tZW51LWl0ZW0iICkgOgoJCQkJbWF0Y2g7CgoJCQkvLyBJZiBubyBtYXRjaGVzIG9uIHRoZSBjdXJyZW50IGZpbHRlciwgcmVzZXQgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIHByZXNzZWQKCQkJLy8gdG8gbW92ZSBkb3duIHRoZSBtZW51IHRvIHRoZSBmaXJzdCBpdGVtIHRoYXQgc3RhcnRzIHdpdGggdGhhdCBjaGFyYWN0ZXIKCQkJaWYgKCAhbWF0Y2gubGVuZ3RoICkgewoJCQkJY2hhcmFjdGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSggZXZlbnQua2V5Q29kZSApOwoJCQkJcmVnZXggPSBuZXcgUmVnRXhwKCAiXiIgKyBlc2NhcGUoIGNoYXJhY3RlciApLCAiaSIgKTsKCQkJCW1hdGNoID0gdGhpcy5hY3RpdmVNZW51LmZpbmQoIHRoaXMub3B0aW9ucy5pdGVtcyApLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCQlyZXR1cm4gcmVnZXgudGVzdCggJCggdGhpcyApLnRleHQoKSApOwoJCQkJfSk7CgkJCX0KCgkJCWlmICggbWF0Y2gubGVuZ3RoICkgewoJCQkJdGhpcy5mb2N1cyggZXZlbnQsIG1hdGNoICk7CgkJCQlpZiAoIG1hdGNoLmxlbmd0aCA+IDEgKSB7CgkJCQkJdGhpcy5wcmV2aW91c0ZpbHRlciA9IGNoYXJhY3RlcjsKCQkJCQl0aGlzLmZpbHRlclRpbWVyID0gdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQkJCWRlbGV0ZSB0aGlzLnByZXZpb3VzRmlsdGVyOwoJCQkJCX0sIDEwMDAgKTsKCQkJCX0gZWxzZSB7CgkJCQkJZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXI7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQlkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcjsKCQkJfQoJCX0KCgkJaWYgKCBwcmV2ZW50RGVmYXVsdCApIHsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9LAoKCV9hY3RpdmF0ZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggIXRoaXMuYWN0aXZlLmlzKCAiLnVpLXN0YXRlLWRpc2FibGVkIiApICkgewoJCQlpZiAoIHRoaXMuYWN0aXZlLmlzKCAiW2FyaWEtaGFzcG9wdXA9J3RydWUnXSIgKSApIHsKCQkJCXRoaXMuZXhwYW5kKCBldmVudCApOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5zZWxlY3QoIGV2ZW50ICk7CgkJCX0KCQl9Cgl9LAoKCXJlZnJlc2g6IGZ1bmN0aW9uKCkgewoJCXZhciBtZW51cywgaXRlbXMsCgkJCXRoYXQgPSB0aGlzLAoJCQlpY29uID0gdGhpcy5vcHRpb25zLmljb25zLnN1Ym1lbnUsCgkJCXN1Ym1lbnVzID0gdGhpcy5lbGVtZW50LmZpbmQoIHRoaXMub3B0aW9ucy5tZW51cyApOwoKCQl0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoICJ1aS1tZW51LWljb25zIiwgISF0aGlzLmVsZW1lbnQuZmluZCggIi51aS1pY29uIiApLmxlbmd0aCApOwoKCQkvLyBJbml0aWFsaXplIG5lc3RlZCBtZW51cwoJCXN1Ym1lbnVzLmZpbHRlciggIjpub3QoLnVpLW1lbnUpIiApCgkJCS5hZGRDbGFzcyggInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWZyb250IiApCgkJCS5oaWRlKCkKCQkJLmF0dHIoewoJCQkJcm9sZTogdGhpcy5vcHRpb25zLnJvbGUsCgkJCQkiYXJpYS1oaWRkZW4iOiAidHJ1ZSIsCgkJCQkiYXJpYS1leHBhbmRlZCI6ICJmYWxzZSIKCQkJfSkKCQkJLmVhY2goZnVuY3Rpb24oKSB7CgkJCQl2YXIgbWVudSA9ICQoIHRoaXMgKSwKCQkJCQlpdGVtID0gbWVudS5wYXJlbnQoKSwKCQkJCQlzdWJtZW51Q2FyYXQgPSAkKCAiPHNwYW4+IiApCgkJCQkJCS5hZGRDbGFzcyggInVpLW1lbnUtaWNvbiB1aS1pY29uICIgKyBpY29uICkKCQkJCQkJLmRhdGEoICJ1aS1tZW51LXN1Ym1lbnUtY2FyYXQiLCB0cnVlICk7CgoJCQkJaXRlbQoJCQkJCS5hdHRyKCAiYXJpYS1oYXNwb3B1cCIsICJ0cnVlIiApCgkJCQkJLnByZXBlbmQoIHN1Ym1lbnVDYXJhdCApOwoJCQkJbWVudS5hdHRyKCAiYXJpYS1sYWJlbGxlZGJ5IiwgaXRlbS5hdHRyKCAiaWQiICkgKTsKCQkJfSk7CgoJCW1lbnVzID0gc3VibWVudXMuYWRkKCB0aGlzLmVsZW1lbnQgKTsKCQlpdGVtcyA9IG1lbnVzLmZpbmQoIHRoaXMub3B0aW9ucy5pdGVtcyApOwoKCQkvLyBJbml0aWFsaXplIG1lbnUtaXRlbXMgY29udGFpbmluZyBzcGFjZXMgYW5kL29yIGRhc2hlcyBvbmx5IGFzIGRpdmlkZXJzCgkJaXRlbXMubm90KCAiLnVpLW1lbnUtaXRlbSIgKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQl2YXIgaXRlbSA9ICQoIHRoaXMgKTsKCQkJaWYgKCB0aGF0Ll9pc0RpdmlkZXIoIGl0ZW0gKSApIHsKCQkJCWl0ZW0uYWRkQ2xhc3MoICJ1aS13aWRnZXQtY29udGVudCB1aS1tZW51LWRpdmlkZXIiICk7CgkJCX0KCQl9KTsKCgkJLy8gRG9uJ3QgcmVmcmVzaCBsaXN0IGl0ZW1zIHRoYXQgYXJlIGFscmVhZHkgYWRhcHRlZAoJCWl0ZW1zLm5vdCggIi51aS1tZW51LWl0ZW0sIC51aS1tZW51LWRpdmlkZXIiICkKCQkJLmFkZENsYXNzKCAidWktbWVudS1pdGVtIiApCgkJCS51bmlxdWVJZCgpCgkJCS5hdHRyKHsKCQkJCXRhYkluZGV4OiAtMSwKCQkJCXJvbGU6IHRoaXMuX2l0ZW1Sb2xlKCkKCQkJfSk7CgoJCS8vIEFkZCBhcmlhLWRpc2FibGVkIGF0dHJpYnV0ZSB0byBhbnkgZGlzYWJsZWQgbWVudSBpdGVtCgkJaXRlbXMuZmlsdGVyKCAiLnVpLXN0YXRlLWRpc2FibGVkIiApLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgInRydWUiICk7CgoJCS8vIElmIHRoZSBhY3RpdmUgaXRlbSBoYXMgYmVlbiByZW1vdmVkLCBibHVyIHRoZSBtZW51CgkJaWYgKCB0aGlzLmFjdGl2ZSAmJiAhJC5jb250YWlucyggdGhpcy5lbGVtZW50WyAwIF0sIHRoaXMuYWN0aXZlWyAwIF0gKSApIHsKCQkJdGhpcy5ibHVyKCk7CgkJfQoJfSwKCglfaXRlbVJvbGU6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB7CgkJCW1lbnU6ICJtZW51aXRlbSIsCgkJCWxpc3Rib3g6ICJvcHRpb24iCgkJfVsgdGhpcy5vcHRpb25zLnJvbGUgXTsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJpY29ucyIgKSB7CgkJCXRoaXMuZWxlbWVudC5maW5kKCAiLnVpLW1lbnUtaWNvbiIgKQoJCQkJLnJlbW92ZUNsYXNzKCB0aGlzLm9wdGlvbnMuaWNvbnMuc3VibWVudSApCgkJCQkuYWRkQ2xhc3MoIHZhbHVlLnN1Ym1lbnUgKTsKCQl9CgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCXRoaXMuZWxlbWVudAoJCQkJLnRvZ2dsZUNsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiLCAhIXZhbHVlICkKCQkJCS5hdHRyKCAiYXJpYS1kaXNhYmxlZCIsIHZhbHVlICk7CgkJfQoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7Cgl9LAoKCWZvY3VzOiBmdW5jdGlvbiggZXZlbnQsIGl0ZW0gKSB7CgkJdmFyIG5lc3RlZCwgZm9jdXNlZDsKCQl0aGlzLmJsdXIoIGV2ZW50LCBldmVudCAmJiBldmVudC50eXBlID09PSAiZm9jdXMiICk7CgoJCXRoaXMuX3Njcm9sbEludG9WaWV3KCBpdGVtICk7CgoJCXRoaXMuYWN0aXZlID0gaXRlbS5maXJzdCgpOwoJCWZvY3VzZWQgPSB0aGlzLmFjdGl2ZS5hZGRDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCS8vIE9ubHkgdXBkYXRlIGFyaWEtYWN0aXZlZGVzY2VuZGFudCBpZiB0aGVyZSdzIGEgcm9sZQoJCS8vIG90aGVyd2lzZSB3ZSBhc3N1bWUgZm9jdXMgaXMgbWFuYWdlZCBlbHNld2hlcmUKCQlpZiAoIHRoaXMub3B0aW9ucy5yb2xlICkgewoJCQl0aGlzLmVsZW1lbnQuYXR0ciggImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsIGZvY3VzZWQuYXR0ciggImlkIiApICk7CgkJfQoKCQkvLyBIaWdobGlnaHQgYWN0aXZlIHBhcmVudCBtZW51IGl0ZW0sIGlmIGFueQoJCXRoaXMuYWN0aXZlCgkJCS5wYXJlbnQoKQoJCQkuY2xvc2VzdCggIi51aS1tZW51LWl0ZW0iICkKCQkJLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoKCQlpZiAoIGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09ICJrZXlkb3duIiApIHsKCQkJdGhpcy5fY2xvc2UoKTsKCQl9IGVsc2UgewoJCQl0aGlzLnRpbWVyID0gdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQl0aGlzLl9jbG9zZSgpOwoJCQl9LCB0aGlzLmRlbGF5ICk7CgkJfQoKCQluZXN0ZWQgPSBpdGVtLmNoaWxkcmVuKCAiLnVpLW1lbnUiICk7CgkJaWYgKCBuZXN0ZWQubGVuZ3RoICYmIGV2ZW50ICYmICggL15tb3VzZS8udGVzdCggZXZlbnQudHlwZSApICkgKSB7CgkJCXRoaXMuX3N0YXJ0T3BlbmluZyhuZXN0ZWQpOwoJCX0KCQl0aGlzLmFjdGl2ZU1lbnUgPSBpdGVtLnBhcmVudCgpOwoKCQl0aGlzLl90cmlnZ2VyKCAiZm9jdXMiLCBldmVudCwgeyBpdGVtOiBpdGVtIH0gKTsKCX0sCgoJX3Njcm9sbEludG9WaWV3OiBmdW5jdGlvbiggaXRlbSApIHsKCQl2YXIgYm9yZGVyVG9wLCBwYWRkaW5nVG9wLCBvZmZzZXQsIHNjcm9sbCwgZWxlbWVudEhlaWdodCwgaXRlbUhlaWdodDsKCQlpZiAoIHRoaXMuX2hhc1Njcm9sbCgpICkgewoJCQlib3JkZXJUb3AgPSBwYXJzZUZsb2F0KCAkLmNzcyggdGhpcy5hY3RpdmVNZW51WzBdLCAiYm9yZGVyVG9wV2lkdGgiICkgKSB8fCAwOwoJCQlwYWRkaW5nVG9wID0gcGFyc2VGbG9hdCggJC5jc3MoIHRoaXMuYWN0aXZlTWVudVswXSwgInBhZGRpbmdUb3AiICkgKSB8fCAwOwoJCQlvZmZzZXQgPSBpdGVtLm9mZnNldCgpLnRvcCAtIHRoaXMuYWN0aXZlTWVudS5vZmZzZXQoKS50b3AgLSBib3JkZXJUb3AgLSBwYWRkaW5nVG9wOwoJCQlzY3JvbGwgPSB0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKCk7CgkJCWVsZW1lbnRIZWlnaHQgPSB0aGlzLmFjdGl2ZU1lbnUuaGVpZ2h0KCk7CgkJCWl0ZW1IZWlnaHQgPSBpdGVtLm91dGVySGVpZ2h0KCk7CgoJCQlpZiAoIG9mZnNldCA8IDAgKSB7CgkJCQl0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKCBzY3JvbGwgKyBvZmZzZXQgKTsKCQkJfSBlbHNlIGlmICggb2Zmc2V0ICsgaXRlbUhlaWdodCA+IGVsZW1lbnRIZWlnaHQgKSB7CgkJCQl0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKCBzY3JvbGwgKyBvZmZzZXQgLSBlbGVtZW50SGVpZ2h0ICsgaXRlbUhlaWdodCApOwoJCQl9CgkJfQoJfSwKCglibHVyOiBmdW5jdGlvbiggZXZlbnQsIGZyb21Gb2N1cyApIHsKCQlpZiAoICFmcm9tRm9jdXMgKSB7CgkJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCX0KCgkJaWYgKCAhdGhpcy5hY3RpdmUgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJdGhpcy5hY3RpdmUgPSBudWxsOwoKCQl0aGlzLl90cmlnZ2VyKCAiYmx1ciIsIGV2ZW50LCB7IGl0ZW06IHRoaXMuYWN0aXZlIH0gKTsKCX0sCgoJX3N0YXJ0T3BlbmluZzogZnVuY3Rpb24oIHN1Ym1lbnUgKSB7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgoJCS8vIERvbid0IG9wZW4gaWYgYWxyZWFkeSBvcGVuIGZpeGVzIGEgRmlyZWZveCBidWcgdGhhdCBjYXVzZWQgYSAuNSBwaXhlbAoJCS8vIHNoaWZ0IGluIHRoZSBzdWJtZW51IHBvc2l0aW9uIHdoZW4gbW91c2luZyBvdmVyIHRoZSBjYXJhdCBpY29uCgkJaWYgKCBzdWJtZW51LmF0dHIoICJhcmlhLWhpZGRlbiIgKSAhPT0gInRydWUiICkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLnRpbWVyID0gdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCXRoaXMuX2Nsb3NlKCk7CgkJCXRoaXMuX29wZW4oIHN1Ym1lbnUgKTsKCQl9LCB0aGlzLmRlbGF5ICk7Cgl9LAoKCV9vcGVuOiBmdW5jdGlvbiggc3VibWVudSApIHsKCQl2YXIgcG9zaXRpb24gPSAkLmV4dGVuZCh7CgkJCW9mOiB0aGlzLmFjdGl2ZQoJCX0sIHRoaXMub3B0aW9ucy5wb3NpdGlvbiApOwoKCQljbGVhclRpbWVvdXQoIHRoaXMudGltZXIgKTsKCQl0aGlzLmVsZW1lbnQuZmluZCggIi51aS1tZW51IiApLm5vdCggc3VibWVudS5wYXJlbnRzKCAiLnVpLW1lbnUiICkgKQoJCQkuaGlkZSgpCgkJCS5hdHRyKCAiYXJpYS1oaWRkZW4iLCAidHJ1ZSIgKTsKCgkJc3VibWVudQoJCQkuc2hvdygpCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS1oaWRkZW4iICkKCQkJLmF0dHIoICJhcmlhLWV4cGFuZGVkIiwgInRydWUiICkKCQkJLnBvc2l0aW9uKCBwb3NpdGlvbiApOwoJfSwKCgljb2xsYXBzZUFsbDogZnVuY3Rpb24oIGV2ZW50LCBhbGwgKSB7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgkJdGhpcy50aW1lciA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkvLyBJZiB3ZSB3ZXJlIHBhc3NlZCBhbiBldmVudCwgbG9vayBmb3IgdGhlIHN1Ym1lbnUgdGhhdCBjb250YWlucyB0aGUgZXZlbnQKCQkJdmFyIGN1cnJlbnRNZW51ID0gYWxsID8gdGhpcy5lbGVtZW50IDoKCQkJCSQoIGV2ZW50ICYmIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoIHRoaXMuZWxlbWVudC5maW5kKCAiLnVpLW1lbnUiICkgKTsKCgkJCS8vIElmIHdlIGZvdW5kIG5vIHZhbGlkIHN1Ym1lbnUgYW5jZXN0b3IsIHVzZSB0aGUgbWFpbiBtZW51IHRvIGNsb3NlIGFsbCBzdWIgbWVudXMgYW55d2F5CgkJCWlmICggIWN1cnJlbnRNZW51Lmxlbmd0aCApIHsKCQkJCWN1cnJlbnRNZW51ID0gdGhpcy5lbGVtZW50OwoJCQl9CgoJCQl0aGlzLl9jbG9zZSggY3VycmVudE1lbnUgKTsKCgkJCXRoaXMuYmx1ciggZXZlbnQgKTsKCQkJdGhpcy5hY3RpdmVNZW51ID0gY3VycmVudE1lbnU7CgkJfSwgdGhpcy5kZWxheSApOwoJfSwKCgkvLyBXaXRoIG5vIGFyZ3VtZW50cywgY2xvc2VzIHRoZSBjdXJyZW50bHkgYWN0aXZlIG1lbnUgLSBpZiBub3RoaW5nIGlzIGFjdGl2ZQoJLy8gaXQgY2xvc2VzIGFsbCBtZW51cy4gIElmIHBhc3NlZCBhbiBhcmd1bWVudCwgaXQgd2lsbCBzZWFyY2ggZm9yIG1lbnVzIEJFTE9XCglfY2xvc2U6IGZ1bmN0aW9uKCBzdGFydE1lbnUgKSB7CgkJaWYgKCAhc3RhcnRNZW51ICkgewoJCQlzdGFydE1lbnUgPSB0aGlzLmFjdGl2ZSA/IHRoaXMuYWN0aXZlLnBhcmVudCgpIDogdGhpcy5lbGVtZW50OwoJCX0KCgkJc3RhcnRNZW51CgkJCS5maW5kKCAiLnVpLW1lbnUiICkKCQkJCS5oaWRlKCkKCQkJCS5hdHRyKCAiYXJpYS1oaWRkZW4iLCAidHJ1ZSIgKQoJCQkJLmF0dHIoICJhcmlhLWV4cGFuZGVkIiwgImZhbHNlIiApCgkJCS5lbmQoKQoJCQkuZmluZCggIi51aS1zdGF0ZS1hY3RpdmUiICkubm90KCAiLnVpLXN0YXRlLWZvY3VzIiApCgkJCQkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7Cgl9LAoKCV9jbG9zZU9uRG9jdW1lbnRDbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXJldHVybiAhJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggIi51aS1tZW51IiApLmxlbmd0aDsKCX0sCgoJX2lzRGl2aWRlcjogZnVuY3Rpb24oIGl0ZW0gKSB7CgoJCS8vIE1hdGNoIGh5cGhlbiwgZW0gZGFzaCwgZW4gZGFzaAoJCXJldHVybiAhL1teXC1cdTIwMTRcdTIwMTNcc10vLnRlc3QoIGl0ZW0udGV4dCgpICk7Cgl9LAoKCWNvbGxhcHNlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIG5ld0l0ZW0gPSB0aGlzLmFjdGl2ZSAmJgoJCQl0aGlzLmFjdGl2ZS5wYXJlbnQoKS5jbG9zZXN0KCAiLnVpLW1lbnUtaXRlbSIsIHRoaXMuZWxlbWVudCApOwoJCWlmICggbmV3SXRlbSAmJiBuZXdJdGVtLmxlbmd0aCApIHsKCQkJdGhpcy5fY2xvc2UoKTsKCQkJdGhpcy5mb2N1cyggZXZlbnQsIG5ld0l0ZW0gKTsKCQl9Cgl9LAoKCWV4cGFuZDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBuZXdJdGVtID0gdGhpcy5hY3RpdmUgJiYKCQkJdGhpcy5hY3RpdmUKCQkJCS5jaGlsZHJlbiggIi51aS1tZW51ICIgKQoJCQkJLmZpbmQoIHRoaXMub3B0aW9ucy5pdGVtcyApCgkJCQkuZmlyc3QoKTsKCgkJaWYgKCBuZXdJdGVtICYmIG5ld0l0ZW0ubGVuZ3RoICkgewoJCQl0aGlzLl9vcGVuKCBuZXdJdGVtLnBhcmVudCgpICk7CgoJCQkvLyBEZWxheSBzbyBGaXJlZm94IHdpbGwgbm90IGhpZGUgYWN0aXZlZGVzY2VuZGFudCBjaGFuZ2UgaW4gZXhwYW5kaW5nIHN1Ym1lbnUgZnJvbSBBVAoJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCXRoaXMuZm9jdXMoIGV2ZW50LCBuZXdJdGVtICk7CgkJCX0pOwoJCX0KCX0sCgoJbmV4dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXRoaXMuX21vdmUoICJuZXh0IiwgImZpcnN0IiwgZXZlbnQgKTsKCX0sCgoJcHJldmlvdXM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl0aGlzLl9tb3ZlKCAicHJldiIsICJsYXN0IiwgZXZlbnQgKTsKCX0sCgoJaXNGaXJzdEl0ZW06IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmFjdGl2ZSAmJiAhdGhpcy5hY3RpdmUucHJldkFsbCggIi51aS1tZW51LWl0ZW0iICkubGVuZ3RoOwoJfSwKCglpc0xhc3RJdGVtOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5hY3RpdmUgJiYgIXRoaXMuYWN0aXZlLm5leHRBbGwoICIudWktbWVudS1pdGVtIiApLmxlbmd0aDsKCX0sCgoJX21vdmU6IGZ1bmN0aW9uKCBkaXJlY3Rpb24sIGZpbHRlciwgZXZlbnQgKSB7CgkJdmFyIG5leHQ7CgkJaWYgKCB0aGlzLmFjdGl2ZSApIHsKCQkJaWYgKCBkaXJlY3Rpb24gPT09ICJmaXJzdCIgfHwgZGlyZWN0aW9uID09PSAibGFzdCIgKSB7CgkJCQluZXh0ID0gdGhpcy5hY3RpdmUKCQkJCQlbIGRpcmVjdGlvbiA9PT0gImZpcnN0IiA/ICJwcmV2QWxsIiA6ICJuZXh0QWxsIiBdKCAiLnVpLW1lbnUtaXRlbSIgKQoJCQkJCS5lcSggLTEgKTsKCQkJfSBlbHNlIHsKCQkJCW5leHQgPSB0aGlzLmFjdGl2ZQoJCQkJCVsgZGlyZWN0aW9uICsgIkFsbCIgXSggIi51aS1tZW51LWl0ZW0iICkKCQkJCQkuZXEoIDAgKTsKCQkJfQoJCX0KCQlpZiAoICFuZXh0IHx8ICFuZXh0Lmxlbmd0aCB8fCAhdGhpcy5hY3RpdmUgKSB7CgkJCW5leHQgPSB0aGlzLmFjdGl2ZU1lbnUuZmluZCggdGhpcy5vcHRpb25zLml0ZW1zIClbIGZpbHRlciBdKCk7CgkJfQoKCQl0aGlzLmZvY3VzKCBldmVudCwgbmV4dCApOwoJfSwKCgluZXh0UGFnZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXZhciBpdGVtLCBiYXNlLCBoZWlnaHQ7CgoJCWlmICggIXRoaXMuYWN0aXZlICkgewoJCQl0aGlzLm5leHQoIGV2ZW50ICk7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLmlzTGFzdEl0ZW0oKSApIHsKCQkJcmV0dXJuOwoJCX0KCQlpZiAoIHRoaXMuX2hhc1Njcm9sbCgpICkgewoJCQliYXNlID0gdGhpcy5hY3RpdmUub2Zmc2V0KCkudG9wOwoJCQloZWlnaHQgPSB0aGlzLmVsZW1lbnQuaGVpZ2h0KCk7CgkJCXRoaXMuYWN0aXZlLm5leHRBbGwoICIudWktbWVudS1pdGVtIiApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQlpdGVtID0gJCggdGhpcyApOwoJCQkJcmV0dXJuIGl0ZW0ub2Zmc2V0KCkudG9wIC0gYmFzZSAtIGhlaWdodCA8IDA7CgkJCX0pOwoKCQkJdGhpcy5mb2N1cyggZXZlbnQsIGl0ZW0gKTsKCQl9IGVsc2UgewoJCQl0aGlzLmZvY3VzKCBldmVudCwgdGhpcy5hY3RpdmVNZW51LmZpbmQoIHRoaXMub3B0aW9ucy5pdGVtcyApCgkJCQlbICF0aGlzLmFjdGl2ZSA/ICJmaXJzdCIgOiAibGFzdCIgXSgpICk7CgkJfQoJfSwKCglwcmV2aW91c1BhZ2U6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgaXRlbSwgYmFzZSwgaGVpZ2h0OwoJCWlmICggIXRoaXMuYWN0aXZlICkgewoJCQl0aGlzLm5leHQoIGV2ZW50ICk7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLmlzRmlyc3RJdGVtKCkgKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKCB0aGlzLl9oYXNTY3JvbGwoKSApIHsKCQkJYmFzZSA9IHRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcDsKCQkJaGVpZ2h0ID0gdGhpcy5lbGVtZW50LmhlaWdodCgpOwoJCQl0aGlzLmFjdGl2ZS5wcmV2QWxsKCAiLnVpLW1lbnUtaXRlbSIgKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaXRlbSA9ICQoIHRoaXMgKTsKCQkJCXJldHVybiBpdGVtLm9mZnNldCgpLnRvcCAtIGJhc2UgKyBoZWlnaHQgPiAwOwoJCQl9KTsKCgkJCXRoaXMuZm9jdXMoIGV2ZW50LCBpdGVtICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5mb2N1cyggZXZlbnQsIHRoaXMuYWN0aXZlTWVudS5maW5kKCB0aGlzLm9wdGlvbnMuaXRlbXMgKS5maXJzdCgpICk7CgkJfQoJfSwKCglfaGFzU2Nyb2xsOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkgPCB0aGlzLmVsZW1lbnQucHJvcCggInNjcm9sbEhlaWdodCIgKTsKCX0sCgoJc2VsZWN0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJLy8gVE9ETzogSXQgc2hvdWxkIG5ldmVyIGJlIHBvc3NpYmxlIHRvIG5vdCBoYXZlIGFuIGFjdGl2ZSBpdGVtIGF0IHRoaXMKCQkvLyBwb2ludCwgYnV0IHRoZSB0ZXN0cyBkb24ndCB0cmlnZ2VyIG1vdXNlZW50ZXIgYmVmb3JlIGNsaWNrLgoJCXRoaXMuYWN0aXZlID0gdGhpcy5hY3RpdmUgfHwgJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggIi51aS1tZW51LWl0ZW0iICk7CgkJdmFyIHVpID0geyBpdGVtOiB0aGlzLmFjdGl2ZSB9OwoJCWlmICggIXRoaXMuYWN0aXZlLmhhcyggIi51aS1tZW51IiApLmxlbmd0aCApIHsKCQkJdGhpcy5jb2xsYXBzZUFsbCggZXZlbnQsIHRydWUgKTsKCQl9CgkJdGhpcy5fdHJpZ2dlciggInNlbGVjdCIsIGV2ZW50LCB1aSApOwoJfQp9KTsKCgovKiEKICogalF1ZXJ5IFVJIEF1dG9jb21wbGV0ZSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9hdXRvY29tcGxldGUvCiAqLwoKCiQud2lkZ2V0KCAidWkuYXV0b2NvbXBsZXRlIiwgewoJdmVyc2lvbjogIjEuMTEuMCIsCglkZWZhdWx0RWxlbWVudDogIjxpbnB1dD4iLAoJb3B0aW9uczogewoJCWFwcGVuZFRvOiBudWxsLAoJCWF1dG9Gb2N1czogZmFsc2UsCgkJZGVsYXk6IDMwMCwKCQltaW5MZW5ndGg6IDEsCgkJcG9zaXRpb246IHsKCQkJbXk6ICJsZWZ0IHRvcCIsCgkJCWF0OiAibGVmdCBib3R0b20iLAoJCQljb2xsaXNpb246ICJub25lIgoJCX0sCgkJc291cmNlOiBudWxsLAoKCQkvLyBjYWxsYmFja3MKCQljaGFuZ2U6IG51bGwsCgkJY2xvc2U6IG51bGwsCgkJZm9jdXM6IG51bGwsCgkJb3BlbjogbnVsbCwKCQlyZXNwb25zZTogbnVsbCwKCQlzZWFyY2g6IG51bGwsCgkJc2VsZWN0OiBudWxsCgl9LAoKCXJlcXVlc3RJbmRleDogMCwKCXBlbmRpbmc6IDAsCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJLy8gU29tZSBicm93c2VycyBvbmx5IHJlcGVhdCBrZXlkb3duIGV2ZW50cywgbm90IGtleXByZXNzIGV2ZW50cywKCQkvLyBzbyB3ZSB1c2UgdGhlIHN1cHByZXNzS2V5UHJlc3MgZmxhZyB0byBkZXRlcm1pbmUgaWYgd2UndmUgYWxyZWFkeQoJCS8vIGhhbmRsZWQgdGhlIGtleWRvd24gZXZlbnQuICM3MjY5CgkJLy8gVW5mb3J0dW5hdGVseSB0aGUgY29kZSBmb3IgJiBpbiBrZXlwcmVzcyBpcyB0aGUgc2FtZSBhcyB0aGUgdXAgYXJyb3csCgkJLy8gc28gd2UgdXNlIHRoZSBzdXBwcmVzc0tleVByZXNzUmVwZWF0IGZsYWcgdG8gYXZvaWQgaGFuZGxpbmcga2V5cHJlc3MKCQkvLyBldmVudHMgd2hlbiB3ZSBrbm93IHRoZSBrZXlkb3duIGV2ZW50IHdhcyB1c2VkIHRvIG1vZGlmeSB0aGUKCQkvLyBzZWFyY2ggdGVybS4gIzc3OTkKCQl2YXIgc3VwcHJlc3NLZXlQcmVzcywgc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCwgc3VwcHJlc3NJbnB1dCwKCQkJbm9kZU5hbWUgPSB0aGlzLmVsZW1lbnRbIDAgXS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLAoJCQlpc1RleHRhcmVhID0gbm9kZU5hbWUgPT09ICJ0ZXh0YXJlYSIsCgkJCWlzSW5wdXQgPSBub2RlTmFtZSA9PT0gImlucHV0IjsKCgkJdGhpcy5pc011bHRpTGluZSA9CgkJCS8vIFRleHRhcmVhcyBhcmUgYWx3YXlzIG11bHRpLWxpbmUKCQkJaXNUZXh0YXJlYSA/IHRydWUgOgoJCQkvLyBJbnB1dHMgYXJlIGFsd2F5cyBzaW5nbGUtbGluZSwgZXZlbiBpZiBpbnNpZGUgYSBjb250ZW50RWRpdGFibGUgZWxlbWVudAoJCQkvLyBJRSBhbHNvIHRyZWF0cyBpbnB1dHMgYXMgY29udGVudEVkaXRhYmxlCgkJCWlzSW5wdXQgPyBmYWxzZSA6CgkJCS8vIEFsbCBvdGhlciBlbGVtZW50IHR5cGVzIGFyZSBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIgb3Igbm90IHRoZXkncmUgY29udGVudEVkaXRhYmxlCgkJCXRoaXMuZWxlbWVudC5wcm9wKCAiaXNDb250ZW50RWRpdGFibGUiICk7CgoJCXRoaXMudmFsdWVNZXRob2QgPSB0aGlzLmVsZW1lbnRbIGlzVGV4dGFyZWEgfHwgaXNJbnB1dCA/ICJ2YWwiIDogInRleHQiIF07CgkJdGhpcy5pc05ld01lbnUgPSB0cnVlOwoKCQl0aGlzLmVsZW1lbnQKCQkJLmFkZENsYXNzKCAidWktYXV0b2NvbXBsZXRlLWlucHV0IiApCgkJCS5hdHRyKCAiYXV0b2NvbXBsZXRlIiwgIm9mZiIgKTsKCgkJdGhpcy5fb24oIHRoaXMuZWxlbWVudCwgewoJCQlrZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHRoaXMuZWxlbWVudC5wcm9wKCAicmVhZE9ubHkiICkgKSB7CgkJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IHRydWU7CgkJCQkJc3VwcHJlc3NJbnB1dCA9IHRydWU7CgkJCQkJc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCA9IHRydWU7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCXN1cHByZXNzS2V5UHJlc3MgPSBmYWxzZTsKCQkJCXN1cHByZXNzSW5wdXQgPSBmYWxzZTsKCQkJCXN1cHByZXNzS2V5UHJlc3NSZXBlYXQgPSBmYWxzZTsKCQkJCXZhciBrZXlDb2RlID0gJC51aS5rZXlDb2RlOwoJCQkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQkJCWNhc2Uga2V5Q29kZS5QQUdFX1VQOgoJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCXRoaXMuX21vdmUoICJwcmV2aW91c1BhZ2UiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBrZXlDb2RlLlBBR0VfRE9XTjoKCQkJCQlzdXBwcmVzc0tleVByZXNzID0gdHJ1ZTsKCQkJCQl0aGlzLl9tb3ZlKCAibmV4dFBhZ2UiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBrZXlDb2RlLlVQOgoJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSB0cnVlOwoJCQkJCXRoaXMuX2tleUV2ZW50KCAicHJldmlvdXMiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBrZXlDb2RlLkRPV046CgkJCQkJc3VwcHJlc3NLZXlQcmVzcyA9IHRydWU7CgkJCQkJdGhpcy5fa2V5RXZlbnQoICJuZXh0IiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5FTlRFUjoKCQkJCQkvLyB3aGVuIG1lbnUgaXMgb3BlbiBhbmQgaGFzIGZvY3VzCgkJCQkJaWYgKCB0aGlzLm1lbnUuYWN0aXZlICkgewoJCQkJCQkvLyAjNjA1NSAtIE9wZXJhIHN0aWxsIGFsbG93cyB0aGUga2V5cHJlc3MgdG8gb2NjdXIKCQkJCQkJLy8gd2hpY2ggY2F1c2VzIGZvcm1zIHRvIHN1Ym1pdAoJCQkJCQlzdXBwcmVzc0tleVByZXNzID0gdHJ1ZTsKCQkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCQkJdGhpcy5tZW51LnNlbGVjdCggZXZlbnQgKTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuVEFCOgoJCQkJCWlmICggdGhpcy5tZW51LmFjdGl2ZSApIHsKCQkJCQkJdGhpcy5tZW51LnNlbGVjdCggZXZlbnQgKTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQljYXNlIGtleUNvZGUuRVNDQVBFOgoJCQkJCWlmICggdGhpcy5tZW51LmVsZW1lbnQuaXMoICI6dmlzaWJsZSIgKSApIHsKCQkJCQkJdGhpcy5fdmFsdWUoIHRoaXMudGVybSApOwoJCQkJCQl0aGlzLmNsb3NlKCBldmVudCApOwoJCQkJCQkvLyBEaWZmZXJlbnQgYnJvd3NlcnMgaGF2ZSBkaWZmZXJlbnQgZGVmYXVsdCBiZWhhdmlvciBmb3IgZXNjYXBlCgkJCQkJCS8vIFNpbmdsZSBwcmVzcyBjYW4gbWVhbiB1bmRvIG9yIGNsZWFyCgkJCQkJCS8vIERvdWJsZSBwcmVzcyBpbiBJRSBtZWFucyBjbGVhciB0aGUgd2hvbGUgZm9ybQoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWRlZmF1bHQ6CgkJCQkJc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCA9IHRydWU7CgkJCQkJLy8gc2VhcmNoIHRpbWVvdXQgc2hvdWxkIGJlIHRyaWdnZXJlZCBiZWZvcmUgdGhlIGlucHV0IHZhbHVlIGlzIGNoYW5nZWQKCQkJCQl0aGlzLl9zZWFyY2hUaW1lb3V0KCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9LAoJCQlrZXlwcmVzczogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCBzdXBwcmVzc0tleVByZXNzICkgewoJCQkJCXN1cHByZXNzS2V5UHJlc3MgPSBmYWxzZTsKCQkJCQlpZiAoICF0aGlzLmlzTXVsdGlMaW5lIHx8IHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJfQoJCQkJCXJldHVybjsKCQkJCX0KCQkJCWlmICggc3VwcHJlc3NLZXlQcmVzc1JlcGVhdCApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgoJCQkJLy8gcmVwbGljYXRlIHNvbWUga2V5IGhhbmRsZXJzIHRvIGFsbG93IHRoZW0gdG8gcmVwZWF0IGluIEZpcmVmb3ggYW5kIE9wZXJhCgkJCQl2YXIga2V5Q29kZSA9ICQudWkua2V5Q29kZTsKCQkJCXN3aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7CgkJCQljYXNlIGtleUNvZGUuUEFHRV9VUDoKCQkJCQl0aGlzLl9tb3ZlKCAicHJldmlvdXNQYWdlIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5QQUdFX0RPV046CgkJCQkJdGhpcy5fbW92ZSggIm5leHRQYWdlIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5VUDoKCQkJCQl0aGlzLl9rZXlFdmVudCggInByZXZpb3VzIiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQkJCXRoaXMuX2tleUV2ZW50KCAibmV4dCIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0sCgkJCWlucHV0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCQlpZiAoIHN1cHByZXNzSW5wdXQgKSB7CgkJCQkJc3VwcHJlc3NJbnB1dCA9IGZhbHNlOwoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJdGhpcy5fc2VhcmNoVGltZW91dCggZXZlbnQgKTsKCQkJfSwKCQkJZm9jdXM6IGZ1bmN0aW9uKCkgewoJCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsOwoJCQkJdGhpcy5wcmV2aW91cyA9IHRoaXMuX3ZhbHVlKCk7CgkJCX0sCgkJCWJsdXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggdGhpcy5jYW5jZWxCbHVyICkgewoJCQkJCWRlbGV0ZSB0aGlzLmNhbmNlbEJsdXI7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCWNsZWFyVGltZW91dCggdGhpcy5zZWFyY2hpbmcgKTsKCQkJCXRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJCQl0aGlzLl9jaGFuZ2UoIGV2ZW50ICk7CgkJCX0KCQl9KTsKCgkJdGhpcy5faW5pdFNvdXJjZSgpOwoJCXRoaXMubWVudSA9ICQoICI8dWw+IiApCgkJCS5hZGRDbGFzcyggInVpLWF1dG9jb21wbGV0ZSB1aS1mcm9udCIgKQoJCQkuYXBwZW5kVG8oIHRoaXMuX2FwcGVuZFRvKCkgKQoJCQkubWVudSh7CgkJCQkvLyBkaXNhYmxlIEFSSUEgc3VwcG9ydCwgdGhlIGxpdmUgcmVnaW9uIHRha2VzIGNhcmUgb2YgdGhhdAoJCQkJcm9sZTogbnVsbAoJCQl9KQoJCQkuaGlkZSgpCgkJCS5tZW51KCAiaW5zdGFuY2UiICk7CgoJCXRoaXMuX29uKCB0aGlzLm1lbnUuZWxlbWVudCwgewoJCQltb3VzZWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIHByZXZlbnQgbW92aW5nIGZvY3VzIG91dCBvZiB0aGUgdGV4dCBmaWVsZAoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCgkJCQkvLyBJRSBkb2Vzbid0IHByZXZlbnQgbW92aW5nIGZvY3VzIGV2ZW4gd2l0aCBldmVudC5wcmV2ZW50RGVmYXVsdCgpCgkJCQkvLyBzbyB3ZSBzZXQgYSBmbGFnIHRvIGtub3cgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBibHVyIGV2ZW50CgkJCQl0aGlzLmNhbmNlbEJsdXIgPSB0cnVlOwoJCQkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQkJZGVsZXRlIHRoaXMuY2FuY2VsQmx1cjsKCQkJCX0pOwoKCQkJCS8vIGNsaWNraW5nIG9uIHRoZSBzY3JvbGxiYXIgY2F1c2VzIGZvY3VzIHRvIHNoaWZ0IHRvIHRoZSBib2R5CgkJCQkvLyBidXQgd2UgY2FuJ3QgZGV0ZWN0IGEgbW91c2V1cCBvciBhIGNsaWNrIGltbWVkaWF0ZWx5IGFmdGVyd2FyZAoJCQkJLy8gc28gd2UgaGF2ZSB0byB0cmFjayB0aGUgbmV4dCBtb3VzZWRvd24gYW5kIGNsb3NlIHRoZSBtZW51IGlmCgkJCQkvLyB0aGUgdXNlciBjbGlja3Mgc29tZXdoZXJlIG91dHNpZGUgb2YgdGhlIGF1dG9jb21wbGV0ZQoJCQkJdmFyIG1lbnVFbGVtZW50ID0gdGhpcy5tZW51LmVsZW1lbnRbIDAgXTsKCQkJCWlmICggISQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoICIudWktbWVudS1pdGVtIiApLmxlbmd0aCApIHsKCQkJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCQkJdmFyIHRoYXQgPSB0aGlzOwoJCQkJCQl0aGlzLmRvY3VtZW50Lm9uZSggIm1vdXNlZG93biIsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCQkJCWlmICggZXZlbnQudGFyZ2V0ICE9PSB0aGF0LmVsZW1lbnRbIDAgXSAmJgoJCQkJCQkJCQlldmVudC50YXJnZXQgIT09IG1lbnVFbGVtZW50ICYmCgkJCQkJCQkJCSEkLmNvbnRhaW5zKCBtZW51RWxlbWVudCwgZXZlbnQudGFyZ2V0ICkgKSB7CgkJCQkJCQkJdGhhdC5jbG9zZSgpOwoJCQkJCQkJfQoJCQkJCQl9KTsKCQkJCQl9KTsKCQkJCX0KCQkJfSwKCQkJbWVudWZvY3VzOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJdmFyIGxhYmVsLCBpdGVtOwoJCQkJLy8gc3VwcG9ydDogRmlyZWZveAoJCQkJLy8gUHJldmVudCBhY2NpZGVudGFsIGFjdGl2YXRpb24gb2YgbWVudSBpdGVtcyBpbiBGaXJlZm94ICgjNzAyNCAjOTExOCkKCQkJCWlmICggdGhpcy5pc05ld01lbnUgKSB7CgkJCQkJdGhpcy5pc05ld01lbnUgPSBmYWxzZTsKCQkJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgL15tb3VzZS8udGVzdCggZXZlbnQub3JpZ2luYWxFdmVudC50eXBlICkgKSB7CgkJCQkJCXRoaXMubWVudS5ibHVyKCk7CgoJCQkJCQl0aGlzLmRvY3VtZW50Lm9uZSggIm1vdXNlbW92ZSIsIGZ1bmN0aW9uKCkgewoJCQkJCQkJJCggZXZlbnQudGFyZ2V0ICkudHJpZ2dlciggZXZlbnQub3JpZ2luYWxFdmVudCApOwoJCQkJCQl9KTsKCgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQl9CgoJCQkJaXRlbSA9IHVpLml0ZW0uZGF0YSggInVpLWF1dG9jb21wbGV0ZS1pdGVtIiApOwoJCQkJaWYgKCBmYWxzZSAhPT0gdGhpcy5fdHJpZ2dlciggImZvY3VzIiwgZXZlbnQsIHsgaXRlbTogaXRlbSB9ICkgKSB7CgkJCQkJLy8gdXNlIHZhbHVlIHRvIG1hdGNoIHdoYXQgd2lsbCBlbmQgdXAgaW4gdGhlIGlucHV0LCBpZiBpdCB3YXMgYSBrZXkgZXZlbnQKCQkJCQlpZiAoIGV2ZW50Lm9yaWdpbmFsRXZlbnQgJiYgL15rZXkvLnRlc3QoIGV2ZW50Lm9yaWdpbmFsRXZlbnQudHlwZSApICkgewoJCQkJCQl0aGlzLl92YWx1ZSggaXRlbS52YWx1ZSApOwoJCQkJCX0KCQkJCX0KCgkJCQkvLyBBbm5vdW5jZSB0aGUgdmFsdWUgaW4gdGhlIGxpdmVSZWdpb24KCQkJCWxhYmVsID0gdWkuaXRlbS5hdHRyKCAiYXJpYS1sYWJlbCIgKSB8fCBpdGVtLnZhbHVlOwoJCQkJaWYgKCBsYWJlbCAmJiBqUXVlcnkudHJpbSggbGFiZWwgKS5sZW5ndGggKSB7CgkJCQkJdGhpcy5saXZlUmVnaW9uLmNoaWxkcmVuKCkuaGlkZSgpOwoJCQkJCSQoICI8ZGl2PiIgKS50ZXh0KCBsYWJlbCApLmFwcGVuZFRvKCB0aGlzLmxpdmVSZWdpb24gKTsKCQkJCX0KCQkJfSwKCQkJbWVudXNlbGVjdDogZnVuY3Rpb24oIGV2ZW50LCB1aSApIHsKCQkJCXZhciBpdGVtID0gdWkuaXRlbS5kYXRhKCAidWktYXV0b2NvbXBsZXRlLWl0ZW0iICksCgkJCQkJcHJldmlvdXMgPSB0aGlzLnByZXZpb3VzOwoKCQkJCS8vIG9ubHkgdHJpZ2dlciB3aGVuIGZvY3VzIHdhcyBsb3N0IChjbGljayBvbiBtZW51KQoJCQkJaWYgKCB0aGlzLmVsZW1lbnRbIDAgXSAhPT0gdGhpcy5kb2N1bWVudFsgMCBdLmFjdGl2ZUVsZW1lbnQgKSB7CgkJCQkJdGhpcy5lbGVtZW50LmZvY3VzKCk7CgkJCQkJdGhpcy5wcmV2aW91cyA9IHByZXZpb3VzOwoJCQkJCS8vICM2MTA5IC0gSUUgdHJpZ2dlcnMgdHdvIGZvY3VzIGV2ZW50cyBhbmQgdGhlIHNlY29uZAoJCQkJCS8vIGlzIGFzeW5jaHJvbm91cywgc28gd2UgbmVlZCB0byByZXNldCB0aGUgcHJldmlvdXMKCQkJCQkvLyB0ZXJtIHN5bmNocm9ub3VzbHkgYW5kIGFzeW5jaHJvbm91c2x5IDotKAoJCQkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJCQl0aGlzLnByZXZpb3VzID0gcHJldmlvdXM7CgkJCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKCQkJCQl9KTsKCQkJCX0KCgkJCQlpZiAoIGZhbHNlICE9PSB0aGlzLl90cmlnZ2VyKCAic2VsZWN0IiwgZXZlbnQsIHsgaXRlbTogaXRlbSB9ICkgKSB7CgkJCQkJdGhpcy5fdmFsdWUoIGl0ZW0udmFsdWUgKTsKCQkJCX0KCQkJCS8vIHJlc2V0IHRoZSB0ZXJtIGFmdGVyIHRoZSBzZWxlY3QgZXZlbnQKCQkJCS8vIHRoaXMgYWxsb3dzIGN1c3RvbSBzZWxlY3QgaGFuZGxpbmcgdG8gd29yayBwcm9wZXJseQoJCQkJdGhpcy50ZXJtID0gdGhpcy5fdmFsdWUoKTsKCgkJCQl0aGlzLmNsb3NlKCBldmVudCApOwoJCQkJdGhpcy5zZWxlY3RlZEl0ZW0gPSBpdGVtOwoJCQl9CgkJfSk7CgoJCXRoaXMubGl2ZVJlZ2lvbiA9ICQoICI8c3Bhbj4iLCB7CgkJCQlyb2xlOiAic3RhdHVzIiwKCQkJCSJhcmlhLWxpdmUiOiAiYXNzZXJ0aXZlIiwKCQkJCSJhcmlhLXJlbGV2YW50IjogImFkZGl0aW9ucyIKCQkJfSkKCQkJLmFkZENsYXNzKCAidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiApCgkJCS5hcHBlbmRUbyggdGhpcy5kb2N1bWVudFsgMCBdLmJvZHkgKTsKCgkJLy8gdHVybmluZyBvZmYgYXV0b2NvbXBsZXRlIHByZXZlbnRzIHRoZSBicm93c2VyIGZyb20gcmVtZW1iZXJpbmcgdGhlCgkJLy8gdmFsdWUgd2hlbiBuYXZpZ2F0aW5nIHRocm91Z2ggaGlzdG9yeSwgc28gd2UgcmUtZW5hYmxlIGF1dG9jb21wbGV0ZQoJCS8vIGlmIHRoZSBwYWdlIGlzIHVubG9hZGVkIGJlZm9yZSB0aGUgd2lkZ2V0IGlzIGRlc3Ryb3llZC4gIzc3OTAKCQl0aGlzLl9vbiggdGhpcy53aW5kb3csIHsKCQkJYmVmb3JldW5sb2FkOiBmdW5jdGlvbigpIHsKCQkJCXRoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCAiYXV0b2NvbXBsZXRlIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQljbGVhclRpbWVvdXQoIHRoaXMuc2VhcmNoaW5nICk7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcyggInVpLWF1dG9jb21wbGV0ZS1pbnB1dCIgKQoJCQkucmVtb3ZlQXR0ciggImF1dG9jb21wbGV0ZSIgKTsKCQl0aGlzLm1lbnUuZWxlbWVudC5yZW1vdmUoKTsKCQl0aGlzLmxpdmVSZWdpb24ucmVtb3ZlKCk7Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgkJaWYgKCBrZXkgPT09ICJzb3VyY2UiICkgewoJCQl0aGlzLl9pbml0U291cmNlKCk7CgkJfQoJCWlmICgga2V5ID09PSAiYXBwZW5kVG8iICkgewoJCQl0aGlzLm1lbnUuZWxlbWVudC5hcHBlbmRUbyggdGhpcy5fYXBwZW5kVG8oKSApOwoJCX0KCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiAmJiB2YWx1ZSAmJiB0aGlzLnhociApIHsKCQkJdGhpcy54aHIuYWJvcnQoKTsKCQl9Cgl9LAoKCV9hcHBlbmRUbzogZnVuY3Rpb24oKSB7CgkJdmFyIGVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuYXBwZW5kVG87CgoJCWlmICggZWxlbWVudCApIHsKCQkJZWxlbWVudCA9IGVsZW1lbnQuanF1ZXJ5IHx8IGVsZW1lbnQubm9kZVR5cGUgPwoJCQkJJCggZWxlbWVudCApIDoKCQkJCXRoaXMuZG9jdW1lbnQuZmluZCggZWxlbWVudCApLmVxKCAwICk7CgkJfQoKCQlpZiAoICFlbGVtZW50IHx8ICFlbGVtZW50WyAwIF0gKSB7CgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQuY2xvc2VzdCggIi51aS1mcm9udCIgKTsKCQl9CgoJCWlmICggIWVsZW1lbnQubGVuZ3RoICkgewoJCQllbGVtZW50ID0gdGhpcy5kb2N1bWVudFsgMCBdLmJvZHk7CgkJfQoKCQlyZXR1cm4gZWxlbWVudDsKCX0sCgoJX2luaXRTb3VyY2U6IGZ1bmN0aW9uKCkgewoJCXZhciBhcnJheSwgdXJsLAoJCQl0aGF0ID0gdGhpczsKCQlpZiAoICQuaXNBcnJheSggdGhpcy5vcHRpb25zLnNvdXJjZSApICkgewoJCQlhcnJheSA9IHRoaXMub3B0aW9ucy5zb3VyY2U7CgkJCXRoaXMuc291cmNlID0gZnVuY3Rpb24oIHJlcXVlc3QsIHJlc3BvbnNlICkgewoJCQkJcmVzcG9uc2UoICQudWkuYXV0b2NvbXBsZXRlLmZpbHRlciggYXJyYXksIHJlcXVlc3QudGVybSApICk7CgkJCX07CgkJfSBlbHNlIGlmICggdHlwZW9mIHRoaXMub3B0aW9ucy5zb3VyY2UgPT09ICJzdHJpbmciICkgewoJCQl1cmwgPSB0aGlzLm9wdGlvbnMuc291cmNlOwoJCQl0aGlzLnNvdXJjZSA9IGZ1bmN0aW9uKCByZXF1ZXN0LCByZXNwb25zZSApIHsKCQkJCWlmICggdGhhdC54aHIgKSB7CgkJCQkJdGhhdC54aHIuYWJvcnQoKTsKCQkJCX0KCQkJCXRoYXQueGhyID0gJC5hamF4KHsKCQkJCQl1cmw6IHVybCwKCQkJCQlkYXRhOiByZXF1ZXN0LAoJCQkJCWRhdGFUeXBlOiAianNvbiIsCgkJCQkJc3VjY2VzczogZnVuY3Rpb24oIGRhdGEgKSB7CgkJCQkJCXJlc3BvbnNlKCBkYXRhICk7CgkJCQkJfSwKCQkJCQllcnJvcjogZnVuY3Rpb24oKSB7CgkJCQkJCXJlc3BvbnNlKFtdKTsKCQkJCQl9CgkJCQl9KTsKCQkJfTsKCQl9IGVsc2UgewoJCQl0aGlzLnNvdXJjZSA9IHRoaXMub3B0aW9ucy5zb3VyY2U7CgkJfQoJfSwKCglfc2VhcmNoVGltZW91dDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWNsZWFyVGltZW91dCggdGhpcy5zZWFyY2hpbmcgKTsKCQl0aGlzLnNlYXJjaGluZyA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoKCQkJLy8gU2VhcmNoIGlmIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwgb3IgaWYgdGhlIHVzZXIgcmV0eXBlcyB0aGUgc2FtZSB2YWx1ZSAoc2VlICM3NDM0KQoJCQl2YXIgZXF1YWxWYWx1ZXMgPSB0aGlzLnRlcm0gPT09IHRoaXMuX3ZhbHVlKCksCgkJCQltZW51VmlzaWJsZSA9IHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICksCgkJCQltb2RpZmllcktleSA9IGV2ZW50LmFsdEtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkgfHwgZXZlbnQuc2hpZnRLZXk7CgoJCQlpZiAoICFlcXVhbFZhbHVlcyB8fCAoIGVxdWFsVmFsdWVzICYmICFtZW51VmlzaWJsZSAmJiAhbW9kaWZpZXJLZXkgKSApIHsKCQkJCXRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKCQkJCXRoaXMuc2VhcmNoKCBudWxsLCBldmVudCApOwoJCQl9CgkJfSwgdGhpcy5vcHRpb25zLmRlbGF5ICk7Cgl9LAoKCXNlYXJjaDogZnVuY3Rpb24oIHZhbHVlLCBldmVudCApIHsKCQl2YWx1ZSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IHRoaXMuX3ZhbHVlKCk7CgoJCS8vIGFsd2F5cyBzYXZlIHRoZSBhY3R1YWwgdmFsdWUsIG5vdCB0aGUgb25lIHBhc3NlZCBhcyBhbiBhcmd1bWVudAoJCXRoaXMudGVybSA9IHRoaXMuX3ZhbHVlKCk7CgoJCWlmICggdmFsdWUubGVuZ3RoIDwgdGhpcy5vcHRpb25zLm1pbkxlbmd0aCApIHsKCQkJcmV0dXJuIHRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJfQoKCQlpZiAoIHRoaXMuX3RyaWdnZXIoICJzZWFyY2giLCBldmVudCApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJcmV0dXJuIHRoaXMuX3NlYXJjaCggdmFsdWUgKTsKCX0sCgoJX3NlYXJjaDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXRoaXMucGVuZGluZysrOwoJCXRoaXMuZWxlbWVudC5hZGRDbGFzcyggInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiApOwoJCXRoaXMuY2FuY2VsU2VhcmNoID0gZmFsc2U7CgoJCXRoaXMuc291cmNlKCB7IHRlcm06IHZhbHVlIH0sIHRoaXMuX3Jlc3BvbnNlKCkgKTsKCX0sCgoJX3Jlc3BvbnNlOiBmdW5jdGlvbigpIHsKCQl2YXIgaW5kZXggPSArK3RoaXMucmVxdWVzdEluZGV4OwoKCQlyZXR1cm4gJC5wcm94eShmdW5jdGlvbiggY29udGVudCApIHsKCQkJaWYgKCBpbmRleCA9PT0gdGhpcy5yZXF1ZXN0SW5kZXggKSB7CgkJCQl0aGlzLl9fcmVzcG9uc2UoIGNvbnRlbnQgKTsKCQkJfQoKCQkJdGhpcy5wZW5kaW5nLS07CgkJCWlmICggIXRoaXMucGVuZGluZyApIHsKCQkJCXRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyggInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiApOwoJCQl9CgkJfSwgdGhpcyApOwoJfSwKCglfX3Jlc3BvbnNlOiBmdW5jdGlvbiggY29udGVudCApIHsKCQlpZiAoIGNvbnRlbnQgKSB7CgkJCWNvbnRlbnQgPSB0aGlzLl9ub3JtYWxpemUoIGNvbnRlbnQgKTsKCQl9CgkJdGhpcy5fdHJpZ2dlciggInJlc3BvbnNlIiwgbnVsbCwgeyBjb250ZW50OiBjb250ZW50IH0gKTsKCQlpZiAoICF0aGlzLm9wdGlvbnMuZGlzYWJsZWQgJiYgY29udGVudCAmJiBjb250ZW50Lmxlbmd0aCAmJiAhdGhpcy5jYW5jZWxTZWFyY2ggKSB7CgkJCXRoaXMuX3N1Z2dlc3QoIGNvbnRlbnQgKTsKCQkJdGhpcy5fdHJpZ2dlciggIm9wZW4iICk7CgkJfSBlbHNlIHsKCQkJLy8gdXNlIC5fY2xvc2UoKSBpbnN0ZWFkIG9mIC5jbG9zZSgpIHNvIHdlIGRvbid0IGNhbmNlbCBmdXR1cmUgc2VhcmNoZXMKCQkJdGhpcy5fY2xvc2UoKTsKCQl9Cgl9LAoKCWNsb3NlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdGhpcy5jYW5jZWxTZWFyY2ggPSB0cnVlOwoJCXRoaXMuX2Nsb3NlKCBldmVudCApOwoJfSwKCglfY2xvc2U6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCXRoaXMubWVudS5lbGVtZW50LmhpZGUoKTsKCQkJdGhpcy5tZW51LmJsdXIoKTsKCQkJdGhpcy5pc05ld01lbnUgPSB0cnVlOwoJCQl0aGlzLl90cmlnZ2VyKCAiY2xvc2UiLCBldmVudCApOwoJCX0KCX0sCgoJX2NoYW5nZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggdGhpcy5wcmV2aW91cyAhPT0gdGhpcy5fdmFsdWUoKSApIHsKCQkJdGhpcy5fdHJpZ2dlciggImNoYW5nZSIsIGV2ZW50LCB7IGl0ZW06IHRoaXMuc2VsZWN0ZWRJdGVtIH0gKTsKCQl9Cgl9LAoKCV9ub3JtYWxpemU6IGZ1bmN0aW9uKCBpdGVtcyApIHsKCQkvLyBhc3N1bWUgYWxsIGl0ZW1zIGhhdmUgdGhlIHJpZ2h0IGZvcm1hdCB3aGVuIHRoZSBmaXJzdCBpdGVtIGlzIGNvbXBsZXRlCgkJaWYgKCBpdGVtcy5sZW5ndGggJiYgaXRlbXNbIDAgXS5sYWJlbCAmJiBpdGVtc1sgMCBdLnZhbHVlICkgewoJCQlyZXR1cm4gaXRlbXM7CgkJfQoJCXJldHVybiAkLm1hcCggaXRlbXMsIGZ1bmN0aW9uKCBpdGVtICkgewoJCQlpZiAoIHR5cGVvZiBpdGVtID09PSAic3RyaW5nIiApIHsKCQkJCXJldHVybiB7CgkJCQkJbGFiZWw6IGl0ZW0sCgkJCQkJdmFsdWU6IGl0ZW0KCQkJCX07CgkJCX0KCQkJcmV0dXJuICQuZXh0ZW5kKCB7fSwgaXRlbSwgewoJCQkJbGFiZWw6IGl0ZW0ubGFiZWwgfHwgaXRlbS52YWx1ZSwKCQkJCXZhbHVlOiBpdGVtLnZhbHVlIHx8IGl0ZW0ubGFiZWwKCQkJfSk7CgkJfSk7Cgl9LAoKCV9zdWdnZXN0OiBmdW5jdGlvbiggaXRlbXMgKSB7CgkJdmFyIHVsID0gdGhpcy5tZW51LmVsZW1lbnQuZW1wdHkoKTsKCQl0aGlzLl9yZW5kZXJNZW51KCB1bCwgaXRlbXMgKTsKCQl0aGlzLmlzTmV3TWVudSA9IHRydWU7CgkJdGhpcy5tZW51LnJlZnJlc2goKTsKCgkJLy8gc2l6ZSBhbmQgcG9zaXRpb24gbWVudQoJCXVsLnNob3coKTsKCQl0aGlzLl9yZXNpemVNZW51KCk7CgkJdWwucG9zaXRpb24oICQuZXh0ZW5kKHsKCQkJb2Y6IHRoaXMuZWxlbWVudAoJCX0sIHRoaXMub3B0aW9ucy5wb3NpdGlvbiApICk7CgoJCWlmICggdGhpcy5vcHRpb25zLmF1dG9Gb2N1cyApIHsKCQkJdGhpcy5tZW51Lm5leHQoKTsKCQl9Cgl9LAoKCV9yZXNpemVNZW51OiBmdW5jdGlvbigpIHsKCQl2YXIgdWwgPSB0aGlzLm1lbnUuZWxlbWVudDsKCQl1bC5vdXRlcldpZHRoKCBNYXRoLm1heCgKCQkJLy8gRmlyZWZveCB3cmFwcyBsb25nIHRleHQgKHBvc3NpYmx5IGEgcm91bmRpbmcgYnVnKQoJCQkvLyBzbyB3ZSBhZGQgMXB4IHRvIGF2b2lkIHRoZSB3cmFwcGluZyAoIzc1MTMpCgkJCXVsLndpZHRoKCAiIiApLm91dGVyV2lkdGgoKSArIDEsCgkJCXRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCkKCQkpICk7Cgl9LAoKCV9yZW5kZXJNZW51OiBmdW5jdGlvbiggdWwsIGl0ZW1zICkgewoJCXZhciB0aGF0ID0gdGhpczsKCQkkLmVhY2goIGl0ZW1zLCBmdW5jdGlvbiggaW5kZXgsIGl0ZW0gKSB7CgkJCXRoYXQuX3JlbmRlckl0ZW1EYXRhKCB1bCwgaXRlbSApOwoJCX0pOwoJfSwKCglfcmVuZGVySXRlbURhdGE6IGZ1bmN0aW9uKCB1bCwgaXRlbSApIHsKCQlyZXR1cm4gdGhpcy5fcmVuZGVySXRlbSggdWwsIGl0ZW0gKS5kYXRhKCAidWktYXV0b2NvbXBsZXRlLWl0ZW0iLCBpdGVtICk7Cgl9LAoKCV9yZW5kZXJJdGVtOiBmdW5jdGlvbiggdWwsIGl0ZW0gKSB7CgkJcmV0dXJuICQoICI8bGk+IiApLnRleHQoIGl0ZW0ubGFiZWwgKS5hcHBlbmRUbyggdWwgKTsKCX0sCgoJX21vdmU6IGZ1bmN0aW9uKCBkaXJlY3Rpb24sIGV2ZW50ICkgewoJCWlmICggIXRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCXRoaXMuc2VhcmNoKCBudWxsLCBldmVudCApOwoJCQlyZXR1cm47CgkJfQoJCWlmICggdGhpcy5tZW51LmlzRmlyc3RJdGVtKCkgJiYgL15wcmV2aW91cy8udGVzdCggZGlyZWN0aW9uICkgfHwKCQkJCXRoaXMubWVudS5pc0xhc3RJdGVtKCkgJiYgL15uZXh0Ly50ZXN0KCBkaXJlY3Rpb24gKSApIHsKCgkJCWlmICggIXRoaXMuaXNNdWx0aUxpbmUgKSB7CgkJCQl0aGlzLl92YWx1ZSggdGhpcy50ZXJtICk7CgkJCX0KCgkJCXRoaXMubWVudS5ibHVyKCk7CgkJCXJldHVybjsKCQl9CgkJdGhpcy5tZW51WyBkaXJlY3Rpb24gXSggZXZlbnQgKTsKCX0sCgoJd2lkZ2V0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tZW51LmVsZW1lbnQ7Cgl9LAoKCV92YWx1ZTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudmFsdWVNZXRob2QuYXBwbHkoIHRoaXMuZWxlbWVudCwgYXJndW1lbnRzICk7Cgl9LAoKCV9rZXlFdmVudDogZnVuY3Rpb24oIGtleUV2ZW50LCBldmVudCApIHsKCQlpZiAoICF0aGlzLmlzTXVsdGlMaW5lIHx8IHRoaXMubWVudS5lbGVtZW50LmlzKCAiOnZpc2libGUiICkgKSB7CgkJCXRoaXMuX21vdmUoIGtleUV2ZW50LCBldmVudCApOwoKCQkJLy8gcHJldmVudHMgbW92aW5nIGN1cnNvciB0byBiZWdpbm5pbmcvZW5kIG9mIHRoZSB0ZXh0IGZpZWxkIGluIHNvbWUgYnJvd3NlcnMKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQl9Cgl9Cn0pOwoKJC5leHRlbmQoICQudWkuYXV0b2NvbXBsZXRlLCB7Cgllc2NhcGVSZWdleDogZnVuY3Rpb24oIHZhbHVlICkgewoJCXJldHVybiB2YWx1ZS5yZXBsYWNlKCAvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywgIlxcJCYiICk7Cgl9LAoJZmlsdGVyOiBmdW5jdGlvbiggYXJyYXksIHRlcm0gKSB7CgkJdmFyIG1hdGNoZXIgPSBuZXcgUmVnRXhwKCAkLnVpLmF1dG9jb21wbGV0ZS5lc2NhcGVSZWdleCggdGVybSApLCAiaSIgKTsKCQlyZXR1cm4gJC5ncmVwKCBhcnJheSwgZnVuY3Rpb24oIHZhbHVlICkgewoJCQlyZXR1cm4gbWF0Y2hlci50ZXN0KCB2YWx1ZS5sYWJlbCB8fCB2YWx1ZS52YWx1ZSB8fCB2YWx1ZSApOwoJCX0pOwoJfQp9KTsKCi8vIGxpdmUgcmVnaW9uIGV4dGVuc2lvbiwgYWRkaW5nIGEgYG1lc3NhZ2VzYCBvcHRpb24KLy8gTk9URTogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgQVBJLiBXZSBhcmUgc3RpbGwgaW52ZXN0aWdhdGluZwovLyBhIGZ1bGwgc29sdXRpb24gZm9yIHN0cmluZyBtYW5pcHVsYXRpb24gYW5kIGludGVybmF0aW9uYWxpemF0aW9uLgokLndpZGdldCggInVpLmF1dG9jb21wbGV0ZSIsICQudWkuYXV0b2NvbXBsZXRlLCB7CglvcHRpb25zOiB7CgkJbWVzc2FnZXM6IHsKCQkJbm9SZXN1bHRzOiAiTm8gc2VhcmNoIHJlc3VsdHMuIiwKCQkJcmVzdWx0czogZnVuY3Rpb24oIGFtb3VudCApIHsKCQkJCXJldHVybiBhbW91bnQgKyAoIGFtb3VudCA+IDEgPyAiIHJlc3VsdHMgYXJlIiA6ICIgcmVzdWx0IGlzIiApICsKCQkJCQkiIGF2YWlsYWJsZSwgdXNlIHVwIGFuZCBkb3duIGFycm93IGtleXMgdG8gbmF2aWdhdGUuIjsKCQkJfQoJCX0KCX0sCgoJX19yZXNwb25zZTogZnVuY3Rpb24oIGNvbnRlbnQgKSB7CgkJdmFyIG1lc3NhZ2U7CgkJdGhpcy5fc3VwZXJBcHBseSggYXJndW1lbnRzICk7CgkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgfHwgdGhpcy5jYW5jZWxTZWFyY2ggKSB7CgkJCXJldHVybjsKCQl9CgkJaWYgKCBjb250ZW50ICYmIGNvbnRlbnQubGVuZ3RoICkgewoJCQltZXNzYWdlID0gdGhpcy5vcHRpb25zLm1lc3NhZ2VzLnJlc3VsdHMoIGNvbnRlbnQubGVuZ3RoICk7CgkJfSBlbHNlIHsKCQkJbWVzc2FnZSA9IHRoaXMub3B0aW9ucy5tZXNzYWdlcy5ub1Jlc3VsdHM7CgkJfQoJCXRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKTsKCQkkKCAiPGRpdj4iICkudGV4dCggbWVzc2FnZSApLmFwcGVuZFRvKCB0aGlzLmxpdmVSZWdpb24gKTsKCX0KfSk7Cgp2YXIgYXV0b2NvbXBsZXRlID0gJC51aS5hdXRvY29tcGxldGU7CgoKLyohCiAqIGpRdWVyeSBVSSBCdXR0b24gMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vYnV0dG9uLwogKi8KCgp2YXIgbGFzdEFjdGl2ZSwKCWJhc2VDbGFzc2VzID0gInVpLWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiwKCXR5cGVDbGFzc2VzID0gInVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRvbi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1dHRvbi10ZXh0LW9ubHkiLAoJZm9ybVJlc2V0SGFuZGxlciA9IGZ1bmN0aW9uKCkgewoJCXZhciBmb3JtID0gJCggdGhpcyApOwoJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCWZvcm0uZmluZCggIjp1aS1idXR0b24iICkuYnV0dG9uKCAicmVmcmVzaCIgKTsKCQl9LCAxICk7Cgl9LAoJcmFkaW9Hcm91cCA9IGZ1bmN0aW9uKCByYWRpbyApIHsKCQl2YXIgbmFtZSA9IHJhZGlvLm5hbWUsCgkJCWZvcm0gPSByYWRpby5mb3JtLAoJCQlyYWRpb3MgPSAkKCBbXSApOwoJCWlmICggbmFtZSApIHsKCQkJbmFtZSA9IG5hbWUucmVwbGFjZSggLycvZywgIlxcJyIgKTsKCQkJaWYgKCBmb3JtICkgewoJCQkJcmFkaW9zID0gJCggZm9ybSApLmZpbmQoICJbbmFtZT0nIiArIG5hbWUgKyAiJ11bdHlwZT1yYWRpb10iICk7CgkJCX0gZWxzZSB7CgkJCQlyYWRpb3MgPSAkKCAiW25hbWU9JyIgKyBuYW1lICsgIiddW3R5cGU9cmFkaW9dIiwgcmFkaW8ub3duZXJEb2N1bWVudCApCgkJCQkJLmZpbHRlcihmdW5jdGlvbigpIHsKCQkJCQkJcmV0dXJuICF0aGlzLmZvcm07CgkJCQkJfSk7CgkJCX0KCQl9CgkJcmV0dXJuIHJhZGlvczsKCX07CgokLndpZGdldCggInVpLmJ1dHRvbiIsIHsKCXZlcnNpb246ICIxLjExLjAiLAoJZGVmYXVsdEVsZW1lbnQ6ICI8YnV0dG9uPiIsCglvcHRpb25zOiB7CgkJZGlzYWJsZWQ6IG51bGwsCgkJdGV4dDogdHJ1ZSwKCQlsYWJlbDogbnVsbCwKCQlpY29uczogewoJCQlwcmltYXJ5OiBudWxsLAoJCQlzZWNvbmRhcnk6IG51bGwKCQl9Cgl9LAoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LmNsb3Nlc3QoICJmb3JtIiApCgkJCS51bmJpbmQoICJyZXNldCIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlICkKCQkJLmJpbmQoICJyZXNldCIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmb3JtUmVzZXRIYW5kbGVyICk7CgoJCWlmICggdHlwZW9mIHRoaXMub3B0aW9ucy5kaXNhYmxlZCAhPT0gImJvb2xlYW4iICkgewoJCQl0aGlzLm9wdGlvbnMuZGlzYWJsZWQgPSAhIXRoaXMuZWxlbWVudC5wcm9wKCAiZGlzYWJsZWQiICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5lbGVtZW50LnByb3AoICJkaXNhYmxlZCIsIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApOwoJCX0KCgkJdGhpcy5fZGV0ZXJtaW5lQnV0dG9uVHlwZSgpOwoJCXRoaXMuaGFzVGl0bGUgPSAhIXRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCAidGl0bGUiICk7CgoJCXZhciB0aGF0ID0gdGhpcywKCQkJb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJdG9nZ2xlQnV0dG9uID0gdGhpcy50eXBlID09PSAiY2hlY2tib3giIHx8IHRoaXMudHlwZSA9PT0gInJhZGlvIiwKCQkJYWN0aXZlQ2xhc3MgPSAhdG9nZ2xlQnV0dG9uID8gInVpLXN0YXRlLWFjdGl2ZSIgOiAiIjsKCgkJaWYgKCBvcHRpb25zLmxhYmVsID09PSBudWxsICkgewoJCQlvcHRpb25zLmxhYmVsID0gKHRoaXMudHlwZSA9PT0gImlucHV0IiA/IHRoaXMuYnV0dG9uRWxlbWVudC52YWwoKSA6IHRoaXMuYnV0dG9uRWxlbWVudC5odG1sKCkpOwoJCX0KCgkJdGhpcy5faG92ZXJhYmxlKCB0aGlzLmJ1dHRvbkVsZW1lbnQgKTsKCgkJdGhpcy5idXR0b25FbGVtZW50CgkJCS5hZGRDbGFzcyggYmFzZUNsYXNzZXMgKQoJCQkuYXR0ciggInJvbGUiLCAiYnV0dG9uIiApCgkJCS5iaW5kKCAibW91c2VlbnRlciIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQlyZXR1cm47CgkJCQl9CgkJCQlpZiAoIHRoaXMgPT09IGxhc3RBY3RpdmUgKSB7CgkJCQkJJCggdGhpcyApLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJfQoJCQl9KQoJCQkuYmluZCggIm1vdXNlbGVhdmUiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQlpZiAoIG9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCQkJcmV0dXJuOwoJCQkJfQoJCQkJJCggdGhpcyApLnJlbW92ZUNsYXNzKCBhY3RpdmVDbGFzcyApOwoJCQl9KQoJCQkuYmluZCggImNsaWNrIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCWV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwoJCQkJfQoJCQl9KTsKCgkJLy8gQ2FuJ3QgdXNlIF9mb2N1c2FibGUoKSBiZWNhdXNlIHRoZSBlbGVtZW50IHRoYXQgcmVjZWl2ZXMgZm9jdXMKCQkvLyBhbmQgdGhlIGVsZW1lbnQgdGhhdCBnZXRzIHRoZSB1aS1zdGF0ZS1mb2N1cyBjbGFzcyBhcmUgZGlmZmVyZW50CgkJdGhpcy5fb24oewoJCQlmb2N1czogZnVuY3Rpb24oKSB7CgkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfSwKCQkJYmx1cjogZnVuY3Rpb24oKSB7CgkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyIgKTsKCQkJfQoJCX0pOwoKCQlpZiAoIHRvZ2dsZUJ1dHRvbiApIHsKCQkJdGhpcy5lbGVtZW50LmJpbmQoICJjaGFuZ2UiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQl0aGF0LnJlZnJlc2goKTsKCQkJfSk7CgkJfQoKCQlpZiAoIHRoaXMudHlwZSA9PT0gImNoZWNrYm94IiApIHsKCQkJdGhpcy5idXR0b25FbGVtZW50LmJpbmQoICJjbGljayIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCX0pOwoJCX0gZWxzZSBpZiAoIHRoaXMudHlwZSA9PT0gInJhZGlvIiApIHsKCQkJdGhpcy5idXR0b25FbGVtZW50LmJpbmQoICJjbGljayIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9CgkJCQkkKCB0aGlzICkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl0aGF0LmJ1dHRvbkVsZW1lbnQuYXR0ciggImFyaWEtcHJlc3NlZCIsICJ0cnVlIiApOwoKCQkJCXZhciByYWRpbyA9IHRoYXQuZWxlbWVudFsgMCBdOwoJCQkJcmFkaW9Hcm91cCggcmFkaW8gKQoJCQkJCS5ub3QoIHJhZGlvICkKCQkJCQkubWFwKGZ1bmN0aW9uKCkgewoJCQkJCQlyZXR1cm4gJCggdGhpcyApLmJ1dHRvbiggIndpZGdldCIgKVsgMCBdOwoJCQkJCX0pCgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApCgkJCQkJLmF0dHIoICJhcmlhLXByZXNzZWQiLCAiZmFsc2UiICk7CgkJCX0pOwoJCX0gZWxzZSB7CgkJCXRoaXMuYnV0dG9uRWxlbWVudAoJCQkJLmJpbmQoICJtb3VzZWRvd24iICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCSQoIHRoaXMgKS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCQlsYXN0QWN0aXZlID0gdGhpczsKCQkJCQl0aGF0LmRvY3VtZW50Lm9uZSggIm1vdXNldXAiLCBmdW5jdGlvbigpIHsKCQkJCQkJbGFzdEFjdGl2ZSA9IG51bGw7CgkJCQkJfSk7CgkJCQl9KQoJCQkJLmJpbmQoICJtb3VzZXVwIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCkgewoJCQkJCWlmICggb3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCQkkKCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl9KQoJCQkJLmJpbmQoICJrZXlkb3duIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQkJaWYgKCBvcHRpb25zLmRpc2FibGVkICkgewoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJCWlmICggZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLlNQQUNFIHx8IGV2ZW50LmtleUNvZGUgPT09ICQudWkua2V5Q29kZS5FTlRFUiApIHsKCQkJCQkJJCggdGhpcyApLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJCX0KCQkJCX0pCgkJCQkvLyBzZWUgIzg1NTksIHdlIGJpbmQgdG8gYmx1ciBoZXJlIGluIGNhc2UgdGhlIGJ1dHRvbiBlbGVtZW50IGxvc2VzCgkJCQkvLyBmb2N1cyBiZXR3ZWVuIGtleWRvd24gYW5kIGtleXVwLCBpdCB3b3VsZCBiZSBsZWZ0IGluIGFuICJhY3RpdmUiIHN0YXRlCgkJCQkuYmluZCggImtleXVwIiArIHRoaXMuZXZlbnROYW1lc3BhY2UgKyAiIGJsdXIiICsgdGhpcy5ldmVudE5hbWVzcGFjZSwgZnVuY3Rpb24oKSB7CgkJCQkJJCggdGhpcyApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJfSk7CgoJCQlpZiAoIHRoaXMuYnV0dG9uRWxlbWVudC5pcygiYSIpICkgewoJCQkJdGhpcy5idXR0b25FbGVtZW50LmtleXVwKGZ1bmN0aW9uKGV2ZW50KSB7CgkJCQkJaWYgKCBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuU1BBQ0UgKSB7CgkJCQkJCS8vIFRPRE8gcGFzcyB0aHJvdWdoIG9yaWdpbmFsIGV2ZW50IGNvcnJlY3RseSAoanVzdCBhcyAybmQgYXJndW1lbnQgZG9lc24ndCB3b3JrKQoJCQkJCQkkKCB0aGlzICkuY2xpY2soKTsKCQkJCQl9CgkJCQl9KTsKCQkJfQoJCX0KCgkJdGhpcy5fc2V0T3B0aW9uKCAiZGlzYWJsZWQiLCBvcHRpb25zLmRpc2FibGVkICk7CgkJdGhpcy5fcmVzZXRCdXR0b24oKTsKCX0sCgoJX2RldGVybWluZUJ1dHRvblR5cGU6IGZ1bmN0aW9uKCkgewoJCXZhciBhbmNlc3RvciwgbGFiZWxTZWxlY3RvciwgY2hlY2tlZDsKCgkJaWYgKCB0aGlzLmVsZW1lbnQuaXMoIlt0eXBlPWNoZWNrYm94XSIpICkgewoJCQl0aGlzLnR5cGUgPSAiY2hlY2tib3giOwoJCX0gZWxzZSBpZiAoIHRoaXMuZWxlbWVudC5pcygiW3R5cGU9cmFkaW9dIikgKSB7CgkJCXRoaXMudHlwZSA9ICJyYWRpbyI7CgkJfSBlbHNlIGlmICggdGhpcy5lbGVtZW50LmlzKCJpbnB1dCIpICkgewoJCQl0aGlzLnR5cGUgPSAiaW5wdXQiOwoJCX0gZWxzZSB7CgkJCXRoaXMudHlwZSA9ICJidXR0b24iOwoJCX0KCgkJaWYgKCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8iICkgewoJCQkvLyB3ZSBkb24ndCBzZWFyY2ggYWdhaW5zdCB0aGUgZG9jdW1lbnQgaW4gY2FzZSB0aGUgZWxlbWVudAoJCQkvLyBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgRE9NCgkJCWFuY2VzdG9yID0gdGhpcy5lbGVtZW50LnBhcmVudHMoKS5sYXN0KCk7CgkJCWxhYmVsU2VsZWN0b3IgPSAibGFiZWxbZm9yPSciICsgdGhpcy5lbGVtZW50LmF0dHIoImlkIikgKyAiJ10iOwoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQgPSBhbmNlc3Rvci5maW5kKCBsYWJlbFNlbGVjdG9yICk7CgkJCWlmICggIXRoaXMuYnV0dG9uRWxlbWVudC5sZW5ndGggKSB7CgkJCQlhbmNlc3RvciA9IGFuY2VzdG9yLmxlbmd0aCA/IGFuY2VzdG9yLnNpYmxpbmdzKCkgOiB0aGlzLmVsZW1lbnQuc2libGluZ3MoKTsKCQkJCXRoaXMuYnV0dG9uRWxlbWVudCA9IGFuY2VzdG9yLmZpbHRlciggbGFiZWxTZWxlY3RvciApOwoJCQkJaWYgKCAhdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aCApIHsKCQkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQgPSBhbmNlc3Rvci5maW5kKCBsYWJlbFNlbGVjdG9yICk7CgkJCQl9CgkJCX0KCQkJdGhpcy5lbGVtZW50LmFkZENsYXNzKCAidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiApOwoKCQkJY2hlY2tlZCA9IHRoaXMuZWxlbWVudC5pcyggIjpjaGVja2VkIiApOwoJCQlpZiAoIGNoZWNrZWQgKSB7CgkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCX0KCQkJdGhpcy5idXR0b25FbGVtZW50LnByb3AoICJhcmlhLXByZXNzZWQiLCBjaGVja2VkICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5idXR0b25FbGVtZW50ID0gdGhpcy5lbGVtZW50OwoJCX0KCX0sCgoJd2lkZ2V0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5idXR0b25FbGVtZW50OwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcyggInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIgKTsKCQl0aGlzLmJ1dHRvbkVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCBiYXNlQ2xhc3NlcyArICIgdWktc3RhdGUtYWN0aXZlICIgKyB0eXBlQ2xhc3NlcyApCgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtcHJlc3NlZCIgKQoJCQkuaHRtbCggdGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSApOwoKCQlpZiAoICF0aGlzLmhhc1RpdGxlICkgewoJCQl0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQXR0ciggInRpdGxlIiApOwoJCX0KCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiwgISF2YWx1ZSApOwoJCQl0aGlzLmVsZW1lbnQucHJvcCggImRpc2FibGVkIiwgISF2YWx1ZSApOwoJCQlpZiAoIHZhbHVlICkgewoJCQkJaWYgKCB0aGlzLnR5cGUgPT09ICJjaGVja2JveCIgfHwgdGhpcy50eXBlID09PSAicmFkaW8iICkgewoJCQkJCXRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWZvY3VzIiApOwoJCQkJfSBlbHNlIHsKCQkJCQl0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1mb2N1cyB1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCQl9CgkJCX0KCQkJcmV0dXJuOwoJCX0KCQl0aGlzLl9yZXNldEJ1dHRvbigpOwoJfSwKCglyZWZyZXNoOiBmdW5jdGlvbigpIHsKCQkvL1NlZSAjODIzNyAmICM4ODI4CgkJdmFyIGlzRGlzYWJsZWQgPSB0aGlzLmVsZW1lbnQuaXMoICJpbnB1dCwgYnV0dG9uIiApID8gdGhpcy5lbGVtZW50LmlzKCAiOmRpc2FibGVkIiApIDogdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCAidWktYnV0dG9uLWRpc2FibGVkIiApOwoKCQlpZiAoIGlzRGlzYWJsZWQgIT09IHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJdGhpcy5fc2V0T3B0aW9uKCAiZGlzYWJsZWQiLCBpc0Rpc2FibGVkICk7CgkJfQoJCWlmICggdGhpcy50eXBlID09PSAicmFkaW8iICkgewoJCQlyYWRpb0dyb3VwKCB0aGlzLmVsZW1lbnRbMF0gKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCAkKCB0aGlzICkuaXMoICI6Y2hlY2tlZCIgKSApIHsKCQkJCQkkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApCgkJCQkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCQkuYXR0ciggImFyaWEtcHJlc3NlZCIsICJ0cnVlIiApOwoJCQkJfSBlbHNlIHsKCQkJCQkkKCB0aGlzICkuYnV0dG9uKCAid2lkZ2V0IiApCgkJCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCQkuYXR0ciggImFyaWEtcHJlc3NlZCIsICJmYWxzZSIgKTsKCQkJCX0KCQkJfSk7CgkJfSBlbHNlIGlmICggdGhpcy50eXBlID09PSAiY2hlY2tib3giICkgewoJCQlpZiAoIHRoaXMuZWxlbWVudC5pcyggIjpjaGVja2VkIiApICkgewoJCQkJdGhpcy5idXR0b25FbGVtZW50CgkJCQkJLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApCgkJCQkJLmF0dHIoICJhcmlhLXByZXNzZWQiLCAidHJ1ZSIgKTsKCQkJfSBlbHNlIHsKCQkJCXRoaXMuYnV0dG9uRWxlbWVudAoJCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJCS5hdHRyKCAiYXJpYS1wcmVzc2VkIiwgImZhbHNlIiApOwoJCQl9CgkJfQoJfSwKCglfcmVzZXRCdXR0b246IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy50eXBlID09PSAiaW5wdXQiICkgewoJCQlpZiAoIHRoaXMub3B0aW9ucy5sYWJlbCApIHsKCQkJCXRoaXMuZWxlbWVudC52YWwoIHRoaXMub3B0aW9ucy5sYWJlbCApOwoJCQl9CgkJCXJldHVybjsKCQl9CgkJdmFyIGJ1dHRvbkVsZW1lbnQgPSB0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoIHR5cGVDbGFzc2VzICksCgkJCWJ1dHRvblRleHQgPSAkKCAiPHNwYW4+PC9zcGFuPiIsIHRoaXMuZG9jdW1lbnRbMF0gKQoJCQkJLmFkZENsYXNzKCAidWktYnV0dG9uLXRleHQiICkKCQkJCS5odG1sKCB0aGlzLm9wdGlvbnMubGFiZWwgKQoJCQkJLmFwcGVuZFRvKCBidXR0b25FbGVtZW50LmVtcHR5KCkgKQoJCQkJLnRleHQoKSwKCQkJaWNvbnMgPSB0aGlzLm9wdGlvbnMuaWNvbnMsCgkJCW11bHRpcGxlSWNvbnMgPSBpY29ucy5wcmltYXJ5ICYmIGljb25zLnNlY29uZGFyeSwKCQkJYnV0dG9uQ2xhc3NlcyA9IFtdOwoKCQlpZiAoIGljb25zLnByaW1hcnkgfHwgaWNvbnMuc2Vjb25kYXJ5ICkgewoJCQlpZiAoIHRoaXMub3B0aW9ucy50ZXh0ICkgewoJCQkJYnV0dG9uQ2xhc3Nlcy5wdXNoKCAidWktYnV0dG9uLXRleHQtaWNvbiIgKyAoIG11bHRpcGxlSWNvbnMgPyAicyIgOiAoIGljb25zLnByaW1hcnkgPyAiLXByaW1hcnkiIDogIi1zZWNvbmRhcnkiICkgKSApOwoJCQl9CgoJCQlpZiAoIGljb25zLnByaW1hcnkgKSB7CgkJCQlidXR0b25FbGVtZW50LnByZXBlbmQoICI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tcHJpbWFyeSB1aS1pY29uICIgKyBpY29ucy5wcmltYXJ5ICsgIic+PC9zcGFuPiIgKTsKCQkJfQoKCQkJaWYgKCBpY29ucy5zZWNvbmRhcnkgKSB7CgkJCQlidXR0b25FbGVtZW50LmFwcGVuZCggIjxzcGFuIGNsYXNzPSd1aS1idXR0b24taWNvbi1zZWNvbmRhcnkgdWktaWNvbiAiICsgaWNvbnMuc2Vjb25kYXJ5ICsgIic+PC9zcGFuPiIgKTsKCQkJfQoKCQkJaWYgKCAhdGhpcy5vcHRpb25zLnRleHQgKSB7CgkJCQlidXR0b25DbGFzc2VzLnB1c2goIG11bHRpcGxlSWNvbnMgPyAidWktYnV0dG9uLWljb25zLW9ubHkiIDogInVpLWJ1dHRvbi1pY29uLW9ubHkiICk7CgoJCQkJaWYgKCAhdGhpcy5oYXNUaXRsZSApIHsKCQkJCQlidXR0b25FbGVtZW50LmF0dHIoICJ0aXRsZSIsICQudHJpbSggYnV0dG9uVGV4dCApICk7CgkJCQl9CgkJCX0KCQl9IGVsc2UgewoJCQlidXR0b25DbGFzc2VzLnB1c2goICJ1aS1idXR0b24tdGV4dC1vbmx5IiApOwoJCX0KCQlidXR0b25FbGVtZW50LmFkZENsYXNzKCBidXR0b25DbGFzc2VzLmpvaW4oICIgIiApICk7Cgl9Cn0pOwoKJC53aWRnZXQoICJ1aS5idXR0b25zZXQiLCB7Cgl2ZXJzaW9uOiAiMS4xMS4wIiwKCW9wdGlvbnM6IHsKCQlpdGVtczogImJ1dHRvbiwgaW5wdXRbdHlwZT1idXR0b25dLCBpbnB1dFt0eXBlPXN1Ym1pdF0sIGlucHV0W3R5cGU9cmVzZXRdLCBpbnB1dFt0eXBlPWNoZWNrYm94XSwgaW5wdXRbdHlwZT1yYWRpb10sIGEsIDpkYXRhKHVpLWJ1dHRvbikiCgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCXRoaXMuZWxlbWVudC5hZGRDbGFzcyggInVpLWJ1dHRvbnNldCIgKTsKCX0sCgoJX2luaXQ6IGZ1bmN0aW9uKCkgewoJCXRoaXMucmVmcmVzaCgpOwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy5idXR0b25zLmJ1dHRvbiggIm9wdGlvbiIsIGtleSwgdmFsdWUgKTsKCQl9CgoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7Cgl9LAoKCXJlZnJlc2g6IGZ1bmN0aW9uKCkgewoJCXZhciBydGwgPSB0aGlzLmVsZW1lbnQuY3NzKCAiZGlyZWN0aW9uIiApID09PSAicnRsIiwKCQkJYWxsQnV0dG9ucyA9IHRoaXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMuaXRlbXMgKSwKCQkJZXhpc3RpbmdCdXR0b25zID0gYWxsQnV0dG9ucy5maWx0ZXIoICI6dWktYnV0dG9uIiApOwoKCQkvLyBJbml0aWFsaXplIG5ldyBidXR0b25zCgkJYWxsQnV0dG9ucy5ub3QoICI6dWktYnV0dG9uIiApLmJ1dHRvbigpOwoKCQkvLyBSZWZyZXNoIGV4aXN0aW5nIGJ1dHRvbnMKCQlleGlzdGluZ0J1dHRvbnMuYnV0dG9uKCAicmVmcmVzaCIgKTsKCgkJdGhpcy5idXR0b25zID0gYWxsQnV0dG9ucwoJCQkubWFwKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICQoIHRoaXMgKS5idXR0b24oICJ3aWRnZXQiIClbIDAgXTsKCQkJfSkKCQkJCS5yZW1vdmVDbGFzcyggInVpLWNvcm5lci1hbGwgdWktY29ybmVyLWxlZnQgdWktY29ybmVyLXJpZ2h0IiApCgkJCQkuZmlsdGVyKCAiOmZpcnN0IiApCgkJCQkJLmFkZENsYXNzKCBydGwgPyAidWktY29ybmVyLXJpZ2h0IiA6ICJ1aS1jb3JuZXItbGVmdCIgKQoJCQkJLmVuZCgpCgkJCQkuZmlsdGVyKCAiOmxhc3QiICkKCQkJCQkuYWRkQ2xhc3MoIHJ0bCA/ICJ1aS1jb3JuZXItbGVmdCIgOiAidWktY29ybmVyLXJpZ2h0IiApCgkJCQkuZW5kKCkKCQkJLmVuZCgpOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCAidWktYnV0dG9uc2V0IiApOwoJCXRoaXMuYnV0dG9ucwoJCQkubWFwKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICQoIHRoaXMgKS5idXR0b24oICJ3aWRnZXQiIClbIDAgXTsKCQkJfSkKCQkJCS5yZW1vdmVDbGFzcyggInVpLWNvcm5lci1sZWZ0IHVpLWNvcm5lci1yaWdodCIgKQoJCQkuZW5kKCkKCQkJLmJ1dHRvbiggImRlc3Ryb3kiICk7Cgl9Cn0pOwoKdmFyIGJ1dHRvbiA9ICQudWkuYnV0dG9uOwoKCi8qIQogKiBqUXVlcnkgVUkgRGF0ZXBpY2tlciAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9kYXRlcGlja2VyLwogKi8KCgokLmV4dGVuZCgkLnVpLCB7IGRhdGVwaWNrZXI6IHsgdmVyc2lvbjogIjEuMTEuMCIgfSB9KTsKCnZhciBkYXRlcGlja2VyX2luc3RBY3RpdmU7CgpmdW5jdGlvbiBkYXRlcGlja2VyX2dldFppbmRleCggZWxlbSApIHsKCXZhciBwb3NpdGlvbiwgdmFsdWU7Cgl3aGlsZSAoIGVsZW0ubGVuZ3RoICYmIGVsZW1bIDAgXSAhPT0gZG9jdW1lbnQgKSB7CgkJLy8gSWdub3JlIHotaW5kZXggaWYgcG9zaXRpb24gaXMgc2V0IHRvIGEgdmFsdWUgd2hlcmUgei1pbmRleCBpcyBpZ25vcmVkIGJ5IHRoZSBicm93c2VyCgkJLy8gVGhpcyBtYWtlcyBiZWhhdmlvciBvZiB0aGlzIGZ1bmN0aW9uIGNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzCgkJLy8gV2ViS2l0IGFsd2F5cyByZXR1cm5zIGF1dG8gaWYgdGhlIGVsZW1lbnQgaXMgcG9zaXRpb25lZAoJCXBvc2l0aW9uID0gZWxlbS5jc3MoICJwb3NpdGlvbiIgKTsKCQlpZiAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAicmVsYXRpdmUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQkvLyBJRSByZXR1cm5zIDAgd2hlbiB6SW5kZXggaXMgbm90IHNwZWNpZmllZAoJCQkvLyBvdGhlciBicm93c2VycyByZXR1cm4gYSBzdHJpbmcKCQkJLy8gd2UgaWdub3JlIHRoZSBjYXNlIG9mIG5lc3RlZCBlbGVtZW50cyB3aXRoIGFuIGV4cGxpY2l0IHZhbHVlIG9mIDAKCQkJLy8gPGRpdiBzdHlsZT0iei1pbmRleDogLTEwOyI+PGRpdiBzdHlsZT0iei1pbmRleDogMDsiPjwvZGl2PjwvZGl2PgoJCQl2YWx1ZSA9IHBhcnNlSW50KCBlbGVtLmNzcyggInpJbmRleCIgKSwgMTAgKTsKCQkJaWYgKCAhaXNOYU4oIHZhbHVlICkgJiYgdmFsdWUgIT09IDAgKSB7CgkJCQlyZXR1cm4gdmFsdWU7CgkJCX0KCQl9CgkJZWxlbSA9IGVsZW0ucGFyZW50KCk7Cgl9CgoJcmV0dXJuIDA7Cn0KLyogRGF0ZSBwaWNrZXIgbWFuYWdlci4KICAgVXNlIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcywgJC5kYXRlcGlja2VyLCB0byBpbnRlcmFjdCB3aXRoIHRoZSBkYXRlIHBpY2tlci4KICAgU2V0dGluZ3MgZm9yIChncm91cHMgb2YpIGRhdGUgcGlja2VycyBhcmUgbWFpbnRhaW5lZCBpbiBhbiBpbnN0YW5jZSBvYmplY3QsCiAgIGFsbG93aW5nIG11bHRpcGxlIGRpZmZlcmVudCBzZXR0aW5ncyBvbiB0aGUgc2FtZSBwYWdlLiAqLwoKZnVuY3Rpb24gRGF0ZXBpY2tlcigpIHsKCXRoaXMuX2N1ckluc3QgPSBudWxsOyAvLyBUaGUgY3VycmVudCBpbnN0YW5jZSBpbiB1c2UKCXRoaXMuX2tleUV2ZW50ID0gZmFsc2U7IC8vIElmIHRoZSBsYXN0IGV2ZW50IHdhcyBhIGtleSBldmVudAoJdGhpcy5fZGlzYWJsZWRJbnB1dHMgPSBbXTsgLy8gTGlzdCBvZiBkYXRlIHBpY2tlciBpbnB1dHMgdGhhdCBoYXZlIGJlZW4gZGlzYWJsZWQKCXRoaXMuX2RhdGVwaWNrZXJTaG93aW5nID0gZmFsc2U7IC8vIFRydWUgaWYgdGhlIHBvcHVwIHBpY2tlciBpcyBzaG93aW5nICwgZmFsc2UgaWYgbm90Cgl0aGlzLl9pbkRpYWxvZyA9IGZhbHNlOyAvLyBUcnVlIGlmIHNob3dpbmcgd2l0aGluIGEgImRpYWxvZyIsIGZhbHNlIGlmIG5vdAoJdGhpcy5fbWFpbkRpdklkID0gInVpLWRhdGVwaWNrZXItZGl2IjsgLy8gVGhlIElEIG9mIHRoZSBtYWluIGRhdGVwaWNrZXIgZGl2aXNpb24KCXRoaXMuX2lubGluZUNsYXNzID0gInVpLWRhdGVwaWNrZXItaW5saW5lIjsgLy8gVGhlIG5hbWUgb2YgdGhlIGlubGluZSBtYXJrZXIgY2xhc3MKCXRoaXMuX2FwcGVuZENsYXNzID0gInVpLWRhdGVwaWNrZXItYXBwZW5kIjsgLy8gVGhlIG5hbWUgb2YgdGhlIGFwcGVuZCBtYXJrZXIgY2xhc3MKCXRoaXMuX3RyaWdnZXJDbGFzcyA9ICJ1aS1kYXRlcGlja2VyLXRyaWdnZXIiOyAvLyBUaGUgbmFtZSBvZiB0aGUgdHJpZ2dlciBtYXJrZXIgY2xhc3MKCXRoaXMuX2RpYWxvZ0NsYXNzID0gInVpLWRhdGVwaWNrZXItZGlhbG9nIjsgLy8gVGhlIG5hbWUgb2YgdGhlIGRpYWxvZyBtYXJrZXIgY2xhc3MKCXRoaXMuX2Rpc2FibGVDbGFzcyA9ICJ1aS1kYXRlcGlja2VyLWRpc2FibGVkIjsgLy8gVGhlIG5hbWUgb2YgdGhlIGRpc2FibGVkIGNvdmVyaW5nIG1hcmtlciBjbGFzcwoJdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MgPSAidWktZGF0ZXBpY2tlci11bnNlbGVjdGFibGUiOyAvLyBUaGUgbmFtZSBvZiB0aGUgdW5zZWxlY3RhYmxlIGNlbGwgbWFya2VyIGNsYXNzCgl0aGlzLl9jdXJyZW50Q2xhc3MgPSAidWktZGF0ZXBpY2tlci1jdXJyZW50LWRheSI7IC8vIFRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGRheSBtYXJrZXIgY2xhc3MKCXRoaXMuX2RheU92ZXJDbGFzcyA9ICJ1aS1kYXRlcGlja2VyLWRheXMtY2VsbC1vdmVyIjsgLy8gVGhlIG5hbWUgb2YgdGhlIGRheSBob3ZlciBtYXJrZXIgY2xhc3MKCXRoaXMucmVnaW9uYWwgPSBbXTsgLy8gQXZhaWxhYmxlIHJlZ2lvbmFsIHNldHRpbmdzLCBpbmRleGVkIGJ5IGxhbmd1YWdlIGNvZGUKCXRoaXMucmVnaW9uYWxbIiJdID0geyAvLyBEZWZhdWx0IHJlZ2lvbmFsIHNldHRpbmdzCgkJY2xvc2VUZXh0OiAiRG9uZSIsIC8vIERpc3BsYXkgdGV4dCBmb3IgY2xvc2UgbGluawoJCXByZXZUZXh0OiAiUHJldiIsIC8vIERpc3BsYXkgdGV4dCBmb3IgcHJldmlvdXMgbW9udGggbGluawoJCW5leHRUZXh0OiAiTmV4dCIsIC8vIERpc3BsYXkgdGV4dCBmb3IgbmV4dCBtb250aCBsaW5rCgkJY3VycmVudFRleHQ6ICJUb2RheSIsIC8vIERpc3BsYXkgdGV4dCBmb3IgY3VycmVudCBtb250aCBsaW5rCgkJbW9udGhOYW1lczogWyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsCgkJCSJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSwgLy8gTmFtZXMgb2YgbW9udGhzIGZvciBkcm9wLWRvd24gYW5kIGZvcm1hdHRpbmcKCQltb250aE5hbWVzU2hvcnQ6IFsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXSwgLy8gRm9yIGZvcm1hdHRpbmcKCQlkYXlOYW1lczogWyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJdLCAvLyBGb3IgZm9ybWF0dGluZwoJCWRheU5hbWVzU2hvcnQ6IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0Il0sIC8vIEZvciBmb3JtYXR0aW5nCgkJZGF5TmFtZXNNaW46IFsiU3UiLCJNbyIsIlR1IiwiV2UiLCJUaCIsIkZyIiwiU2EiXSwgLy8gQ29sdW1uIGhlYWRpbmdzIGZvciBkYXlzIHN0YXJ0aW5nIGF0IFN1bmRheQoJCXdlZWtIZWFkZXI6ICJXayIsIC8vIENvbHVtbiBoZWFkZXIgZm9yIHdlZWsgb2YgdGhlIHllYXIKCQlkYXRlRm9ybWF0OiAibW0vZGQveXkiLCAvLyBTZWUgZm9ybWF0IG9wdGlvbnMgb24gcGFyc2VEYXRlCgkJZmlyc3REYXk6IDAsIC8vIFRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWssIFN1biA9IDAsIE1vbiA9IDEsIC4uLgoJCWlzUlRMOiBmYWxzZSwgLy8gVHJ1ZSBpZiByaWdodC10by1sZWZ0IGxhbmd1YWdlLCBmYWxzZSBpZiBsZWZ0LXRvLXJpZ2h0CgkJc2hvd01vbnRoQWZ0ZXJZZWFyOiBmYWxzZSwgLy8gVHJ1ZSBpZiB0aGUgeWVhciBzZWxlY3QgcHJlY2VkZXMgbW9udGgsIGZhbHNlIGZvciBtb250aCB0aGVuIHllYXIKCQl5ZWFyU3VmZml4OiAiIiAvLyBBZGRpdGlvbmFsIHRleHQgdG8gYXBwZW5kIHRvIHRoZSB5ZWFyIGluIHRoZSBtb250aCBoZWFkZXJzCgl9OwoJdGhpcy5fZGVmYXVsdHMgPSB7IC8vIEdsb2JhbCBkZWZhdWx0cyBmb3IgYWxsIHRoZSBkYXRlIHBpY2tlciBpbnN0YW5jZXMKCQlzaG93T246ICJmb2N1cyIsIC8vICJmb2N1cyIgZm9yIHBvcHVwIG9uIGZvY3VzLAoJCQkvLyAiYnV0dG9uIiBmb3IgdHJpZ2dlciBidXR0b24sIG9yICJib3RoIiBmb3IgZWl0aGVyCgkJc2hvd0FuaW06ICJmYWRlSW4iLCAvLyBOYW1lIG9mIGpRdWVyeSBhbmltYXRpb24gZm9yIHBvcHVwCgkJc2hvd09wdGlvbnM6IHt9LCAvLyBPcHRpb25zIGZvciBlbmhhbmNlZCBhbmltYXRpb25zCgkJZGVmYXVsdERhdGU6IG51bGwsIC8vIFVzZWQgd2hlbiBmaWVsZCBpcyBibGFuazogYWN0dWFsIGRhdGUsCgkJCS8vICsvLW51bWJlciBmb3Igb2Zmc2V0IGZyb20gdG9kYXksIG51bGwgZm9yIHRvZGF5CgkJYXBwZW5kVGV4dDogIiIsIC8vIERpc3BsYXkgdGV4dCBmb2xsb3dpbmcgdGhlIGlucHV0IGJveCwgZS5nLiBzaG93aW5nIHRoZSBmb3JtYXQKCQlidXR0b25UZXh0OiAiLi4uIiwgLy8gVGV4dCBmb3IgdHJpZ2dlciBidXR0b24KCQlidXR0b25JbWFnZTogIiIsIC8vIFVSTCBmb3IgdHJpZ2dlciBidXR0b24gaW1hZ2UKCQlidXR0b25JbWFnZU9ubHk6IGZhbHNlLCAvLyBUcnVlIGlmIHRoZSBpbWFnZSBhcHBlYXJzIGFsb25lLCBmYWxzZSBpZiBpdCBhcHBlYXJzIG9uIGEgYnV0dG9uCgkJaGlkZUlmTm9QcmV2TmV4dDogZmFsc2UsIC8vIFRydWUgdG8gaGlkZSBuZXh0L3ByZXZpb3VzIG1vbnRoIGxpbmtzCgkJCS8vIGlmIG5vdCBhcHBsaWNhYmxlLCBmYWxzZSB0byBqdXN0IGRpc2FibGUgdGhlbQoJCW5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ6IGZhbHNlLCAvLyBUcnVlIGlmIGRhdGUgZm9ybWF0dGluZyBhcHBsaWVkIHRvIHByZXYvdG9kYXkvbmV4dCBsaW5rcwoJCWdvdG9DdXJyZW50OiBmYWxzZSwgLy8gVHJ1ZSBpZiB0b2RheSBsaW5rIGdvZXMgYmFjayB0byBjdXJyZW50IHNlbGVjdGlvbiBpbnN0ZWFkCgkJY2hhbmdlTW9udGg6IGZhbHNlLCAvLyBUcnVlIGlmIG1vbnRoIGNhbiBiZSBzZWxlY3RlZCBkaXJlY3RseSwgZmFsc2UgaWYgb25seSBwcmV2L25leHQKCQljaGFuZ2VZZWFyOiBmYWxzZSwgLy8gVHJ1ZSBpZiB5ZWFyIGNhbiBiZSBzZWxlY3RlZCBkaXJlY3RseSwgZmFsc2UgaWYgb25seSBwcmV2L25leHQKCQl5ZWFyUmFuZ2U6ICJjLTEwOmMrMTAiLCAvLyBSYW5nZSBvZiB5ZWFycyB0byBkaXNwbGF5IGluIGRyb3AtZG93biwKCQkJLy8gZWl0aGVyIHJlbGF0aXZlIHRvIHRvZGF5J3MgeWVhciAoLW5uOitubiksIHJlbGF0aXZlIHRvIGN1cnJlbnRseSBkaXNwbGF5ZWQgeWVhcgoJCQkvLyAoYy1ubjpjK25uKSwgYWJzb2x1dGUgKG5ubm46bm5ubiksIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIGFib3ZlIChubm5uOi1uKQoJCXNob3dPdGhlck1vbnRoczogZmFsc2UsIC8vIFRydWUgdG8gc2hvdyBkYXRlcyBpbiBvdGhlciBtb250aHMsIGZhbHNlIHRvIGxlYXZlIGJsYW5rCgkJc2VsZWN0T3RoZXJNb250aHM6IGZhbHNlLCAvLyBUcnVlIHRvIGFsbG93IHNlbGVjdGlvbiBvZiBkYXRlcyBpbiBvdGhlciBtb250aHMsIGZhbHNlIGZvciB1bnNlbGVjdGFibGUKCQlzaG93V2VlazogZmFsc2UsIC8vIFRydWUgdG8gc2hvdyB3ZWVrIG9mIHRoZSB5ZWFyLCBmYWxzZSB0byBub3Qgc2hvdyBpdAoJCWNhbGN1bGF0ZVdlZWs6IHRoaXMuaXNvODYwMVdlZWssIC8vIEhvdyB0byBjYWxjdWxhdGUgdGhlIHdlZWsgb2YgdGhlIHllYXIsCgkJCS8vIHRha2VzIGEgRGF0ZSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSB3ZWVrIGZvciBpdAoJCXNob3J0WWVhckN1dG9mZjogIisxMCIsIC8vIFNob3J0IHllYXIgdmFsdWVzIDwgdGhpcyBhcmUgaW4gdGhlIGN1cnJlbnQgY2VudHVyeSwKCQkJLy8gPiB0aGlzIGFyZSBpbiB0aGUgcHJldmlvdXMgY2VudHVyeSwKCQkJLy8gc3RyaW5nIHZhbHVlIHN0YXJ0aW5nIHdpdGggIisiIGZvciBjdXJyZW50IHllYXIgKyB2YWx1ZQoJCW1pbkRhdGU6IG51bGwsIC8vIFRoZSBlYXJsaWVzdCBzZWxlY3RhYmxlIGRhdGUsIG9yIG51bGwgZm9yIG5vIGxpbWl0CgkJbWF4RGF0ZTogbnVsbCwgLy8gVGhlIGxhdGVzdCBzZWxlY3RhYmxlIGRhdGUsIG9yIG51bGwgZm9yIG5vIGxpbWl0CgkJZHVyYXRpb246ICJmYXN0IiwgLy8gRHVyYXRpb24gb2YgZGlzcGxheS9jbG9zdXJlCgkJYmVmb3JlU2hvd0RheTogbnVsbCwgLy8gRnVuY3Rpb24gdGhhdCB0YWtlcyBhIGRhdGUgYW5kIHJldHVybnMgYW4gYXJyYXkgd2l0aAoJCQkvLyBbMF0gPSB0cnVlIGlmIHNlbGVjdGFibGUsIGZhbHNlIGlmIG5vdCwgWzFdID0gY3VzdG9tIENTUyBjbGFzcyBuYW1lKHMpIG9yICIiLAoJCQkvLyBbMl0gPSBjZWxsIHRpdGxlIChvcHRpb25hbCksIGUuZy4gJC5kYXRlcGlja2VyLm5vV2Vla2VuZHMKCQliZWZvcmVTaG93OiBudWxsLCAvLyBGdW5jdGlvbiB0aGF0IHRha2VzIGFuIGlucHV0IGZpZWxkIGFuZAoJCQkvLyByZXR1cm5zIGEgc2V0IG9mIGN1c3RvbSBzZXR0aW5ncyBmb3IgdGhlIGRhdGUgcGlja2VyCgkJb25TZWxlY3Q6IG51bGwsIC8vIERlZmluZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gYSBkYXRlIGlzIHNlbGVjdGVkCgkJb25DaGFuZ2VNb250aFllYXI6IG51bGwsIC8vIERlZmluZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIG1vbnRoIG9yIHllYXIgaXMgY2hhbmdlZAoJCW9uQ2xvc2U6IG51bGwsIC8vIERlZmluZSBhIGNhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gdGhlIGRhdGVwaWNrZXIgaXMgY2xvc2VkCgkJbnVtYmVyT2ZNb250aHM6IDEsIC8vIE51bWJlciBvZiBtb250aHMgdG8gc2hvdyBhdCBhIHRpbWUKCQlzaG93Q3VycmVudEF0UG9zOiAwLCAvLyBUaGUgcG9zaXRpb24gaW4gbXVsdGlwZSBtb250aHMgYXQgd2hpY2ggdG8gc2hvdyB0aGUgY3VycmVudCBtb250aCAoc3RhcnRpbmcgYXQgMCkKCQlzdGVwTW9udGhzOiAxLCAvLyBOdW1iZXIgb2YgbW9udGhzIHRvIHN0ZXAgYmFjay9mb3J3YXJkCgkJc3RlcEJpZ01vbnRoczogMTIsIC8vIE51bWJlciBvZiBtb250aHMgdG8gc3RlcCBiYWNrL2ZvcndhcmQgZm9yIHRoZSBiaWcgbGlua3MKCQlhbHRGaWVsZDogIiIsIC8vIFNlbGVjdG9yIGZvciBhbiBhbHRlcm5hdGUgZmllbGQgdG8gc3RvcmUgc2VsZWN0ZWQgZGF0ZXMgaW50bwoJCWFsdEZvcm1hdDogIiIsIC8vIFRoZSBkYXRlIGZvcm1hdCB0byB1c2UgZm9yIHRoZSBhbHRlcm5hdGUgZmllbGQKCQljb25zdHJhaW5JbnB1dDogdHJ1ZSwgLy8gVGhlIGlucHV0IGlzIGNvbnN0cmFpbmVkIGJ5IHRoZSBjdXJyZW50IGRhdGUgZm9ybWF0CgkJc2hvd0J1dHRvblBhbmVsOiBmYWxzZSwgLy8gVHJ1ZSB0byBzaG93IGJ1dHRvbiBwYW5lbCwgZmFsc2UgdG8gbm90IHNob3cgaXQKCQlhdXRvU2l6ZTogZmFsc2UsIC8vIFRydWUgdG8gc2l6ZSB0aGUgaW5wdXQgZm9yIHRoZSBkYXRlIGZvcm1hdCwgZmFsc2UgdG8gbGVhdmUgYXMgaXMKCQlkaXNhYmxlZDogZmFsc2UgLy8gVGhlIGluaXRpYWwgZGlzYWJsZWQgc3RhdGUKCX07CgkkLmV4dGVuZCh0aGlzLl9kZWZhdWx0cywgdGhpcy5yZWdpb25hbFsiIl0pOwoJdGhpcy5yZWdpb25hbC5lbiA9ICQuZXh0ZW5kKCB0cnVlLCB7fSwgdGhpcy5yZWdpb25hbFsgIiIgXSk7Cgl0aGlzLnJlZ2lvbmFsWyAiZW4tVVMiIF0gPSAkLmV4dGVuZCggdHJ1ZSwge30sIHRoaXMucmVnaW9uYWwuZW4gKTsKCXRoaXMuZHBEaXYgPSBkYXRlcGlja2VyX2JpbmRIb3ZlcigkKCI8ZGl2IGlkPSciICsgdGhpcy5fbWFpbkRpdklkICsgIicgY2xhc3M9J3VpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsJz48L2Rpdj4iKSk7Cn0KCiQuZXh0ZW5kKERhdGVwaWNrZXIucHJvdG90eXBlLCB7CgkvKiBDbGFzcyBuYW1lIGFkZGVkIHRvIGVsZW1lbnRzIHRvIGluZGljYXRlIGFscmVhZHkgY29uZmlndXJlZCB3aXRoIGEgZGF0ZSBwaWNrZXIuICovCgltYXJrZXJDbGFzc05hbWU6ICJoYXNEYXRlcGlja2VyIiwKCgkvL0tlZXAgdHJhY2sgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgZGlzcGxheWVkIChzZWUgIzcwNDMpCgltYXhSb3dzOiA0LAoKCS8vIFRPRE8gcmVuYW1lIHRvICJ3aWRnZXQiIHdoZW4gc3dpdGNoaW5nIHRvIHdpZGdldCBmYWN0b3J5Cglfd2lkZ2V0RGF0ZXBpY2tlcjogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuZHBEaXY7Cgl9LAoKCS8qIE92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgaW5zdGFuY2VzIG9mIHRoZSBkYXRlIHBpY2tlci4KCSAqIEBwYXJhbSAgc2V0dGluZ3MgIG9iamVjdCAtIHRoZSBuZXcgc2V0dGluZ3MgdG8gdXNlIGFzIGRlZmF1bHRzIChhbm9ueW1vdXMgb2JqZWN0KQoJICogQHJldHVybiB0aGUgbWFuYWdlciBvYmplY3QKCSAqLwoJc2V0RGVmYXVsdHM6IGZ1bmN0aW9uKHNldHRpbmdzKSB7CgkJZGF0ZXBpY2tlcl9leHRlbmRSZW1vdmUodGhpcy5fZGVmYXVsdHMsIHNldHRpbmdzIHx8IHt9KTsKCQlyZXR1cm4gdGhpczsKCX0sCgoJLyogQXR0YWNoIHRoZSBkYXRlIHBpY2tlciB0byBhIGpRdWVyeSBzZWxlY3Rpb24uCgkgKiBAcGFyYW0gIHRhcmdldAllbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKiBAcGFyYW0gIHNldHRpbmdzICBvYmplY3QgLSB0aGUgbmV3IHNldHRpbmdzIHRvIHVzZSBmb3IgdGhpcyBkYXRlIHBpY2tlciBpbnN0YW5jZSAoYW5vbnltb3VzKQoJICovCglfYXR0YWNoRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBzZXR0aW5ncykgewoJCXZhciBub2RlTmFtZSwgaW5saW5lLCBpbnN0OwoJCW5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJaW5saW5lID0gKG5vZGVOYW1lID09PSAiZGl2IiB8fCBub2RlTmFtZSA9PT0gInNwYW4iKTsKCQlpZiAoIXRhcmdldC5pZCkgewoJCQl0aGlzLnV1aWQgKz0gMTsKCQkJdGFyZ2V0LmlkID0gImRwIiArIHRoaXMudXVpZDsKCQl9CgkJaW5zdCA9IHRoaXMuX25ld0luc3QoJCh0YXJnZXQpLCBpbmxpbmUpOwoJCWluc3Quc2V0dGluZ3MgPSAkLmV4dGVuZCh7fSwgc2V0dGluZ3MgfHwge30pOwoJCWlmIChub2RlTmFtZSA9PT0gImlucHV0IikgewoJCQl0aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0YXJnZXQsIGluc3QpOwoJCX0gZWxzZSBpZiAoaW5saW5lKSB7CgkJCXRoaXMuX2lubGluZURhdGVwaWNrZXIodGFyZ2V0LCBpbnN0KTsKCQl9Cgl9LAoKCS8qIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvYmplY3QuICovCglfbmV3SW5zdDogZnVuY3Rpb24odGFyZ2V0LCBpbmxpbmUpIHsKCQl2YXIgaWQgPSB0YXJnZXRbMF0uaWQucmVwbGFjZSgvKFteQS1aYS16MC05X1wtXSkvZywgIlxcXFwkMSIpOyAvLyBlc2NhcGUgalF1ZXJ5IG1ldGEgY2hhcnMKCQlyZXR1cm4ge2lkOiBpZCwgaW5wdXQ6IHRhcmdldCwgLy8gYXNzb2NpYXRlZCB0YXJnZXQKCQkJc2VsZWN0ZWREYXk6IDAsIHNlbGVjdGVkTW9udGg6IDAsIHNlbGVjdGVkWWVhcjogMCwgLy8gY3VycmVudCBzZWxlY3Rpb24KCQkJZHJhd01vbnRoOiAwLCBkcmF3WWVhcjogMCwgLy8gbW9udGggYmVpbmcgZHJhd24KCQkJaW5saW5lOiBpbmxpbmUsIC8vIGlzIGRhdGVwaWNrZXIgaW5saW5lIG9yIG5vdAoJCQlkcERpdjogKCFpbmxpbmUgPyB0aGlzLmRwRGl2IDogLy8gcHJlc2VudGF0aW9uIGRpdgoJCQlkYXRlcGlja2VyX2JpbmRIb3ZlcigkKCI8ZGl2IGNsYXNzPSciICsgdGhpcy5faW5saW5lQ2xhc3MgKyAiIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsJz48L2Rpdj4iKSkpfTsKCX0sCgoJLyogQXR0YWNoIHRoZSBkYXRlIHBpY2tlciB0byBhbiBpbnB1dCBmaWVsZC4gKi8KCV9jb25uZWN0RGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBpbnN0KSB7CgkJdmFyIGlucHV0ID0gJCh0YXJnZXQpOwoJCWluc3QuYXBwZW5kID0gJChbXSk7CgkJaW5zdC50cmlnZ2VyID0gJChbXSk7CgkJaWYgKGlucHV0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSkgewoJCQlyZXR1cm47CgkJfQoJCXRoaXMuX2F0dGFjaG1lbnRzKGlucHV0LCBpbnN0KTsKCQlpbnB1dC5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkua2V5ZG93bih0aGlzLl9kb0tleURvd24pLgoJCQlrZXlwcmVzcyh0aGlzLl9kb0tleVByZXNzKS5rZXl1cCh0aGlzLl9kb0tleVVwKTsKCQl0aGlzLl9hdXRvU2l6ZShpbnN0KTsKCQkkLmRhdGEodGFyZ2V0LCAiZGF0ZXBpY2tlciIsIGluc3QpOwoJCS8vSWYgZGlzYWJsZWQgb3B0aW9uIGlzIHRydWUsIGRpc2FibGUgdGhlIGRhdGVwaWNrZXIgb25jZSBpdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgaW5wdXQgKHNlZSB0aWNrZXQgIzU2NjUpCgkJaWYoIGluc3Quc2V0dGluZ3MuZGlzYWJsZWQgKSB7CgkJCXRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKCB0YXJnZXQgKTsKCQl9Cgl9LAoKCS8qIE1ha2UgYXR0YWNobWVudHMgYmFzZWQgb24gc2V0dGluZ3MuICovCglfYXR0YWNobWVudHM6IGZ1bmN0aW9uKGlucHV0LCBpbnN0KSB7CgkJdmFyIHNob3dPbiwgYnV0dG9uVGV4dCwgYnV0dG9uSW1hZ2UsCgkJCWFwcGVuZFRleHQgPSB0aGlzLl9nZXQoaW5zdCwgImFwcGVuZFRleHQiKSwKCQkJaXNSVEwgPSB0aGlzLl9nZXQoaW5zdCwgImlzUlRMIik7CgoJCWlmIChpbnN0LmFwcGVuZCkgewoJCQlpbnN0LmFwcGVuZC5yZW1vdmUoKTsKCQl9CgkJaWYgKGFwcGVuZFRleHQpIHsKCQkJaW5zdC5hcHBlbmQgPSAkKCI8c3BhbiBjbGFzcz0nIiArIHRoaXMuX2FwcGVuZENsYXNzICsgIic+IiArIGFwcGVuZFRleHQgKyAiPC9zcGFuPiIpOwoJCQlpbnB1dFtpc1JUTCA/ICJiZWZvcmUiIDogImFmdGVyIl0oaW5zdC5hcHBlbmQpOwoJCX0KCgkJaW5wdXQudW5iaW5kKCJmb2N1cyIsIHRoaXMuX3Nob3dEYXRlcGlja2VyKTsKCgkJaWYgKGluc3QudHJpZ2dlcikgewoJCQlpbnN0LnRyaWdnZXIucmVtb3ZlKCk7CgkJfQoKCQlzaG93T24gPSB0aGlzLl9nZXQoaW5zdCwgInNob3dPbiIpOwoJCWlmIChzaG93T24gPT09ICJmb2N1cyIgfHwgc2hvd09uID09PSAiYm90aCIpIHsgLy8gcG9wLXVwIGRhdGUgcGlja2VyIHdoZW4gaW4gdGhlIG1hcmtlZCBmaWVsZAoJCQlpbnB1dC5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlcik7CgkJfQoJCWlmIChzaG93T24gPT09ICJidXR0b24iIHx8IHNob3dPbiA9PT0gImJvdGgiKSB7IC8vIHBvcC11cCBkYXRlIHBpY2tlciB3aGVuIGJ1dHRvbiBjbGlja2VkCgkJCWJ1dHRvblRleHQgPSB0aGlzLl9nZXQoaW5zdCwgImJ1dHRvblRleHQiKTsKCQkJYnV0dG9uSW1hZ2UgPSB0aGlzLl9nZXQoaW5zdCwgImJ1dHRvbkltYWdlIik7CgkJCWluc3QudHJpZ2dlciA9ICQodGhpcy5fZ2V0KGluc3QsICJidXR0b25JbWFnZU9ubHkiKSA/CgkJCQkkKCI8aW1nLz4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLgoJCQkJCWF0dHIoeyBzcmM6IGJ1dHRvbkltYWdlLCBhbHQ6IGJ1dHRvblRleHQsIHRpdGxlOiBidXR0b25UZXh0IH0pIDoKCQkJCSQoIjxidXR0b24gdHlwZT0nYnV0dG9uJz48L2J1dHRvbj4iKS5hZGRDbGFzcyh0aGlzLl90cmlnZ2VyQ2xhc3MpLgoJCQkJCWh0bWwoIWJ1dHRvbkltYWdlID8gYnV0dG9uVGV4dCA6ICQoIjxpbWcvPiIpLmF0dHIoCgkJCQkJeyBzcmM6YnV0dG9uSW1hZ2UsIGFsdDpidXR0b25UZXh0LCB0aXRsZTpidXR0b25UZXh0IH0pKSk7CgkJCWlucHV0W2lzUlRMID8gImJlZm9yZSIgOiAiYWZ0ZXIiXShpbnN0LnRyaWdnZXIpOwoJCQlpbnN0LnRyaWdnZXIuY2xpY2soZnVuY3Rpb24oKSB7CgkJCQlpZiAoJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyAmJiAkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCA9PT0gaW5wdXRbMF0pIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7CgkJCQl9IGVsc2UgaWYgKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgJiYgJC5kYXRlcGlja2VyLl9sYXN0SW5wdXQgIT09IGlucHV0WzBdKSB7CgkJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCQkJCSQuZGF0ZXBpY2tlci5fc2hvd0RhdGVwaWNrZXIoaW5wdXRbMF0pOwoJCQkJfSBlbHNlIHsKCQkJCQkkLmRhdGVwaWNrZXIuX3Nob3dEYXRlcGlja2VyKGlucHV0WzBdKTsKCQkJCX0KCQkJCXJldHVybiBmYWxzZTsKCQkJfSk7CgkJfQoJfSwKCgkvKiBBcHBseSB0aGUgbWF4aW11bSBsZW5ndGggZm9yIHRoZSBkYXRlIGZvcm1hdC4gKi8KCV9hdXRvU2l6ZTogZnVuY3Rpb24oaW5zdCkgewoJCWlmICh0aGlzLl9nZXQoaW5zdCwgImF1dG9TaXplIikgJiYgIWluc3QuaW5saW5lKSB7CgkJCXZhciBmaW5kTWF4LCBtYXgsIG1heEksIGksCgkJCQlkYXRlID0gbmV3IERhdGUoMjAwOSwgMTIgLSAxLCAyMCksIC8vIEVuc3VyZSBkb3VibGUgZGlnaXRzCgkJCQlkYXRlRm9ybWF0ID0gdGhpcy5fZ2V0KGluc3QsICJkYXRlRm9ybWF0Iik7CgoJCQlpZiAoZGF0ZUZvcm1hdC5tYXRjaCgvW0RNXS8pKSB7CgkJCQlmaW5kTWF4ID0gZnVuY3Rpb24obmFtZXMpIHsKCQkJCQltYXggPSAwOwoJCQkJCW1heEkgPSAwOwoJCQkJCWZvciAoaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewoJCQkJCQlpZiAobmFtZXNbaV0ubGVuZ3RoID4gbWF4KSB7CgkJCQkJCQltYXggPSBuYW1lc1tpXS5sZW5ndGg7CgkJCQkJCQltYXhJID0gaTsKCQkJCQkJfQoJCQkJCX0KCQkJCQlyZXR1cm4gbWF4STsKCQkJCX07CgkJCQlkYXRlLnNldE1vbnRoKGZpbmRNYXgodGhpcy5fZ2V0KGluc3QsIChkYXRlRm9ybWF0Lm1hdGNoKC9NTS8pID8KCQkJCQkibW9udGhOYW1lcyIgOiAibW9udGhOYW1lc1Nob3J0IikpKSk7CgkJCQlkYXRlLnNldERhdGUoZmluZE1heCh0aGlzLl9nZXQoaW5zdCwgKGRhdGVGb3JtYXQubWF0Y2goL0RELykgPwoJCQkJCSJkYXlOYW1lcyIgOiAiZGF5TmFtZXNTaG9ydCIpKSkgKyAyMCAtIGRhdGUuZ2V0RGF5KCkpOwoJCQl9CgkJCWluc3QuaW5wdXQuYXR0cigic2l6ZSIsIHRoaXMuX2Zvcm1hdERhdGUoaW5zdCwgZGF0ZSkubGVuZ3RoKTsKCQl9Cgl9LAoKCS8qIEF0dGFjaCBhbiBpbmxpbmUgZGF0ZSBwaWNrZXIgdG8gYSBkaXYuICovCglfaW5saW5lRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBpbnN0KSB7CgkJdmFyIGRpdlNwYW4gPSAkKHRhcmdldCk7CgkJaWYgKGRpdlNwYW4uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKSB7CgkJCXJldHVybjsKCQl9CgkJZGl2U3Bhbi5hZGRDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuYXBwZW5kKGluc3QuZHBEaXYpOwoJCSQuZGF0YSh0YXJnZXQsICJkYXRlcGlja2VyIiwgaW5zdCk7CgkJdGhpcy5fc2V0RGF0ZShpbnN0LCB0aGlzLl9nZXREZWZhdWx0RGF0ZShpbnN0KSwgdHJ1ZSk7CgkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCQl0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJLy9JZiBkaXNhYmxlZCBvcHRpb24gaXMgdHJ1ZSwgZGlzYWJsZSB0aGUgZGF0ZXBpY2tlciBiZWZvcmUgc2hvd2luZyBpdCAoc2VlIHRpY2tldCAjNTY2NSkKCQlpZiggaW5zdC5zZXR0aW5ncy5kaXNhYmxlZCApIHsKCQkJdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIoIHRhcmdldCApOwoJCX0KCQkvLyBTZXQgZGlzcGxheTpibG9jayBpbiBwbGFjZSBvZiBpbnN0LmRwRGl2LnNob3coKSB3aGljaCB3b24ndCB3b3JrIG9uIGRpc2Nvbm5lY3RlZCBlbGVtZW50cwoJCS8vIGh0dHA6Ly9idWdzLmpxdWVyeXVpLmNvbS90aWNrZXQvNzU1MiAtIEEgRGF0ZXBpY2tlciBjcmVhdGVkIG9uIGEgZGV0YWNoZWQgZGl2IGhhcyB6ZXJvIGhlaWdodAoJCWluc3QuZHBEaXYuY3NzKCAiZGlzcGxheSIsICJibG9jayIgKTsKCX0sCgoJLyogUG9wLXVwIHRoZSBkYXRlIHBpY2tlciBpbiBhICJkaWFsb2ciIGJveC4KCSAqIEBwYXJhbSAgaW5wdXQgZWxlbWVudCAtIGlnbm9yZWQKCSAqIEBwYXJhbSAgZGF0ZQlzdHJpbmcgb3IgRGF0ZSAtIHRoZSBpbml0aWFsIGRhdGUgdG8gZGlzcGxheQoJICogQHBhcmFtICBvblNlbGVjdCAgZnVuY3Rpb24gLSB0aGUgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIGEgZGF0ZSBpcyBzZWxlY3RlZAoJICogQHBhcmFtICBzZXR0aW5ncyAgb2JqZWN0IC0gdXBkYXRlIHRoZSBkaWFsb2cgZGF0ZSBwaWNrZXIgaW5zdGFuY2UncyBzZXR0aW5ncyAoYW5vbnltb3VzIG9iamVjdCkKCSAqIEBwYXJhbSAgcG9zIGludFsyXSAtIGNvb3JkaW5hdGVzIGZvciB0aGUgZGlhbG9nJ3MgcG9zaXRpb24gd2l0aGluIHRoZSBzY3JlZW4gb3IKCSAqCQkJCQlldmVudCAtIHdpdGggeC95IGNvb3JkaW5hdGVzIG9yCgkgKgkJCQkJbGVhdmUgZW1wdHkgZm9yIGRlZmF1bHQgKHNjcmVlbiBjZW50cmUpCgkgKiBAcmV0dXJuIHRoZSBtYW5hZ2VyIG9iamVjdAoJICovCglfZGlhbG9nRGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5wdXQsIGRhdGUsIG9uU2VsZWN0LCBzZXR0aW5ncywgcG9zKSB7CgkJdmFyIGlkLCBicm93c2VyV2lkdGgsIGJyb3dzZXJIZWlnaHQsIHNjcm9sbFgsIHNjcm9sbFksCgkJCWluc3QgPSB0aGlzLl9kaWFsb2dJbnN0OyAvLyBpbnRlcm5hbCBpbnN0YW5jZQoKCQlpZiAoIWluc3QpIHsKCQkJdGhpcy51dWlkICs9IDE7CgkJCWlkID0gImRwIiArIHRoaXMudXVpZDsKCQkJdGhpcy5fZGlhbG9nSW5wdXQgPSAkKCI8aW5wdXQgdHlwZT0ndGV4dCcgaWQ9JyIgKyBpZCArCgkJCQkiJyBzdHlsZT0ncG9zaXRpb246IGFic29sdXRlOyB0b3A6IC0xMDBweDsgd2lkdGg6IDBweDsnLz4iKTsKCQkJdGhpcy5fZGlhbG9nSW5wdXQua2V5ZG93bih0aGlzLl9kb0tleURvd24pOwoJCQkkKCJib2R5IikuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KTsKCQkJaW5zdCA9IHRoaXMuX2RpYWxvZ0luc3QgPSB0aGlzLl9uZXdJbnN0KHRoaXMuX2RpYWxvZ0lucHV0LCBmYWxzZSk7CgkJCWluc3Quc2V0dGluZ3MgPSB7fTsKCQkJJC5kYXRhKHRoaXMuX2RpYWxvZ0lucHV0WzBdLCAiZGF0ZXBpY2tlciIsIGluc3QpOwoJCX0KCQlkYXRlcGlja2VyX2V4dGVuZFJlbW92ZShpbnN0LnNldHRpbmdzLCBzZXR0aW5ncyB8fCB7fSk7CgkJZGF0ZSA9IChkYXRlICYmIGRhdGUuY29uc3RydWN0b3IgPT09IERhdGUgPyB0aGlzLl9mb3JtYXREYXRlKGluc3QsIGRhdGUpIDogZGF0ZSk7CgkJdGhpcy5fZGlhbG9nSW5wdXQudmFsKGRhdGUpOwoKCQl0aGlzLl9wb3MgPSAocG9zID8gKHBvcy5sZW5ndGggPyBwb3MgOiBbcG9zLnBhZ2VYLCBwb3MucGFnZVldKSA6IG51bGwpOwoJCWlmICghdGhpcy5fcG9zKSB7CgkJCWJyb3dzZXJXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDsKCQkJYnJvd3NlckhlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7CgkJCXNjcm9sbFggPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ7CgkJCXNjcm9sbFkgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wOwoJCQl0aGlzLl9wb3MgPSAvLyBzaG91bGQgdXNlIGFjdHVhbCB3aWR0aC9oZWlnaHQgYmVsb3cKCQkJCVsoYnJvd3NlcldpZHRoIC8gMikgLSAxMDAgKyBzY3JvbGxYLCAoYnJvd3NlckhlaWdodCAvIDIpIC0gMTUwICsgc2Nyb2xsWV07CgkJfQoKCQkvLyBtb3ZlIGlucHV0IG9uIHNjcmVlbiBmb3IgZm9jdXMsIGJ1dCBoaWRkZW4gYmVoaW5kIGRpYWxvZwoJCXRoaXMuX2RpYWxvZ0lucHV0LmNzcygibGVmdCIsICh0aGlzLl9wb3NbMF0gKyAyMCkgKyAicHgiKS5jc3MoInRvcCIsIHRoaXMuX3Bvc1sxXSArICJweCIpOwoJCWluc3Quc2V0dGluZ3Mub25TZWxlY3QgPSBvblNlbGVjdDsKCQl0aGlzLl9pbkRpYWxvZyA9IHRydWU7CgkJdGhpcy5kcERpdi5hZGRDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcyk7CgkJdGhpcy5fc2hvd0RhdGVwaWNrZXIodGhpcy5fZGlhbG9nSW5wdXRbMF0pOwoJCWlmICgkLmJsb2NrVUkpIHsKCQkJJC5ibG9ja1VJKHRoaXMuZHBEaXYpOwoJCX0KCQkkLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sICJkYXRlcGlja2VyIiwgaW5zdCk7CgkJcmV0dXJuIHRoaXM7Cgl9LAoKCS8qIERldGFjaCBhIGRhdGVwaWNrZXIgZnJvbSBpdHMgY29udHJvbC4KCSAqIEBwYXJhbSAgdGFyZ2V0CWVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4KCSAqLwoJX2Rlc3Ryb3lEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQpIHsKCQl2YXIgbm9kZU5hbWUsCgkJCSR0YXJnZXQgPSAkKHRhcmdldCksCgkJCWluc3QgPSAkLmRhdGEodGFyZ2V0LCAiZGF0ZXBpY2tlciIpOwoKCQlpZiAoISR0YXJnZXQuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpKSB7CgkJCXJldHVybjsKCQl9CgoJCW5vZGVOYW1lID0gdGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CgkJJC5yZW1vdmVEYXRhKHRhcmdldCwgImRhdGVwaWNrZXIiKTsKCQlpZiAobm9kZU5hbWUgPT09ICJpbnB1dCIpIHsKCQkJaW5zdC5hcHBlbmQucmVtb3ZlKCk7CgkJCWluc3QudHJpZ2dlci5yZW1vdmUoKTsKCQkJJHRhcmdldC5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkuCgkJCQl1bmJpbmQoImZvY3VzIiwgdGhpcy5fc2hvd0RhdGVwaWNrZXIpLgoJCQkJdW5iaW5kKCJrZXlkb3duIiwgdGhpcy5fZG9LZXlEb3duKS4KCQkJCXVuYmluZCgia2V5cHJlc3MiLCB0aGlzLl9kb0tleVByZXNzKS4KCQkJCXVuYmluZCgia2V5dXAiLCB0aGlzLl9kb0tleVVwKTsKCQl9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAiZGl2IiB8fCBub2RlTmFtZSA9PT0gInNwYW4iKSB7CgkJCSR0YXJnZXQucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCk7CgkJfQoJfSwKCgkvKiBFbmFibGUgdGhlIGRhdGUgcGlja2VyIHRvIGEgalF1ZXJ5IHNlbGVjdGlvbi4KCSAqIEBwYXJhbSAgdGFyZ2V0CWVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4KCSAqLwoJX2VuYWJsZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciBub2RlTmFtZSwgaW5saW5lLAoJCQkkdGFyZ2V0ID0gJCh0YXJnZXQpLAoJCQlpbnN0ID0gJC5kYXRhKHRhcmdldCwgImRhdGVwaWNrZXIiKTsKCgkJaWYgKCEkdGFyZ2V0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSkgewoJCQlyZXR1cm47CgkJfQoKCQlub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCWlmIChub2RlTmFtZSA9PT0gImlucHV0IikgewoJCQl0YXJnZXQuZGlzYWJsZWQgPSBmYWxzZTsKCQkJaW5zdC50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuCgkJCQllYWNoKGZ1bmN0aW9uKCkgeyB0aGlzLmRpc2FibGVkID0gZmFsc2U7IH0pLmVuZCgpLgoJCQkJZmlsdGVyKCJpbWciKS5jc3Moe29wYWNpdHk6ICIxLjAiLCBjdXJzb3I6ICIifSk7CgkJfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gImRpdiIgfHwgbm9kZU5hbWUgPT09ICJzcGFuIikgewoJCQlpbmxpbmUgPSAkdGFyZ2V0LmNoaWxkcmVuKCIuIiArIHRoaXMuX2lubGluZUNsYXNzKTsKCQkJaW5saW5lLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIik7CgkJCWlubGluZS5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLgoJCQkJcHJvcCgiZGlzYWJsZWQiLCBmYWxzZSk7CgkJfQoJCXRoaXMuX2Rpc2FibGVkSW5wdXRzID0gJC5tYXAodGhpcy5fZGlzYWJsZWRJbnB1dHMsCgkJCWZ1bmN0aW9uKHZhbHVlKSB7IHJldHVybiAodmFsdWUgPT09IHRhcmdldCA/IG51bGwgOiB2YWx1ZSk7IH0pOyAvLyBkZWxldGUgZW50cnkKCX0sCgoJLyogRGlzYWJsZSB0aGUgZGF0ZSBwaWNrZXIgdG8gYSBqUXVlcnkgc2VsZWN0aW9uLgoJICogQHBhcmFtICB0YXJnZXQJZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICovCglfZGlzYWJsZURhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCkgewoJCXZhciBub2RlTmFtZSwgaW5saW5lLAoJCQkkdGFyZ2V0ID0gJCh0YXJnZXQpLAoJCQlpbnN0ID0gJC5kYXRhKHRhcmdldCwgImRhdGVwaWNrZXIiKTsKCgkJaWYgKCEkdGFyZ2V0Lmhhc0NsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKSkgewoJCQlyZXR1cm47CgkJfQoKCQlub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwoJCWlmIChub2RlTmFtZSA9PT0gImlucHV0IikgewoJCQl0YXJnZXQuZGlzYWJsZWQgPSB0cnVlOwoJCQlpbnN0LnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS4KCQkJCWVhY2goZnVuY3Rpb24oKSB7IHRoaXMuZGlzYWJsZWQgPSB0cnVlOyB9KS5lbmQoKS4KCQkJCWZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiAiMC41IiwgY3Vyc29yOiAiZGVmYXVsdCJ9KTsKCQl9IGVsc2UgaWYgKG5vZGVOYW1lID09PSAiZGl2IiB8fCBub2RlTmFtZSA9PT0gInNwYW4iKSB7CgkJCWlubGluZSA9ICR0YXJnZXQuY2hpbGRyZW4oIi4iICsgdGhpcy5faW5saW5lQ2xhc3MpOwoJCQlpbmxpbmUuY2hpbGRyZW4oKS5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKTsKCQkJaW5saW5lLmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLW1vbnRoLCBzZWxlY3QudWktZGF0ZXBpY2tlci15ZWFyIikuCgkJCQlwcm9wKCJkaXNhYmxlZCIsIHRydWUpOwoJCX0KCQl0aGlzLl9kaXNhYmxlZElucHV0cyA9ICQubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLAoJCQlmdW5jdGlvbih2YWx1ZSkgeyByZXR1cm4gKHZhbHVlID09PSB0YXJnZXQgPyBudWxsIDogdmFsdWUpOyB9KTsgLy8gZGVsZXRlIGVudHJ5CgkJdGhpcy5fZGlzYWJsZWRJbnB1dHNbdGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoXSA9IHRhcmdldDsKCX0sCgoJLyogSXMgdGhlIGZpcnN0IGZpZWxkIGluIGEgalF1ZXJ5IGNvbGxlY3Rpb24gZGlzYWJsZWQgYXMgYSBkYXRlcGlja2VyPwoJICogQHBhcmFtICB0YXJnZXQJZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiBkaXNhYmxlZCwgZmFsc2UgaWYgZW5hYmxlZAoJICovCglfaXNEaXNhYmxlZERhdGVwaWNrZXI6IGZ1bmN0aW9uKHRhcmdldCkgewoJCWlmICghdGFyZ2V0KSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGg7IGkrKykgewoJCQlpZiAodGhpcy5fZGlzYWJsZWRJbnB1dHNbaV0gPT09IHRhcmdldCkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQl9CgkJcmV0dXJuIGZhbHNlOwoJfSwKCgkvKiBSZXRyaWV2ZSB0aGUgaW5zdGFuY2UgZGF0YSBmb3IgdGhlIHRhcmdldCBjb250cm9sLgoJICogQHBhcmFtICB0YXJnZXQgIGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4KCSAqIEByZXR1cm4gIG9iamVjdCAtIHRoZSBhc3NvY2lhdGVkIGluc3RhbmNlIGRhdGEKCSAqIEB0aHJvd3MgIGVycm9yIGlmIGEgalF1ZXJ5IHByb2JsZW0gZ2V0dGluZyBkYXRhCgkgKi8KCV9nZXRJbnN0OiBmdW5jdGlvbih0YXJnZXQpIHsKCQl0cnkgewoJCQlyZXR1cm4gJC5kYXRhKHRhcmdldCwgImRhdGVwaWNrZXIiKTsKCQl9CgkJY2F0Y2ggKGVycikgewoJCQl0aHJvdyAiTWlzc2luZyBpbnN0YW5jZSBkYXRhIGZvciB0aGlzIGRhdGVwaWNrZXIiOwoJCX0KCX0sCgoJLyogVXBkYXRlIG9yIHJldHJpZXZlIHRoZSBzZXR0aW5ncyBmb3IgYSBkYXRlIHBpY2tlciBhdHRhY2hlZCB0byBhbiBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbi4KCSAqIEBwYXJhbSAgdGFyZ2V0ICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKiBAcGFyYW0gIG5hbWUJb2JqZWN0IC0gdGhlIG5ldyBzZXR0aW5ncyB0byB1cGRhdGUgb3IKCSAqCQkJCXN0cmluZyAtIHRoZSBuYW1lIG9mIHRoZSBzZXR0aW5nIHRvIGNoYW5nZSBvciByZXRyaWV2ZSwKCSAqCQkJCXdoZW4gcmV0cmlldmluZyBhbHNvICJhbGwiIGZvciBhbGwgaW5zdGFuY2Ugc2V0dGluZ3Mgb3IKCSAqCQkJCSJkZWZhdWx0cyIgZm9yIGFsbCBnbG9iYWwgZGVmYXVsdHMKCSAqIEBwYXJhbSAgdmFsdWUgICBhbnkgLSB0aGUgbmV3IHZhbHVlIGZvciB0aGUgc2V0dGluZwoJICoJCQkJKG9taXQgaWYgYWJvdmUgaXMgYW4gb2JqZWN0IG9yIHRvIHJldHJpZXZlIGEgdmFsdWUpCgkgKi8KCV9vcHRpb25EYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7CgkJdmFyIHNldHRpbmdzLCBkYXRlLCBtaW5EYXRlLCBtYXhEYXRlLAoJCQlpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpOwoKCQlpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgbmFtZSA9PT0gInN0cmluZyIpIHsKCQkJcmV0dXJuIChuYW1lID09PSAiZGVmYXVsdHMiID8gJC5leHRlbmQoe30sICQuZGF0ZXBpY2tlci5fZGVmYXVsdHMpIDoKCQkJCShpbnN0ID8gKG5hbWUgPT09ICJhbGwiID8gJC5leHRlbmQoe30sIGluc3Quc2V0dGluZ3MpIDoKCQkJCXRoaXMuX2dldChpbnN0LCBuYW1lKSkgOiBudWxsKSk7CgkJfQoKCQlzZXR0aW5ncyA9IG5hbWUgfHwge307CgkJaWYgKHR5cGVvZiBuYW1lID09PSAic3RyaW5nIikgewoJCQlzZXR0aW5ncyA9IHt9OwoJCQlzZXR0aW5nc1tuYW1lXSA9IHZhbHVlOwoJCX0KCgkJaWYgKGluc3QpIHsKCQkJaWYgKHRoaXMuX2N1ckluc3QgPT09IGluc3QpIHsKCQkJCXRoaXMuX2hpZGVEYXRlcGlja2VyKCk7CgkJCX0KCgkJCWRhdGUgPSB0aGlzLl9nZXREYXRlRGF0ZXBpY2tlcih0YXJnZXQsIHRydWUpOwoJCQltaW5EYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAibWluIik7CgkJCW1heERhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICJtYXgiKTsKCQkJZGF0ZXBpY2tlcl9leHRlbmRSZW1vdmUoaW5zdC5zZXR0aW5ncywgc2V0dGluZ3MpOwoJCQkvLyByZWZvcm1hdCB0aGUgb2xkIG1pbkRhdGUvbWF4RGF0ZSB2YWx1ZXMgaWYgZGF0ZUZvcm1hdCBjaGFuZ2VzIGFuZCBhIG5ldyBtaW5EYXRlL21heERhdGUgaXNuJ3QgcHJvdmlkZWQKCQkJaWYgKG1pbkRhdGUgIT09IG51bGwgJiYgc2V0dGluZ3MuZGF0ZUZvcm1hdCAhPT0gdW5kZWZpbmVkICYmIHNldHRpbmdzLm1pbkRhdGUgPT09IHVuZGVmaW5lZCkgewoJCQkJaW5zdC5zZXR0aW5ncy5taW5EYXRlID0gdGhpcy5fZm9ybWF0RGF0ZShpbnN0LCBtaW5EYXRlKTsKCQkJfQoJCQlpZiAobWF4RGF0ZSAhPT0gbnVsbCAmJiBzZXR0aW5ncy5kYXRlRm9ybWF0ICE9PSB1bmRlZmluZWQgJiYgc2V0dGluZ3MubWF4RGF0ZSA9PT0gdW5kZWZpbmVkKSB7CgkJCQlpbnN0LnNldHRpbmdzLm1heERhdGUgPSB0aGlzLl9mb3JtYXREYXRlKGluc3QsIG1heERhdGUpOwoJCQl9CgkJCWlmICggImRpc2FibGVkIiBpbiBzZXR0aW5ncyApIHsKCQkJCWlmICggc2V0dGluZ3MuZGlzYWJsZWQgKSB7CgkJCQkJdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIodGFyZ2V0KTsKCQkJCX0gZWxzZSB7CgkJCQkJdGhpcy5fZW5hYmxlRGF0ZXBpY2tlcih0YXJnZXQpOwoJCQkJfQoJCQl9CgkJCXRoaXMuX2F0dGFjaG1lbnRzKCQodGFyZ2V0KSwgaW5zdCk7CgkJCXRoaXMuX2F1dG9TaXplKGluc3QpOwoJCQl0aGlzLl9zZXREYXRlKGluc3QsIGRhdGUpOwoJCQl0aGlzLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJCXRoaXMuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJfQoJfSwKCgkvLyBjaGFuZ2UgbWV0aG9kIGRlcHJlY2F0ZWQKCV9jaGFuZ2VEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIG5hbWUsIHZhbHVlKSB7CgkJdGhpcy5fb3B0aW9uRGF0ZXBpY2tlcih0YXJnZXQsIG5hbWUsIHZhbHVlKTsKCX0sCgoJLyogUmVkcmF3IHRoZSBkYXRlIHBpY2tlciBhdHRhY2hlZCB0byBhbiBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbi4KCSAqIEBwYXJhbSAgdGFyZ2V0ICBlbGVtZW50IC0gdGhlIHRhcmdldCBpbnB1dCBmaWVsZCBvciBkaXZpc2lvbiBvciBzcGFuCgkgKi8KCV9yZWZyZXNoRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0KSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKGluc3QpIHsKCQkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCQl9Cgl9LAoKCS8qIFNldCB0aGUgZGF0ZXMgZm9yIGEgalF1ZXJ5IHNlbGVjdGlvbi4KCSAqIEBwYXJhbSAgdGFyZ2V0IGVsZW1lbnQgLSB0aGUgdGFyZ2V0IGlucHV0IGZpZWxkIG9yIGRpdmlzaW9uIG9yIHNwYW4KCSAqIEBwYXJhbSAgZGF0ZQlEYXRlIC0gdGhlIG5ldyBkYXRlCgkgKi8KCV9zZXREYXRlRGF0ZXBpY2tlcjogZnVuY3Rpb24odGFyZ2V0LCBkYXRlKSB7CgkJdmFyIGluc3QgPSB0aGlzLl9nZXRJbnN0KHRhcmdldCk7CgkJaWYgKGluc3QpIHsKCQkJdGhpcy5fc2V0RGF0ZShpbnN0LCBkYXRlKTsKCQkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCQkJdGhpcy5fdXBkYXRlQWx0ZXJuYXRlKGluc3QpOwoJCX0KCX0sCgoJLyogR2V0IHRoZSBkYXRlKHMpIGZvciB0aGUgZmlyc3QgZW50cnkgaW4gYSBqUXVlcnkgc2VsZWN0aW9uLgoJICogQHBhcmFtICB0YXJnZXQgZWxlbWVudCAtIHRoZSB0YXJnZXQgaW5wdXQgZmllbGQgb3IgZGl2aXNpb24gb3Igc3BhbgoJICogQHBhcmFtICBub0RlZmF1bHQgYm9vbGVhbiAtIHRydWUgaWYgbm8gZGVmYXVsdCBkYXRlIGlzIHRvIGJlIHVzZWQKCSAqIEByZXR1cm4gRGF0ZSAtIHRoZSBjdXJyZW50IGRhdGUKCSAqLwoJX2dldERhdGVEYXRlcGlja2VyOiBmdW5jdGlvbih0YXJnZXQsIG5vRGVmYXVsdCkgewoJCXZhciBpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXQpOwoJCWlmIChpbnN0ICYmICFpbnN0LmlubGluZSkgewoJCQl0aGlzLl9zZXREYXRlRnJvbUZpZWxkKGluc3QsIG5vRGVmYXVsdCk7CgkJfQoJCXJldHVybiAoaW5zdCA/IHRoaXMuX2dldERhdGUoaW5zdCkgOiBudWxsKTsKCX0sCgoJLyogSGFuZGxlIGtleXN0cm9rZXMuICovCglfZG9LZXlEb3duOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBvblNlbGVjdCwgZGF0ZVN0ciwgc2VsLAoJCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCksCgkJCWhhbmRsZWQgPSB0cnVlLAoJCQlpc1JUTCA9IGluc3QuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpOwoKCQlpbnN0Ll9rZXlFdmVudCA9IHRydWU7CgkJaWYgKCQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpIHsKCQkJc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CgkJCQljYXNlIDk6ICQuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKTsKCQkJCQkJaGFuZGxlZCA9IGZhbHNlOwoJCQkJCQlicmVhazsgLy8gaGlkZSBvbiB0YWIgb3V0CgkJCQljYXNlIDEzOiBzZWwgPSAkKCJ0ZC4iICsgJC5kYXRlcGlja2VyLl9kYXlPdmVyQ2xhc3MgKyAiOm5vdCguIiArCgkJCQkJCQkJCSQuZGF0ZXBpY2tlci5fY3VycmVudENsYXNzICsgIikiLCBpbnN0LmRwRGl2KTsKCQkJCQkJaWYgKHNlbFswXSkgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9zZWxlY3REYXkoZXZlbnQudGFyZ2V0LCBpbnN0LnNlbGVjdGVkTW9udGgsIGluc3Quc2VsZWN0ZWRZZWFyLCBzZWxbMF0pOwoJCQkJCQl9CgoJCQkJCQlvblNlbGVjdCA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJvblNlbGVjdCIpOwoJCQkJCQlpZiAob25TZWxlY3QpIHsKCQkJCQkJCWRhdGVTdHIgPSAkLmRhdGVwaWNrZXIuX2Zvcm1hdERhdGUoaW5zdCk7CgoJCQkJCQkJLy8gdHJpZ2dlciBjdXN0b20gY2FsbGJhY2sKCQkJCQkJCW9uU2VsZWN0LmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLCBbZGF0ZVN0ciwgaW5zdF0pOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCQkJCQl9CgoJCQkJCQlyZXR1cm4gZmFsc2U7IC8vIGRvbid0IHN1Ym1pdCB0aGUgZm9ybQoJCQkJY2FzZSAyNzogJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCQkJCQlicmVhazsgLy8gaGlkZSBvbiBlc2NhcGUKCQkJCWNhc2UgMzM6ICQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChldmVudC5jdHJsS2V5ID8KCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcEJpZ01vbnRocyIpIDoKCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcE1vbnRocyIpKSwgIk0iKTsKCQkJCQkJYnJlYWs7IC8vIHByZXZpb3VzIG1vbnRoL3llYXIgb24gcGFnZSB1cC8rIGN0cmwKCQkJCWNhc2UgMzQ6ICQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChldmVudC5jdHJsS2V5ID8KCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcEJpZ01vbnRocyIpIDoKCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcE1vbnRocyIpKSwgIk0iKTsKCQkJCQkJYnJlYWs7IC8vIG5leHQgbW9udGgveWVhciBvbiBwYWdlIGRvd24vKyBjdHJsCgkJCQljYXNlIDM1OiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZShldmVudC50YXJnZXQpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCWJyZWFrOyAvLyBjbGVhciBvbiBjdHJsIG9yIGNvbW1hbmQgK2VuZAoJCQkJY2FzZSAzNjogaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9nb3RvVG9kYXkoZXZlbnQudGFyZ2V0KTsKCQkJCQkJfQoJCQkJCQloYW5kbGVkID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5OwoJCQkJCQlicmVhazsgLy8gY3VycmVudCBvbiBjdHJsIG9yIGNvbW1hbmQgK2hvbWUKCQkJCWNhc2UgMzc6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKCQkJCQkJCSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChpc1JUTCA/ICsxIDogLTEpLCAiRCIpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCS8vIC0xIGRheSBvbiBjdHJsIG9yIGNvbW1hbmQgK2xlZnQKCQkJCQkJaWYgKGV2ZW50Lm9yaWdpbmFsRXZlbnQuYWx0S2V5KSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCAoZXZlbnQuY3RybEtleSA/CgkJCQkJCQkJLSQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJzdGVwQmlnTW9udGhzIikgOgoJCQkJCQkJCS0kLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcE1vbnRocyIpKSwgIk0iKTsKCQkJCQkJfQoJCQkJCQkvLyBuZXh0IG1vbnRoL3llYXIgb24gYWx0ICtsZWZ0IG9uIE1hYwoJCQkJCQlicmVhazsKCQkJCWNhc2UgMzg6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKCQkJCQkJCSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIC03LCAiRCIpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCWJyZWFrOyAvLyAtMSB3ZWVrIG9uIGN0cmwgb3IgY29tbWFuZCArdXAKCQkJCWNhc2UgMzk6IGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKCQkJCQkJCSQuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShldmVudC50YXJnZXQsIChpc1JUTCA/IC0xIDogKzEpLCAiRCIpOwoJCQkJCQl9CgkJCQkJCWhhbmRsZWQgPSBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXk7CgkJCQkJCS8vICsxIGRheSBvbiBjdHJsIG9yIGNvbW1hbmQgK3JpZ2h0CgkJCQkJCWlmIChldmVudC5vcmlnaW5hbEV2ZW50LmFsdEtleSkgewoJCQkJCQkJJC5kYXRlcGlja2VyLl9hZGp1c3REYXRlKGV2ZW50LnRhcmdldCwgKGV2ZW50LmN0cmxLZXkgPwoJCQkJCQkJCSskLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic3RlcEJpZ01vbnRocyIpIDoKCQkJCQkJCQkrJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgInN0ZXBNb250aHMiKSksICJNIik7CgkJCQkJCX0KCQkJCQkJLy8gbmV4dCBtb250aC95ZWFyIG9uIGFsdCArcmlnaHQKCQkJCQkJYnJlYWs7CgkJCQljYXNlIDQwOiBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7CgkJCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoZXZlbnQudGFyZ2V0LCArNywgIkQiKTsKCQkJCQkJfQoJCQkJCQloYW5kbGVkID0gZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5OwoJCQkJCQlicmVhazsgLy8gKzEgd2VlayBvbiBjdHJsIG9yIGNvbW1hbmQgK2Rvd24KCQkJCWRlZmF1bHQ6IGhhbmRsZWQgPSBmYWxzZTsKCQkJfQoJCX0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMzYgJiYgZXZlbnQuY3RybEtleSkgeyAvLyBkaXNwbGF5IHRoZSBkYXRlIHBpY2tlciBvbiBjdHJsK2hvbWUKCQkJJC5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKTsKCQl9IGVsc2UgewoJCQloYW5kbGVkID0gZmFsc2U7CgkJfQoKCQlpZiAoaGFuZGxlZCkgewoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCQl9Cgl9LAoKCS8qIEZpbHRlciBlbnRlcmVkIGNoYXJhY3RlcnMgLSBiYXNlZCBvbiBkYXRlIGZvcm1hdC4gKi8KCV9kb0tleVByZXNzOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBjaGFycywgY2hyLAoJCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCk7CgoJCWlmICgkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAiY29uc3RyYWluSW5wdXQiKSkgewoJCQljaGFycyA9ICQuZGF0ZXBpY2tlci5fcG9zc2libGVDaGFycygkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAiZGF0ZUZvcm1hdCIpKTsKCQkJY2hyID0gU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5jaGFyQ29kZSA9PSBudWxsID8gZXZlbnQua2V5Q29kZSA6IGV2ZW50LmNoYXJDb2RlKTsKCQkJcmV0dXJuIGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSB8fCAoY2hyIDwgIiAiIHx8ICFjaGFycyB8fCBjaGFycy5pbmRleE9mKGNocikgPiAtMSk7CgkJfQoJfSwKCgkvKiBTeW5jaHJvbmlzZSBtYW51YWwgZW50cnkgYW5kIGZpZWxkL2FsdGVybmF0ZSBmaWVsZC4gKi8KCV9kb0tleVVwOiBmdW5jdGlvbihldmVudCkgewoJCXZhciBkYXRlLAoJCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGV2ZW50LnRhcmdldCk7CgoJCWlmIChpbnN0LmlucHV0LnZhbCgpICE9PSBpbnN0Lmxhc3RWYWwpIHsKCQkJdHJ5IHsKCQkJCWRhdGUgPSAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJkYXRlRm9ybWF0IiksCgkJCQkJKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogbnVsbCksCgkJCQkJJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpOwoKCQkJCWlmIChkYXRlKSB7IC8vIG9ubHkgaWYgdmFsaWQKCQkJCQkkLmRhdGVwaWNrZXIuX3NldERhdGVGcm9tRmllbGQoaW5zdCk7CgkJCQkJJC5kYXRlcGlja2VyLl91cGRhdGVBbHRlcm5hdGUoaW5zdCk7CgkJCQkJJC5kYXRlcGlja2VyLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCQkJfQoJCQl9CgkJCWNhdGNoIChlcnIpIHsKCQkJfQoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJLyogUG9wLXVwIHRoZSBkYXRlIHBpY2tlciBmb3IgYSBnaXZlbiBpbnB1dCBmaWVsZC4KCSAqIElmIGZhbHNlIHJldHVybmVkIGZyb20gYmVmb3JlU2hvdyBldmVudCBoYW5kbGVyIGRvIG5vdCBzaG93LgoJICogQHBhcmFtICBpbnB1dCAgZWxlbWVudCAtIHRoZSBpbnB1dCBmaWVsZCBhdHRhY2hlZCB0byB0aGUgZGF0ZSBwaWNrZXIgb3IKCSAqCQkJCQlldmVudCAtIGlmIHRyaWdnZXJlZCBieSBmb2N1cwoJICovCglfc2hvd0RhdGVwaWNrZXI6IGZ1bmN0aW9uKGlucHV0KSB7CgkJaW5wdXQgPSBpbnB1dC50YXJnZXQgfHwgaW5wdXQ7CgkJaWYgKGlucHV0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICJpbnB1dCIpIHsgLy8gZmluZCBmcm9tIGJ1dHRvbi9pbWFnZSB0cmlnZ2VyCgkJCWlucHV0ID0gJCgiaW5wdXQiLCBpbnB1dC5wYXJlbnROb2RlKVswXTsKCQl9CgoJCWlmICgkLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKGlucHV0KSB8fCAkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCA9PT0gaW5wdXQpIHsgLy8gYWxyZWFkeSBoZXJlCgkJCXJldHVybjsKCQl9CgoJCXZhciBpbnN0LCBiZWZvcmVTaG93LCBiZWZvcmVTaG93U2V0dGluZ3MsIGlzRml4ZWQsCgkJCW9mZnNldCwgc2hvd0FuaW0sIGR1cmF0aW9uOwoKCQlpbnN0ID0gJC5kYXRlcGlja2VyLl9nZXRJbnN0KGlucHV0KTsKCQlpZiAoJC5kYXRlcGlja2VyLl9jdXJJbnN0ICYmICQuZGF0ZXBpY2tlci5fY3VySW5zdCAhPT0gaW5zdCkgewoJCQkkLmRhdGVwaWNrZXIuX2N1ckluc3QuZHBEaXYuc3RvcCh0cnVlLCB0cnVlKTsKCQkJaWYgKCBpbnN0ICYmICQuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcgKSB7CgkJCQkkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCAkLmRhdGVwaWNrZXIuX2N1ckluc3QuaW5wdXRbMF0gKTsKCQkJfQoJCX0KCgkJYmVmb3JlU2hvdyA9ICQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJiZWZvcmVTaG93Iik7CgkJYmVmb3JlU2hvd1NldHRpbmdzID0gYmVmb3JlU2hvdyA/IGJlZm9yZVNob3cuYXBwbHkoaW5wdXQsIFtpbnB1dCwgaW5zdF0pIDoge307CgkJaWYoYmVmb3JlU2hvd1NldHRpbmdzID09PSBmYWxzZSl7CgkJCXJldHVybjsKCQl9CgkJZGF0ZXBpY2tlcl9leHRlbmRSZW1vdmUoaW5zdC5zZXR0aW5ncywgYmVmb3JlU2hvd1NldHRpbmdzKTsKCgkJaW5zdC5sYXN0VmFsID0gbnVsbDsKCQkkLmRhdGVwaWNrZXIuX2xhc3RJbnB1dCA9IGlucHV0OwoJCSQuZGF0ZXBpY2tlci5fc2V0RGF0ZUZyb21GaWVsZChpbnN0KTsKCgkJaWYgKCQuZGF0ZXBpY2tlci5faW5EaWFsb2cpIHsgLy8gaGlkZSBjdXJzb3IKCQkJaW5wdXQudmFsdWUgPSAiIjsKCQl9CgkJaWYgKCEkLmRhdGVwaWNrZXIuX3BvcykgeyAvLyBwb3NpdGlvbiBiZWxvdyBpbnB1dAoJCQkkLmRhdGVwaWNrZXIuX3BvcyA9ICQuZGF0ZXBpY2tlci5fZmluZFBvcyhpbnB1dCk7CgkJCSQuZGF0ZXBpY2tlci5fcG9zWzFdICs9IGlucHV0Lm9mZnNldEhlaWdodDsgLy8gYWRkIHRoZSBoZWlnaHQKCQl9CgoJCWlzRml4ZWQgPSBmYWxzZTsKCQkkKGlucHV0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJaXNGaXhlZCB8PSAkKHRoaXMpLmNzcygicG9zaXRpb24iKSA9PT0gImZpeGVkIjsKCQkJcmV0dXJuICFpc0ZpeGVkOwoJCX0pOwoKCQlvZmZzZXQgPSB7bGVmdDogJC5kYXRlcGlja2VyLl9wb3NbMF0sIHRvcDogJC5kYXRlcGlja2VyLl9wb3NbMV19OwoJCSQuZGF0ZXBpY2tlci5fcG9zID0gbnVsbDsKCQkvL3RvIGF2b2lkIGZsYXNoZXMgb24gRmlyZWZveAoJCWluc3QuZHBEaXYuZW1wdHkoKTsKCQkvLyBkZXRlcm1pbmUgc2l6aW5nIG9mZnNjcmVlbgoJCWluc3QuZHBEaXYuY3NzKHtwb3NpdGlvbjogImFic29sdXRlIiwgZGlzcGxheTogImJsb2NrIiwgdG9wOiAiLTEwMDBweCJ9KTsKCQkkLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaW5zdCk7CgkJLy8gZml4IHdpZHRoIGZvciBkeW5hbWljIG51bWJlciBvZiBkYXRlIHBpY2tlcnMKCQkvLyBhbmQgYWRqdXN0IHBvc2l0aW9uIGJlZm9yZSBzaG93aW5nCgkJb2Zmc2V0ID0gJC5kYXRlcGlja2VyLl9jaGVja09mZnNldChpbnN0LCBvZmZzZXQsIGlzRml4ZWQpOwoJCWluc3QuZHBEaXYuY3NzKHtwb3NpdGlvbjogKCQuZGF0ZXBpY2tlci5faW5EaWFsb2cgJiYgJC5ibG9ja1VJID8KCQkJInN0YXRpYyIgOiAoaXNGaXhlZCA/ICJmaXhlZCIgOiAiYWJzb2x1dGUiKSksIGRpc3BsYXk6ICJub25lIiwKCQkJbGVmdDogb2Zmc2V0LmxlZnQgKyAicHgiLCB0b3A6IG9mZnNldC50b3AgKyAicHgifSk7CgoJCWlmICghaW5zdC5pbmxpbmUpIHsKCQkJc2hvd0FuaW0gPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic2hvd0FuaW0iKTsKCQkJZHVyYXRpb24gPSAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAiZHVyYXRpb24iKTsKCQkJaW5zdC5kcERpdi5jc3MoICJ6LWluZGV4IiwgZGF0ZXBpY2tlcl9nZXRaaW5kZXgoICQoIGlucHV0ICkgKSArIDEgKTsKCQkJJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyA9IHRydWU7CgoJCQlpZiAoICQuZWZmZWN0cyAmJiAkLmVmZmVjdHMuZWZmZWN0WyBzaG93QW5pbSBdICkgewoJCQkJaW5zdC5kcERpdi5zaG93KHNob3dBbmltLCAkLmRhdGVwaWNrZXIuX2dldChpbnN0LCAic2hvd09wdGlvbnMiKSwgZHVyYXRpb24pOwoJCQl9IGVsc2UgewoJCQkJaW5zdC5kcERpdltzaG93QW5pbSB8fCAic2hvdyJdKHNob3dBbmltID8gZHVyYXRpb24gOiBudWxsKTsKCQkJfQoKCQkJaWYgKCAkLmRhdGVwaWNrZXIuX3Nob3VsZEZvY3VzSW5wdXQoIGluc3QgKSApIHsKCQkJCWluc3QuaW5wdXQuZm9jdXMoKTsKCQkJfQoKCQkJJC5kYXRlcGlja2VyLl9jdXJJbnN0ID0gaW5zdDsKCQl9Cgl9LAoKCS8qIEdlbmVyYXRlIHRoZSBkYXRlIHBpY2tlciBjb250ZW50LiAqLwoJX3VwZGF0ZURhdGVwaWNrZXI6IGZ1bmN0aW9uKGluc3QpIHsKCQl0aGlzLm1heFJvd3MgPSA0OyAvL1Jlc2V0IHRoZSBtYXggbnVtYmVyIG9mIHJvd3MgYmVpbmcgZGlzcGxheWVkIChzZWUgIzcwNDMpCgkJZGF0ZXBpY2tlcl9pbnN0QWN0aXZlID0gaW5zdDsgLy8gZm9yIGRlbGVnYXRlIGhvdmVyIGV2ZW50cwoJCWluc3QuZHBEaXYuZW1wdHkoKS5hcHBlbmQodGhpcy5fZ2VuZXJhdGVIVE1MKGluc3QpKTsKCQl0aGlzLl9hdHRhY2hIYW5kbGVycyhpbnN0KTsKCQlpbnN0LmRwRGl2LmZpbmQoIi4iICsgdGhpcy5fZGF5T3ZlckNsYXNzICsgIiBhIik7CgoJCXZhciBvcmlneWVhcnNodG1sLAoJCQludW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0KSwKCQkJY29scyA9IG51bU1vbnRoc1sxXSwKCQkJd2lkdGggPSAxNzsKCgkJaW5zdC5kcERpdi5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1tdWx0aS0yIHVpLWRhdGVwaWNrZXItbXVsdGktMyB1aS1kYXRlcGlja2VyLW11bHRpLTQiKS53aWR0aCgiIik7CgkJaWYgKGNvbHMgPiAxKSB7CgkJCWluc3QuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIiArIGNvbHMpLmNzcygid2lkdGgiLCAod2lkdGggKiBjb2xzKSArICJlbSIpOwoJCX0KCQlpbnN0LmRwRGl2WyhudW1Nb250aHNbMF0gIT09IDEgfHwgbnVtTW9udGhzWzFdICE9PSAxID8gImFkZCIgOiAicmVtb3ZlIikgKwoJCQkiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpOwoJCWluc3QuZHBEaXZbKHRoaXMuX2dldChpbnN0LCAiaXNSVEwiKSA/ICJhZGQiIDogInJlbW92ZSIpICsKCQkJIkNsYXNzIl0oInVpLWRhdGVwaWNrZXItcnRsIik7CgoJCWlmIChpbnN0ID09PSAkLmRhdGVwaWNrZXIuX2N1ckluc3QgJiYgJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyAmJiAkLmRhdGVwaWNrZXIuX3Nob3VsZEZvY3VzSW5wdXQoIGluc3QgKSApIHsKCQkJaW5zdC5pbnB1dC5mb2N1cygpOwoJCX0KCgkJLy8gZGVmZmVyZWQgcmVuZGVyIG9mIHRoZSB5ZWFycyBzZWxlY3QgKHRvIGF2b2lkIGZsYXNoZXMgb24gRmlyZWZveCkKCQlpZiggaW5zdC55ZWFyc2h0bWwgKXsKCQkJb3JpZ3llYXJzaHRtbCA9IGluc3QueWVhcnNodG1sOwoJCQlzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CgkJCQkvL2Fzc3VyZSB0aGF0IGluc3QueWVhcnNodG1sIGRpZG4ndCBjaGFuZ2UuCgkJCQlpZiggb3JpZ3llYXJzaHRtbCA9PT0gaW5zdC55ZWFyc2h0bWwgJiYgaW5zdC55ZWFyc2h0bWwgKXsKCQkJCQlpbnN0LmRwRGl2LmZpbmQoInNlbGVjdC51aS1kYXRlcGlja2VyLXllYXI6Zmlyc3QiKS5yZXBsYWNlV2l0aChpbnN0LnllYXJzaHRtbCk7CgkJCQl9CgkJCQlvcmlneWVhcnNodG1sID0gaW5zdC55ZWFyc2h0bWwgPSBudWxsOwoJCQl9LCAwKTsKCQl9Cgl9LAoKCS8vICM2Njk0IC0gZG9uJ3QgZm9jdXMgdGhlIGlucHV0IGlmIGl0J3MgYWxyZWFkeSBmb2N1c2VkCgkvLyB0aGlzIGJyZWFrcyB0aGUgY2hhbmdlIGV2ZW50IGluIElFCgkvLyBTdXBwb3J0OiBJRSBhbmQgalF1ZXJ5IDwxLjkKCV9zaG91bGRGb2N1c0lucHV0OiBmdW5jdGlvbiggaW5zdCApIHsKCQlyZXR1cm4gaW5zdC5pbnB1dCAmJiBpbnN0LmlucHV0LmlzKCAiOnZpc2libGUiICkgJiYgIWluc3QuaW5wdXQuaXMoICI6ZGlzYWJsZWQiICkgJiYgIWluc3QuaW5wdXQuaXMoICI6Zm9jdXMiICk7Cgl9LAoKCS8qIENoZWNrIHBvc2l0aW9uaW5nIHRvIHJlbWFpbiBvbiBzY3JlZW4uICovCglfY2hlY2tPZmZzZXQ6IGZ1bmN0aW9uKGluc3QsIG9mZnNldCwgaXNGaXhlZCkgewoJCXZhciBkcFdpZHRoID0gaW5zdC5kcERpdi5vdXRlcldpZHRoKCksCgkJCWRwSGVpZ2h0ID0gaW5zdC5kcERpdi5vdXRlckhlaWdodCgpLAoJCQlpbnB1dFdpZHRoID0gaW5zdC5pbnB1dCA/IGluc3QuaW5wdXQub3V0ZXJXaWR0aCgpIDogMCwKCQkJaW5wdXRIZWlnaHQgPSBpbnN0LmlucHV0ID8gaW5zdC5pbnB1dC5vdXRlckhlaWdodCgpIDogMCwKCQkJdmlld1dpZHRoID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoICsgKGlzRml4ZWQgPyAwIDogJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpKSwKCQkJdmlld0hlaWdodCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgKyAoaXNGaXhlZCA/IDAgOiAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSk7CgoJCW9mZnNldC5sZWZ0IC09ICh0aGlzLl9nZXQoaW5zdCwgImlzUlRMIikgPyAoZHBXaWR0aCAtIGlucHV0V2lkdGgpIDogMCk7CgkJb2Zmc2V0LmxlZnQgLT0gKGlzRml4ZWQgJiYgb2Zmc2V0LmxlZnQgPT09IGluc3QuaW5wdXQub2Zmc2V0KCkubGVmdCkgPyAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgOiAwOwoJCW9mZnNldC50b3AgLT0gKGlzRml4ZWQgJiYgb2Zmc2V0LnRvcCA9PT0gKGluc3QuaW5wdXQub2Zmc2V0KCkudG9wICsgaW5wdXRIZWlnaHQpKSA/ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpIDogMDsKCgkJLy8gbm93IGNoZWNrIGlmIGRhdGVwaWNrZXIgaXMgc2hvd2luZyBvdXRzaWRlIHdpbmRvdyB2aWV3cG9ydCAtIG1vdmUgdG8gYSBiZXR0ZXIgcGxhY2UgaWYgc28uCgkJb2Zmc2V0LmxlZnQgLT0gTWF0aC5taW4ob2Zmc2V0LmxlZnQsIChvZmZzZXQubGVmdCArIGRwV2lkdGggPiB2aWV3V2lkdGggJiYgdmlld1dpZHRoID4gZHBXaWR0aCkgPwoJCQlNYXRoLmFicyhvZmZzZXQubGVmdCArIGRwV2lkdGggLSB2aWV3V2lkdGgpIDogMCk7CgkJb2Zmc2V0LnRvcCAtPSBNYXRoLm1pbihvZmZzZXQudG9wLCAob2Zmc2V0LnRvcCArIGRwSGVpZ2h0ID4gdmlld0hlaWdodCAmJiB2aWV3SGVpZ2h0ID4gZHBIZWlnaHQpID8KCQkJTWF0aC5hYnMoZHBIZWlnaHQgKyBpbnB1dEhlaWdodCkgOiAwKTsKCgkJcmV0dXJuIG9mZnNldDsKCX0sCgoJLyogRmluZCBhbiBvYmplY3QncyBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuLiAqLwoJX2ZpbmRQb3M6IGZ1bmN0aW9uKG9iaikgewoJCXZhciBwb3NpdGlvbiwKCQkJaW5zdCA9IHRoaXMuX2dldEluc3Qob2JqKSwKCQkJaXNSVEwgPSB0aGlzLl9nZXQoaW5zdCwgImlzUlRMIik7CgoJCXdoaWxlIChvYmogJiYgKG9iai50eXBlID09PSAiaGlkZGVuIiB8fCBvYmoubm9kZVR5cGUgIT09IDEgfHwgJC5leHByLmZpbHRlcnMuaGlkZGVuKG9iaikpKSB7CgkJCW9iaiA9IG9ialtpc1JUTCA/ICJwcmV2aW91c1NpYmxpbmciIDogIm5leHRTaWJsaW5nIl07CgkJfQoKCQlwb3NpdGlvbiA9ICQob2JqKS5vZmZzZXQoKTsKCQlyZXR1cm4gW3Bvc2l0aW9uLmxlZnQsIHBvc2l0aW9uLnRvcF07Cgl9LAoKCS8qIEhpZGUgdGhlIGRhdGUgcGlja2VyIGZyb20gdmlldy4KCSAqIEBwYXJhbSAgaW5wdXQgIGVsZW1lbnQgLSB0aGUgaW5wdXQgZmllbGQgYXR0YWNoZWQgdG8gdGhlIGRhdGUgcGlja2VyCgkgKi8KCV9oaWRlRGF0ZXBpY2tlcjogZnVuY3Rpb24oaW5wdXQpIHsKCQl2YXIgc2hvd0FuaW0sIGR1cmF0aW9uLCBwb3N0UHJvY2Vzcywgb25DbG9zZSwKCQkJaW5zdCA9IHRoaXMuX2N1ckluc3Q7CgoJCWlmICghaW5zdCB8fCAoaW5wdXQgJiYgaW5zdCAhPT0gJC5kYXRhKGlucHV0LCAiZGF0ZXBpY2tlciIpKSkgewoJCQlyZXR1cm47CgkJfQoKCQlpZiAodGhpcy5fZGF0ZXBpY2tlclNob3dpbmcpIHsKCQkJc2hvd0FuaW0gPSB0aGlzLl9nZXQoaW5zdCwgInNob3dBbmltIik7CgkJCWR1cmF0aW9uID0gdGhpcy5fZ2V0KGluc3QsICJkdXJhdGlvbiIpOwoJCQlwb3N0UHJvY2VzcyA9IGZ1bmN0aW9uKCkgewoJCQkJJC5kYXRlcGlja2VyLl90aWR5RGlhbG9nKGluc3QpOwoJCQl9OwoKCQkJLy8gREVQUkVDQVRFRDogYWZ0ZXIgQkMgZm9yIDEuOC54ICQuZWZmZWN0c1sgc2hvd0FuaW0gXSBpcyBub3QgbmVlZGVkCgkJCWlmICggJC5lZmZlY3RzICYmICggJC5lZmZlY3RzLmVmZmVjdFsgc2hvd0FuaW0gXSB8fCAkLmVmZmVjdHNbIHNob3dBbmltIF0gKSApIHsKCQkJCWluc3QuZHBEaXYuaGlkZShzaG93QW5pbSwgJC5kYXRlcGlja2VyLl9nZXQoaW5zdCwgInNob3dPcHRpb25zIiksIGR1cmF0aW9uLCBwb3N0UHJvY2Vzcyk7CgkJCX0gZWxzZSB7CgkJCQlpbnN0LmRwRGl2WyhzaG93QW5pbSA9PT0gInNsaWRlRG93biIgPyAic2xpZGVVcCIgOgoJCQkJCShzaG93QW5pbSA9PT0gImZhZGVJbiIgPyAiZmFkZU91dCIgOiAiaGlkZSIpKV0oKHNob3dBbmltID8gZHVyYXRpb24gOiBudWxsKSwgcG9zdFByb2Nlc3MpOwoJCQl9CgoJCQlpZiAoIXNob3dBbmltKSB7CgkJCQlwb3N0UHJvY2VzcygpOwoJCQl9CgkJCXRoaXMuX2RhdGVwaWNrZXJTaG93aW5nID0gZmFsc2U7CgoJCQlvbkNsb3NlID0gdGhpcy5fZ2V0KGluc3QsICJvbkNsb3NlIik7CgkJCWlmIChvbkNsb3NlKSB7CgkJCQlvbkNsb3NlLmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLCBbKGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogIiIpLCBpbnN0XSk7CgkJCX0KCgkJCXRoaXMuX2xhc3RJbnB1dCA9IG51bGw7CgkJCWlmICh0aGlzLl9pbkRpYWxvZykgewoJCQkJdGhpcy5fZGlhbG9nSW5wdXQuY3NzKHsgcG9zaXRpb246ICJhYnNvbHV0ZSIsIGxlZnQ6ICIwIiwgdG9wOiAiLTEwMHB4IiB9KTsKCQkJCWlmICgkLmJsb2NrVUkpIHsKCQkJCQkkLnVuYmxvY2tVSSgpOwoJCQkJCSQoImJvZHkiKS5hcHBlbmQodGhpcy5kcERpdik7CgkJCQl9CgkJCX0KCQkJdGhpcy5faW5EaWFsb2cgPSBmYWxzZTsKCQl9Cgl9LAoKCS8qIFRpZHkgdXAgYWZ0ZXIgYSBkaWFsb2cgZGlzcGxheS4gKi8KCV90aWR5RGlhbG9nOiBmdW5jdGlvbihpbnN0KSB7CgkJaW5zdC5kcERpdi5yZW1vdmVDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcykudW5iaW5kKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpOwoJfSwKCgkvKiBDbG9zZSBkYXRlIHBpY2tlciBpZiBjbGlja2VkIGVsc2V3aGVyZS4gKi8KCV9jaGVja0V4dGVybmFsQ2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CgkJaWYgKCEkLmRhdGVwaWNrZXIuX2N1ckluc3QpIHsKCQkJcmV0dXJuOwoJCX0KCgkJdmFyICR0YXJnZXQgPSAkKGV2ZW50LnRhcmdldCksCgkJCWluc3QgPSAkLmRhdGVwaWNrZXIuX2dldEluc3QoJHRhcmdldFswXSk7CgoJCWlmICggKCAoICR0YXJnZXRbMF0uaWQgIT09ICQuZGF0ZXBpY2tlci5fbWFpbkRpdklkICYmCgkJCQkkdGFyZ2V0LnBhcmVudHMoIiMiICsgJC5kYXRlcGlja2VyLl9tYWluRGl2SWQpLmxlbmd0aCA9PT0gMCAmJgoJCQkJISR0YXJnZXQuaGFzQ2xhc3MoJC5kYXRlcGlja2VyLm1hcmtlckNsYXNzTmFtZSkgJiYKCQkJCSEkdGFyZ2V0LmNsb3Nlc3QoIi4iICsgJC5kYXRlcGlja2VyLl90cmlnZ2VyQ2xhc3MpLmxlbmd0aCAmJgoJCQkJJC5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyAmJiAhKCQuZGF0ZXBpY2tlci5faW5EaWFsb2cgJiYgJC5ibG9ja1VJKSApICkgfHwKCQkJKCAkdGFyZ2V0Lmhhc0NsYXNzKCQuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpICYmICQuZGF0ZXBpY2tlci5fY3VySW5zdCAhPT0gaW5zdCApICkgewoJCQkJJC5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpOwoJCX0KCX0sCgoJLyogQWRqdXN0IG9uZSBvZiB0aGUgZGF0ZSBzdWItZmllbGRzLiAqLwoJX2FkanVzdERhdGU6IGZ1bmN0aW9uKGlkLCBvZmZzZXQsIHBlcmlvZCkgewoJCXZhciB0YXJnZXQgPSAkKGlkKSwKCQkJaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCgkJaWYgKHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHRhcmdldFswXSkpIHsKCQkJcmV0dXJuOwoJCX0KCQl0aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0LCBvZmZzZXQgKwoJCQkocGVyaW9kID09PSAiTSIgPyB0aGlzLl9nZXQoaW5zdCwgInNob3dDdXJyZW50QXRQb3MiKSA6IDApLCAvLyB1bmRvIHBvc2l0aW9uaW5nCgkJCXBlcmlvZCk7CgkJdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpbnN0KTsKCX0sCgoJLyogQWN0aW9uIGZvciBjdXJyZW50IGxpbmsuICovCglfZ290b1RvZGF5OiBmdW5jdGlvbihpZCkgewoJCXZhciBkYXRlLAoJCQl0YXJnZXQgPSAkKGlkKSwKCQkJaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCgkJaWYgKHRoaXMuX2dldChpbnN0LCAiZ290b0N1cnJlbnQiKSAmJiBpbnN0LmN1cnJlbnREYXkpIHsKCQkJaW5zdC5zZWxlY3RlZERheSA9IGluc3QuY3VycmVudERheTsKCQkJaW5zdC5kcmF3TW9udGggPSBpbnN0LnNlbGVjdGVkTW9udGggPSBpbnN0LmN1cnJlbnRNb250aDsKCQkJaW5zdC5kcmF3WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyID0gaW5zdC5jdXJyZW50WWVhcjsKCQl9IGVsc2UgewoJCQlkYXRlID0gbmV3IERhdGUoKTsKCQkJaW5zdC5zZWxlY3RlZERheSA9IGRhdGUuZ2V0RGF0ZSgpOwoJCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKCQkJaW5zdC5kcmF3WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwoJCX0KCQl0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7CgkJdGhpcy5fYWRqdXN0RGF0ZSh0YXJnZXQpOwoJfSwKCgkvKiBBY3Rpb24gZm9yIHNlbGVjdGluZyBhIG5ldyBtb250aC95ZWFyLiAqLwoJX3NlbGVjdE1vbnRoWWVhcjogZnVuY3Rpb24oaWQsIHNlbGVjdCwgcGVyaW9kKSB7CgkJdmFyIHRhcmdldCA9ICQoaWQpLAoJCQlpbnN0ID0gdGhpcy5fZ2V0SW5zdCh0YXJnZXRbMF0pOwoKCQlpbnN0WyJzZWxlY3RlZCIgKyAocGVyaW9kID09PSAiTSIgPyAiTW9udGgiIDogIlllYXIiKV0gPQoJCWluc3RbImRyYXciICsgKHBlcmlvZCA9PT0gIk0iID8gIk1vbnRoIiA6ICJZZWFyIildID0KCQkJcGFyc2VJbnQoc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnZhbHVlLDEwKTsKCgkJdGhpcy5fbm90aWZ5Q2hhbmdlKGluc3QpOwoJCXRoaXMuX2FkanVzdERhdGUodGFyZ2V0KTsKCX0sCgoJLyogQWN0aW9uIGZvciBzZWxlY3RpbmcgYSBkYXkuICovCglfc2VsZWN0RGF5OiBmdW5jdGlvbihpZCwgbW9udGgsIHllYXIsIHRkKSB7CgkJdmFyIGluc3QsCgkJCXRhcmdldCA9ICQoaWQpOwoKCQlpZiAoJCh0ZCkuaGFzQ2xhc3ModGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MpIHx8IHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKHRhcmdldFswXSkpIHsKCQkJcmV0dXJuOwoJCX0KCgkJaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCQlpbnN0LnNlbGVjdGVkRGF5ID0gaW5zdC5jdXJyZW50RGF5ID0gJCgiYSIsIHRkKS5odG1sKCk7CgkJaW5zdC5zZWxlY3RlZE1vbnRoID0gaW5zdC5jdXJyZW50TW9udGggPSBtb250aDsKCQlpbnN0LnNlbGVjdGVkWWVhciA9IGluc3QuY3VycmVudFllYXIgPSB5ZWFyOwoJCXRoaXMuX3NlbGVjdERhdGUoaWQsIHRoaXMuX2Zvcm1hdERhdGUoaW5zdCwKCQkJaW5zdC5jdXJyZW50RGF5LCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50WWVhcikpOwoJfSwKCgkvKiBFcmFzZSB0aGUgaW5wdXQgZmllbGQgYW5kIGhpZGUgdGhlIGRhdGUgcGlja2VyLiAqLwoJX2NsZWFyRGF0ZTogZnVuY3Rpb24oaWQpIHsKCQl2YXIgdGFyZ2V0ID0gJChpZCk7CgkJdGhpcy5fc2VsZWN0RGF0ZSh0YXJnZXQsICIiKTsKCX0sCgoJLyogVXBkYXRlIHRoZSBpbnB1dCBmaWVsZCB3aXRoIHRoZSBzZWxlY3RlZCBkYXRlLiAqLwoJX3NlbGVjdERhdGU6IGZ1bmN0aW9uKGlkLCBkYXRlU3RyKSB7CgkJdmFyIG9uU2VsZWN0LAoJCQl0YXJnZXQgPSAkKGlkKSwKCQkJaW5zdCA9IHRoaXMuX2dldEluc3QodGFyZ2V0WzBdKTsKCgkJZGF0ZVN0ciA9IChkYXRlU3RyICE9IG51bGwgPyBkYXRlU3RyIDogdGhpcy5fZm9ybWF0RGF0ZShpbnN0KSk7CgkJaWYgKGluc3QuaW5wdXQpIHsKCQkJaW5zdC5pbnB1dC52YWwoZGF0ZVN0cik7CgkJfQoJCXRoaXMuX3VwZGF0ZUFsdGVybmF0ZShpbnN0KTsKCgkJb25TZWxlY3QgPSB0aGlzLl9nZXQoaW5zdCwgIm9uU2VsZWN0Iik7CgkJaWYgKG9uU2VsZWN0KSB7CgkJCW9uU2VsZWN0LmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLCBbZGF0ZVN0ciwgaW5zdF0pOyAgLy8gdHJpZ2dlciBjdXN0b20gY2FsbGJhY2sKCQl9IGVsc2UgaWYgKGluc3QuaW5wdXQpIHsKCQkJaW5zdC5pbnB1dC50cmlnZ2VyKCJjaGFuZ2UiKTsgLy8gZmlyZSB0aGUgY2hhbmdlIGV2ZW50CgkJfQoKCQlpZiAoaW5zdC5pbmxpbmUpewoJCQl0aGlzLl91cGRhdGVEYXRlcGlja2VyKGluc3QpOwoJCX0gZWxzZSB7CgkJCXRoaXMuX2hpZGVEYXRlcGlja2VyKCk7CgkJCXRoaXMuX2xhc3RJbnB1dCA9IGluc3QuaW5wdXRbMF07CgkJCWlmICh0eXBlb2YoaW5zdC5pbnB1dFswXSkgIT09ICJvYmplY3QiKSB7CgkJCQlpbnN0LmlucHV0LmZvY3VzKCk7IC8vIHJlc3RvcmUgZm9jdXMKCQkJfQoJCQl0aGlzLl9sYXN0SW5wdXQgPSBudWxsOwoJCX0KCX0sCgoJLyogVXBkYXRlIGFueSBhbHRlcm5hdGUgZmllbGQgdG8gc3luY2hyb25pc2Ugd2l0aCB0aGUgbWFpbiBmaWVsZC4gKi8KCV91cGRhdGVBbHRlcm5hdGU6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgYWx0Rm9ybWF0LCBkYXRlLCBkYXRlU3RyLAoJCQlhbHRGaWVsZCA9IHRoaXMuX2dldChpbnN0LCAiYWx0RmllbGQiKTsKCgkJaWYgKGFsdEZpZWxkKSB7IC8vIHVwZGF0ZSBhbHRlcm5hdGUgZmllbGQgdG9vCgkJCWFsdEZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAiYWx0Rm9ybWF0IikgfHwgdGhpcy5fZ2V0KGluc3QsICJkYXRlRm9ybWF0Iik7CgkJCWRhdGUgPSB0aGlzLl9nZXREYXRlKGluc3QpOwoJCQlkYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGFsdEZvcm1hdCwgZGF0ZSwgdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGluc3QpKTsKCQkJJChhbHRGaWVsZCkuZWFjaChmdW5jdGlvbigpIHsgJCh0aGlzKS52YWwoZGF0ZVN0cik7IH0pOwoJCX0KCX0sCgoJLyogU2V0IGFzIGJlZm9yZVNob3dEYXkgZnVuY3Rpb24gdG8gcHJldmVudCBzZWxlY3Rpb24gb2Ygd2Vla2VuZHMuCgkgKiBAcGFyYW0gIGRhdGUgIERhdGUgLSB0aGUgZGF0ZSB0byBjdXN0b21pc2UKCSAqIEByZXR1cm4gW2Jvb2xlYW4sIHN0cmluZ10gLSBpcyB0aGlzIGRhdGUgc2VsZWN0YWJsZT8sIHdoYXQgaXMgaXRzIENTUyBjbGFzcz8KCSAqLwoJbm9XZWVrZW5kczogZnVuY3Rpb24oZGF0ZSkgewoJCXZhciBkYXkgPSBkYXRlLmdldERheSgpOwoJCXJldHVybiBbKGRheSA+IDAgJiYgZGF5IDwgNiksICIiXTsKCX0sCgoJLyogU2V0IGFzIGNhbGN1bGF0ZVdlZWsgdG8gZGV0ZXJtaW5lIHRoZSB3ZWVrIG9mIHRoZSB5ZWFyIGJhc2VkIG9uIHRoZSBJU08gODYwMSBkZWZpbml0aW9uLgoJICogQHBhcmFtICBkYXRlICBEYXRlIC0gdGhlIGRhdGUgdG8gZ2V0IHRoZSB3ZWVrIGZvcgoJICogQHJldHVybiAgbnVtYmVyIC0gdGhlIG51bWJlciBvZiB0aGUgd2VlayB3aXRoaW4gdGhlIHllYXIgdGhhdCBjb250YWlucyB0aGlzIGRhdGUKCSAqLwoJaXNvODYwMVdlZWs6IGZ1bmN0aW9uKGRhdGUpIHsKCQl2YXIgdGltZSwKCQkJY2hlY2tEYXRlID0gbmV3IERhdGUoZGF0ZS5nZXRUaW1lKCkpOwoKCQkvLyBGaW5kIFRodXJzZGF5IG9mIHRoaXMgd2VlayBzdGFydGluZyBvbiBNb25kYXkKCQljaGVja0RhdGUuc2V0RGF0ZShjaGVja0RhdGUuZ2V0RGF0ZSgpICsgNCAtIChjaGVja0RhdGUuZ2V0RGF5KCkgfHwgNykpOwoKCQl0aW1lID0gY2hlY2tEYXRlLmdldFRpbWUoKTsKCQljaGVja0RhdGUuc2V0TW9udGgoMCk7IC8vIENvbXBhcmUgd2l0aCBKYW4gMQoJCWNoZWNrRGF0ZS5zZXREYXRlKDEpOwoJCXJldHVybiBNYXRoLmZsb29yKE1hdGgucm91bmQoKHRpbWUgLSBjaGVja0RhdGUpIC8gODY0MDAwMDApIC8gNykgKyAxOwoJfSwKCgkvKiBQYXJzZSBhIHN0cmluZyB2YWx1ZSBpbnRvIGEgZGF0ZSBvYmplY3QuCgkgKiBTZWUgZm9ybWF0RGF0ZSBiZWxvdyBmb3IgdGhlIHBvc3NpYmxlIGZvcm1hdHMuCgkgKgoJICogQHBhcmFtICBmb3JtYXQgc3RyaW5nIC0gdGhlIGV4cGVjdGVkIGZvcm1hdCBvZiB0aGUgZGF0ZQoJICogQHBhcmFtICB2YWx1ZSBzdHJpbmcgLSB0aGUgZGF0ZSBpbiB0aGUgYWJvdmUgZm9ybWF0CgkgKiBAcGFyYW0gIHNldHRpbmdzIE9iamVjdCAtIGF0dHJpYnV0ZXMgaW5jbHVkZToKCSAqCQkJCQlzaG9ydFllYXJDdXRvZmYgIG51bWJlciAtIHRoZSBjdXRvZmYgeWVhciBmb3IgZGV0ZXJtaW5pbmcgdGhlIGNlbnR1cnkgKG9wdGlvbmFsKQoJICoJCQkJCWRheU5hbWVzU2hvcnQJc3RyaW5nWzddIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIGRheXMgZnJvbSBTdW5kYXkgKG9wdGlvbmFsKQoJICoJCQkJCWRheU5hbWVzCQlzdHJpbmdbN10gLSBuYW1lcyBvZiB0aGUgZGF5cyBmcm9tIFN1bmRheSAob3B0aW9uYWwpCgkgKgkJCQkJbW9udGhOYW1lc1Nob3J0IHN0cmluZ1sxMl0gLSBhYmJyZXZpYXRlZCBuYW1lcyBvZiB0aGUgbW9udGhzIChvcHRpb25hbCkKCSAqCQkJCQltb250aE5hbWVzCQlzdHJpbmdbMTJdIC0gbmFtZXMgb2YgdGhlIG1vbnRocyAob3B0aW9uYWwpCgkgKiBAcmV0dXJuICBEYXRlIC0gdGhlIGV4dHJhY3RlZCBkYXRlIHZhbHVlIG9yIG51bGwgaWYgdmFsdWUgaXMgYmxhbmsKCSAqLwoJcGFyc2VEYXRlOiBmdW5jdGlvbiAoZm9ybWF0LCB2YWx1ZSwgc2V0dGluZ3MpIHsKCQlpZiAoZm9ybWF0ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewoJCQl0aHJvdyAiSW52YWxpZCBhcmd1bWVudHMiOwoJCX0KCgkJdmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAib2JqZWN0IiA/IHZhbHVlLnRvU3RyaW5nKCkgOiB2YWx1ZSArICIiKTsKCQlpZiAodmFsdWUgPT09ICIiKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCgkJdmFyIGlGb3JtYXQsIGRpbSwgZXh0cmEsCgkJCWlWYWx1ZSA9IDAsCgkJCXNob3J0WWVhckN1dG9mZlRlbXAgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5zaG9ydFllYXJDdXRvZmYgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5zaG9ydFllYXJDdXRvZmYsCgkJCXNob3J0WWVhckN1dG9mZiA9ICh0eXBlb2Ygc2hvcnRZZWFyQ3V0b2ZmVGVtcCAhPT0gInN0cmluZyIgPyBzaG9ydFllYXJDdXRvZmZUZW1wIDoKCQkJCW5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCArIHBhcnNlSW50KHNob3J0WWVhckN1dG9mZlRlbXAsIDEwKSksCgkJCWRheU5hbWVzU2hvcnQgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXlOYW1lc1Nob3J0IDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCwKCQkJZGF5TmFtZXMgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5kYXlOYW1lcyA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLAoJCQltb250aE5hbWVzU2hvcnQgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5tb250aE5hbWVzU2hvcnQgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzU2hvcnQsCgkJCW1vbnRoTmFtZXMgPSAoc2V0dGluZ3MgPyBzZXR0aW5ncy5tb250aE5hbWVzIDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcywKCQkJeWVhciA9IC0xLAoJCQltb250aCA9IC0xLAoJCQlkYXkgPSAtMSwKCQkJZG95ID0gLTEsCgkJCWxpdGVyYWwgPSBmYWxzZSwKCQkJZGF0ZSwKCQkJLy8gQ2hlY2sgd2hldGhlciBhIGZvcm1hdCBjaGFyYWN0ZXIgaXMgZG91YmxlZAoJCQlsb29rQWhlYWQgPSBmdW5jdGlvbihtYXRjaCkgewoJCQkJdmFyIG1hdGNoZXMgPSAoaUZvcm1hdCArIDEgPCBmb3JtYXQubGVuZ3RoICYmIGZvcm1hdC5jaGFyQXQoaUZvcm1hdCArIDEpID09PSBtYXRjaCk7CgkJCQlpZiAobWF0Y2hlcykgewoJCQkJCWlGb3JtYXQrKzsKCQkJCX0KCQkJCXJldHVybiBtYXRjaGVzOwoJCQl9LAoJCQkvLyBFeHRyYWN0IGEgbnVtYmVyIGZyb20gdGhlIHN0cmluZyB2YWx1ZQoJCQlnZXROdW1iZXIgPSBmdW5jdGlvbihtYXRjaCkgewoJCQkJdmFyIGlzRG91YmxlZCA9IGxvb2tBaGVhZChtYXRjaCksCgkJCQkJc2l6ZSA9IChtYXRjaCA9PT0gIkAiID8gMTQgOiAobWF0Y2ggPT09ICIhIiA/IDIwIDoKCQkJCQkobWF0Y2ggPT09ICJ5IiAmJiBpc0RvdWJsZWQgPyA0IDogKG1hdGNoID09PSAibyIgPyAzIDogMikpKSksCgkJCQkJZGlnaXRzID0gbmV3IFJlZ0V4cCgiXlxcZHsxLCIgKyBzaXplICsgIn0iKSwKCQkJCQludW0gPSB2YWx1ZS5zdWJzdHJpbmcoaVZhbHVlKS5tYXRjaChkaWdpdHMpOwoJCQkJaWYgKCFudW0pIHsKCQkJCQl0aHJvdyAiTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gIiArIGlWYWx1ZTsKCQkJCX0KCQkJCWlWYWx1ZSArPSBudW1bMF0ubGVuZ3RoOwoJCQkJcmV0dXJuIHBhcnNlSW50KG51bVswXSwgMTApOwoJCQl9LAoJCQkvLyBFeHRyYWN0IGEgbmFtZSBmcm9tIHRoZSBzdHJpbmcgdmFsdWUgYW5kIGNvbnZlcnQgdG8gYW4gaW5kZXgKCQkJZ2V0TmFtZSA9IGZ1bmN0aW9uKG1hdGNoLCBzaG9ydE5hbWVzLCBsb25nTmFtZXMpIHsKCQkJCXZhciBpbmRleCA9IC0xLAoJCQkJCW5hbWVzID0gJC5tYXAobG9va0FoZWFkKG1hdGNoKSA/IGxvbmdOYW1lcyA6IHNob3J0TmFtZXMsIGZ1bmN0aW9uICh2LCBrKSB7CgkJCQkJCXJldHVybiBbIFtrLCB2XSBdOwoJCQkJCX0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKCQkJCQkJcmV0dXJuIC0oYVsxXS5sZW5ndGggLSBiWzFdLmxlbmd0aCk7CgkJCQkJfSk7CgoJCQkJJC5lYWNoKG5hbWVzLCBmdW5jdGlvbiAoaSwgcGFpcikgewoJCQkJCXZhciBuYW1lID0gcGFpclsxXTsKCQkJCQlpZiAodmFsdWUuc3Vic3RyKGlWYWx1ZSwgbmFtZS5sZW5ndGgpLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKSkgewoJCQkJCQlpbmRleCA9IHBhaXJbMF07CgkJCQkJCWlWYWx1ZSArPSBuYW1lLmxlbmd0aDsKCQkJCQkJcmV0dXJuIGZhbHNlOwoJCQkJCX0KCQkJCX0pOwoJCQkJaWYgKGluZGV4ICE9PSAtMSkgewoJCQkJCXJldHVybiBpbmRleCArIDE7CgkJCQl9IGVsc2UgewoJCQkJCXRocm93ICJVbmtub3duIG5hbWUgYXQgcG9zaXRpb24gIiArIGlWYWx1ZTsKCQkJCX0KCQkJfSwKCQkJLy8gQ29uZmlybSB0aGF0IGEgbGl0ZXJhbCBjaGFyYWN0ZXIgbWF0Y2hlcyB0aGUgc3RyaW5nIHZhbHVlCgkJCWNoZWNrTGl0ZXJhbCA9IGZ1bmN0aW9uKCkgewoJCQkJaWYgKHZhbHVlLmNoYXJBdChpVmFsdWUpICE9PSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpKSB7CgkJCQkJdGhyb3cgIlVuZXhwZWN0ZWQgbGl0ZXJhbCBhdCBwb3NpdGlvbiAiICsgaVZhbHVlOwoJCQkJfQoJCQkJaVZhbHVlKys7CgkJCX07CgoJCWZvciAoaUZvcm1hdCA9IDA7IGlGb3JtYXQgPCBmb3JtYXQubGVuZ3RoOyBpRm9ybWF0KyspIHsKCQkJaWYgKGxpdGVyYWwpIHsKCQkJCWlmIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpID09PSAiJyIgJiYgIWxvb2tBaGVhZCgiJyIpKSB7CgkJCQkJbGl0ZXJhbCA9IGZhbHNlOwoJCQkJfSBlbHNlIHsKCQkJCQljaGVja0xpdGVyYWwoKTsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCXN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkgewoJCQkJCWNhc2UgImQiOgoJCQkJCQlkYXkgPSBnZXROdW1iZXIoImQiKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiRCI6CgkJCQkJCWdldE5hbWUoIkQiLCBkYXlOYW1lc1Nob3J0LCBkYXlOYW1lcyk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIm8iOgoJCQkJCQlkb3kgPSBnZXROdW1iZXIoIm8iKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAibSI6CgkJCQkJCW1vbnRoID0gZ2V0TnVtYmVyKCJtIik7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIk0iOgoJCQkJCQltb250aCA9IGdldE5hbWUoIk0iLCBtb250aE5hbWVzU2hvcnQsIG1vbnRoTmFtZXMpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICJ5IjoKCQkJCQkJeWVhciA9IGdldE51bWJlcigieSIpOwoJCQkJCQlicmVhazsKCQkJCQljYXNlICJAIjoKCQkJCQkJZGF0ZSA9IG5ldyBEYXRlKGdldE51bWJlcigiQCIpKTsKCQkJCQkJeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTsKCQkJCQkJbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxOwoJCQkJCQlkYXkgPSBkYXRlLmdldERhdGUoKTsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiISI6CgkJCQkJCWRhdGUgPSBuZXcgRGF0ZSgoZ2V0TnVtYmVyKCIhIikgLSB0aGlzLl90aWNrc1RvMTk3MCkgLyAxMDAwMCk7CgkJCQkJCXllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJCQkJCW1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTsKCQkJCQkJZGF5ID0gZGF0ZS5nZXREYXRlKCk7CgkJCQkJCWJyZWFrOwoJCQkJCWNhc2UgIiciOgoJCQkJCQlpZiAobG9va0FoZWFkKCInIikpewoJCQkJCQkJY2hlY2tMaXRlcmFsKCk7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQlsaXRlcmFsID0gdHJ1ZTsKCQkJCQkJfQoJCQkJCQlicmVhazsKCQkJCQlkZWZhdWx0OgoJCQkJCQljaGVja0xpdGVyYWwoKTsKCQkJCX0KCQkJfQoJCX0KCgkJaWYgKGlWYWx1ZSA8IHZhbHVlLmxlbmd0aCl7CgkJCWV4dHJhID0gdmFsdWUuc3Vic3RyKGlWYWx1ZSk7CgkJCWlmICghL15ccysvLnRlc3QoZXh0cmEpKSB7CgkJCQl0aHJvdyAiRXh0cmEvdW5wYXJzZWQgY2hhcmFjdGVycyBmb3VuZCBpbiBkYXRlOiAiICsgZXh0cmE7CgkJCX0KCQl9CgoJCWlmICh5ZWFyID09PSAtMSkgewoJCQl5ZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpOwoJCX0gZWxzZSBpZiAoeWVhciA8IDEwMCkgewoJCQl5ZWFyICs9IG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAtIG5ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKSAlIDEwMCArCgkJCQkoeWVhciA8PSBzaG9ydFllYXJDdXRvZmYgPyAwIDogLTEwMCk7CgkJfQoKCQlpZiAoZG95ID4gLTEpIHsKCQkJbW9udGggPSAxOwoJCQlkYXkgPSBkb3k7CgkJCWRvIHsKCQkJCWRpbSA9IHRoaXMuX2dldERheXNJbk1vbnRoKHllYXIsIG1vbnRoIC0gMSk7CgkJCQlpZiAoZGF5IDw9IGRpbSkgewoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJbW9udGgrKzsKCQkJCWRheSAtPSBkaW07CgkJCX0gd2hpbGUgKHRydWUpOwoJCX0KCgkJZGF0ZSA9IHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoIC0gMSwgZGF5KSk7CgkJaWYgKGRhdGUuZ2V0RnVsbFllYXIoKSAhPT0geWVhciB8fCBkYXRlLmdldE1vbnRoKCkgKyAxICE9PSBtb250aCB8fCBkYXRlLmdldERhdGUoKSAhPT0gZGF5KSB7CgkJCXRocm93ICJJbnZhbGlkIGRhdGUiOyAvLyBFLmcuIDMxLzAyLzAwCgkJfQoJCXJldHVybiBkYXRlOwoJfSwKCgkvKiBTdGFuZGFyZCBkYXRlIGZvcm1hdHMuICovCglBVE9NOiAieXktbW0tZGQiLCAvLyBSRkMgMzMzOSAoSVNPIDg2MDEpCglDT09LSUU6ICJELCBkZCBNIHl5IiwKCUlTT184NjAxOiAieXktbW0tZGQiLAoJUkZDXzgyMjogIkQsIGQgTSB5IiwKCVJGQ184NTA6ICJERCwgZGQtTS15IiwKCVJGQ18xMDM2OiAiRCwgZCBNIHkiLAoJUkZDXzExMjM6ICJELCBkIE0geXkiLAoJUkZDXzI4MjI6ICJELCBkIE0geXkiLAoJUlNTOiAiRCwgZCBNIHkiLCAvLyBSRkMgODIyCglUSUNLUzogIiEiLAoJVElNRVNUQU1QOiAiQCIsCglXM0M6ICJ5eS1tbS1kZCIsIC8vIElTTyA4NjAxCgoJX3RpY2tzVG8xOTcwOiAoKCgxOTcwIC0gMSkgKiAzNjUgKyBNYXRoLmZsb29yKDE5NzAgLyA0KSAtIE1hdGguZmxvb3IoMTk3MCAvIDEwMCkgKwoJCU1hdGguZmxvb3IoMTk3MCAvIDQwMCkpICogMjQgKiA2MCAqIDYwICogMTAwMDAwMDApLAoKCS8qIEZvcm1hdCBhIGRhdGUgb2JqZWN0IGludG8gYSBzdHJpbmcgdmFsdWUuCgkgKiBUaGUgZm9ybWF0IGNhbiBiZSBjb21iaW5hdGlvbnMgb2YgdGhlIGZvbGxvd2luZzoKCSAqIGQgIC0gZGF5IG9mIG1vbnRoIChubyBsZWFkaW5nIHplcm8pCgkgKiBkZCAtIGRheSBvZiBtb250aCAodHdvIGRpZ2l0KQoJICogbyAgLSBkYXkgb2YgeWVhciAobm8gbGVhZGluZyB6ZXJvcykKCSAqIG9vIC0gZGF5IG9mIHllYXIgKHRocmVlIGRpZ2l0KQoJICogRCAgLSBkYXkgbmFtZSBzaG9ydAoJICogREQgLSBkYXkgbmFtZSBsb25nCgkgKiBtICAtIG1vbnRoIG9mIHllYXIgKG5vIGxlYWRpbmcgemVybykKCSAqIG1tIC0gbW9udGggb2YgeWVhciAodHdvIGRpZ2l0KQoJICogTSAgLSBtb250aCBuYW1lIHNob3J0CgkgKiBNTSAtIG1vbnRoIG5hbWUgbG9uZwoJICogeSAgLSB5ZWFyICh0d28gZGlnaXQpCgkgKiB5eSAtIHllYXIgKGZvdXIgZGlnaXQpCgkgKiBAIC0gVW5peCB0aW1lc3RhbXAgKG1zIHNpbmNlIDAxLzAxLzE5NzApCgkgKiAhIC0gV2luZG93cyB0aWNrcyAoMTAwbnMgc2luY2UgMDEvMDEvMDAwMSkKCSAqICIuLi4iIC0gbGl0ZXJhbCB0ZXh0CgkgKiAnJyAtIHNpbmdsZSBxdW90ZQoJICoKCSAqIEBwYXJhbSAgZm9ybWF0IHN0cmluZyAtIHRoZSBkZXNpcmVkIGZvcm1hdCBvZiB0aGUgZGF0ZQoJICogQHBhcmFtICBkYXRlIERhdGUgLSB0aGUgZGF0ZSB2YWx1ZSB0byBmb3JtYXQKCSAqIEBwYXJhbSAgc2V0dGluZ3MgT2JqZWN0IC0gYXR0cmlidXRlcyBpbmNsdWRlOgoJICoJCQkJCWRheU5hbWVzU2hvcnQJc3RyaW5nWzddIC0gYWJicmV2aWF0ZWQgbmFtZXMgb2YgdGhlIGRheXMgZnJvbSBTdW5kYXkgKG9wdGlvbmFsKQoJICoJCQkJCWRheU5hbWVzCQlzdHJpbmdbN10gLSBuYW1lcyBvZiB0aGUgZGF5cyBmcm9tIFN1bmRheSAob3B0aW9uYWwpCgkgKgkJCQkJbW9udGhOYW1lc1Nob3J0IHN0cmluZ1sxMl0gLSBhYmJyZXZpYXRlZCBuYW1lcyBvZiB0aGUgbW9udGhzIChvcHRpb25hbCkKCSAqCQkJCQltb250aE5hbWVzCQlzdHJpbmdbMTJdIC0gbmFtZXMgb2YgdGhlIG1vbnRocyAob3B0aW9uYWwpCgkgKiBAcmV0dXJuICBzdHJpbmcgLSB0aGUgZGF0ZSBpbiB0aGUgYWJvdmUgZm9ybWF0CgkgKi8KCWZvcm1hdERhdGU6IGZ1bmN0aW9uIChmb3JtYXQsIGRhdGUsIHNldHRpbmdzKSB7CgkJaWYgKCFkYXRlKSB7CgkJCXJldHVybiAiIjsKCQl9CgoJCXZhciBpRm9ybWF0LAoJCQlkYXlOYW1lc1Nob3J0ID0gKHNldHRpbmdzID8gc2V0dGluZ3MuZGF5TmFtZXNTaG9ydCA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzU2hvcnQsCgkJCWRheU5hbWVzID0gKHNldHRpbmdzID8gc2V0dGluZ3MuZGF5TmFtZXMgOiBudWxsKSB8fCB0aGlzLl9kZWZhdWx0cy5kYXlOYW1lcywKCQkJbW9udGhOYW1lc1Nob3J0ID0gKHNldHRpbmdzID8gc2V0dGluZ3MubW9udGhOYW1lc1Nob3J0IDogbnVsbCkgfHwgdGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LAoJCQltb250aE5hbWVzID0gKHNldHRpbmdzID8gc2V0dGluZ3MubW9udGhOYW1lcyA6IG51bGwpIHx8IHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXMsCgkJCS8vIENoZWNrIHdoZXRoZXIgYSBmb3JtYXQgY2hhcmFjdGVyIGlzIGRvdWJsZWQKCQkJbG9va0FoZWFkID0gZnVuY3Rpb24obWF0Y2gpIHsKCQkJCXZhciBtYXRjaGVzID0gKGlGb3JtYXQgKyAxIDwgZm9ybWF0Lmxlbmd0aCAmJiBmb3JtYXQuY2hhckF0KGlGb3JtYXQgKyAxKSA9PT0gbWF0Y2gpOwoJCQkJaWYgKG1hdGNoZXMpIHsKCQkJCQlpRm9ybWF0Kys7CgkJCQl9CgkJCQlyZXR1cm4gbWF0Y2hlczsKCQkJfSwKCQkJLy8gRm9ybWF0IGEgbnVtYmVyLCB3aXRoIGxlYWRpbmcgemVybyBpZiBuZWNlc3NhcnkKCQkJZm9ybWF0TnVtYmVyID0gZnVuY3Rpb24obWF0Y2gsIHZhbHVlLCBsZW4pIHsKCQkJCXZhciBudW0gPSAiIiArIHZhbHVlOwoJCQkJaWYgKGxvb2tBaGVhZChtYXRjaCkpIHsKCQkJCQl3aGlsZSAobnVtLmxlbmd0aCA8IGxlbikgewoJCQkJCQludW0gPSAiMCIgKyBudW07CgkJCQkJfQoJCQkJfQoJCQkJcmV0dXJuIG51bTsKCQkJfSwKCQkJLy8gRm9ybWF0IGEgbmFtZSwgc2hvcnQgb3IgbG9uZyBhcyByZXF1ZXN0ZWQKCQkJZm9ybWF0TmFtZSA9IGZ1bmN0aW9uKG1hdGNoLCB2YWx1ZSwgc2hvcnROYW1lcywgbG9uZ05hbWVzKSB7CgkJCQlyZXR1cm4gKGxvb2tBaGVhZChtYXRjaCkgPyBsb25nTmFtZXNbdmFsdWVdIDogc2hvcnROYW1lc1t2YWx1ZV0pOwoJCQl9LAoJCQlvdXRwdXQgPSAiIiwKCQkJbGl0ZXJhbCA9IGZhbHNlOwoKCQlpZiAoZGF0ZSkgewoJCQlmb3IgKGlGb3JtYXQgPSAwOyBpRm9ybWF0IDwgZm9ybWF0Lmxlbmd0aDsgaUZvcm1hdCsrKSB7CgkJCQlpZiAobGl0ZXJhbCkgewoJCQkJCWlmIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpID09PSAiJyIgJiYgIWxvb2tBaGVhZCgiJyIpKSB7CgkJCQkJCWxpdGVyYWwgPSBmYWxzZTsKCQkJCQl9IGVsc2UgewoJCQkJCQlvdXRwdXQgKz0gZm9ybWF0LmNoYXJBdChpRm9ybWF0KTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCXN3aXRjaCAoZm9ybWF0LmNoYXJBdChpRm9ybWF0KSkgewoJCQkJCQljYXNlICJkIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROdW1iZXIoImQiLCBkYXRlLmdldERhdGUoKSwgMik7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiRCI6CgkJCQkJCQlvdXRwdXQgKz0gZm9ybWF0TmFtZSgiRCIsIGRhdGUuZ2V0RGF5KCksIGRheU5hbWVzU2hvcnQsIGRheU5hbWVzKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJvIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROdW1iZXIoIm8iLAoJCQkJCQkJCU1hdGgucm91bmQoKG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCAwLCAwKS5nZXRUaW1lKCkpIC8gODY0MDAwMDApLCAzKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJtIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROdW1iZXIoIm0iLCBkYXRlLmdldE1vbnRoKCkgKyAxLCAyKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlICJNIjoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXROYW1lKCJNIiwgZGF0ZS5nZXRNb250aCgpLCBtb250aE5hbWVzU2hvcnQsIG1vbnRoTmFtZXMpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgInkiOgoJCQkJCQkJb3V0cHV0ICs9IChsb29rQWhlYWQoInkiKSA/IGRhdGUuZ2V0RnVsbFllYXIoKSA6CgkJCQkJCQkJKGRhdGUuZ2V0WWVhcigpICUgMTAwIDwgMTAgPyAiMCIgOiAiIikgKyBkYXRlLmdldFllYXIoKSAlIDEwMCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiQCI6CgkJCQkJCQlvdXRwdXQgKz0gZGF0ZS5nZXRUaW1lKCk7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAiISI6CgkJCQkJCQlvdXRwdXQgKz0gZGF0ZS5nZXRUaW1lKCkgKiAxMDAwMCArIHRoaXMuX3RpY2tzVG8xOTcwOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgIiciOgoJCQkJCQkJaWYgKGxvb2tBaGVhZCgiJyIpKSB7CgkJCQkJCQkJb3V0cHV0ICs9ICInIjsKCQkJCQkJCX0gZWxzZSB7CgkJCQkJCQkJbGl0ZXJhbCA9IHRydWU7CgkJCQkJCQl9CgkJCQkJCQlicmVhazsKCQkJCQkJZGVmYXVsdDoKCQkJCQkJCW91dHB1dCArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gb3V0cHV0OwoJfSwKCgkvKiBFeHRyYWN0IGFsbCBwb3NzaWJsZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGRhdGUgZm9ybWF0LiAqLwoJX3Bvc3NpYmxlQ2hhcnM6IGZ1bmN0aW9uIChmb3JtYXQpIHsKCQl2YXIgaUZvcm1hdCwKCQkJY2hhcnMgPSAiIiwKCQkJbGl0ZXJhbCA9IGZhbHNlLAoJCQkvLyBDaGVjayB3aGV0aGVyIGEgZm9ybWF0IGNoYXJhY3RlciBpcyBkb3VibGVkCgkJCWxvb2tBaGVhZCA9IGZ1bmN0aW9uKG1hdGNoKSB7CgkJCQl2YXIgbWF0Y2hlcyA9IChpRm9ybWF0ICsgMSA8IGZvcm1hdC5sZW5ndGggJiYgZm9ybWF0LmNoYXJBdChpRm9ybWF0ICsgMSkgPT09IG1hdGNoKTsKCQkJCWlmIChtYXRjaGVzKSB7CgkJCQkJaUZvcm1hdCsrOwoJCQkJfQoJCQkJcmV0dXJuIG1hdGNoZXM7CgkJCX07CgoJCWZvciAoaUZvcm1hdCA9IDA7IGlGb3JtYXQgPCBmb3JtYXQubGVuZ3RoOyBpRm9ybWF0KyspIHsKCQkJaWYgKGxpdGVyYWwpIHsKCQkJCWlmIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpID09PSAiJyIgJiYgIWxvb2tBaGVhZCgiJyIpKSB7CgkJCQkJbGl0ZXJhbCA9IGZhbHNlOwoJCQkJfSBlbHNlIHsKCQkJCQljaGFycyArPSBmb3JtYXQuY2hhckF0KGlGb3JtYXQpOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJc3dpdGNoIChmb3JtYXQuY2hhckF0KGlGb3JtYXQpKSB7CgkJCQkJY2FzZSAiZCI6IGNhc2UgIm0iOiBjYXNlICJ5IjogY2FzZSAiQCI6CgkJCQkJCWNoYXJzICs9ICIwMTIzNDU2Nzg5IjsKCQkJCQkJYnJlYWs7CgkJCQkJY2FzZSAiRCI6IGNhc2UgIk0iOgoJCQkJCQlyZXR1cm4gbnVsbDsgLy8gQWNjZXB0IGFueXRoaW5nCgkJCQkJY2FzZSAiJyI6CgkJCQkJCWlmIChsb29rQWhlYWQoIiciKSkgewoJCQkJCQkJY2hhcnMgKz0gIiciOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJbGl0ZXJhbCA9IHRydWU7CgkJCQkJCX0KCQkJCQkJYnJlYWs7CgkJCQkJZGVmYXVsdDoKCQkJCQkJY2hhcnMgKz0gZm9ybWF0LmNoYXJBdChpRm9ybWF0KTsKCQkJCX0KCQkJfQoJCX0KCQlyZXR1cm4gY2hhcnM7Cgl9LAoKCS8qIEdldCBhIHNldHRpbmcgdmFsdWUsIGRlZmF1bHRpbmcgaWYgbmVjZXNzYXJ5LiAqLwoJX2dldDogZnVuY3Rpb24oaW5zdCwgbmFtZSkgewoJCXJldHVybiBpbnN0LnNldHRpbmdzW25hbWVdICE9PSB1bmRlZmluZWQgPwoJCQlpbnN0LnNldHRpbmdzW25hbWVdIDogdGhpcy5fZGVmYXVsdHNbbmFtZV07Cgl9LAoKCS8qIFBhcnNlIGV4aXN0aW5nIGRhdGUgYW5kIGluaXRpYWxpc2UgZGF0ZSBwaWNrZXIuICovCglfc2V0RGF0ZUZyb21GaWVsZDogZnVuY3Rpb24oaW5zdCwgbm9EZWZhdWx0KSB7CgkJaWYgKGluc3QuaW5wdXQudmFsKCkgPT09IGluc3QubGFzdFZhbCkgewoJCQlyZXR1cm47CgkJfQoKCQl2YXIgZGF0ZUZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAiZGF0ZUZvcm1hdCIpLAoJCQlkYXRlcyA9IGluc3QubGFzdFZhbCA9IGluc3QuaW5wdXQgPyBpbnN0LmlucHV0LnZhbCgpIDogbnVsbCwKCQkJZGVmYXVsdERhdGUgPSB0aGlzLl9nZXREZWZhdWx0RGF0ZShpbnN0KSwKCQkJZGF0ZSA9IGRlZmF1bHREYXRlLAoJCQlzZXR0aW5ncyA9IHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KTsKCgkJdHJ5IHsKCQkJZGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGVGb3JtYXQsIGRhdGVzLCBzZXR0aW5ncykgfHwgZGVmYXVsdERhdGU7CgkJfSBjYXRjaCAoZXZlbnQpIHsKCQkJZGF0ZXMgPSAobm9EZWZhdWx0ID8gIiIgOiBkYXRlcyk7CgkJfQoJCWluc3Quc2VsZWN0ZWREYXkgPSBkYXRlLmdldERhdGUoKTsKCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGRhdGUuZ2V0TW9udGgoKTsKCQlpbnN0LmRyYXdZZWFyID0gaW5zdC5zZWxlY3RlZFllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7CgkJaW5zdC5jdXJyZW50RGF5ID0gKGRhdGVzID8gZGF0ZS5nZXREYXRlKCkgOiAwKTsKCQlpbnN0LmN1cnJlbnRNb250aCA9IChkYXRlcyA/IGRhdGUuZ2V0TW9udGgoKSA6IDApOwoJCWluc3QuY3VycmVudFllYXIgPSAoZGF0ZXMgPyBkYXRlLmdldEZ1bGxZZWFyKCkgOiAwKTsKCQl0aGlzLl9hZGp1c3RJbnN0RGF0ZShpbnN0KTsKCX0sCgoJLyogUmV0cmlldmUgdGhlIGRlZmF1bHQgZGF0ZSBzaG93biBvbiBvcGVuaW5nLiAqLwoJX2dldERlZmF1bHREYXRlOiBmdW5jdGlvbihpbnN0KSB7CgkJcmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGluc3QsCgkJCXRoaXMuX2RldGVybWluZURhdGUoaW5zdCwgdGhpcy5fZ2V0KGluc3QsICJkZWZhdWx0RGF0ZSIpLCBuZXcgRGF0ZSgpKSk7Cgl9LAoKCS8qIEEgZGF0ZSBtYXkgYmUgc3BlY2lmaWVkIGFzIGFuIGV4YWN0IHZhbHVlIG9yIGEgcmVsYXRpdmUgb25lLiAqLwoJX2RldGVybWluZURhdGU6IGZ1bmN0aW9uKGluc3QsIGRhdGUsIGRlZmF1bHREYXRlKSB7CgkJdmFyIG9mZnNldE51bWVyaWMgPSBmdW5jdGlvbihvZmZzZXQpIHsKCQkJCXZhciBkYXRlID0gbmV3IERhdGUoKTsKCQkJCWRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIG9mZnNldCk7CgkJCQlyZXR1cm4gZGF0ZTsKCQkJfSwKCQkJb2Zmc2V0U3RyaW5nID0gZnVuY3Rpb24ob2Zmc2V0KSB7CgkJCQl0cnkgewoJCQkJCXJldHVybiAkLmRhdGVwaWNrZXIucGFyc2VEYXRlKCQuZGF0ZXBpY2tlci5fZ2V0KGluc3QsICJkYXRlRm9ybWF0IiksCgkJCQkJCW9mZnNldCwgJC5kYXRlcGlja2VyLl9nZXRGb3JtYXRDb25maWcoaW5zdCkpOwoJCQkJfQoJCQkJY2F0Y2ggKGUpIHsKCQkJCQkvLyBJZ25vcmUKCQkJCX0KCgkJCQl2YXIgZGF0ZSA9IChvZmZzZXQudG9Mb3dlckNhc2UoKS5tYXRjaCgvXmMvKSA/CgkJCQkJJC5kYXRlcGlja2VyLl9nZXREYXRlKGluc3QpIDogbnVsbCkgfHwgbmV3IERhdGUoKSwKCQkJCQl5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpLAoJCQkJCW1vbnRoID0gZGF0ZS5nZXRNb250aCgpLAoJCQkJCWRheSA9IGRhdGUuZ2V0RGF0ZSgpLAoJCQkJCXBhdHRlcm4gPSAvKFsrXC1dP1swLTldKylccyooZHxEfHd8V3xtfE18eXxZKT8vZywKCQkJCQltYXRjaGVzID0gcGF0dGVybi5leGVjKG9mZnNldCk7CgoJCQkJd2hpbGUgKG1hdGNoZXMpIHsKCQkJCQlzd2l0Y2ggKG1hdGNoZXNbMl0gfHwgImQiKSB7CgkJCQkJCWNhc2UgImQiIDogY2FzZSAiRCIgOgoJCQkJCQkJZGF5ICs9IHBhcnNlSW50KG1hdGNoZXNbMV0sMTApOyBicmVhazsKCQkJCQkJY2FzZSAidyIgOiBjYXNlICJXIiA6CgkJCQkJCQlkYXkgKz0gcGFyc2VJbnQobWF0Y2hlc1sxXSwxMCkgKiA3OyBicmVhazsKCQkJCQkJY2FzZSAibSIgOiBjYXNlICJNIiA6CgkJCQkJCQltb250aCArPSBwYXJzZUludChtYXRjaGVzWzFdLDEwKTsKCQkJCQkJCWRheSA9IE1hdGgubWluKGRheSwgJC5kYXRlcGlja2VyLl9nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWNhc2UgInkiOiBjYXNlICJZIiA6CgkJCQkJCQl5ZWFyICs9IHBhcnNlSW50KG1hdGNoZXNbMV0sMTApOwoJCQkJCQkJZGF5ID0gTWF0aC5taW4oZGF5LCAkLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSk7CgkJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJbWF0Y2hlcyA9IHBhdHRlcm4uZXhlYyhvZmZzZXQpOwoJCQkJfQoJCQkJcmV0dXJuIG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpOwoJCQl9LAoJCQluZXdEYXRlID0gKGRhdGUgPT0gbnVsbCB8fCBkYXRlID09PSAiIiA/IGRlZmF1bHREYXRlIDogKHR5cGVvZiBkYXRlID09PSAic3RyaW5nIiA/IG9mZnNldFN0cmluZyhkYXRlKSA6CgkJCQkodHlwZW9mIGRhdGUgPT09ICJudW1iZXIiID8gKGlzTmFOKGRhdGUpID8gZGVmYXVsdERhdGUgOiBvZmZzZXROdW1lcmljKGRhdGUpKSA6IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKSkpKTsKCgkJbmV3RGF0ZSA9IChuZXdEYXRlICYmIG5ld0RhdGUudG9TdHJpbmcoKSA9PT0gIkludmFsaWQgRGF0ZSIgPyBkZWZhdWx0RGF0ZSA6IG5ld0RhdGUpOwoJCWlmIChuZXdEYXRlKSB7CgkJCW5ld0RhdGUuc2V0SG91cnMoMCk7CgkJCW5ld0RhdGUuc2V0TWludXRlcygwKTsKCQkJbmV3RGF0ZS5zZXRTZWNvbmRzKDApOwoJCQluZXdEYXRlLnNldE1pbGxpc2Vjb25kcygwKTsKCQl9CgkJcmV0dXJuIHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ld0RhdGUpOwoJfSwKCgkvKiBIYW5kbGUgc3dpdGNoIHRvL2Zyb20gZGF5bGlnaHQgc2F2aW5nLgoJICogSG91cnMgbWF5IGJlIG5vbi16ZXJvIG9uIGRheWxpZ2h0IHNhdmluZyBjdXQtb3ZlcjoKCSAqID4gMTIgd2hlbiBtaWRuaWdodCBjaGFuZ2VvdmVyLCBidXQgdGhlbiBjYW5ub3QgZ2VuZXJhdGUKCSAqIG1pZG5pZ2h0IGRhdGV0aW1lLCBzbyBqdW1wIHRvIDFBTSwgb3RoZXJ3aXNlIHJlc2V0LgoJICogQHBhcmFtICBkYXRlICAoRGF0ZSkgdGhlIGRhdGUgdG8gY2hlY2sKCSAqIEByZXR1cm4gIChEYXRlKSB0aGUgY29ycmVjdGVkIGRhdGUKCSAqLwoJX2RheWxpZ2h0U2F2aW5nQWRqdXN0OiBmdW5jdGlvbihkYXRlKSB7CgkJaWYgKCFkYXRlKSB7CgkJCXJldHVybiBudWxsOwoJCX0KCQlkYXRlLnNldEhvdXJzKGRhdGUuZ2V0SG91cnMoKSA+IDEyID8gZGF0ZS5nZXRIb3VycygpICsgMiA6IDApOwoJCXJldHVybiBkYXRlOwoJfSwKCgkvKiBTZXQgdGhlIGRhdGUocykgZGlyZWN0bHkuICovCglfc2V0RGF0ZTogZnVuY3Rpb24oaW5zdCwgZGF0ZSwgbm9DaGFuZ2UpIHsKCQl2YXIgY2xlYXIgPSAhZGF0ZSwKCQkJb3JpZ01vbnRoID0gaW5zdC5zZWxlY3RlZE1vbnRoLAoJCQlvcmlnWWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyLAoJCQluZXdEYXRlID0gdGhpcy5fcmVzdHJpY3RNaW5NYXgoaW5zdCwgdGhpcy5fZGV0ZXJtaW5lRGF0ZShpbnN0LCBkYXRlLCBuZXcgRGF0ZSgpKSk7CgoJCWluc3Quc2VsZWN0ZWREYXkgPSBpbnN0LmN1cnJlbnREYXkgPSBuZXdEYXRlLmdldERhdGUoKTsKCQlpbnN0LmRyYXdNb250aCA9IGluc3Quc2VsZWN0ZWRNb250aCA9IGluc3QuY3VycmVudE1vbnRoID0gbmV3RGF0ZS5nZXRNb250aCgpOwoJCWluc3QuZHJhd1llYXIgPSBpbnN0LnNlbGVjdGVkWWVhciA9IGluc3QuY3VycmVudFllYXIgPSBuZXdEYXRlLmdldEZ1bGxZZWFyKCk7CgkJaWYgKChvcmlnTW9udGggIT09IGluc3Quc2VsZWN0ZWRNb250aCB8fCBvcmlnWWVhciAhPT0gaW5zdC5zZWxlY3RlZFllYXIpICYmICFub0NoYW5nZSkgewoJCQl0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7CgkJfQoJCXRoaXMuX2FkanVzdEluc3REYXRlKGluc3QpOwoJCWlmIChpbnN0LmlucHV0KSB7CgkJCWluc3QuaW5wdXQudmFsKGNsZWFyID8gIiIgOiB0aGlzLl9mb3JtYXREYXRlKGluc3QpKTsKCQl9Cgl9LAoKCS8qIFJldHJpZXZlIHRoZSBkYXRlKHMpIGRpcmVjdGx5LiAqLwoJX2dldERhdGU6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgc3RhcnREYXRlID0gKCFpbnN0LmN1cnJlbnRZZWFyIHx8IChpbnN0LmlucHV0ICYmIGluc3QuaW5wdXQudmFsKCkgPT09ICIiKSA/IG51bGwgOgoJCQl0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSgKCQkJaW5zdC5jdXJyZW50WWVhciwgaW5zdC5jdXJyZW50TW9udGgsIGluc3QuY3VycmVudERheSkpKTsKCQkJcmV0dXJuIHN0YXJ0RGF0ZTsKCX0sCgoJLyogQXR0YWNoIHRoZSBvbnh4eCBoYW5kbGVycy4gIFRoZXNlIGFyZSBkZWNsYXJlZCBzdGF0aWNhbGx5IHNvCgkgKiB0aGV5IHdvcmsgd2l0aCBzdGF0aWMgY29kZSB0cmFuc2Zvcm1lcnMgbGlrZSBDYWphLgoJICovCglfYXR0YWNoSGFuZGxlcnM6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgc3RlcE1vbnRocyA9IHRoaXMuX2dldChpbnN0LCAic3RlcE1vbnRocyIpLAoJCQlpZCA9ICIjIiArIGluc3QuaWQucmVwbGFjZSggL1xcXFwvZywgIlxcIiApOwoJCWluc3QuZHBEaXYuZmluZCgiW2RhdGEtaGFuZGxlcl0iKS5tYXAoZnVuY3Rpb24gKCkgewoJCQl2YXIgaGFuZGxlciA9IHsKCQkJCXByZXY6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoaWQsIC1zdGVwTW9udGhzLCAiTSIpOwoJCQkJfSwKCQkJCW5leHQ6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2FkanVzdERhdGUoaWQsICtzdGVwTW9udGhzLCAiTSIpOwoJCQkJfSwKCQkJCWhpZGU6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk7CgkJCQl9LAoJCQkJdG9kYXk6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX2dvdG9Ub2RheShpZCk7CgkJCQl9LAoJCQkJc2VsZWN0RGF5OiBmdW5jdGlvbiAoKSB7CgkJCQkJJC5kYXRlcGlja2VyLl9zZWxlY3REYXkoaWQsICt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1tb250aCIpLCArdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEteWVhciIpLCB0aGlzKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9LAoJCQkJc2VsZWN0TW9udGg6IGZ1bmN0aW9uICgpIHsKCQkJCQkkLmRhdGVwaWNrZXIuX3NlbGVjdE1vbnRoWWVhcihpZCwgdGhpcywgIk0iKTsKCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQl9LAoJCQkJc2VsZWN0WWVhcjogZnVuY3Rpb24gKCkgewoJCQkJCSQuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKGlkLCB0aGlzLCAiWSIpOwoJCQkJCXJldHVybiBmYWxzZTsKCQkJCX0KCQkJfTsKCQkJJCh0aGlzKS5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWV2ZW50IiksIGhhbmRsZXJbdGhpcy5nZXRBdHRyaWJ1dGUoImRhdGEtaGFuZGxlciIpXSk7CgkJfSk7Cgl9LAoKCS8qIEdlbmVyYXRlIHRoZSBIVE1MIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGF0ZSBwaWNrZXIuICovCglfZ2VuZXJhdGVIVE1MOiBmdW5jdGlvbihpbnN0KSB7CgkJdmFyIG1heERyYXcsIHByZXZUZXh0LCBwcmV2LCBuZXh0VGV4dCwgbmV4dCwgY3VycmVudFRleHQsIGdvdG9EYXRlLAoJCQljb250cm9scywgYnV0dG9uUGFuZWwsIGZpcnN0RGF5LCBzaG93V2VlaywgZGF5TmFtZXMsIGRheU5hbWVzTWluLAoJCQltb250aE5hbWVzLCBtb250aE5hbWVzU2hvcnQsIGJlZm9yZVNob3dEYXksIHNob3dPdGhlck1vbnRocywKCQkJc2VsZWN0T3RoZXJNb250aHMsIGRlZmF1bHREYXRlLCBodG1sLCBkb3csIHJvdywgZ3JvdXAsIGNvbCwgc2VsZWN0ZWREYXRlLAoJCQljb3JuZXJDbGFzcywgY2FsZW5kZXIsIHRoZWFkLCBkYXksIGRheXNJbk1vbnRoLCBsZWFkRGF5cywgY3VyUm93cywgbnVtUm93cywKCQkJcHJpbnREYXRlLCBkUm93LCB0Ym9keSwgZGF5U2V0dGluZ3MsIG90aGVyTW9udGgsIHVuc2VsZWN0YWJsZSwKCQkJdGVtcERhdGUgPSBuZXcgRGF0ZSgpLAoJCQl0b2RheSA9IHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KAoJCQkJbmV3IERhdGUodGVtcERhdGUuZ2V0RnVsbFllYXIoKSwgdGVtcERhdGUuZ2V0TW9udGgoKSwgdGVtcERhdGUuZ2V0RGF0ZSgpKSksIC8vIGNsZWFyIHRpbWUKCQkJaXNSVEwgPSB0aGlzLl9nZXQoaW5zdCwgImlzUlRMIiksCgkJCXNob3dCdXR0b25QYW5lbCA9IHRoaXMuX2dldChpbnN0LCAic2hvd0J1dHRvblBhbmVsIiksCgkJCWhpZGVJZk5vUHJldk5leHQgPSB0aGlzLl9nZXQoaW5zdCwgImhpZGVJZk5vUHJldk5leHQiKSwKCQkJbmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCA9IHRoaXMuX2dldChpbnN0LCAibmF2aWdhdGlvbkFzRGF0ZUZvcm1hdCIpLAoJCQludW1Nb250aHMgPSB0aGlzLl9nZXROdW1iZXJPZk1vbnRocyhpbnN0KSwKCQkJc2hvd0N1cnJlbnRBdFBvcyA9IHRoaXMuX2dldChpbnN0LCAic2hvd0N1cnJlbnRBdFBvcyIpLAoJCQlzdGVwTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICJzdGVwTW9udGhzIiksCgkJCWlzTXVsdGlNb250aCA9IChudW1Nb250aHNbMF0gIT09IDEgfHwgbnVtTW9udGhzWzFdICE9PSAxKSwKCQkJY3VycmVudERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdCgoIWluc3QuY3VycmVudERheSA/IG5ldyBEYXRlKDk5OTksIDksIDkpIDoKCQkJCW5ldyBEYXRlKGluc3QuY3VycmVudFllYXIsIGluc3QuY3VycmVudE1vbnRoLCBpbnN0LmN1cnJlbnREYXkpKSksCgkJCW1pbkRhdGUgPSB0aGlzLl9nZXRNaW5NYXhEYXRlKGluc3QsICJtaW4iKSwKCQkJbWF4RGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgIm1heCIpLAoJCQlkcmF3TW9udGggPSBpbnN0LmRyYXdNb250aCAtIHNob3dDdXJyZW50QXRQb3MsCgkJCWRyYXdZZWFyID0gaW5zdC5kcmF3WWVhcjsKCgkJaWYgKGRyYXdNb250aCA8IDApIHsKCQkJZHJhd01vbnRoICs9IDEyOwoJCQlkcmF3WWVhci0tOwoJCX0KCQlpZiAobWF4RGF0ZSkgewoJCQltYXhEcmF3ID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobWF4RGF0ZS5nZXRGdWxsWWVhcigpLAoJCQkJbWF4RGF0ZS5nZXRNb250aCgpIC0gKG51bU1vbnRoc1swXSAqIG51bU1vbnRoc1sxXSkgKyAxLCBtYXhEYXRlLmdldERhdGUoKSkpOwoJCQltYXhEcmF3ID0gKG1pbkRhdGUgJiYgbWF4RHJhdyA8IG1pbkRhdGUgPyBtaW5EYXRlIDogbWF4RHJhdyk7CgkJCXdoaWxlICh0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShkcmF3WWVhciwgZHJhd01vbnRoLCAxKSkgPiBtYXhEcmF3KSB7CgkJCQlkcmF3TW9udGgtLTsKCQkJCWlmIChkcmF3TW9udGggPCAwKSB7CgkJCQkJZHJhd01vbnRoID0gMTE7CgkJCQkJZHJhd1llYXItLTsKCQkJCX0KCQkJfQoJCX0KCQlpbnN0LmRyYXdNb250aCA9IGRyYXdNb250aDsKCQlpbnN0LmRyYXdZZWFyID0gZHJhd1llYXI7CgoJCXByZXZUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJwcmV2VGV4dCIpOwoJCXByZXZUZXh0ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0ID8gcHJldlRleHQgOiB0aGlzLmZvcm1hdERhdGUocHJldlRleHQsCgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3TW9udGggLSBzdGVwTW9udGhzLCAxKSksCgkJCXRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoKCQlwcmV2ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsIC0xLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/CgkJCSI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1wcmV2IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0ncHJldicgZGF0YS1ldmVudD0nY2xpY2snIiArCgkJCSIgdGl0bGU9JyIgKyBwcmV2VGV4dCArICInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIgKyAoIGlzUlRMID8gImUiIDogInciKSArICInPiIgKyBwcmV2VGV4dCArICI8L3NwYW4+PC9hPiIgOgoJCQkoaGlkZUlmTm9QcmV2TmV4dCA/ICIiIDogIjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIrIHByZXZUZXh0ICsiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iICsgKCBpc1JUTCA/ICJlIiA6ICJ3IikgKyAiJz4iICsgcHJldlRleHQgKyAiPC9zcGFuPjwvYT4iKSk7CgoJCW5leHRUZXh0ID0gdGhpcy5fZ2V0KGluc3QsICJuZXh0VGV4dCIpOwoJCW5leHRUZXh0ID0gKCFuYXZpZ2F0aW9uQXNEYXRlRm9ybWF0ID8gbmV4dFRleHQgOiB0aGlzLmZvcm1hdERhdGUobmV4dFRleHQsCgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGRyYXdZZWFyLCBkcmF3TW9udGggKyBzdGVwTW9udGhzLCAxKSksCgkJCXRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoKCQluZXh0ID0gKHRoaXMuX2NhbkFkanVzdE1vbnRoKGluc3QsICsxLCBkcmF3WWVhciwgZHJhd01vbnRoKSA/CgkJCSI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0nbmV4dCcgZGF0YS1ldmVudD0nY2xpY2snIiArCgkJCSIgdGl0bGU9JyIgKyBuZXh0VGV4dCArICInPjxzcGFuIGNsYXNzPSd1aS1pY29uIHVpLWljb24tY2lyY2xlLXRyaWFuZ2xlLSIgKyAoIGlzUlRMID8gInciIDogImUiKSArICInPiIgKyBuZXh0VGV4dCArICI8L3NwYW4+PC9hPiIgOgoJCQkoaGlkZUlmTm9QcmV2TmV4dCA/ICIiIDogIjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLW5leHQgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIrIG5leHRUZXh0ICsgIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIiArICggaXNSVEwgPyAidyIgOiAiZSIpICsgIic+IiArIG5leHRUZXh0ICsgIjwvc3Bhbj48L2E+IikpOwoKCQljdXJyZW50VGV4dCA9IHRoaXMuX2dldChpbnN0LCAiY3VycmVudFRleHQiKTsKCQlnb3RvRGF0ZSA9ICh0aGlzLl9nZXQoaW5zdCwgImdvdG9DdXJyZW50IikgJiYgaW5zdC5jdXJyZW50RGF5ID8gY3VycmVudERhdGUgOiB0b2RheSk7CgkJY3VycmVudFRleHQgPSAoIW5hdmlnYXRpb25Bc0RhdGVGb3JtYXQgPyBjdXJyZW50VGV4dCA6CgkJCXRoaXMuZm9ybWF0RGF0ZShjdXJyZW50VGV4dCwgZ290b0RhdGUsIHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSkpOwoKCQljb250cm9scyA9ICghaW5zdC5pbmxpbmUgPyAiPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSd1aS1kYXRlcGlja2VyLWNsb3NlIHVpLXN0YXRlLWRlZmF1bHQgdWktcHJpb3JpdHktcHJpbWFyeSB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9J2hpZGUnIGRhdGEtZXZlbnQ9J2NsaWNrJz4iICsKCQkJdGhpcy5fZ2V0KGluc3QsICJjbG9zZVRleHQiKSArICI8L2J1dHRvbj4iIDogIiIpOwoKCQlidXR0b25QYW5lbCA9IChzaG93QnV0dG9uUGFuZWwpID8gIjxkaXYgY2xhc3M9J3VpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSB1aS13aWRnZXQtY29udGVudCc+IiArIChpc1JUTCA/IGNvbnRyb2xzIDogIiIpICsKCQkJKHRoaXMuX2lzSW5SYW5nZShpbnN0LCBnb3RvRGF0ZSkgPyAiPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSd1aS1kYXRlcGlja2VyLWN1cnJlbnQgdWktc3RhdGUtZGVmYXVsdCB1aS1wcmlvcml0eS1zZWNvbmRhcnkgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSd0b2RheScgZGF0YS1ldmVudD0nY2xpY2snIiArCgkJCSI+IiArIGN1cnJlbnRUZXh0ICsgIjwvYnV0dG9uPiIgOiAiIikgKyAoaXNSVEwgPyAiIiA6IGNvbnRyb2xzKSArICI8L2Rpdj4iIDogIiI7CgoJCWZpcnN0RGF5ID0gcGFyc2VJbnQodGhpcy5fZ2V0KGluc3QsICJmaXJzdERheSIpLDEwKTsKCQlmaXJzdERheSA9IChpc05hTihmaXJzdERheSkgPyAwIDogZmlyc3REYXkpOwoKCQlzaG93V2VlayA9IHRoaXMuX2dldChpbnN0LCAic2hvd1dlZWsiKTsKCQlkYXlOYW1lcyA9IHRoaXMuX2dldChpbnN0LCAiZGF5TmFtZXMiKTsKCQlkYXlOYW1lc01pbiA9IHRoaXMuX2dldChpbnN0LCAiZGF5TmFtZXNNaW4iKTsKCQltb250aE5hbWVzID0gdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzIik7CgkJbW9udGhOYW1lc1Nob3J0ID0gdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzU2hvcnQiKTsKCQliZWZvcmVTaG93RGF5ID0gdGhpcy5fZ2V0KGluc3QsICJiZWZvcmVTaG93RGF5Iik7CgkJc2hvd090aGVyTW9udGhzID0gdGhpcy5fZ2V0KGluc3QsICJzaG93T3RoZXJNb250aHMiKTsKCQlzZWxlY3RPdGhlck1vbnRocyA9IHRoaXMuX2dldChpbnN0LCAic2VsZWN0T3RoZXJNb250aHMiKTsKCQlkZWZhdWx0RGF0ZSA9IHRoaXMuX2dldERlZmF1bHREYXRlKGluc3QpOwoJCWh0bWwgPSAiIjsKCQlkb3c7CgkJZm9yIChyb3cgPSAwOyByb3cgPCBudW1Nb250aHNbMF07IHJvdysrKSB7CgkJCWdyb3VwID0gIiI7CgkJCXRoaXMubWF4Um93cyA9IDQ7CgkJCWZvciAoY29sID0gMDsgY29sIDwgbnVtTW9udGhzWzFdOyBjb2wrKykgewoJCQkJc2VsZWN0ZWREYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsIGRyYXdNb250aCwgaW5zdC5zZWxlY3RlZERheSkpOwoJCQkJY29ybmVyQ2xhc3MgPSAiIHVpLWNvcm5lci1hbGwiOwoJCQkJY2FsZW5kZXIgPSAiIjsKCQkJCWlmIChpc011bHRpTW9udGgpIHsKCQkJCQljYWxlbmRlciArPSAiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1ncm91cCI7CgkJCQkJaWYgKG51bU1vbnRoc1sxXSA+IDEpIHsKCQkJCQkJc3dpdGNoIChjb2wpIHsKCQkJCQkJCWNhc2UgMDogY2FsZW5kZXIgKz0gIiB1aS1kYXRlcGlja2VyLWdyb3VwLWZpcnN0IjsKCQkJCQkJCQljb3JuZXJDbGFzcyA9ICIgdWktY29ybmVyLSIgKyAoaXNSVEwgPyAicmlnaHQiIDogImxlZnQiKTsgYnJlYWs7CgkJCQkJCQljYXNlIG51bU1vbnRoc1sxXS0xOiBjYWxlbmRlciArPSAiIHVpLWRhdGVwaWNrZXItZ3JvdXAtbGFzdCI7CgkJCQkJCQkJY29ybmVyQ2xhc3MgPSAiIHVpLWNvcm5lci0iICsgKGlzUlRMID8gImxlZnQiIDogInJpZ2h0Iik7IGJyZWFrOwoJCQkJCQkJZGVmYXVsdDogY2FsZW5kZXIgKz0gIiB1aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSI7IGNvcm5lckNsYXNzID0gIiI7IGJyZWFrOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWNhbGVuZGVyICs9ICInPiI7CgkJCQl9CgkJCQljYWxlbmRlciArPSAiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgiICsgY29ybmVyQ2xhc3MgKyAiJz4iICsKCQkJCQkoL2FsbHxsZWZ0Ly50ZXN0KGNvcm5lckNsYXNzKSAmJiByb3cgPT09IDAgPyAoaXNSVEwgPyBuZXh0IDogcHJldikgOiAiIikgKwoJCQkJCSgvYWxsfHJpZ2h0Ly50ZXN0KGNvcm5lckNsYXNzKSAmJiByb3cgPT09IDAgPyAoaXNSVEwgPyBwcmV2IDogbmV4dCkgOiAiIikgKwoJCQkJCXRoaXMuX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyKGluc3QsIGRyYXdNb250aCwgZHJhd1llYXIsIG1pbkRhdGUsIG1heERhdGUsCgkJCQkJcm93ID4gMCB8fCBjb2wgPiAwLCBtb250aE5hbWVzLCBtb250aE5hbWVzU2hvcnQpICsgLy8gZHJhdyBtb250aCBoZWFkZXJzCgkJCQkJIjwvZGl2Pjx0YWJsZSBjbGFzcz0ndWktZGF0ZXBpY2tlci1jYWxlbmRhcic+PHRoZWFkPiIgKwoJCQkJCSI8dHI+IjsKCQkJCXRoZWFkID0gKHNob3dXZWVrID8gIjx0aCBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWNvbCc+IiArIHRoaXMuX2dldChpbnN0LCAid2Vla0hlYWRlciIpICsgIjwvdGg+IiA6ICIiKTsKCQkJCWZvciAoZG93ID0gMDsgZG93IDwgNzsgZG93KyspIHsgLy8gZGF5cyBvZiB0aGUgd2VlawoJCQkJCWRheSA9IChkb3cgKyBmaXJzdERheSkgJSA3OwoJCQkJCXRoZWFkICs9ICI8dGggc2NvcGU9J2NvbCciICsgKChkb3cgKyBmaXJzdERheSArIDYpICUgNyA+PSA1ID8gIiBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWVuZCciIDogIiIpICsgIj4iICsKCQkJCQkJIjxzcGFuIHRpdGxlPSciICsgZGF5TmFtZXNbZGF5XSArICInPiIgKyBkYXlOYW1lc01pbltkYXldICsgIjwvc3Bhbj48L3RoPiI7CgkJCQl9CgkJCQljYWxlbmRlciArPSB0aGVhZCArICI8L3RyPjwvdGhlYWQ+PHRib2R5PiI7CgkJCQlkYXlzSW5Nb250aCA9IHRoaXMuX2dldERheXNJbk1vbnRoKGRyYXdZZWFyLCBkcmF3TW9udGgpOwoJCQkJaWYgKGRyYXdZZWFyID09PSBpbnN0LnNlbGVjdGVkWWVhciAmJiBkcmF3TW9udGggPT09IGluc3Quc2VsZWN0ZWRNb250aCkgewoJCQkJCWluc3Quc2VsZWN0ZWREYXkgPSBNYXRoLm1pbihpbnN0LnNlbGVjdGVkRGF5LCBkYXlzSW5Nb250aCk7CgkJCQl9CgkJCQlsZWFkRGF5cyA9ICh0aGlzLl9nZXRGaXJzdERheU9mTW9udGgoZHJhd1llYXIsIGRyYXdNb250aCkgLSBmaXJzdERheSArIDcpICUgNzsKCQkJCWN1clJvd3MgPSBNYXRoLmNlaWwoKGxlYWREYXlzICsgZGF5c0luTW9udGgpIC8gNyk7IC8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHJvd3MgdG8gZ2VuZXJhdGUKCQkJCW51bVJvd3MgPSAoaXNNdWx0aU1vbnRoID8gdGhpcy5tYXhSb3dzID4gY3VyUm93cyA/IHRoaXMubWF4Um93cyA6IGN1clJvd3MgOiBjdXJSb3dzKTsgLy9JZiBtdWx0aXBsZSBtb250aHMsIHVzZSB0aGUgaGlnaGVyIG51bWJlciBvZiByb3dzIChzZWUgIzcwNDMpCgkJCQl0aGlzLm1heFJvd3MgPSBudW1Sb3dzOwoJCQkJcHJpbnREYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZHJhd1llYXIsIGRyYXdNb250aCwgMSAtIGxlYWREYXlzKSk7CgkJCQlmb3IgKGRSb3cgPSAwOyBkUm93IDwgbnVtUm93czsgZFJvdysrKSB7IC8vIGNyZWF0ZSBkYXRlIHBpY2tlciByb3dzCgkJCQkJY2FsZW5kZXIgKz0gIjx0cj4iOwoJCQkJCXRib2R5ID0gKCFzaG93V2VlayA/ICIiIDogIjx0ZCBjbGFzcz0ndWktZGF0ZXBpY2tlci13ZWVrLWNvbCc+IiArCgkJCQkJCXRoaXMuX2dldChpbnN0LCAiY2FsY3VsYXRlV2VlayIpKHByaW50RGF0ZSkgKyAiPC90ZD4iKTsKCQkJCQlmb3IgKGRvdyA9IDA7IGRvdyA8IDc7IGRvdysrKSB7IC8vIGNyZWF0ZSBkYXRlIHBpY2tlciBkYXlzCgkJCQkJCWRheVNldHRpbmdzID0gKGJlZm9yZVNob3dEYXkgPwoJCQkJCQkJYmVmb3JlU2hvd0RheS5hcHBseSgoaW5zdC5pbnB1dCA/IGluc3QuaW5wdXRbMF0gOiBudWxsKSwgW3ByaW50RGF0ZV0pIDogW3RydWUsICIiXSk7CgkJCQkJCW90aGVyTW9udGggPSAocHJpbnREYXRlLmdldE1vbnRoKCkgIT09IGRyYXdNb250aCk7CgkJCQkJCXVuc2VsZWN0YWJsZSA9IChvdGhlck1vbnRoICYmICFzZWxlY3RPdGhlck1vbnRocykgfHwgIWRheVNldHRpbmdzWzBdIHx8CgkJCQkJCQkobWluRGF0ZSAmJiBwcmludERhdGUgPCBtaW5EYXRlKSB8fCAobWF4RGF0ZSAmJiBwcmludERhdGUgPiBtYXhEYXRlKTsKCQkJCQkJdGJvZHkgKz0gIjx0ZCBjbGFzcz0nIiArCgkJCQkJCQkoKGRvdyArIGZpcnN0RGF5ICsgNikgJSA3ID49IDUgPyAiIHVpLWRhdGVwaWNrZXItd2Vlay1lbmQiIDogIiIpICsgLy8gaGlnaGxpZ2h0IHdlZWtlbmRzCgkJCQkJCQkob3RoZXJNb250aCA/ICIgdWktZGF0ZXBpY2tlci1vdGhlci1tb250aCIgOiAiIikgKyAvLyBoaWdobGlnaHQgZGF5cyBmcm9tIG90aGVyIG1vbnRocwoJCQkJCQkJKChwcmludERhdGUuZ2V0VGltZSgpID09PSBzZWxlY3RlZERhdGUuZ2V0VGltZSgpICYmIGRyYXdNb250aCA9PT0gaW5zdC5zZWxlY3RlZE1vbnRoICYmIGluc3QuX2tleUV2ZW50KSB8fCAvLyB1c2VyIHByZXNzZWQga2V5CgkJCQkJCQkoZGVmYXVsdERhdGUuZ2V0VGltZSgpID09PSBwcmludERhdGUuZ2V0VGltZSgpICYmIGRlZmF1bHREYXRlLmdldFRpbWUoKSA9PT0gc2VsZWN0ZWREYXRlLmdldFRpbWUoKSkgPwoJCQkJCQkJLy8gb3IgZGVmYXVsdERhdGUgaXMgY3VycmVudCBwcmludGVkRGF0ZSBhbmQgZGVmYXVsdERhdGUgaXMgc2VsZWN0ZWREYXRlCgkJCQkJCQkiICIgKyB0aGlzLl9kYXlPdmVyQ2xhc3MgOiAiIikgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5CgkJCQkJCQkodW5zZWxlY3RhYmxlID8gIiAiICsgdGhpcy5fdW5zZWxlY3RhYmxlQ2xhc3MgKyAiIHVpLXN0YXRlLWRpc2FibGVkIjogIiIpICsgIC8vIGhpZ2hsaWdodCB1bnNlbGVjdGFibGUgZGF5cwoJCQkJCQkJKG90aGVyTW9udGggJiYgIXNob3dPdGhlck1vbnRocyA/ICIiIDogIiAiICsgZGF5U2V0dGluZ3NbMV0gKyAvLyBoaWdobGlnaHQgY3VzdG9tIGRhdGVzCgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9PT0gY3VycmVudERhdGUuZ2V0VGltZSgpID8gIiAiICsgdGhpcy5fY3VycmVudENsYXNzIDogIiIpICsgLy8gaGlnaGxpZ2h0IHNlbGVjdGVkIGRheQoJCQkJCQkJKHByaW50RGF0ZS5nZXRUaW1lKCkgPT09IHRvZGF5LmdldFRpbWUoKSA/ICIgdWktZGF0ZXBpY2tlci10b2RheSIgOiAiIikpICsgIiciICsgLy8gaGlnaGxpZ2h0IHRvZGF5IChpZiBkaWZmZXJlbnQpCgkJCQkJCQkoKCFvdGhlck1vbnRoIHx8IHNob3dPdGhlck1vbnRocykgJiYgZGF5U2V0dGluZ3NbMl0gPyAiIHRpdGxlPSciICsgZGF5U2V0dGluZ3NbMl0ucmVwbGFjZSgvJy9nLCAiJiMzOTsiKSArICInIiA6ICIiKSArIC8vIGNlbGwgdGl0bGUKCQkJCQkJCSh1bnNlbGVjdGFibGUgPyAiIiA6ICIgZGF0YS1oYW5kbGVyPSdzZWxlY3REYXknIGRhdGEtZXZlbnQ9J2NsaWNrJyBkYXRhLW1vbnRoPSciICsgcHJpbnREYXRlLmdldE1vbnRoKCkgKyAiJyBkYXRhLXllYXI9JyIgKyBwcmludERhdGUuZ2V0RnVsbFllYXIoKSArICInIikgKyAiPiIgKyAvLyBhY3Rpb25zCgkJCQkJCQkob3RoZXJNb250aCAmJiAhc2hvd090aGVyTW9udGhzID8gIiYjeGEwOyIgOiAvLyBkaXNwbGF5IGZvciBvdGhlciBtb250aHMKCQkJCQkJCSh1bnNlbGVjdGFibGUgPyAiPHNwYW4gY2xhc3M9J3VpLXN0YXRlLWRlZmF1bHQnPiIgKyBwcmludERhdGUuZ2V0RGF0ZSgpICsgIjwvc3Bhbj4iIDogIjxhIGNsYXNzPSd1aS1zdGF0ZS1kZWZhdWx0IiArCgkJCQkJCQkocHJpbnREYXRlLmdldFRpbWUoKSA9PT0gdG9kYXkuZ2V0VGltZSgpID8gIiB1aS1zdGF0ZS1oaWdobGlnaHQiIDogIiIpICsKCQkJCQkJCShwcmludERhdGUuZ2V0VGltZSgpID09PSBjdXJyZW50RGF0ZS5nZXRUaW1lKCkgPyAiIHVpLXN0YXRlLWFjdGl2ZSIgOiAiIikgKyAvLyBoaWdobGlnaHQgc2VsZWN0ZWQgZGF5CgkJCQkJCQkob3RoZXJNb250aCA/ICIgdWktcHJpb3JpdHktc2Vjb25kYXJ5IiA6ICIiKSArIC8vIGRpc3Rpbmd1aXNoIGRhdGVzIGZyb20gb3RoZXIgbW9udGhzCgkJCQkJCQkiJyBocmVmPScjJz4iICsgcHJpbnREYXRlLmdldERhdGUoKSArICI8L2E+IikpICsgIjwvdGQ+IjsgLy8gZGlzcGxheSBzZWxlY3RhYmxlIGRhdGUKCQkJCQkJcHJpbnREYXRlLnNldERhdGUocHJpbnREYXRlLmdldERhdGUoKSArIDEpOwoJCQkJCQlwcmludERhdGUgPSB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChwcmludERhdGUpOwoJCQkJCX0KCQkJCQljYWxlbmRlciArPSB0Ym9keSArICI8L3RyPiI7CgkJCQl9CgkJCQlkcmF3TW9udGgrKzsKCQkJCWlmIChkcmF3TW9udGggPiAxMSkgewoJCQkJCWRyYXdNb250aCA9IDA7CgkJCQkJZHJhd1llYXIrKzsKCQkJCX0KCQkJCWNhbGVuZGVyICs9ICI8L3Rib2R5PjwvdGFibGU+IiArIChpc011bHRpTW9udGggPyAiPC9kaXY+IiArCgkJCQkJCQkoKG51bU1vbnRoc1swXSA+IDAgJiYgY29sID09PSBudW1Nb250aHNbMV0tMSkgPyAiPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1yb3ctYnJlYWsnPjwvZGl2PiIgOiAiIikgOiAiIik7CgkJCQlncm91cCArPSBjYWxlbmRlcjsKCQkJfQoJCQlodG1sICs9IGdyb3VwOwoJCX0KCQlodG1sICs9IGJ1dHRvblBhbmVsOwoJCWluc3QuX2tleUV2ZW50ID0gZmFsc2U7CgkJcmV0dXJuIGh0bWw7Cgl9LAoKCS8qIEdlbmVyYXRlIHRoZSBtb250aCBhbmQgeWVhciBoZWFkZXIuICovCglfZ2VuZXJhdGVNb250aFllYXJIZWFkZXI6IGZ1bmN0aW9uKGluc3QsIGRyYXdNb250aCwgZHJhd1llYXIsIG1pbkRhdGUsIG1heERhdGUsCgkJCXNlY29uZGFyeSwgbW9udGhOYW1lcywgbW9udGhOYW1lc1Nob3J0KSB7CgoJCXZhciBpbk1pblllYXIsIGluTWF4WWVhciwgbW9udGgsIHllYXJzLCB0aGlzWWVhciwgZGV0ZXJtaW5lWWVhciwgeWVhciwgZW5kWWVhciwKCQkJY2hhbmdlTW9udGggPSB0aGlzLl9nZXQoaW5zdCwgImNoYW5nZU1vbnRoIiksCgkJCWNoYW5nZVllYXIgPSB0aGlzLl9nZXQoaW5zdCwgImNoYW5nZVllYXIiKSwKCQkJc2hvd01vbnRoQWZ0ZXJZZWFyID0gdGhpcy5fZ2V0KGluc3QsICJzaG93TW9udGhBZnRlclllYXIiKSwKCQkJaHRtbCA9ICI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLXRpdGxlJz4iLAoJCQltb250aEh0bWwgPSAiIjsKCgkJLy8gbW9udGggc2VsZWN0aW9uCgkJaWYgKHNlY29uZGFyeSB8fCAhY2hhbmdlTW9udGgpIHsKCQkJbW9udGhIdG1sICs9ICI8c3BhbiBjbGFzcz0ndWktZGF0ZXBpY2tlci1tb250aCc+IiArIG1vbnRoTmFtZXNbZHJhd01vbnRoXSArICI8L3NwYW4+IjsKCQl9IGVsc2UgewoJCQlpbk1pblllYXIgPSAobWluRGF0ZSAmJiBtaW5EYXRlLmdldEZ1bGxZZWFyKCkgPT09IGRyYXdZZWFyKTsKCQkJaW5NYXhZZWFyID0gKG1heERhdGUgJiYgbWF4RGF0ZS5nZXRGdWxsWWVhcigpID09PSBkcmF3WWVhcik7CgkJCW1vbnRoSHRtbCArPSAiPHNlbGVjdCBjbGFzcz0ndWktZGF0ZXBpY2tlci1tb250aCcgZGF0YS1oYW5kbGVyPSdzZWxlY3RNb250aCcgZGF0YS1ldmVudD0nY2hhbmdlJz4iOwoJCQlmb3IgKCBtb250aCA9IDA7IG1vbnRoIDwgMTI7IG1vbnRoKyspIHsKCQkJCWlmICgoIWluTWluWWVhciB8fCBtb250aCA+PSBtaW5EYXRlLmdldE1vbnRoKCkpICYmICghaW5NYXhZZWFyIHx8IG1vbnRoIDw9IG1heERhdGUuZ2V0TW9udGgoKSkpIHsKCQkJCQltb250aEh0bWwgKz0gIjxvcHRpb24gdmFsdWU9JyIgKyBtb250aCArICInIiArCgkJCQkJCShtb250aCA9PT0gZHJhd01vbnRoID8gIiBzZWxlY3RlZD0nc2VsZWN0ZWQnIiA6ICIiKSArCgkJCQkJCSI+IiArIG1vbnRoTmFtZXNTaG9ydFttb250aF0gKyAiPC9vcHRpb24+IjsKCQkJCX0KCQkJfQoJCQltb250aEh0bWwgKz0gIjwvc2VsZWN0PiI7CgkJfQoKCQlpZiAoIXNob3dNb250aEFmdGVyWWVhcikgewoJCQlodG1sICs9IG1vbnRoSHRtbCArIChzZWNvbmRhcnkgfHwgIShjaGFuZ2VNb250aCAmJiBjaGFuZ2VZZWFyKSA/ICImI3hhMDsiIDogIiIpOwoJCX0KCgkJLy8geWVhciBzZWxlY3Rpb24KCQlpZiAoICFpbnN0LnllYXJzaHRtbCApIHsKCQkJaW5zdC55ZWFyc2h0bWwgPSAiIjsKCQkJaWYgKHNlY29uZGFyeSB8fCAhY2hhbmdlWWVhcikgewoJCQkJaHRtbCArPSAiPHNwYW4gY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcic+IiArIGRyYXdZZWFyICsgIjwvc3Bhbj4iOwoJCQl9IGVsc2UgewoJCQkJLy8gZGV0ZXJtaW5lIHJhbmdlIG9mIHllYXJzIHRvIGRpc3BsYXkKCQkJCXllYXJzID0gdGhpcy5fZ2V0KGluc3QsICJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpOwoJCQkJdGhpc1llYXIgPSBuZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCk7CgkJCQlkZXRlcm1pbmVZZWFyID0gZnVuY3Rpb24odmFsdWUpIHsKCQkJCQl2YXIgeWVhciA9ICh2YWx1ZS5tYXRjaCgvY1srXC1dLiovKSA/IGRyYXdZZWFyICsgcGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKDEpLCAxMCkgOgoJCQkJCQkodmFsdWUubWF0Y2goL1srXC1dLiovKSA/IHRoaXNZZWFyICsgcGFyc2VJbnQodmFsdWUsIDEwKSA6CgkJCQkJCXBhcnNlSW50KHZhbHVlLCAxMCkpKTsKCQkJCQlyZXR1cm4gKGlzTmFOKHllYXIpID8gdGhpc1llYXIgOiB5ZWFyKTsKCQkJCX07CgkJCQl5ZWFyID0gZGV0ZXJtaW5lWWVhcih5ZWFyc1swXSk7CgkJCQllbmRZZWFyID0gTWF0aC5tYXgoeWVhciwgZGV0ZXJtaW5lWWVhcih5ZWFyc1sxXSB8fCAiIikpOwoJCQkJeWVhciA9IChtaW5EYXRlID8gTWF0aC5tYXgoeWVhciwgbWluRGF0ZS5nZXRGdWxsWWVhcigpKSA6IHllYXIpOwoJCQkJZW5kWWVhciA9IChtYXhEYXRlID8gTWF0aC5taW4oZW5kWWVhciwgbWF4RGF0ZS5nZXRGdWxsWWVhcigpKSA6IGVuZFllYXIpOwoJCQkJaW5zdC55ZWFyc2h0bWwgKz0gIjxzZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcicgZGF0YS1oYW5kbGVyPSdzZWxlY3RZZWFyJyBkYXRhLWV2ZW50PSdjaGFuZ2UnPiI7CgkJCQlmb3IgKDsgeWVhciA8PSBlbmRZZWFyOyB5ZWFyKyspIHsKCQkJCQlpbnN0LnllYXJzaHRtbCArPSAiPG9wdGlvbiB2YWx1ZT0nIiArIHllYXIgKyAiJyIgKwoJCQkJCQkoeWVhciA9PT0gZHJhd1llYXIgPyAiIHNlbGVjdGVkPSdzZWxlY3RlZCciIDogIiIpICsKCQkJCQkJIj4iICsgeWVhciArICI8L29wdGlvbj4iOwoJCQkJfQoJCQkJaW5zdC55ZWFyc2h0bWwgKz0gIjwvc2VsZWN0PiI7CgoJCQkJaHRtbCArPSBpbnN0LnllYXJzaHRtbDsKCQkJCWluc3QueWVhcnNodG1sID0gbnVsbDsKCQkJfQoJCX0KCgkJaHRtbCArPSB0aGlzLl9nZXQoaW5zdCwgInllYXJTdWZmaXgiKTsKCQlpZiAoc2hvd01vbnRoQWZ0ZXJZZWFyKSB7CgkJCWh0bWwgKz0gKHNlY29uZGFyeSB8fCAhKGNoYW5nZU1vbnRoICYmIGNoYW5nZVllYXIpID8gIiYjeGEwOyIgOiAiIikgKyBtb250aEh0bWw7CgkJfQoJCWh0bWwgKz0gIjwvZGl2PiI7IC8vIENsb3NlIGRhdGVwaWNrZXJfaGVhZGVyCgkJcmV0dXJuIGh0bWw7Cgl9LAoKCS8qIEFkanVzdCBvbmUgb2YgdGhlIGRhdGUgc3ViLWZpZWxkcy4gKi8KCV9hZGp1c3RJbnN0RGF0ZTogZnVuY3Rpb24oaW5zdCwgb2Zmc2V0LCBwZXJpb2QpIHsKCQl2YXIgeWVhciA9IGluc3QuZHJhd1llYXIgKyAocGVyaW9kID09PSAiWSIgPyBvZmZzZXQgOiAwKSwKCQkJbW9udGggPSBpbnN0LmRyYXdNb250aCArIChwZXJpb2QgPT09ICJNIiA/IG9mZnNldCA6IDApLAoJCQlkYXkgPSBNYXRoLm1pbihpbnN0LnNlbGVjdGVkRGF5LCB0aGlzLl9nZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpICsgKHBlcmlvZCA9PT0gIkQiID8gb2Zmc2V0IDogMCksCgkJCWRhdGUgPSB0aGlzLl9yZXN0cmljdE1pbk1heChpbnN0LCB0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZSh5ZWFyLCBtb250aCwgZGF5KSkpOwoKCQlpbnN0LnNlbGVjdGVkRGF5ID0gZGF0ZS5nZXREYXRlKCk7CgkJaW5zdC5kcmF3TW9udGggPSBpbnN0LnNlbGVjdGVkTW9udGggPSBkYXRlLmdldE1vbnRoKCk7CgkJaW5zdC5kcmF3WWVhciA9IGluc3Quc2VsZWN0ZWRZZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpOwoJCWlmIChwZXJpb2QgPT09ICJNIiB8fCBwZXJpb2QgPT09ICJZIikgewoJCQl0aGlzLl9ub3RpZnlDaGFuZ2UoaW5zdCk7CgkJfQoJfSwKCgkvKiBFbnN1cmUgYSBkYXRlIGlzIHdpdGhpbiBhbnkgbWluL21heCBib3VuZHMuICovCglfcmVzdHJpY3RNaW5NYXg6IGZ1bmN0aW9uKGluc3QsIGRhdGUpIHsKCQl2YXIgbWluRGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgIm1pbiIpLAoJCQltYXhEYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAibWF4IiksCgkJCW5ld0RhdGUgPSAobWluRGF0ZSAmJiBkYXRlIDwgbWluRGF0ZSA/IG1pbkRhdGUgOiBkYXRlKTsKCQlyZXR1cm4gKG1heERhdGUgJiYgbmV3RGF0ZSA+IG1heERhdGUgPyBtYXhEYXRlIDogbmV3RGF0ZSk7Cgl9LAoKCS8qIE5vdGlmeSBjaGFuZ2Ugb2YgbW9udGgveWVhci4gKi8KCV9ub3RpZnlDaGFuZ2U6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgb25DaGFuZ2UgPSB0aGlzLl9nZXQoaW5zdCwgIm9uQ2hhbmdlTW9udGhZZWFyIik7CgkJaWYgKG9uQ2hhbmdlKSB7CgkJCW9uQ2hhbmdlLmFwcGx5KChpbnN0LmlucHV0ID8gaW5zdC5pbnB1dFswXSA6IG51bGwpLAoJCQkJW2luc3Quc2VsZWN0ZWRZZWFyLCBpbnN0LnNlbGVjdGVkTW9udGggKyAxLCBpbnN0XSk7CgkJfQoJfSwKCgkvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBtb250aHMgdG8gc2hvdy4gKi8KCV9nZXROdW1iZXJPZk1vbnRoczogZnVuY3Rpb24oaW5zdCkgewoJCXZhciBudW1Nb250aHMgPSB0aGlzLl9nZXQoaW5zdCwgIm51bWJlck9mTW9udGhzIik7CgkJcmV0dXJuIChudW1Nb250aHMgPT0gbnVsbCA/IFsxLCAxXSA6ICh0eXBlb2YgbnVtTW9udGhzID09PSAibnVtYmVyIiA/IFsxLCBudW1Nb250aHNdIDogbnVtTW9udGhzKSk7Cgl9LAoKCS8qIERldGVybWluZSB0aGUgY3VycmVudCBtYXhpbXVtIGRhdGUgLSBlbnN1cmUgbm8gdGltZSBjb21wb25lbnRzIGFyZSBzZXQuICovCglfZ2V0TWluTWF4RGF0ZTogZnVuY3Rpb24oaW5zdCwgbWluTWF4KSB7CgkJcmV0dXJuIHRoaXMuX2RldGVybWluZURhdGUoaW5zdCwgdGhpcy5fZ2V0KGluc3QsIG1pbk1heCArICJEYXRlIiksIG51bGwpOwoJfSwKCgkvKiBGaW5kIHRoZSBudW1iZXIgb2YgZGF5cyBpbiBhIGdpdmVuIG1vbnRoLiAqLwoJX2dldERheXNJbk1vbnRoOiBmdW5jdGlvbih5ZWFyLCBtb250aCkgewoJCXJldHVybiAzMiAtIHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoLCAzMikpLmdldERhdGUoKTsKCX0sCgoJLyogRmluZCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIHRoZSBmaXJzdCBvZiBhIG1vbnRoLiAqLwoJX2dldEZpcnN0RGF5T2ZNb250aDogZnVuY3Rpb24oeWVhciwgbW9udGgpIHsKCQlyZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpLmdldERheSgpOwoJfSwKCgkvKiBEZXRlcm1pbmVzIGlmIHdlIHNob3VsZCBhbGxvdyBhICJuZXh0L3ByZXYiIG1vbnRoIGRpc3BsYXkgY2hhbmdlLiAqLwoJX2NhbkFkanVzdE1vbnRoOiBmdW5jdGlvbihpbnN0LCBvZmZzZXQsIGN1clllYXIsIGN1ck1vbnRoKSB7CgkJdmFyIG51bU1vbnRocyA9IHRoaXMuX2dldE51bWJlck9mTW9udGhzKGluc3QpLAoJCQlkYXRlID0gdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoY3VyWWVhciwKCQkJY3VyTW9udGggKyAob2Zmc2V0IDwgMCA/IG9mZnNldCA6IG51bU1vbnRoc1swXSAqIG51bU1vbnRoc1sxXSksIDEpKTsKCgkJaWYgKG9mZnNldCA8IDApIHsKCQkJZGF0ZS5zZXREYXRlKHRoaXMuX2dldERheXNJbk1vbnRoKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpKSk7CgkJfQoJCXJldHVybiB0aGlzLl9pc0luUmFuZ2UoaW5zdCwgZGF0ZSk7Cgl9LAoKCS8qIElzIHRoZSBnaXZlbiBkYXRlIGluIHRoZSBhY2NlcHRlZCByYW5nZT8gKi8KCV9pc0luUmFuZ2U6IGZ1bmN0aW9uKGluc3QsIGRhdGUpIHsKCQl2YXIgeWVhclNwbGl0LCBjdXJyZW50WWVhciwKCQkJbWluRGF0ZSA9IHRoaXMuX2dldE1pbk1heERhdGUoaW5zdCwgIm1pbiIpLAoJCQltYXhEYXRlID0gdGhpcy5fZ2V0TWluTWF4RGF0ZShpbnN0LCAibWF4IiksCgkJCW1pblllYXIgPSBudWxsLAoJCQltYXhZZWFyID0gbnVsbCwKCQkJeWVhcnMgPSB0aGlzLl9nZXQoaW5zdCwgInllYXJSYW5nZSIpOwoJCQlpZiAoeWVhcnMpewoJCQkJeWVhclNwbGl0ID0geWVhcnMuc3BsaXQoIjoiKTsKCQkJCWN1cnJlbnRZZWFyID0gbmV3IERhdGUoKS5nZXRGdWxsWWVhcigpOwoJCQkJbWluWWVhciA9IHBhcnNlSW50KHllYXJTcGxpdFswXSwgMTApOwoJCQkJbWF4WWVhciA9IHBhcnNlSW50KHllYXJTcGxpdFsxXSwgMTApOwoJCQkJaWYgKCB5ZWFyU3BsaXRbMF0ubWF0Y2goL1srXC1dLiovKSApIHsKCQkJCQltaW5ZZWFyICs9IGN1cnJlbnRZZWFyOwoJCQkJfQoJCQkJaWYgKCB5ZWFyU3BsaXRbMV0ubWF0Y2goL1srXC1dLiovKSApIHsKCQkJCQltYXhZZWFyICs9IGN1cnJlbnRZZWFyOwoJCQkJfQoJCQl9CgoJCXJldHVybiAoKCFtaW5EYXRlIHx8IGRhdGUuZ2V0VGltZSgpID49IG1pbkRhdGUuZ2V0VGltZSgpKSAmJgoJCQkoIW1heERhdGUgfHwgZGF0ZS5nZXRUaW1lKCkgPD0gbWF4RGF0ZS5nZXRUaW1lKCkpICYmCgkJCSghbWluWWVhciB8fCBkYXRlLmdldEZ1bGxZZWFyKCkgPj0gbWluWWVhcikgJiYKCQkJKCFtYXhZZWFyIHx8IGRhdGUuZ2V0RnVsbFllYXIoKSA8PSBtYXhZZWFyKSk7Cgl9LAoKCS8qIFByb3ZpZGUgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGZvcm1hdHRpbmcvcGFyc2luZy4gKi8KCV9nZXRGb3JtYXRDb25maWc6IGZ1bmN0aW9uKGluc3QpIHsKCQl2YXIgc2hvcnRZZWFyQ3V0b2ZmID0gdGhpcy5fZ2V0KGluc3QsICJzaG9ydFllYXJDdXRvZmYiKTsKCQlzaG9ydFllYXJDdXRvZmYgPSAodHlwZW9mIHNob3J0WWVhckN1dG9mZiAhPT0gInN0cmluZyIgPyBzaG9ydFllYXJDdXRvZmYgOgoJCQluZXcgRGF0ZSgpLmdldEZ1bGxZZWFyKCkgJSAxMDAgKyBwYXJzZUludChzaG9ydFllYXJDdXRvZmYsIDEwKSk7CgkJcmV0dXJuIHtzaG9ydFllYXJDdXRvZmY6IHNob3J0WWVhckN1dG9mZiwKCQkJZGF5TmFtZXNTaG9ydDogdGhpcy5fZ2V0KGluc3QsICJkYXlOYW1lc1Nob3J0IiksIGRheU5hbWVzOiB0aGlzLl9nZXQoaW5zdCwgImRheU5hbWVzIiksCgkJCW1vbnRoTmFtZXNTaG9ydDogdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzU2hvcnQiKSwgbW9udGhOYW1lczogdGhpcy5fZ2V0KGluc3QsICJtb250aE5hbWVzIil9OwoJfSwKCgkvKiBGb3JtYXQgdGhlIGdpdmVuIGRhdGUgZm9yIGRpc3BsYXkuICovCglfZm9ybWF0RGF0ZTogZnVuY3Rpb24oaW5zdCwgZGF5LCBtb250aCwgeWVhcikgewoJCWlmICghZGF5KSB7CgkJCWluc3QuY3VycmVudERheSA9IGluc3Quc2VsZWN0ZWREYXk7CgkJCWluc3QuY3VycmVudE1vbnRoID0gaW5zdC5zZWxlY3RlZE1vbnRoOwoJCQlpbnN0LmN1cnJlbnRZZWFyID0gaW5zdC5zZWxlY3RlZFllYXI7CgkJfQoJCXZhciBkYXRlID0gKGRheSA/ICh0eXBlb2YgZGF5ID09PSAib2JqZWN0IiA/IGRheSA6CgkJCXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHllYXIsIG1vbnRoLCBkYXkpKSkgOgoJCQl0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShpbnN0LmN1cnJlbnRZZWFyLCBpbnN0LmN1cnJlbnRNb250aCwgaW5zdC5jdXJyZW50RGF5KSkpOwoJCXJldHVybiB0aGlzLmZvcm1hdERhdGUodGhpcy5fZ2V0KGluc3QsICJkYXRlRm9ybWF0IiksIGRhdGUsIHRoaXMuX2dldEZvcm1hdENvbmZpZyhpbnN0KSk7Cgl9Cn0pOwoKLyoKICogQmluZCBob3ZlciBldmVudHMgZm9yIGRhdGVwaWNrZXIgZWxlbWVudHMuCiAqIERvbmUgdmlhIGRlbGVnYXRlIHNvIHRoZSBiaW5kaW5nIG9ubHkgb2NjdXJzIG9uY2UgaW4gdGhlIGxpZmV0aW1lIG9mIHRoZSBwYXJlbnQgZGl2LgogKiBHbG9iYWwgZGF0ZXBpY2tlcl9pbnN0QWN0aXZlLCBzZXQgYnkgX3VwZGF0ZURhdGVwaWNrZXIgYWxsb3dzIHRoZSBoYW5kbGVycyB0byBmaW5kIHRoZWlyIHdheSBiYWNrIHRvIHRoZSBhY3RpdmUgcGlja2VyLgogKi8KZnVuY3Rpb24gZGF0ZXBpY2tlcl9iaW5kSG92ZXIoZHBEaXYpIHsKCXZhciBzZWxlY3RvciA9ICJidXR0b24sIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyLW5leHQsIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIGEiOwoJcmV0dXJuIGRwRGl2LmRlbGVnYXRlKHNlbGVjdG9yLCAibW91c2VvdXQiLCBmdW5jdGlvbigpIHsKCQkJJCh0aGlzKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKTsKCQkJaWYgKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoInVpLWRhdGVwaWNrZXItcHJldiIpICE9PSAtMSkgewoJCQkJJCh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIik7CgkJCX0KCQkJaWYgKHRoaXMuY2xhc3NOYW1lLmluZGV4T2YoInVpLWRhdGVwaWNrZXItbmV4dCIpICE9PSAtMSkgewoJCQkJJCh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIik7CgkJCX0KCQl9KQoJCS5kZWxlZ2F0ZShzZWxlY3RvciwgIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKCl7CgkJCWlmICghJC5kYXRlcGlja2VyLl9pc0Rpc2FibGVkRGF0ZXBpY2tlciggZGF0ZXBpY2tlcl9pbnN0QWN0aXZlLmlubGluZSA/IGRwRGl2LnBhcmVudCgpWzBdIDogZGF0ZXBpY2tlcl9pbnN0QWN0aXZlLmlucHV0WzBdKSkgewoJCQkJJCh0aGlzKS5wYXJlbnRzKCIudWktZGF0ZXBpY2tlci1jYWxlbmRhciIpLmZpbmQoImEiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtaG92ZXIiKTsKCQkJCSQodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIik7CgkJCQlpZiAodGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1wcmV2IikgIT09IC0xKSB7CgkJCQkJJCh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIik7CgkJCQl9CgkJCQlpZiAodGhpcy5jbGFzc05hbWUuaW5kZXhPZigidWktZGF0ZXBpY2tlci1uZXh0IikgIT09IC0xKSB7CgkJCQkJJCh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIik7CgkJCQl9CgkJCX0KCQl9KTsKfQoKLyogalF1ZXJ5IGV4dGVuZCBub3cgaWdub3JlcyBudWxscyEgKi8KZnVuY3Rpb24gZGF0ZXBpY2tlcl9leHRlbmRSZW1vdmUodGFyZ2V0LCBwcm9wcykgewoJJC5leHRlbmQodGFyZ2V0LCBwcm9wcyk7Cglmb3IgKHZhciBuYW1lIGluIHByb3BzKSB7CgkJaWYgKHByb3BzW25hbWVdID09IG51bGwpIHsKCQkJdGFyZ2V0W25hbWVdID0gcHJvcHNbbmFtZV07CgkJfQoJfQoJcmV0dXJuIHRhcmdldDsKfQoKLyogSW52b2tlIHRoZSBkYXRlcGlja2VyIGZ1bmN0aW9uYWxpdHkuCiAgIEBwYXJhbSAgb3B0aW9ucyAgc3RyaW5nIC0gYSBjb21tYW5kLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGFkZGl0aW9uYWwgcGFyYW1ldGVycyBvcgoJCQkJCU9iamVjdCAtIHNldHRpbmdzIGZvciBhdHRhY2hpbmcgbmV3IGRhdGVwaWNrZXIgZnVuY3Rpb25hbGl0eQogICBAcmV0dXJuICBqUXVlcnkgb2JqZWN0ICovCiQuZm4uZGF0ZXBpY2tlciA9IGZ1bmN0aW9uKG9wdGlvbnMpewoKCS8qIFZlcmlmeSBhbiBlbXB0eSBjb2xsZWN0aW9uIHdhc24ndCBwYXNzZWQgLSBGaXhlcyAjNjk3NiAqLwoJaWYgKCAhdGhpcy5sZW5ndGggKSB7CgkJcmV0dXJuIHRoaXM7Cgl9CgoJLyogSW5pdGlhbGlzZSB0aGUgZGF0ZSBwaWNrZXIuICovCglpZiAoISQuZGF0ZXBpY2tlci5pbml0aWFsaXplZCkgewoJCSQoZG9jdW1lbnQpLm1vdXNlZG93bigkLmRhdGVwaWNrZXIuX2NoZWNrRXh0ZXJuYWxDbGljayk7CgkJJC5kYXRlcGlja2VyLmluaXRpYWxpemVkID0gdHJ1ZTsKCX0KCgkvKiBBcHBlbmQgZGF0ZXBpY2tlciBtYWluIGNvbnRhaW5lciB0byBib2R5IGlmIG5vdCBleGlzdC4gKi8KCWlmICgkKCIjIiskLmRhdGVwaWNrZXIuX21haW5EaXZJZCkubGVuZ3RoID09PSAwKSB7CgkJJCgiYm9keSIpLmFwcGVuZCgkLmRhdGVwaWNrZXIuZHBEaXYpOwoJfQoKCXZhciBvdGhlckFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpOwoJaWYgKHR5cGVvZiBvcHRpb25zID09PSAic3RyaW5nIiAmJiAob3B0aW9ucyA9PT0gImlzRGlzYWJsZWQiIHx8IG9wdGlvbnMgPT09ICJnZXREYXRlIiB8fCBvcHRpb25zID09PSAid2lkZ2V0IikpIHsKCQlyZXR1cm4gJC5kYXRlcGlja2VyWyJfIiArIG9wdGlvbnMgKyAiRGF0ZXBpY2tlciJdLgoJCQlhcHBseSgkLmRhdGVwaWNrZXIsIFt0aGlzWzBdXS5jb25jYXQob3RoZXJBcmdzKSk7Cgl9CglpZiAob3B0aW9ucyA9PT0gIm9wdGlvbiIgJiYgYXJndW1lbnRzLmxlbmd0aCA9PT0gMiAmJiB0eXBlb2YgYXJndW1lbnRzWzFdID09PSAic3RyaW5nIikgewoJCXJldHVybiAkLmRhdGVwaWNrZXJbIl8iICsgb3B0aW9ucyArICJEYXRlcGlja2VyIl0uCgkJCWFwcGx5KCQuZGF0ZXBpY2tlciwgW3RoaXNbMF1dLmNvbmNhdChvdGhlckFyZ3MpKTsKCX0KCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CgkJdHlwZW9mIG9wdGlvbnMgPT09ICJzdHJpbmciID8KCQkJJC5kYXRlcGlja2VyWyJfIiArIG9wdGlvbnMgKyAiRGF0ZXBpY2tlciJdLgoJCQkJYXBwbHkoJC5kYXRlcGlja2VyLCBbdGhpc10uY29uY2F0KG90aGVyQXJncykpIDoKCQkJJC5kYXRlcGlja2VyLl9hdHRhY2hEYXRlcGlja2VyKHRoaXMsIG9wdGlvbnMpOwoJfSk7Cn07CgokLmRhdGVwaWNrZXIgPSBuZXcgRGF0ZXBpY2tlcigpOyAvLyBzaW5nbGV0b24gaW5zdGFuY2UKJC5kYXRlcGlja2VyLmluaXRpYWxpemVkID0gZmFsc2U7CiQuZGF0ZXBpY2tlci51dWlkID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiQuZGF0ZXBpY2tlci52ZXJzaW9uID0gIjEuMTEuMCI7Cgp2YXIgZGF0ZXBpY2tlciA9ICQuZGF0ZXBpY2tlcjsKCgovKiEKICogalF1ZXJ5IFVJIERpYWxvZyAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9kaWFsb2cvCiAqLwoKCnZhciBkaWFsb2cgPSAkLndpZGdldCggInVpLmRpYWxvZyIsIHsKCXZlcnNpb246ICIxLjExLjAiLAoJb3B0aW9uczogewoJCWFwcGVuZFRvOiAiYm9keSIsCgkJYXV0b09wZW46IHRydWUsCgkJYnV0dG9uczogW10sCgkJY2xvc2VPbkVzY2FwZTogdHJ1ZSwKCQljbG9zZVRleHQ6ICJDbG9zZSIsCgkJZGlhbG9nQ2xhc3M6ICIiLAoJCWRyYWdnYWJsZTogdHJ1ZSwKCQloaWRlOiBudWxsLAoJCWhlaWdodDogImF1dG8iLAoJCW1heEhlaWdodDogbnVsbCwKCQltYXhXaWR0aDogbnVsbCwKCQltaW5IZWlnaHQ6IDE1MCwKCQltaW5XaWR0aDogMTUwLAoJCW1vZGFsOiBmYWxzZSwKCQlwb3NpdGlvbjogewoJCQlteTogImNlbnRlciIsCgkJCWF0OiAiY2VudGVyIiwKCQkJb2Y6IHdpbmRvdywKCQkJY29sbGlzaW9uOiAiZml0IiwKCQkJLy8gRW5zdXJlIHRoZSB0aXRsZWJhciBpcyBhbHdheXMgdmlzaWJsZQoJCQl1c2luZzogZnVuY3Rpb24oIHBvcyApIHsKCQkJCXZhciB0b3BPZmZzZXQgPSAkKCB0aGlzICkuY3NzKCBwb3MgKS5vZmZzZXQoKS50b3A7CgkJCQlpZiAoIHRvcE9mZnNldCA8IDAgKSB7CgkJCQkJJCggdGhpcyApLmNzcyggInRvcCIsIHBvcy50b3AgLSB0b3BPZmZzZXQgKTsKCQkJCX0KCQkJfQoJCX0sCgkJcmVzaXphYmxlOiB0cnVlLAoJCXNob3c6IG51bGwsCgkJdGl0bGU6IG51bGwsCgkJd2lkdGg6IDMwMCwKCgkJLy8gY2FsbGJhY2tzCgkJYmVmb3JlQ2xvc2U6IG51bGwsCgkJY2xvc2U6IG51bGwsCgkJZHJhZzogbnVsbCwKCQlkcmFnU3RhcnQ6IG51bGwsCgkJZHJhZ1N0b3A6IG51bGwsCgkJZm9jdXM6IG51bGwsCgkJb3BlbjogbnVsbCwKCQlyZXNpemU6IG51bGwsCgkJcmVzaXplU3RhcnQ6IG51bGwsCgkJcmVzaXplU3RvcDogbnVsbAoJfSwKCglzaXplUmVsYXRlZE9wdGlvbnM6IHsKCQlidXR0b25zOiB0cnVlLAoJCWhlaWdodDogdHJ1ZSwKCQltYXhIZWlnaHQ6IHRydWUsCgkJbWF4V2lkdGg6IHRydWUsCgkJbWluSGVpZ2h0OiB0cnVlLAoJCW1pbldpZHRoOiB0cnVlLAoJCXdpZHRoOiB0cnVlCgl9LAoKCXJlc2l6YWJsZVJlbGF0ZWRPcHRpb25zOiB7CgkJbWF4SGVpZ2h0OiB0cnVlLAoJCW1heFdpZHRoOiB0cnVlLAoJCW1pbkhlaWdodDogdHJ1ZSwKCQltaW5XaWR0aDogdHJ1ZQoJfSwKCglfY3JlYXRlOiBmdW5jdGlvbigpIHsKCQl0aGlzLm9yaWdpbmFsQ3NzID0gewoJCQlkaXNwbGF5OiB0aGlzLmVsZW1lbnRbIDAgXS5zdHlsZS5kaXNwbGF5LAoJCQl3aWR0aDogdGhpcy5lbGVtZW50WyAwIF0uc3R5bGUud2lkdGgsCgkJCW1pbkhlaWdodDogdGhpcy5lbGVtZW50WyAwIF0uc3R5bGUubWluSGVpZ2h0LAoJCQltYXhIZWlnaHQ6IHRoaXMuZWxlbWVudFsgMCBdLnN0eWxlLm1heEhlaWdodCwKCQkJaGVpZ2h0OiB0aGlzLmVsZW1lbnRbIDAgXS5zdHlsZS5oZWlnaHQKCQl9OwoJCXRoaXMub3JpZ2luYWxQb3NpdGlvbiA9IHsKCQkJcGFyZW50OiB0aGlzLmVsZW1lbnQucGFyZW50KCksCgkJCWluZGV4OiB0aGlzLmVsZW1lbnQucGFyZW50KCkuY2hpbGRyZW4oKS5pbmRleCggdGhpcy5lbGVtZW50ICkKCQl9OwoJCXRoaXMub3JpZ2luYWxUaXRsZSA9IHRoaXMuZWxlbWVudC5hdHRyKCAidGl0bGUiICk7CgkJdGhpcy5vcHRpb25zLnRpdGxlID0gdGhpcy5vcHRpb25zLnRpdGxlIHx8IHRoaXMub3JpZ2luYWxUaXRsZTsKCgkJdGhpcy5fY3JlYXRlV3JhcHBlcigpOwoKCQl0aGlzLmVsZW1lbnQKCQkJLnNob3coKQoJCQkucmVtb3ZlQXR0ciggInRpdGxlIiApCgkJCS5hZGRDbGFzcyggInVpLWRpYWxvZy1jb250ZW50IHVpLXdpZGdldC1jb250ZW50IiApCgkJCS5hcHBlbmRUbyggdGhpcy51aURpYWxvZyApOwoKCQl0aGlzLl9jcmVhdGVUaXRsZWJhcigpOwoJCXRoaXMuX2NyZWF0ZUJ1dHRvblBhbmUoKTsKCgkJaWYgKCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlICYmICQuZm4uZHJhZ2dhYmxlICkgewoJCQl0aGlzLl9tYWtlRHJhZ2dhYmxlKCk7CgkJfQoJCWlmICggdGhpcy5vcHRpb25zLnJlc2l6YWJsZSAmJiAkLmZuLnJlc2l6YWJsZSApIHsKCQkJdGhpcy5fbWFrZVJlc2l6YWJsZSgpOwoJCX0KCgkJdGhpcy5faXNPcGVuID0gZmFsc2U7CgoJCXRoaXMuX3RyYWNrRm9jdXMoKTsKCX0sCgoJX2luaXQ6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy5vcHRpb25zLmF1dG9PcGVuICkgewoJCQl0aGlzLm9wZW4oKTsKCQl9Cgl9LAoKCV9hcHBlbmRUbzogZnVuY3Rpb24oKSB7CgkJdmFyIGVsZW1lbnQgPSB0aGlzLm9wdGlvbnMuYXBwZW5kVG87CgkJaWYgKCBlbGVtZW50ICYmIChlbGVtZW50LmpxdWVyeSB8fCBlbGVtZW50Lm5vZGVUeXBlKSApIHsKCQkJcmV0dXJuICQoIGVsZW1lbnQgKTsKCQl9CgkJcmV0dXJuIHRoaXMuZG9jdW1lbnQuZmluZCggZWxlbWVudCB8fCAiYm9keSIgKS5lcSggMCApOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdmFyIG5leHQsCgkJCW9yaWdpbmFsUG9zaXRpb24gPSB0aGlzLm9yaWdpbmFsUG9zaXRpb247CgoJCXRoaXMuX2Rlc3Ryb3lPdmVybGF5KCk7CgoJCXRoaXMuZWxlbWVudAoJCQkucmVtb3ZlVW5pcXVlSWQoKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIgKQoJCQkuY3NzKCB0aGlzLm9yaWdpbmFsQ3NzICkKCQkJLy8gV2l0aG91dCBkZXRhY2hpbmcgZmlyc3QsIHRoZSBmb2xsb3dpbmcgYmVjb21lcyByZWFsbHkgc2xvdwoJCQkuZGV0YWNoKCk7CgoJCXRoaXMudWlEaWFsb2cuc3RvcCggdHJ1ZSwgdHJ1ZSApLnJlbW92ZSgpOwoKCQlpZiAoIHRoaXMub3JpZ2luYWxUaXRsZSApIHsKCQkJdGhpcy5lbGVtZW50LmF0dHIoICJ0aXRsZSIsIHRoaXMub3JpZ2luYWxUaXRsZSApOwoJCX0KCgkJbmV4dCA9IG9yaWdpbmFsUG9zaXRpb24ucGFyZW50LmNoaWxkcmVuKCkuZXEoIG9yaWdpbmFsUG9zaXRpb24uaW5kZXggKTsKCQkvLyBEb24ndCB0cnkgdG8gcGxhY2UgdGhlIGRpYWxvZyBuZXh0IHRvIGl0c2VsZiAoIzg2MTMpCgkJaWYgKCBuZXh0Lmxlbmd0aCAmJiBuZXh0WyAwIF0gIT09IHRoaXMuZWxlbWVudFsgMCBdICkgewoJCQluZXh0LmJlZm9yZSggdGhpcy5lbGVtZW50ICk7CgkJfSBlbHNlIHsKCQkJb3JpZ2luYWxQb3NpdGlvbi5wYXJlbnQuYXBwZW5kKCB0aGlzLmVsZW1lbnQgKTsKCQl9Cgl9LAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudWlEaWFsb2c7Cgl9LAoKCWRpc2FibGU6ICQubm9vcCwKCWVuYWJsZTogJC5ub29wLAoKCWNsb3NlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIGFjdGl2ZUVsZW1lbnQsCgkJCXRoYXQgPSB0aGlzOwoKCQlpZiAoICF0aGlzLl9pc09wZW4gfHwgdGhpcy5fdHJpZ2dlciggImJlZm9yZUNsb3NlIiwgZXZlbnQgKSA9PT0gZmFsc2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMuX2lzT3BlbiA9IGZhbHNlOwoJCXRoaXMuX2ZvY3VzZWRFbGVtZW50ID0gbnVsbDsKCQl0aGlzLl9kZXN0cm95T3ZlcmxheSgpOwoJCXRoaXMuX3VudHJhY2tJbnN0YW5jZSgpOwoKCQlpZiAoICF0aGlzLm9wZW5lci5maWx0ZXIoICI6Zm9jdXNhYmxlIiApLmZvY3VzKCkubGVuZ3RoICkgewoKCQkJLy8gc3VwcG9ydDogSUU5CgkJCS8vIElFOSB0aHJvd3MgYW4gIlVuc3BlY2lmaWVkIGVycm9yIiBhY2Nlc3NpbmcgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBmcm9tIGFuIDxpZnJhbWU+CgkJCXRyeSB7CgkJCQlhY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1bWVudFsgMCBdLmFjdGl2ZUVsZW1lbnQ7CgoJCQkJLy8gU3VwcG9ydDogSUU5LCBJRTEwCgkJCQkvLyBJZiB0aGUgPGJvZHk+IGlzIGJsdXJyZWQsIElFIHdpbGwgc3dpdGNoIHdpbmRvd3MsIHNlZSAjNDUyMAoJCQkJaWYgKCBhY3RpdmVFbGVtZW50ICYmIGFjdGl2ZUVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gImJvZHkiICkgewoKCQkJCQkvLyBIaWRpbmcgYSBmb2N1c2VkIGVsZW1lbnQgZG9lc24ndCB0cmlnZ2VyIGJsdXIgaW4gV2ViS2l0CgkJCQkJLy8gc28gaW4gY2FzZSB3ZSBoYXZlIG5vdGhpbmcgdG8gZm9jdXMgb24sIGV4cGxpY2l0bHkgYmx1ciB0aGUgYWN0aXZlIGVsZW1lbnQKCQkJCQkvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDcxODIKCQkJCQkkKCBhY3RpdmVFbGVtZW50ICkuYmx1cigpOwoJCQkJfQoJCQl9IGNhdGNoICggZXJyb3IgKSB7fQoJCX0KCgkJdGhpcy5faGlkZSggdGhpcy51aURpYWxvZywgdGhpcy5vcHRpb25zLmhpZGUsIGZ1bmN0aW9uKCkgewoJCQl0aGF0Ll90cmlnZ2VyKCAiY2xvc2UiLCBldmVudCApOwoJCX0pOwoJfSwKCglpc09wZW46IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9pc09wZW47Cgl9LAoKCW1vdmVUb1RvcDogZnVuY3Rpb24oKSB7CgkJdGhpcy5fbW92ZVRvVG9wKCk7Cgl9LAoKCV9tb3ZlVG9Ub3A6IGZ1bmN0aW9uKCBldmVudCwgc2lsZW50ICkgewoJCXZhciBtb3ZlZCA9IGZhbHNlLAoJCQl6SW5kaWNpZXMgPSB0aGlzLnVpRGlhbG9nLnNpYmxpbmdzKCAiLnVpLWZyb250OnZpc2libGUiICkubWFwKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICskKCB0aGlzICkuY3NzKCAiei1pbmRleCIgKTsKCQkJfSkuZ2V0KCksCgkJCXpJbmRleE1heCA9IE1hdGgubWF4LmFwcGx5KCBudWxsLCB6SW5kaWNpZXMgKTsKCgkJaWYgKCB6SW5kZXhNYXggPj0gK3RoaXMudWlEaWFsb2cuY3NzKCAiei1pbmRleCIgKSApIHsKCQkJdGhpcy51aURpYWxvZy5jc3MoICJ6LWluZGV4IiwgekluZGV4TWF4ICsgMSApOwoJCQltb3ZlZCA9IHRydWU7CgkJfQoKCQlpZiAoIG1vdmVkICYmICFzaWxlbnQgKSB7CgkJCXRoaXMuX3RyaWdnZXIoICJmb2N1cyIsIGV2ZW50ICk7CgkJfQoJCXJldHVybiBtb3ZlZDsKCX0sCgoJb3BlbjogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoJCWlmICggdGhpcy5faXNPcGVuICkgewoJCQlpZiAoIHRoaXMuX21vdmVUb1RvcCgpICkgewoJCQkJdGhpcy5fZm9jdXNUYWJiYWJsZSgpOwoJCQl9CgkJCXJldHVybjsKCQl9CgoJCXRoaXMuX2lzT3BlbiA9IHRydWU7CgkJdGhpcy5vcGVuZXIgPSAkKCB0aGlzLmRvY3VtZW50WyAwIF0uYWN0aXZlRWxlbWVudCApOwoKCQl0aGlzLl9zaXplKCk7CgkJdGhpcy5fcG9zaXRpb24oKTsKCQl0aGlzLl9jcmVhdGVPdmVybGF5KCk7CgkJdGhpcy5fbW92ZVRvVG9wKCBudWxsLCB0cnVlICk7CgkJdGhpcy5fc2hvdyggdGhpcy51aURpYWxvZywgdGhpcy5vcHRpb25zLnNob3csIGZ1bmN0aW9uKCkgewoJCQl0aGF0Ll9mb2N1c1RhYmJhYmxlKCk7CgkJCXRoYXQuX3RyaWdnZXIoICJmb2N1cyIgKTsKCQl9KTsKCgkJdGhpcy5fdHJpZ2dlciggIm9wZW4iICk7Cgl9LAoKCV9mb2N1c1RhYmJhYmxlOiBmdW5jdGlvbigpIHsKCQkvLyBTZXQgZm9jdXMgdG8gdGhlIGZpcnN0IG1hdGNoOgoJCS8vIDEuIEFuIGVsZW1lbnQgdGhhdCB3YXMgZm9jdXNlZCBwcmV2aW91c2x5CgkJLy8gMi4gRmlyc3QgZWxlbWVudCBpbnNpZGUgdGhlIGRpYWxvZyBtYXRjaGluZyBbYXV0b2ZvY3VzXQoJCS8vIDMuIFRhYmJhYmxlIGVsZW1lbnQgaW5zaWRlIHRoZSBjb250ZW50IGVsZW1lbnQKCQkvLyA0LiBUYWJiYWJsZSBlbGVtZW50IGluc2lkZSB0aGUgYnV0dG9ucGFuZQoJCS8vIDUuIFRoZSBjbG9zZSBidXR0b24KCQkvLyA2LiBUaGUgZGlhbG9nIGl0c2VsZgoJCXZhciBoYXNGb2N1cyA9IHRoaXMuX2ZvY3VzZWRFbGVtZW50OwoJCWlmICggIWhhc0ZvY3VzICkgewoJCQloYXNGb2N1cyA9IHRoaXMuZWxlbWVudC5maW5kKCAiW2F1dG9mb2N1c10iICk7CgkJfQoJCWlmICggIWhhc0ZvY3VzLmxlbmd0aCApIHsKCQkJaGFzRm9jdXMgPSB0aGlzLmVsZW1lbnQuZmluZCggIjp0YWJiYWJsZSIgKTsKCQl9CgkJaWYgKCAhaGFzRm9jdXMubGVuZ3RoICkgewoJCQloYXNGb2N1cyA9IHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmZpbmQoICI6dGFiYmFibGUiICk7CgkJfQoJCWlmICggIWhhc0ZvY3VzLmxlbmd0aCApIHsKCQkJaGFzRm9jdXMgPSB0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZS5maWx0ZXIoICI6dGFiYmFibGUiICk7CgkJfQoJCWlmICggIWhhc0ZvY3VzLmxlbmd0aCApIHsKCQkJaGFzRm9jdXMgPSB0aGlzLnVpRGlhbG9nOwoJCX0KCQloYXNGb2N1cy5lcSggMCApLmZvY3VzKCk7Cgl9LAoKCV9rZWVwRm9jdXM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlmdW5jdGlvbiBjaGVja0ZvY3VzKCkgewoJCQl2YXIgYWN0aXZlRWxlbWVudCA9IHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCwKCQkJCWlzQWN0aXZlID0gdGhpcy51aURpYWxvZ1swXSA9PT0gYWN0aXZlRWxlbWVudCB8fAoJCQkJCSQuY29udGFpbnMoIHRoaXMudWlEaWFsb2dbMF0sIGFjdGl2ZUVsZW1lbnQgKTsKCQkJaWYgKCAhaXNBY3RpdmUgKSB7CgkJCQl0aGlzLl9mb2N1c1RhYmJhYmxlKCk7CgkJCX0KCQl9CgkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQljaGVja0ZvY3VzLmNhbGwoIHRoaXMgKTsKCQkvLyBzdXBwb3J0OiBJRQoJCS8vIElFIDw9IDggZG9lc24ndCBwcmV2ZW50IG1vdmluZyBmb2N1cyBldmVuIHdpdGggZXZlbnQucHJldmVudERlZmF1bHQoKQoJCS8vIHNvIHdlIGNoZWNrIGFnYWluIGxhdGVyCgkJdGhpcy5fZGVsYXkoIGNoZWNrRm9jdXMgKTsKCX0sCgoJX2NyZWF0ZVdyYXBwZXI6IGZ1bmN0aW9uKCkgewoJCXRoaXMudWlEaWFsb2cgPSAkKCI8ZGl2PiIpCgkJCS5hZGRDbGFzcyggInVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS1mcm9udCAiICsKCQkJCXRoaXMub3B0aW9ucy5kaWFsb2dDbGFzcyApCgkJCS5oaWRlKCkKCQkJLmF0dHIoewoJCQkJLy8gU2V0dGluZyB0YWJJbmRleCBtYWtlcyB0aGUgZGl2IGZvY3VzYWJsZQoJCQkJdGFiSW5kZXg6IC0xLAoJCQkJcm9sZTogImRpYWxvZyIKCQkJfSkKCQkJLmFwcGVuZFRvKCB0aGlzLl9hcHBlbmRUbygpICk7CgoJCXRoaXMuX29uKCB0aGlzLnVpRGlhbG9nLCB7CgkJCWtleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggdGhpcy5vcHRpb25zLmNsb3NlT25Fc2NhcGUgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICYmIGV2ZW50LmtleUNvZGUgJiYKCQkJCQkJZXZlbnQua2V5Q29kZSA9PT0gJC51aS5rZXlDb2RlLkVTQ0FQRSApIHsKCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCXRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJCQkJcmV0dXJuOwoJCQkJfQoKCQkJCS8vIHByZXZlbnQgdGFiYmluZyBvdXQgb2YgZGlhbG9ncwoJCQkJaWYgKCBldmVudC5rZXlDb2RlICE9PSAkLnVpLmtleUNvZGUuVEFCIHx8IGV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCXZhciB0YWJiYWJsZXMgPSB0aGlzLnVpRGlhbG9nLmZpbmQoICI6dGFiYmFibGUiICksCgkJCQkJZmlyc3QgPSB0YWJiYWJsZXMuZmlsdGVyKCAiOmZpcnN0IiApLAoJCQkJCWxhc3QgPSB0YWJiYWJsZXMuZmlsdGVyKCAiOmxhc3QiICk7CgoJCQkJaWYgKCAoIGV2ZW50LnRhcmdldCA9PT0gbGFzdFswXSB8fCBldmVudC50YXJnZXQgPT09IHRoaXMudWlEaWFsb2dbMF0gKSAmJiAhZXZlbnQuc2hpZnRLZXkgKSB7CgkJCQkJdGhpcy5fZGVsYXkoZnVuY3Rpb24oKSB7CgkJCQkJCWZpcnN0LmZvY3VzKCk7CgkJCQkJfSk7CgkJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCX0gZWxzZSBpZiAoICggZXZlbnQudGFyZ2V0ID09PSBmaXJzdFswXSB8fCBldmVudC50YXJnZXQgPT09IHRoaXMudWlEaWFsb2dbMF0gKSAmJiBldmVudC5zaGlmdEtleSApIHsKCQkJCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJCQkJbGFzdC5mb2N1cygpOwoJCQkJCX0pOwoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQl9CgkJCX0sCgkJCW1vdXNlZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCB0aGlzLl9tb3ZlVG9Ub3AoIGV2ZW50ICkgKSB7CgkJCQkJdGhpcy5fZm9jdXNUYWJiYWJsZSgpOwoJCQkJfQoJCQl9CgkJfSk7CgoJCS8vIFdlIGFzc3VtZSB0aGF0IGFueSBleGlzdGluZyBhcmlhLWRlc2NyaWJlZGJ5IGF0dHJpYnV0ZSBtZWFucwoJCS8vIHRoYXQgdGhlIGRpYWxvZyBjb250ZW50IGlzIG1hcmtlZCB1cCBwcm9wZXJseQoJCS8vIG90aGVyd2lzZSB3ZSBicnV0ZSBmb3JjZSB0aGUgY29udGVudCBhcyB0aGUgZGVzY3JpcHRpb24KCQlpZiAoICF0aGlzLmVsZW1lbnQuZmluZCggIlthcmlhLWRlc2NyaWJlZGJ5XSIgKS5sZW5ndGggKSB7CgkJCXRoaXMudWlEaWFsb2cuYXR0cih7CgkJCQkiYXJpYS1kZXNjcmliZWRieSI6IHRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmF0dHIoICJpZCIgKQoJCQl9KTsKCQl9Cgl9LAoKCV9jcmVhdGVUaXRsZWJhcjogZnVuY3Rpb24oKSB7CgkJdmFyIHVpRGlhbG9nVGl0bGU7CgoJCXRoaXMudWlEaWFsb2dUaXRsZWJhciA9ICQoICI8ZGl2PiIgKQoJCQkuYWRkQ2xhc3MoICJ1aS1kaWFsb2ctdGl0bGViYXIgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLWhlbHBlci1jbGVhcmZpeCIgKQoJCQkucHJlcGVuZFRvKCB0aGlzLnVpRGlhbG9nICk7CgkJdGhpcy5fb24oIHRoaXMudWlEaWFsb2dUaXRsZWJhciwgewoJCQltb3VzZWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCS8vIERvbid0IHByZXZlbnQgY2xpY2sgb24gY2xvc2UgYnV0dG9uICgjODgzOCkKCQkJCS8vIEZvY3VzaW5nIGEgZGlhbG9nIHRoYXQgaXMgcGFydGlhbGx5IHNjcm9sbGVkIG91dCBvZiB2aWV3CgkJCQkvLyBjYXVzZXMgdGhlIGJyb3dzZXIgdG8gc2Nyb2xsIGl0IGludG8gdmlldywgcHJldmVudGluZyB0aGUgY2xpY2sgZXZlbnQKCQkJCWlmICggISQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoICIudWktZGlhbG9nLXRpdGxlYmFyLWNsb3NlIiApICkgewoJCQkJCS8vIERpYWxvZyBpc24ndCBnZXR0aW5nIGZvY3VzIHdoZW4gZHJhZ2dpbmcgKCM4MDYzKQoJCQkJCXRoaXMudWlEaWFsb2cuZm9jdXMoKTsKCQkJCX0KCQkJfQoJCX0pOwoKCQkvLyBzdXBwb3J0OiBJRQoJCS8vIFVzZSB0eXBlPSJidXR0b24iIHRvIHByZXZlbnQgZW50ZXIga2V5cHJlc3NlcyBpbiB0ZXh0Ym94ZXMgZnJvbSBjbG9zaW5nIHRoZQoJCS8vIGRpYWxvZyBpbiBJRSAoIzkzMTIpCgkJdGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2UgPSAkKCAiPGJ1dHRvbiB0eXBlPSdidXR0b24nPjwvYnV0dG9uPiIgKQoJCQkuYnV0dG9uKHsKCQkJCWxhYmVsOiB0aGlzLm9wdGlvbnMuY2xvc2VUZXh0LAoJCQkJaWNvbnM6IHsKCQkJCQlwcmltYXJ5OiAidWktaWNvbi1jbG9zZXRoaWNrIgoJCQkJfSwKCQkJCXRleHQ6IGZhbHNlCgkJCX0pCgkJCS5hZGRDbGFzcyggInVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIgKQoJCQkuYXBwZW5kVG8oIHRoaXMudWlEaWFsb2dUaXRsZWJhciApOwoJCXRoaXMuX29uKCB0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZSwgewoJCQljbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCXRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJCX0KCQl9KTsKCgkJdWlEaWFsb2dUaXRsZSA9ICQoICI8c3Bhbj4iICkKCQkJLnVuaXF1ZUlkKCkKCQkJLmFkZENsYXNzKCAidWktZGlhbG9nLXRpdGxlIiApCgkJCS5wcmVwZW5kVG8oIHRoaXMudWlEaWFsb2dUaXRsZWJhciApOwoJCXRoaXMuX3RpdGxlKCB1aURpYWxvZ1RpdGxlICk7CgoJCXRoaXMudWlEaWFsb2cuYXR0cih7CgkJCSJhcmlhLWxhYmVsbGVkYnkiOiB1aURpYWxvZ1RpdGxlLmF0dHIoICJpZCIgKQoJCX0pOwoJfSwKCglfdGl0bGU6IGZ1bmN0aW9uKCB0aXRsZSApIHsKCQlpZiAoICF0aGlzLm9wdGlvbnMudGl0bGUgKSB7CgkJCXRpdGxlLmh0bWwoICImIzE2MDsiICk7CgkJfQoJCXRpdGxlLnRleHQoIHRoaXMub3B0aW9ucy50aXRsZSApOwoJfSwKCglfY3JlYXRlQnV0dG9uUGFuZTogZnVuY3Rpb24oKSB7CgkJdGhpcy51aURpYWxvZ0J1dHRvblBhbmUgPSAkKCAiPGRpdj4iICkKCQkJLmFkZENsYXNzKCAidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IiApOwoKCQl0aGlzLnVpQnV0dG9uU2V0ID0gJCggIjxkaXY+IiApCgkJCS5hZGRDbGFzcyggInVpLWRpYWxvZy1idXR0b25zZXQiICkKCQkJLmFwcGVuZFRvKCB0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZSApOwoKCQl0aGlzLl9jcmVhdGVCdXR0b25zKCk7Cgl9LAoKCV9jcmVhdGVCdXR0b25zOiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCWJ1dHRvbnMgPSB0aGlzLm9wdGlvbnMuYnV0dG9uczsKCgkJLy8gaWYgd2UgYWxyZWFkeSBoYXZlIGEgYnV0dG9uIHBhbmUsIHJlbW92ZSBpdAoJCXRoaXMudWlEaWFsb2dCdXR0b25QYW5lLnJlbW92ZSgpOwoJCXRoaXMudWlCdXR0b25TZXQuZW1wdHkoKTsKCgkJaWYgKCAkLmlzRW1wdHlPYmplY3QoIGJ1dHRvbnMgKSB8fCAoJC5pc0FycmF5KCBidXR0b25zICkgJiYgIWJ1dHRvbnMubGVuZ3RoKSApIHsKCQkJdGhpcy51aURpYWxvZy5yZW1vdmVDbGFzcyggInVpLWRpYWxvZy1idXR0b25zIiApOwoJCQlyZXR1cm47CgkJfQoKCQkkLmVhY2goIGJ1dHRvbnMsIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHsKCQkJdmFyIGNsaWNrLCBidXR0b25PcHRpb25zOwoJCQlwcm9wcyA9ICQuaXNGdW5jdGlvbiggcHJvcHMgKSA/CgkJCQl7IGNsaWNrOiBwcm9wcywgdGV4dDogbmFtZSB9IDoKCQkJCXByb3BzOwoJCQkvLyBEZWZhdWx0IHRvIGEgbm9uLXN1Ym1pdHRpbmcgYnV0dG9uCgkJCXByb3BzID0gJC5leHRlbmQoIHsgdHlwZTogImJ1dHRvbiIgfSwgcHJvcHMgKTsKCQkJLy8gQ2hhbmdlIHRoZSBjb250ZXh0IGZvciB0aGUgY2xpY2sgY2FsbGJhY2sgdG8gYmUgdGhlIG1haW4gZWxlbWVudAoJCQljbGljayA9IHByb3BzLmNsaWNrOwoJCQlwcm9wcy5jbGljayA9IGZ1bmN0aW9uKCkgewoJCQkJY2xpY2suYXBwbHkoIHRoYXQuZWxlbWVudFsgMCBdLCBhcmd1bWVudHMgKTsKCQkJfTsKCQkJYnV0dG9uT3B0aW9ucyA9IHsKCQkJCWljb25zOiBwcm9wcy5pY29ucywKCQkJCXRleHQ6IHByb3BzLnNob3dUZXh0CgkJCX07CgkJCWRlbGV0ZSBwcm9wcy5pY29uczsKCQkJZGVsZXRlIHByb3BzLnNob3dUZXh0OwoJCQkkKCAiPGJ1dHRvbj48L2J1dHRvbj4iLCBwcm9wcyApCgkJCQkuYnV0dG9uKCBidXR0b25PcHRpb25zICkKCQkJCS5hcHBlbmRUbyggdGhhdC51aUJ1dHRvblNldCApOwoJCX0pOwoJCXRoaXMudWlEaWFsb2cuYWRkQ2xhc3MoICJ1aS1kaWFsb2ctYnV0dG9ucyIgKTsKCQl0aGlzLnVpRGlhbG9nQnV0dG9uUGFuZS5hcHBlbmRUbyggdGhpcy51aURpYWxvZyApOwoJfSwKCglfbWFrZURyYWdnYWJsZTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQlmdW5jdGlvbiBmaWx0ZXJlZFVpKCB1aSApIHsKCQkJcmV0dXJuIHsKCQkJCXBvc2l0aW9uOiB1aS5wb3NpdGlvbiwKCQkJCW9mZnNldDogdWkub2Zmc2V0CgkJCX07CgkJfQoKCQl0aGlzLnVpRGlhbG9nLmRyYWdnYWJsZSh7CgkJCWNhbmNlbDogIi51aS1kaWFsb2ctY29udGVudCwgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIsCgkJCWhhbmRsZTogIi51aS1kaWFsb2ctdGl0bGViYXIiLAoJCQljb250YWlubWVudDogImRvY3VtZW50IiwKCQkJc3RhcnQ6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQkkKCB0aGlzICkuYWRkQ2xhc3MoICJ1aS1kaWFsb2ctZHJhZ2dpbmciICk7CgkJCQl0aGF0Ll9ibG9ja0ZyYW1lcygpOwoJCQkJdGhhdC5fdHJpZ2dlciggImRyYWdTdGFydCIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0sCgkJCWRyYWc6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQl0aGF0Ll90cmlnZ2VyKCAiZHJhZyIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQl2YXIgbGVmdCA9IHVpLm9mZnNldC5sZWZ0IC0gdGhhdC5kb2N1bWVudC5zY3JvbGxMZWZ0KCksCgkJCQkJdG9wID0gdWkub2Zmc2V0LnRvcCAtIHRoYXQuZG9jdW1lbnQuc2Nyb2xsVG9wKCk7CgoJCQkJb3B0aW9ucy5wb3NpdGlvbiA9IHsKCQkJCQlteTogImxlZnQgdG9wIiwKCQkJCQlhdDogImxlZnQiICsgKGxlZnQgPj0gMCA/ICIrIiA6ICIiKSArIGxlZnQgKyAiICIgKwoJCQkJCQkidG9wIiArICh0b3AgPj0gMCA/ICIrIiA6ICIiKSArIHRvcCwKCQkJCQlvZjogdGhhdC53aW5kb3cKCQkJCX07CgkJCQkkKCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1kaWFsb2ctZHJhZ2dpbmciICk7CgkJCQl0aGF0Ll91bmJsb2NrRnJhbWVzKCk7CgkJCQl0aGF0Ll90cmlnZ2VyKCAiZHJhZ1N0b3AiLCBldmVudCwgZmlsdGVyZWRVaSggdWkgKSApOwoJCQl9CgkJfSk7Cgl9LAoKCV9tYWtlUmVzaXphYmxlOiBmdW5jdGlvbigpIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWhhbmRsZXMgPSBvcHRpb25zLnJlc2l6YWJsZSwKCQkJLy8gLnVpLXJlc2l6YWJsZSBoYXMgcG9zaXRpb246IHJlbGF0aXZlIGRlZmluZWQgaW4gdGhlIHN0eWxlc2hlZXQKCQkJLy8gYnV0IGRpYWxvZ3MgaGF2ZSB0byB1c2UgYWJzb2x1dGUgb3IgZml4ZWQgcG9zaXRpb25pbmcKCQkJcG9zaXRpb24gPSB0aGlzLnVpRGlhbG9nLmNzcygicG9zaXRpb24iKSwKCQkJcmVzaXplSGFuZGxlcyA9IHR5cGVvZiBoYW5kbGVzID09PSAic3RyaW5nIiA/CgkJCQloYW5kbGVzCToKCQkJCSJuLGUscyx3LHNlLHN3LG5lLG53IjsKCgkJZnVuY3Rpb24gZmlsdGVyZWRVaSggdWkgKSB7CgkJCXJldHVybiB7CgkJCQlvcmlnaW5hbFBvc2l0aW9uOiB1aS5vcmlnaW5hbFBvc2l0aW9uLAoJCQkJb3JpZ2luYWxTaXplOiB1aS5vcmlnaW5hbFNpemUsCgkJCQlwb3NpdGlvbjogdWkucG9zaXRpb24sCgkJCQlzaXplOiB1aS5zaXplCgkJCX07CgkJfQoKCQl0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSh7CgkJCWNhbmNlbDogIi51aS1kaWFsb2ctY29udGVudCIsCgkJCWNvbnRhaW5tZW50OiAiZG9jdW1lbnQiLAoJCQlhbHNvUmVzaXplOiB0aGlzLmVsZW1lbnQsCgkJCW1heFdpZHRoOiBvcHRpb25zLm1heFdpZHRoLAoJCQltYXhIZWlnaHQ6IG9wdGlvbnMubWF4SGVpZ2h0LAoJCQltaW5XaWR0aDogb3B0aW9ucy5taW5XaWR0aCwKCQkJbWluSGVpZ2h0OiB0aGlzLl9taW5IZWlnaHQoKSwKCQkJaGFuZGxlczogcmVzaXplSGFuZGxlcywKCQkJc3RhcnQ6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQkkKCB0aGlzICkuYWRkQ2xhc3MoICJ1aS1kaWFsb2ctcmVzaXppbmciICk7CgkJCQl0aGF0Ll9ibG9ja0ZyYW1lcygpOwoJCQkJdGhhdC5fdHJpZ2dlciggInJlc2l6ZVN0YXJ0IiwgZXZlbnQsIGZpbHRlcmVkVWkoIHVpICkgKTsKCQkJfSwKCQkJcmVzaXplOiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJdGhhdC5fdHJpZ2dlciggInJlc2l6ZSIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0sCgkJCXN0b3A6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQl2YXIgb2Zmc2V0ID0gdGhhdC51aURpYWxvZy5vZmZzZXQoKSwKCQkJCQlsZWZ0ID0gb2Zmc2V0LmxlZnQgLSB0aGF0LmRvY3VtZW50LnNjcm9sbExlZnQoKSwKCQkJCQl0b3AgPSBvZmZzZXQudG9wIC0gdGhhdC5kb2N1bWVudC5zY3JvbGxUb3AoKTsKCgkJCQlvcHRpb25zLmhlaWdodCA9IHRoYXQudWlEaWFsb2cuaGVpZ2h0KCk7CgkJCQlvcHRpb25zLndpZHRoID0gdGhhdC51aURpYWxvZy53aWR0aCgpOwoJCQkJb3B0aW9ucy5wb3NpdGlvbiA9IHsKCQkJCQlteTogImxlZnQgdG9wIiwKCQkJCQlhdDogImxlZnQiICsgKGxlZnQgPj0gMCA/ICIrIiA6ICIiKSArIGxlZnQgKyAiICIgKwoJCQkJCQkidG9wIiArICh0b3AgPj0gMCA/ICIrIiA6ICIiKSArIHRvcCwKCQkJCQlvZjogdGhhdC53aW5kb3cKCQkJCX07CgkJCQkkKCB0aGlzICkucmVtb3ZlQ2xhc3MoICJ1aS1kaWFsb2ctcmVzaXppbmciICk7CgkJCQl0aGF0Ll91bmJsb2NrRnJhbWVzKCk7CgkJCQl0aGF0Ll90cmlnZ2VyKCAicmVzaXplU3RvcCIsIGV2ZW50LCBmaWx0ZXJlZFVpKCB1aSApICk7CgkJCX0KCQl9KQoJCS5jc3MoICJwb3NpdGlvbiIsIHBvc2l0aW9uICk7Cgl9LAoKCV90cmFja0ZvY3VzOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9vbiggdGhpcy53aWRnZXQoKSwgewoJCQkiZm9jdXNpbiI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCXRoaXMuX3VudHJhY2tJbnN0YW5jZSgpOwoJCQkJdGhpcy5fdHJhY2tpbmdJbnN0YW5jZXMoKS51bnNoaWZ0KCB0aGlzICk7CgkJCQl0aGlzLl9mb2N1c2VkRWxlbWVudCA9ICQoIGV2ZW50LnRhcmdldCApOwoJCQl9CgkJfSk7Cgl9LAoKCV91bnRyYWNrSW5zdGFuY2U6IGZ1bmN0aW9uKCkgewoJCXZhciBpbnN0YW5jZXMgPSB0aGlzLl90cmFja2luZ0luc3RhbmNlcygpLAoJCQlleGlzdHMgPSAkLmluQXJyYXkoIHRoaXMsIGluc3RhbmNlcyApOwoJCWlmICggZXhpc3RzICE9PSAtMSApIHsKCQkJaW5zdGFuY2VzLnNwbGljZSggZXhpc3RzLCAxICk7CgkJfQoJfSwKCglfdHJhY2tpbmdJbnN0YW5jZXM6IGZ1bmN0aW9uKCkgewoJCXZhciBpbnN0YW5jZXMgPSB0aGlzLmRvY3VtZW50LmRhdGEoICJ1aS1kaWFsb2ctaW5zdGFuY2VzIiApOwoJCWlmICggIWluc3RhbmNlcyApIHsKCQkJaW5zdGFuY2VzID0gW107CgkJCXRoaXMuZG9jdW1lbnQuZGF0YSggInVpLWRpYWxvZy1pbnN0YW5jZXMiLCBpbnN0YW5jZXMgKTsKCQl9CgkJcmV0dXJuIGluc3RhbmNlczsKCX0sCgoJX21pbkhlaWdodDogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCXJldHVybiBvcHRpb25zLmhlaWdodCA9PT0gImF1dG8iID8KCQkJb3B0aW9ucy5taW5IZWlnaHQgOgoJCQlNYXRoLm1pbiggb3B0aW9ucy5taW5IZWlnaHQsIG9wdGlvbnMuaGVpZ2h0ICk7Cgl9LAoKCV9wb3NpdGlvbjogZnVuY3Rpb24oKSB7CgkJLy8gTmVlZCB0byBzaG93IHRoZSBkaWFsb2cgdG8gZ2V0IHRoZSBhY3R1YWwgb2Zmc2V0IGluIHRoZSBwb3NpdGlvbiBwbHVnaW4KCQl2YXIgaXNWaXNpYmxlID0gdGhpcy51aURpYWxvZy5pcyggIjp2aXNpYmxlIiApOwoJCWlmICggIWlzVmlzaWJsZSApIHsKCQkJdGhpcy51aURpYWxvZy5zaG93KCk7CgkJfQoJCXRoaXMudWlEaWFsb2cucG9zaXRpb24oIHRoaXMub3B0aW9ucy5wb3NpdGlvbiApOwoJCWlmICggIWlzVmlzaWJsZSApIHsKCQkJdGhpcy51aURpYWxvZy5oaWRlKCk7CgkJfQoJfSwKCglfc2V0T3B0aW9uczogZnVuY3Rpb24oIG9wdGlvbnMgKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlyZXNpemUgPSBmYWxzZSwKCQkJcmVzaXphYmxlT3B0aW9ucyA9IHt9OwoKCQkkLmVhY2goIG9wdGlvbnMsIGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCQl0aGF0Ll9zZXRPcHRpb24oIGtleSwgdmFsdWUgKTsKCgkJCWlmICgga2V5IGluIHRoYXQuc2l6ZVJlbGF0ZWRPcHRpb25zICkgewoJCQkJcmVzaXplID0gdHJ1ZTsKCQkJfQoJCQlpZiAoIGtleSBpbiB0aGF0LnJlc2l6YWJsZVJlbGF0ZWRPcHRpb25zICkgewoJCQkJcmVzaXphYmxlT3B0aW9uc1sga2V5IF0gPSB2YWx1ZTsKCQkJfQoJCX0pOwoKCQlpZiAoIHJlc2l6ZSApIHsKCQkJdGhpcy5fc2l6ZSgpOwoJCQl0aGlzLl9wb3NpdGlvbigpOwoJCX0KCQlpZiAoIHRoaXMudWlEaWFsb2cuaXMoICI6ZGF0YSh1aS1yZXNpemFibGUpIiApICkgewoJCQl0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSggIm9wdGlvbiIsIHJlc2l6YWJsZU9wdGlvbnMgKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBpc0RyYWdnYWJsZSwgaXNSZXNpemFibGUsCgkJCXVpRGlhbG9nID0gdGhpcy51aURpYWxvZzsKCgkJaWYgKCBrZXkgPT09ICJkaWFsb2dDbGFzcyIgKSB7CgkJCXVpRGlhbG9nCgkJCQkucmVtb3ZlQ2xhc3MoIHRoaXMub3B0aW9ucy5kaWFsb2dDbGFzcyApCgkJCQkuYWRkQ2xhc3MoIHZhbHVlICk7CgkJfQoKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCgkJaWYgKCBrZXkgPT09ICJhcHBlbmRUbyIgKSB7CgkJCXRoaXMudWlEaWFsb2cuYXBwZW5kVG8oIHRoaXMuX2FwcGVuZFRvKCkgKTsKCQl9CgoJCWlmICgga2V5ID09PSAiYnV0dG9ucyIgKSB7CgkJCXRoaXMuX2NyZWF0ZUJ1dHRvbnMoKTsKCQl9CgoJCWlmICgga2V5ID09PSAiY2xvc2VUZXh0IiApIHsKCQkJdGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2UuYnV0dG9uKHsKCQkJCS8vIEVuc3VyZSB0aGF0IHdlIGFsd2F5cyBwYXNzIGEgc3RyaW5nCgkJCQlsYWJlbDogIiIgKyB2YWx1ZQoJCQl9KTsKCQl9CgoJCWlmICgga2V5ID09PSAiZHJhZ2dhYmxlIiApIHsKCQkJaXNEcmFnZ2FibGUgPSB1aURpYWxvZy5pcyggIjpkYXRhKHVpLWRyYWdnYWJsZSkiICk7CgkJCWlmICggaXNEcmFnZ2FibGUgJiYgIXZhbHVlICkgewoJCQkJdWlEaWFsb2cuZHJhZ2dhYmxlKCAiZGVzdHJveSIgKTsKCQkJfQoKCQkJaWYgKCAhaXNEcmFnZ2FibGUgJiYgdmFsdWUgKSB7CgkJCQl0aGlzLl9tYWtlRHJhZ2dhYmxlKCk7CgkJCX0KCQl9CgoJCWlmICgga2V5ID09PSAicG9zaXRpb24iICkgewoJCQl0aGlzLl9wb3NpdGlvbigpOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJyZXNpemFibGUiICkgewoJCQkvLyBjdXJyZW50bHkgcmVzaXphYmxlLCBiZWNvbWluZyBub24tcmVzaXphYmxlCgkJCWlzUmVzaXphYmxlID0gdWlEaWFsb2cuaXMoICI6ZGF0YSh1aS1yZXNpemFibGUpIiApOwoJCQlpZiAoIGlzUmVzaXphYmxlICYmICF2YWx1ZSApIHsKCQkJCXVpRGlhbG9nLnJlc2l6YWJsZSggImRlc3Ryb3kiICk7CgkJCX0KCgkJCS8vIGN1cnJlbnRseSByZXNpemFibGUsIGNoYW5naW5nIGhhbmRsZXMKCQkJaWYgKCBpc1Jlc2l6YWJsZSAmJiB0eXBlb2YgdmFsdWUgPT09ICJzdHJpbmciICkgewoJCQkJdWlEaWFsb2cucmVzaXphYmxlKCAib3B0aW9uIiwgImhhbmRsZXMiLCB2YWx1ZSApOwoJCQl9CgoJCQkvLyBjdXJyZW50bHkgbm9uLXJlc2l6YWJsZSwgYmVjb21pbmcgcmVzaXphYmxlCgkJCWlmICggIWlzUmVzaXphYmxlICYmIHZhbHVlICE9PSBmYWxzZSApIHsKCQkJCXRoaXMuX21ha2VSZXNpemFibGUoKTsKCQkJfQoJCX0KCgkJaWYgKCBrZXkgPT09ICJ0aXRsZSIgKSB7CgkJCXRoaXMuX3RpdGxlKCB0aGlzLnVpRGlhbG9nVGl0bGViYXIuZmluZCggIi51aS1kaWFsb2ctdGl0bGUiICkgKTsKCQl9Cgl9LAoKCV9zaXplOiBmdW5jdGlvbigpIHsKCQkvLyBJZiB0aGUgdXNlciBoYXMgcmVzaXplZCB0aGUgZGlhbG9nLCB0aGUgLnVpLWRpYWxvZyBhbmQgLnVpLWRpYWxvZy1jb250ZW50CgkJLy8gZGl2cyB3aWxsIGJvdGggaGF2ZSB3aWR0aCBhbmQgaGVpZ2h0IHNldCwgc28gd2UgbmVlZCB0byByZXNldCB0aGVtCgkJdmFyIG5vbkNvbnRlbnRIZWlnaHQsIG1pbkNvbnRlbnRIZWlnaHQsIG1heENvbnRlbnRIZWlnaHQsCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCS8vIFJlc2V0IGNvbnRlbnQgc2l6aW5nCgkJdGhpcy5lbGVtZW50LnNob3coKS5jc3MoewoJCQl3aWR0aDogImF1dG8iLAoJCQltaW5IZWlnaHQ6IDAsCgkJCW1heEhlaWdodDogIm5vbmUiLAoJCQloZWlnaHQ6IDAKCQl9KTsKCgkJaWYgKCBvcHRpb25zLm1pbldpZHRoID4gb3B0aW9ucy53aWR0aCApIHsKCQkJb3B0aW9ucy53aWR0aCA9IG9wdGlvbnMubWluV2lkdGg7CgkJfQoKCQkvLyByZXNldCB3cmFwcGVyIHNpemluZwoJCS8vIGRldGVybWluZSB0aGUgaGVpZ2h0IG9mIGFsbCB0aGUgbm9uLWNvbnRlbnQgZWxlbWVudHMKCQlub25Db250ZW50SGVpZ2h0ID0gdGhpcy51aURpYWxvZy5jc3MoewoJCQkJaGVpZ2h0OiAiYXV0byIsCgkJCQl3aWR0aDogb3B0aW9ucy53aWR0aAoJCQl9KQoJCQkub3V0ZXJIZWlnaHQoKTsKCQltaW5Db250ZW50SGVpZ2h0ID0gTWF0aC5tYXgoIDAsIG9wdGlvbnMubWluSGVpZ2h0IC0gbm9uQ29udGVudEhlaWdodCApOwoJCW1heENvbnRlbnRIZWlnaHQgPSB0eXBlb2Ygb3B0aW9ucy5tYXhIZWlnaHQgPT09ICJudW1iZXIiID8KCQkJTWF0aC5tYXgoIDAsIG9wdGlvbnMubWF4SGVpZ2h0IC0gbm9uQ29udGVudEhlaWdodCApIDoKCQkJIm5vbmUiOwoKCQlpZiAoIG9wdGlvbnMuaGVpZ2h0ID09PSAiYXV0byIgKSB7CgkJCXRoaXMuZWxlbWVudC5jc3MoewoJCQkJbWluSGVpZ2h0OiBtaW5Db250ZW50SGVpZ2h0LAoJCQkJbWF4SGVpZ2h0OiBtYXhDb250ZW50SGVpZ2h0LAoJCQkJaGVpZ2h0OiAiYXV0byIKCQkJfSk7CgkJfSBlbHNlIHsKCQkJdGhpcy5lbGVtZW50LmhlaWdodCggTWF0aC5tYXgoIDAsIG9wdGlvbnMuaGVpZ2h0IC0gbm9uQ29udGVudEhlaWdodCApICk7CgkJfQoKCQlpZiAoIHRoaXMudWlEaWFsb2cuaXMoICI6ZGF0YSh1aS1yZXNpemFibGUpIiApICkgewoJCQl0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSggIm9wdGlvbiIsICJtaW5IZWlnaHQiLCB0aGlzLl9taW5IZWlnaHQoKSApOwoJCX0KCX0sCgoJX2Jsb2NrRnJhbWVzOiBmdW5jdGlvbigpIHsKCQl0aGlzLmlmcmFtZUJsb2NrcyA9IHRoaXMuZG9jdW1lbnQuZmluZCggImlmcmFtZSIgKS5tYXAoZnVuY3Rpb24oKSB7CgkJCXZhciBpZnJhbWUgPSAkKCB0aGlzICk7CgoJCQlyZXR1cm4gJCggIjxkaXY+IiApCgkJCQkuY3NzKHsKCQkJCQlwb3NpdGlvbjogImFic29sdXRlIiwKCQkJCQl3aWR0aDogaWZyYW1lLm91dGVyV2lkdGgoKSwKCQkJCQloZWlnaHQ6IGlmcmFtZS5vdXRlckhlaWdodCgpCgkJCQl9KQoJCQkJLmFwcGVuZFRvKCBpZnJhbWUucGFyZW50KCkgKQoJCQkJLm9mZnNldCggaWZyYW1lLm9mZnNldCgpIClbMF07CgkJfSk7Cgl9LAoKCV91bmJsb2NrRnJhbWVzOiBmdW5jdGlvbigpIHsKCQlpZiAoIHRoaXMuaWZyYW1lQmxvY2tzICkgewoJCQl0aGlzLmlmcmFtZUJsb2Nrcy5yZW1vdmUoKTsKCQkJZGVsZXRlIHRoaXMuaWZyYW1lQmxvY2tzOwoJCX0KCX0sCgoJX2FsbG93SW50ZXJhY3Rpb246IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoICQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoICIudWktZGlhbG9nIiApLmxlbmd0aCApIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQkvLyBUT0RPOiBSZW1vdmUgaGFjayB3aGVuIGRhdGVwaWNrZXIgaW1wbGVtZW50cwoJCS8vIHRoZSAudWktZnJvbnQgbG9naWMgKCM4OTg5KQoJCXJldHVybiAhISQoIGV2ZW50LnRhcmdldCApLmNsb3Nlc3QoICIudWktZGF0ZXBpY2tlciIgKS5sZW5ndGg7Cgl9LAoKCV9jcmVhdGVPdmVybGF5OiBmdW5jdGlvbigpIHsKCQlpZiAoICF0aGlzLm9wdGlvbnMubW9kYWwgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIFdlIHVzZSBhIGRlbGF5IGluIGNhc2UgdGhlIG92ZXJsYXkgaXMgY3JlYXRlZCBmcm9tIGFuCgkJLy8gZXZlbnQgdGhhdCB3ZSdyZSBnb2luZyB0byBiZSBjYW5jZWxsaW5nICgjMjgwNCkKCQl2YXIgaXNPcGVuaW5nID0gdHJ1ZTsKCQl0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJaXNPcGVuaW5nID0gZmFsc2U7CgkJfSk7CgoJCWlmICggIXRoaXMuZG9jdW1lbnQuZGF0YSggInVpLWRpYWxvZy1vdmVybGF5cyIgKSApIHsKCgkJCS8vIFByZXZlbnQgdXNlIG9mIGFuY2hvcnMgYW5kIGlucHV0cwoJCQkvLyBVc2luZyBfb24oKSBmb3IgYW4gZXZlbnQgaGFuZGxlciBzaGFyZWQgYWNyb3NzIG1hbnkgaW5zdGFuY2VzIGlzCgkJCS8vIHNhZmUgYmVjYXVzZSB0aGUgZGlhbG9ncyBzdGFjayBhbmQgbXVzdCBiZSBjbG9zZWQgaW4gcmV2ZXJzZSBvcmRlcgoJCQl0aGlzLl9vbiggdGhpcy5kb2N1bWVudCwgewoJCQkJZm9jdXNpbjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJCWlmICggaXNPcGVuaW5nICkgewoJCQkJCQlyZXR1cm47CgkJCQkJfQoKCQkJCQlpZiAoICF0aGlzLl9hbGxvd0ludGVyYWN0aW9uKCBldmVudCApICkgewoJCQkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJCQl0aGlzLl90cmFja2luZ0luc3RhbmNlcygpWyAwIF0uX2ZvY3VzVGFiYmFibGUoKTsKCQkJCQl9CgkJCQl9CgkJCX0pOwoJCX0KCgkJdGhpcy5vdmVybGF5ID0gJCggIjxkaXY+IiApCgkJCS5hZGRDbGFzcyggInVpLXdpZGdldC1vdmVybGF5IHVpLWZyb250IiApCgkJCS5hcHBlbmRUbyggdGhpcy5fYXBwZW5kVG8oKSApOwoJCXRoaXMuX29uKCB0aGlzLm92ZXJsYXksIHsKCQkJbW91c2Vkb3duOiAiX2tlZXBGb2N1cyIKCQl9KTsKCQl0aGlzLmRvY3VtZW50LmRhdGEoICJ1aS1kaWFsb2ctb3ZlcmxheXMiLAoJCQkodGhpcy5kb2N1bWVudC5kYXRhKCAidWktZGlhbG9nLW92ZXJsYXlzIiApIHx8IDApICsgMSApOwoJfSwKCglfZGVzdHJveU92ZXJsYXk6IGZ1bmN0aW9uKCkgewoJCWlmICggIXRoaXMub3B0aW9ucy5tb2RhbCApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCB0aGlzLm92ZXJsYXkgKSB7CgkJCXZhciBvdmVybGF5cyA9IHRoaXMuZG9jdW1lbnQuZGF0YSggInVpLWRpYWxvZy1vdmVybGF5cyIgKSAtIDE7CgoJCQlpZiAoICFvdmVybGF5cyApIHsKCQkJCXRoaXMuZG9jdW1lbnQKCQkJCQkudW5iaW5kKCAiZm9jdXNpbiIgKQoJCQkJCS5yZW1vdmVEYXRhKCAidWktZGlhbG9nLW92ZXJsYXlzIiApOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5kb2N1bWVudC5kYXRhKCAidWktZGlhbG9nLW92ZXJsYXlzIiwgb3ZlcmxheXMgKTsKCQkJfQoKCQkJdGhpcy5vdmVybGF5LnJlbW92ZSgpOwoJCQl0aGlzLm92ZXJsYXkgPSBudWxsOwoJCX0KCX0KfSk7CgoKLyohCiAqIGpRdWVyeSBVSSBQcm9ncmVzc2JhciAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9wcm9ncmVzc2Jhci8KICovCgoKdmFyIHByb2dyZXNzYmFyID0gJC53aWRnZXQoICJ1aS5wcm9ncmVzc2JhciIsIHsKCXZlcnNpb246ICIxLjExLjAiLAoJb3B0aW9uczogewoJCW1heDogMTAwLAoJCXZhbHVlOiAwLAoKCQljaGFuZ2U6IG51bGwsCgkJY29tcGxldGU6IG51bGwKCX0sCgoJbWluOiAwLAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCS8vIENvbnN0cmFpbiBpbml0aWFsIHZhbHVlCgkJdGhpcy5vbGRWYWx1ZSA9IHRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoKTsKCgkJdGhpcy5lbGVtZW50CgkJCS5hZGRDbGFzcyggInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiApCgkJCS5hdHRyKHsKCQkJCS8vIE9ubHkgc2V0IHN0YXRpYyB2YWx1ZXMsIGFyaWEtdmFsdWVub3cgYW5kIGFyaWEtdmFsdWVtYXggYXJlCgkJCQkvLyBzZXQgaW5zaWRlIF9yZWZyZXNoVmFsdWUoKQoJCQkJcm9sZTogInByb2dyZXNzYmFyIiwKCQkJCSJhcmlhLXZhbHVlbWluIjogdGhpcy5taW4KCQkJfSk7CgoJCXRoaXMudmFsdWVEaXYgPSAkKCAiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItdmFsdWUgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItbGVmdCc+PC9kaXY+IiApCgkJCS5hcHBlbmRUbyggdGhpcy5lbGVtZW50ICk7CgoJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5lbGVtZW50CgkJCS5yZW1vdmVDbGFzcyggInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiApCgkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtdmFsdWVtaW4iICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbWF4IiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW5vdyIgKTsKCgkJdGhpcy52YWx1ZURpdi5yZW1vdmUoKTsKCX0sCgoJdmFsdWU6IGZ1bmN0aW9uKCBuZXdWYWx1ZSApIHsKCQlpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzLm9wdGlvbnMudmFsdWU7CgkJfQoKCQl0aGlzLm9wdGlvbnMudmFsdWUgPSB0aGlzLl9jb25zdHJhaW5lZFZhbHVlKCBuZXdWYWx1ZSApOwoJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJfSwKCglfY29uc3RyYWluZWRWYWx1ZTogZnVuY3Rpb24oIG5ld1ZhbHVlICkgewoJCWlmICggbmV3VmFsdWUgPT09IHVuZGVmaW5lZCApIHsKCQkJbmV3VmFsdWUgPSB0aGlzLm9wdGlvbnMudmFsdWU7CgkJfQoKCQl0aGlzLmluZGV0ZXJtaW5hdGUgPSBuZXdWYWx1ZSA9PT0gZmFsc2U7CgoJCS8vIHNhbml0aXplIHZhbHVlCgkJaWYgKCB0eXBlb2YgbmV3VmFsdWUgIT09ICJudW1iZXIiICkgewoJCQluZXdWYWx1ZSA9IDA7CgkJfQoKCQlyZXR1cm4gdGhpcy5pbmRldGVybWluYXRlID8gZmFsc2UgOgoJCQlNYXRoLm1pbiggdGhpcy5vcHRpb25zLm1heCwgTWF0aC5tYXgoIHRoaXMubWluLCBuZXdWYWx1ZSApICk7Cgl9LAoKCV9zZXRPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQkvLyBFbnN1cmUgInZhbHVlIiBvcHRpb24gaXMgc2V0IGFmdGVyIG90aGVyIHZhbHVlcyAobGlrZSBtYXgpCgkJdmFyIHZhbHVlID0gb3B0aW9ucy52YWx1ZTsKCQlkZWxldGUgb3B0aW9ucy52YWx1ZTsKCgkJdGhpcy5fc3VwZXIoIG9wdGlvbnMgKTsKCgkJdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5fY29uc3RyYWluZWRWYWx1ZSggdmFsdWUgKTsKCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJtYXgiICkgewoJCQkvLyBEb24ndCBhbGxvdyBhIG1heCBsZXNzIHRoYW4gbWluCgkJCXZhbHVlID0gTWF0aC5tYXgoIHRoaXMubWluLCB2YWx1ZSApOwoJCX0KCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpcy5lbGVtZW50CgkJCQkudG9nZ2xlQ2xhc3MoICJ1aS1zdGF0ZS1kaXNhYmxlZCIsICEhdmFsdWUgKQoJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgdmFsdWUgKTsKCQl9CgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCX0sCgoJX3BlcmNlbnRhZ2U6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGUgPyAxMDAgOiAxMDAgKiAoIHRoaXMub3B0aW9ucy52YWx1ZSAtIHRoaXMubWluICkgLyAoIHRoaXMub3B0aW9ucy5tYXggLSB0aGlzLm1pbiApOwoJfSwKCglfcmVmcmVzaFZhbHVlOiBmdW5jdGlvbigpIHsKCQl2YXIgdmFsdWUgPSB0aGlzLm9wdGlvbnMudmFsdWUsCgkJCXBlcmNlbnRhZ2UgPSB0aGlzLl9wZXJjZW50YWdlKCk7CgoJCXRoaXMudmFsdWVEaXYKCQkJLnRvZ2dsZSggdGhpcy5pbmRldGVybWluYXRlIHx8IHZhbHVlID4gdGhpcy5taW4gKQoJCQkudG9nZ2xlQ2xhc3MoICJ1aS1jb3JuZXItcmlnaHQiLCB2YWx1ZSA9PT0gdGhpcy5vcHRpb25zLm1heCApCgkJCS53aWR0aCggcGVyY2VudGFnZS50b0ZpeGVkKDApICsgIiUiICk7CgoJCXRoaXMuZWxlbWVudC50b2dnbGVDbGFzcyggInVpLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUiLCB0aGlzLmluZGV0ZXJtaW5hdGUgKTsKCgkJaWYgKCB0aGlzLmluZGV0ZXJtaW5hdGUgKSB7CgkJCXRoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW5vdyIgKTsKCQkJaWYgKCAhdGhpcy5vdmVybGF5RGl2ICkgewoJCQkJdGhpcy5vdmVybGF5RGl2ID0gJCggIjxkaXYgY2xhc3M9J3VpLXByb2dyZXNzYmFyLW92ZXJsYXknPjwvZGl2PiIgKS5hcHBlbmRUbyggdGhpcy52YWx1ZURpdiApOwoJCQl9CgkJfSBlbHNlIHsKCQkJdGhpcy5lbGVtZW50LmF0dHIoewoJCQkJImFyaWEtdmFsdWVtYXgiOiB0aGlzLm9wdGlvbnMubWF4LAoJCQkJImFyaWEtdmFsdWVub3ciOiB2YWx1ZQoJCQl9KTsKCQkJaWYgKCB0aGlzLm92ZXJsYXlEaXYgKSB7CgkJCQl0aGlzLm92ZXJsYXlEaXYucmVtb3ZlKCk7CgkJCQl0aGlzLm92ZXJsYXlEaXYgPSBudWxsOwoJCQl9CgkJfQoKCQlpZiAoIHRoaXMub2xkVmFsdWUgIT09IHZhbHVlICkgewoJCQl0aGlzLm9sZFZhbHVlID0gdmFsdWU7CgkJCXRoaXMuX3RyaWdnZXIoICJjaGFuZ2UiICk7CgkJfQoJCWlmICggdmFsdWUgPT09IHRoaXMub3B0aW9ucy5tYXggKSB7CgkJCXRoaXMuX3RyaWdnZXIoICJjb21wbGV0ZSIgKTsKCQl9Cgl9Cn0pOwoKCi8qIQogKiBqUXVlcnkgVUkgU2VsZWN0bWVudSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9zZWxlY3RtZW51CiAqLwoKCnZhciBzZWxlY3RtZW51ID0gJC53aWRnZXQoICJ1aS5zZWxlY3RtZW51IiwgewoJdmVyc2lvbjogIjEuMTEuMCIsCglkZWZhdWx0RWxlbWVudDogIjxzZWxlY3Q+IiwKCW9wdGlvbnM6IHsKCQlhcHBlbmRUbzogbnVsbCwKCQlkaXNhYmxlZDogbnVsbCwKCQlpY29uczogewoJCQlidXR0b246ICJ1aS1pY29uLXRyaWFuZ2xlLTEtcyIKCQl9LAoJCXBvc2l0aW9uOiB7CgkJCW15OiAibGVmdCB0b3AiLAoJCQlhdDogImxlZnQgYm90dG9tIiwKCQkJY29sbGlzaW9uOiAibm9uZSIKCQl9LAoJCXdpZHRoOiBudWxsLAoKCQkvLyBjYWxsYmFja3MKCQljaGFuZ2U6IG51bGwsCgkJY2xvc2U6IG51bGwsCgkJZm9jdXM6IG51bGwsCgkJb3BlbjogbnVsbCwKCQlzZWxlY3Q6IG51bGwKCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdmFyIHNlbGVjdG1lbnVJZCA9IHRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmF0dHIoICJpZCIgKTsKCQl0aGlzLmlkcyA9IHsKCQkJZWxlbWVudDogc2VsZWN0bWVudUlkLAoJCQlidXR0b246IHNlbGVjdG1lbnVJZCArICItYnV0dG9uIiwKCQkJbWVudTogc2VsZWN0bWVudUlkICsgIi1tZW51IgoJCX07CgoJCXRoaXMuX2RyYXdCdXR0b24oKTsKCQl0aGlzLl9kcmF3TWVudSgpOwoKCQlpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJdGhpcy5kaXNhYmxlKCk7CgkJfQoJfSwKCglfZHJhd0J1dHRvbjogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQl0YWJpbmRleCA9IHRoaXMuZWxlbWVudC5hdHRyKCAidGFiaW5kZXgiICk7CgoJCS8vIEFzc29jaWF0ZSBleGlzdGluZyBsYWJlbCB3aXRoIHRoZSBuZXcgYnV0dG9uCgkJdGhpcy5sYWJlbCA9ICQoICJsYWJlbFtmb3I9JyIgKyB0aGlzLmlkcy5lbGVtZW50ICsgIiddIiApLmF0dHIoICJmb3IiLCB0aGlzLmlkcy5idXR0b24gKTsKCQl0aGlzLl9vbiggdGhpcy5sYWJlbCwgewoJCQljbGljazogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJdGhpcy5idXR0b24uZm9jdXMoKTsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9KTsKCgkJLy8gSGlkZSBvcmlnaW5hbCBzZWxlY3QgZWxlbWVudAoJCXRoaXMuZWxlbWVudC5oaWRlKCk7CgoJCS8vIENyZWF0ZSBidXR0b24KCQl0aGlzLmJ1dHRvbiA9ICQoICI8c3Bhbj4iLCB7CgkJCSJjbGFzcyI6ICJ1aS1zZWxlY3RtZW51LWJ1dHRvbiB1aS13aWRnZXQgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiwKCQkJdGFiaW5kZXg6IHRhYmluZGV4IHx8IHRoaXMub3B0aW9ucy5kaXNhYmxlZCA/IC0xIDogMCwKCQkJaWQ6IHRoaXMuaWRzLmJ1dHRvbiwKCQkJcm9sZTogImNvbWJvYm94IiwKCQkJImFyaWEtZXhwYW5kZWQiOiAiZmFsc2UiLAoJCQkiYXJpYS1hdXRvY29tcGxldGUiOiAibGlzdCIsCgkJCSJhcmlhLW93bnMiOiB0aGlzLmlkcy5tZW51LAoJCQkiYXJpYS1oYXNwb3B1cCI6ICJ0cnVlIgoJCX0pCgkJCS5pbnNlcnRBZnRlciggdGhpcy5lbGVtZW50ICk7CgoJCSQoICI8c3Bhbj4iLCB7CgkJCSJjbGFzcyI6ICJ1aS1pY29uICIgKyB0aGlzLm9wdGlvbnMuaWNvbnMuYnV0dG9uCgkJfSkKCQkJLnByZXBlbmRUbyggdGhpcy5idXR0b24gKTsKCgkJdGhpcy5idXR0b25UZXh0ID0gJCggIjxzcGFuPiIsIHsKCQkJImNsYXNzIjogInVpLXNlbGVjdG1lbnUtdGV4dCIKCQl9KQoJCQkuYXBwZW5kVG8oIHRoaXMuYnV0dG9uICk7CgoJCXRoaXMuX3NldFRleHQoIHRoaXMuYnV0dG9uVGV4dCwgdGhpcy5lbGVtZW50LmZpbmQoICJvcHRpb246c2VsZWN0ZWQiICkudGV4dCgpICk7CgkJdGhpcy5fc2V0T3B0aW9uKCAid2lkdGgiLCB0aGlzLm9wdGlvbnMud2lkdGggKTsKCgkJdGhpcy5fb24oIHRoaXMuYnV0dG9uLCB0aGlzLl9idXR0b25FdmVudHMgKTsKCQl0aGlzLmJ1dHRvbi5vbmUoICJmb2N1c2luIiwgZnVuY3Rpb24oKSB7CgoJCQkvLyBEZWxheSByZW5kZXJpbmcgdGhlIG1lbnUgaXRlbXMgdW50aWwgdGhlIGJ1dHRvbiByZWNlaXZlcyBmb2N1cy4KCQkJLy8gVGhlIG1lbnUgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIHJlbmRlcmVkIHZpYSBhIHByb2dyYW1tYXRpYyBvcGVuLgoJCQlpZiAoICF0aGF0Lm1lbnVJdGVtcyApIHsKCQkJCXRoYXQuX3JlZnJlc2hNZW51KCk7CgkJCX0KCQl9KTsKCQl0aGlzLl9ob3ZlcmFibGUoIHRoaXMuYnV0dG9uICk7CgkJdGhpcy5fZm9jdXNhYmxlKCB0aGlzLmJ1dHRvbiApOwoJfSwKCglfZHJhd01lbnU6IGZ1bmN0aW9uKCkgewoJCXZhciB0aGF0ID0gdGhpczsKCgkJLy8gQ3JlYXRlIG1lbnUKCQl0aGlzLm1lbnUgPSAkKCAiPHVsPiIsIHsKCQkJImFyaWEtaGlkZGVuIjogInRydWUiLAoJCQkiYXJpYS1sYWJlbGxlZGJ5IjogdGhpcy5pZHMuYnV0dG9uLAoJCQlpZDogdGhpcy5pZHMubWVudQoJCX0pOwoKCQkvLyBXcmFwIG1lbnUKCQl0aGlzLm1lbnVXcmFwID0gJCggIjxkaXY+IiwgewoJCQkiY2xhc3MiOiAidWktc2VsZWN0bWVudS1tZW51IHVpLWZyb250IgoJCX0pCgkJCS5hcHBlbmQoIHRoaXMubWVudSApCgkJCS5hcHBlbmRUbyggdGhpcy5fYXBwZW5kVG8oKSApOwoKCQkvLyBJbml0aWFsaXplIG1lbnUgd2lkZ2V0CgkJdGhpcy5tZW51SW5zdGFuY2UgPSB0aGlzLm1lbnUKCQkJLm1lbnUoewoJCQkJcm9sZTogImxpc3Rib3giLAoJCQkJc2VsZWN0OiBmdW5jdGlvbiggZXZlbnQsIHVpICkgewoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJdGhhdC5fc2VsZWN0KCB1aS5pdGVtLmRhdGEoICJ1aS1zZWxlY3RtZW51LWl0ZW0iICksIGV2ZW50ICk7CgkJCQl9LAoJCQkJZm9jdXM6IGZ1bmN0aW9uKCBldmVudCwgdWkgKSB7CgkJCQkJdmFyIGl0ZW0gPSB1aS5pdGVtLmRhdGEoICJ1aS1zZWxlY3RtZW51LWl0ZW0iICk7CgoJCQkJCS8vIFByZXZlbnQgaW5pdGFsIGZvY3VzIGZyb20gZmlyaW5nIGFuZCBjaGVjayBpZiBpdHMgYSBuZXdseSBmb2N1c2VkIGl0ZW0KCQkJCQlpZiAoIHRoYXQuZm9jdXNJbmRleCAhPSBudWxsICYmIGl0ZW0uaW5kZXggIT09IHRoYXQuZm9jdXNJbmRleCApIHsKCQkJCQkJdGhhdC5fdHJpZ2dlciggImZvY3VzIiwgZXZlbnQsIHsgaXRlbTogaXRlbSB9ICk7CgkJCQkJCWlmICggIXRoYXQuaXNPcGVuICkgewoJCQkJCQkJdGhhdC5fc2VsZWN0KCBpdGVtLCBldmVudCApOwoJCQkJCQl9CgkJCQkJfQoJCQkJCXRoYXQuZm9jdXNJbmRleCA9IGl0ZW0uaW5kZXg7CgoJCQkJCXRoYXQuYnV0dG9uLmF0dHIoICJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLAoJCQkJCQl0aGF0Lm1lbnVJdGVtcy5lcSggaXRlbS5pbmRleCApLmF0dHIoICJpZCIgKSApOwoJCQkJfQoJCQl9KQoJCQkubWVudSggImluc3RhbmNlIiApOwoKCQkvLyBBZGp1c3QgbWVudSBzdHlsZXMgdG8gZHJvcGRvd24KCQl0aGlzLm1lbnUKCQkJLmFkZENsYXNzKCAidWktY29ybmVyLWJvdHRvbSIgKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApOwoKCQkvLyBEb24ndCBjbG9zZSB0aGUgbWVudSBvbiBtb3VzZWxlYXZlCgkJdGhpcy5tZW51SW5zdGFuY2UuX29mZiggdGhpcy5tZW51LCAibW91c2VsZWF2ZSIgKTsKCgkJLy8gQ2FuY2VsIHRoZSBtZW51J3MgY29sbGFwc2VBbGwgb24gZG9jdW1lbnQgY2xpY2sKCQl0aGlzLm1lbnVJbnN0YW5jZS5fY2xvc2VPbkRvY3VtZW50Q2xpY2sgPSBmdW5jdGlvbigpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX07CgoJCS8vIFNlbGVjdHMgb2Z0ZW4gY29udGFpbiBlbXB0eSBpdGVtcywgYnV0IG5ldmVyIGNvbnRhaW4gZGl2aWRlcnMKCQl0aGlzLm1lbnVJbnN0YW5jZS5faXNEaXZpZGVyID0gZnVuY3Rpb24oKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9OwoJfSwKCglyZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9yZWZyZXNoTWVudSgpOwoJCXRoaXMuX3NldFRleHQoIHRoaXMuYnV0dG9uVGV4dCwgdGhpcy5fZ2V0U2VsZWN0ZWRJdGVtKCkudGV4dCgpICk7CgkJdGhpcy5fc2V0T3B0aW9uKCAid2lkdGgiLCB0aGlzLm9wdGlvbnMud2lkdGggKTsKCX0sCgoJX3JlZnJlc2hNZW51OiBmdW5jdGlvbigpIHsKCQl0aGlzLm1lbnUuZW1wdHkoKTsKCgkJdmFyIGl0ZW0sCgkJCW9wdGlvbnMgPSB0aGlzLmVsZW1lbnQuZmluZCggIm9wdGlvbiIgKTsKCgkJaWYgKCAhb3B0aW9ucy5sZW5ndGggKSB7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMuX3BhcnNlT3B0aW9ucyggb3B0aW9ucyApOwoJCXRoaXMuX3JlbmRlck1lbnUoIHRoaXMubWVudSwgdGhpcy5pdGVtcyApOwoKCQl0aGlzLm1lbnVJbnN0YW5jZS5yZWZyZXNoKCk7CgkJdGhpcy5tZW51SXRlbXMgPSB0aGlzLm1lbnUuZmluZCggImxpIiApLm5vdCggIi51aS1zZWxlY3RtZW51LW9wdGdyb3VwIiApOwoKCQlpdGVtID0gdGhpcy5fZ2V0U2VsZWN0ZWRJdGVtKCk7CgoJCS8vIFVwZGF0ZSB0aGUgbWVudSB0byBoYXZlIHRoZSBjb3JyZWN0IGl0ZW0gZm9jdXNlZAoJCXRoaXMubWVudUluc3RhbmNlLmZvY3VzKCBudWxsLCBpdGVtICk7CgkJdGhpcy5fc2V0QXJpYSggaXRlbS5kYXRhKCAidWktc2VsZWN0bWVudS1pdGVtIiApICk7CgoJCS8vIFNldCBkaXNhYmxlZCBzdGF0ZQoJCXRoaXMuX3NldE9wdGlvbiggImRpc2FibGVkIiwgdGhpcy5lbGVtZW50LnByb3AoICJkaXNhYmxlZCIgKSApOwoJfSwKCglvcGVuOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhlIG1lbnUgaXMgYmVpbmcgb3BlbmVkLCByZW5kZXIgdGhlIGl0ZW1zCgkJaWYgKCAhdGhpcy5tZW51SXRlbXMgKSB7CgkJCXRoaXMuX3JlZnJlc2hNZW51KCk7CgkJfSBlbHNlIHsKCgkJCS8vIE1lbnUgY2xlYXJzIGZvY3VzIG9uIGNsb3NlLCByZXNldCBmb2N1cyB0byBzZWxlY3RlZCBpdGVtCgkJCXRoaXMubWVudS5maW5kKCAiLnVpLXN0YXRlLWZvY3VzIiApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZm9jdXMiICk7CgkJCXRoaXMubWVudUluc3RhbmNlLmZvY3VzKCBudWxsLCB0aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKSApOwoJCX0KCgkJdGhpcy5pc09wZW4gPSB0cnVlOwoJCXRoaXMuX3RvZ2dsZUF0dHIoKTsKCQl0aGlzLl9yZXNpemVNZW51KCk7CgkJdGhpcy5fcG9zaXRpb24oKTsKCgkJdGhpcy5fb24oIHRoaXMuZG9jdW1lbnQsIHRoaXMuX2RvY3VtZW50Q2xpY2sgKTsKCgkJdGhpcy5fdHJpZ2dlciggIm9wZW4iLCBldmVudCApOwoJfSwKCglfcG9zaXRpb246IGZ1bmN0aW9uKCkgewoJCXRoaXMubWVudVdyYXAucG9zaXRpb24oICQuZXh0ZW5kKCB7IG9mOiB0aGlzLmJ1dHRvbiB9LCB0aGlzLm9wdGlvbnMucG9zaXRpb24gKSApOwoJfSwKCgljbG9zZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCWlmICggIXRoaXMuaXNPcGVuICkgewoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLmlzT3BlbiA9IGZhbHNlOwoJCXRoaXMuX3RvZ2dsZUF0dHIoKTsKCgkJdGhpcy5fb2ZmKCB0aGlzLmRvY3VtZW50ICk7CgoJCXRoaXMuX3RyaWdnZXIoICJjbG9zZSIsIGV2ZW50ICk7Cgl9LAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMuYnV0dG9uOwoJfSwKCgltZW51V2lkZ2V0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tZW51OwoJfSwKCglfcmVuZGVyTWVudTogZnVuY3Rpb24oIHVsLCBpdGVtcyApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCWN1cnJlbnRPcHRncm91cCA9ICIiOwoKCQkkLmVhY2goIGl0ZW1zLCBmdW5jdGlvbiggaW5kZXgsIGl0ZW0gKSB7CgkJCWlmICggaXRlbS5vcHRncm91cCAhPT0gY3VycmVudE9wdGdyb3VwICkgewoJCQkJJCggIjxsaT4iLCB7CgkJCQkJImNsYXNzIjogInVpLXNlbGVjdG1lbnUtb3B0Z3JvdXAgdWktbWVudS1kaXZpZGVyIiArCgkJCQkJCSggaXRlbS5lbGVtZW50LnBhcmVudCggIm9wdGdyb3VwIiApLnByb3AoICJkaXNhYmxlZCIgKSA/CgkJCQkJCQkiIHVpLXN0YXRlLWRpc2FibGVkIiA6CgkJCQkJCQkiIiApLAoJCQkJCXRleHQ6IGl0ZW0ub3B0Z3JvdXAKCQkJCX0pCgkJCQkJLmFwcGVuZFRvKCB1bCApOwoKCQkJCWN1cnJlbnRPcHRncm91cCA9IGl0ZW0ub3B0Z3JvdXA7CgkJCX0KCgkJCXRoYXQuX3JlbmRlckl0ZW1EYXRhKCB1bCwgaXRlbSApOwoJCX0pOwoJfSwKCglfcmVuZGVySXRlbURhdGE6IGZ1bmN0aW9uKCB1bCwgaXRlbSApIHsKCQlyZXR1cm4gdGhpcy5fcmVuZGVySXRlbSggdWwsIGl0ZW0gKS5kYXRhKCAidWktc2VsZWN0bWVudS1pdGVtIiwgaXRlbSApOwoJfSwKCglfcmVuZGVySXRlbTogZnVuY3Rpb24oIHVsLCBpdGVtICkgewoJCXZhciBsaSA9ICQoICI8bGk+IiApOwoKCQlpZiAoIGl0ZW0uZGlzYWJsZWQgKSB7CgkJCWxpLmFkZENsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICk7CgkJfQoJCXRoaXMuX3NldFRleHQoIGxpLCBpdGVtLmxhYmVsICk7CgoJCXJldHVybiBsaS5hcHBlbmRUbyggdWwgKTsKCX0sCgoJX3NldFRleHQ6IGZ1bmN0aW9uKCBlbGVtZW50LCB2YWx1ZSApIHsKCQlpZiAoIHZhbHVlICkgewoJCQllbGVtZW50LnRleHQoIHZhbHVlICk7CgkJfSBlbHNlIHsKCQkJZWxlbWVudC5odG1sKCAiJiMxNjA7IiApOwoJCX0KCX0sCgoJX21vdmU6IGZ1bmN0aW9uKCBkaXJlY3Rpb24sIGV2ZW50ICkgewoJCXZhciBpdGVtLCBuZXh0LAoJCQlmaWx0ZXIgPSAiLnVpLW1lbnUtaXRlbSI7CgoJCWlmICggdGhpcy5pc09wZW4gKSB7CgkJCWl0ZW0gPSB0aGlzLm1lbnVJdGVtcy5lcSggdGhpcy5mb2N1c0luZGV4ICk7CgkJfSBlbHNlIHsKCQkJaXRlbSA9IHRoaXMubWVudUl0ZW1zLmVxKCB0aGlzLmVsZW1lbnRbIDAgXS5zZWxlY3RlZEluZGV4ICk7CgkJCWZpbHRlciArPSAiOm5vdCgudWktc3RhdGUtZGlzYWJsZWQpIjsKCQl9CgoJCWlmICggZGlyZWN0aW9uID09PSAiZmlyc3QiIHx8IGRpcmVjdGlvbiA9PT0gImxhc3QiICkgewoJCQluZXh0ID0gaXRlbVsgZGlyZWN0aW9uID09PSAiZmlyc3QiID8gInByZXZBbGwiIDogIm5leHRBbGwiIF0oIGZpbHRlciApLmVxKCAtMSApOwoJCX0gZWxzZSB7CgkJCW5leHQgPSBpdGVtWyBkaXJlY3Rpb24gKyAiQWxsIiBdKCBmaWx0ZXIgKS5lcSggMCApOwoJCX0KCgkJaWYgKCBuZXh0Lmxlbmd0aCApIHsKCQkJdGhpcy5tZW51SW5zdGFuY2UuZm9jdXMoIGV2ZW50LCBuZXh0ICk7CgkJfQoJfSwKCglfZ2V0U2VsZWN0ZWRJdGVtOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy5tZW51SXRlbXMuZXEoIHRoaXMuZWxlbWVudFsgMCBdLnNlbGVjdGVkSW5kZXggKTsKCX0sCgoJX3RvZ2dsZTogZnVuY3Rpb24oIGV2ZW50ICkgewoJCXRoaXNbIHRoaXMuaXNPcGVuID8gImNsb3NlIiA6ICJvcGVuIiBdKCBldmVudCApOwoJfSwKCglfZG9jdW1lbnRDbGljazogewoJCW1vdXNlZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQlpZiAoICF0aGlzLmlzT3BlbiApIHsKCQkJCXJldHVybjsKCQkJfQoKCQkJaWYgKCAhJCggZXZlbnQudGFyZ2V0ICkuY2xvc2VzdCggIi51aS1zZWxlY3RtZW51LW1lbnUsICMiICsgdGhpcy5pZHMuYnV0dG9uICkubGVuZ3RoICkgewoJCQkJdGhpcy5jbG9zZSggZXZlbnQgKTsKCQkJfQoJCX0KCX0sCgoJX2J1dHRvbkV2ZW50czogewoJCWNsaWNrOiAiX3RvZ2dsZSIsCgkJa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgcHJldmVudERlZmF1bHQgPSB0cnVlOwoJCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoJCQkJY2FzZSAkLnVpLmtleUNvZGUuVEFCOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuRVNDQVBFOgoJCQkJCXRoaXMuY2xvc2UoIGV2ZW50ICk7CgkJCQkJcHJldmVudERlZmF1bHQgPSBmYWxzZTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkVOVEVSOgoJCQkJCWlmICggdGhpcy5pc09wZW4gKSB7CgkJCQkJCXRoaXMuX3NlbGVjdEZvY3VzZWRJdGVtKCBldmVudCApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLlVQOgoJCQkJCWlmICggZXZlbnQuYWx0S2V5ICkgewoJCQkJCQl0aGlzLl90b2dnbGUoIGV2ZW50ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5fbW92ZSggInByZXYiLCBldmVudCApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkRPV046CgkJCQkJaWYgKCBldmVudC5hbHRLZXkgKSB7CgkJCQkJCXRoaXMuX3RvZ2dsZSggZXZlbnQgKTsKCQkJCQl9IGVsc2UgewoJCQkJCQl0aGlzLl9tb3ZlKCAibmV4dCIsIGV2ZW50ICk7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUuU1BBQ0U6CgkJCQkJaWYgKCB0aGlzLmlzT3BlbiApIHsKCQkJCQkJdGhpcy5fc2VsZWN0Rm9jdXNlZEl0ZW0oIGV2ZW50ICk7CgkJCQkJfSBlbHNlIHsKCQkJCQkJdGhpcy5fdG9nZ2xlKCBldmVudCApOwoJCQkJCX0KCQkJCQlicmVhazsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkxFRlQ6CgkJCQkJdGhpcy5fbW92ZSggInByZXYiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUuUklHSFQ6CgkJCQkJdGhpcy5fbW92ZSggIm5leHQiLCBldmVudCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUuSE9NRToKCQkJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfVVA6CgkJCQkJdGhpcy5fbW92ZSggImZpcnN0IiwgZXZlbnQgKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkVORDoKCQkJCWNhc2UgJC51aS5rZXlDb2RlLlBBR0VfRE9XTjoKCQkJCQl0aGlzLl9tb3ZlKCAibGFzdCIsIGV2ZW50ICk7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCXRoaXMubWVudS50cmlnZ2VyKCBldmVudCApOwoJCQkJCXByZXZlbnREZWZhdWx0ID0gZmFsc2U7CgkJCX0KCgkJCWlmICggcHJldmVudERlZmF1bHQgKSB7CgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQl9CgkJfQoJfSwKCglfc2VsZWN0Rm9jdXNlZEl0ZW06IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgaXRlbSA9IHRoaXMubWVudUl0ZW1zLmVxKCB0aGlzLmZvY3VzSW5kZXggKTsKCQlpZiAoICFpdGVtLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgKSB7CgkJCXRoaXMuX3NlbGVjdCggaXRlbS5kYXRhKCAidWktc2VsZWN0bWVudS1pdGVtIiApLCBldmVudCApOwoJCX0KCX0sCgoJX3NlbGVjdDogZnVuY3Rpb24oIGl0ZW0sIGV2ZW50ICkgewoJCXZhciBvbGRJbmRleCA9IHRoaXMuZWxlbWVudFsgMCBdLnNlbGVjdGVkSW5kZXg7CgoJCS8vIENoYW5nZSBuYXRpdmUgc2VsZWN0IGVsZW1lbnQKCQl0aGlzLmVsZW1lbnRbIDAgXS5zZWxlY3RlZEluZGV4ID0gaXRlbS5pbmRleDsKCQl0aGlzLl9zZXRUZXh0KCB0aGlzLmJ1dHRvblRleHQsIGl0ZW0ubGFiZWwgKTsKCQl0aGlzLl9zZXRBcmlhKCBpdGVtICk7CgkJdGhpcy5fdHJpZ2dlciggInNlbGVjdCIsIGV2ZW50LCB7IGl0ZW06IGl0ZW0gfSApOwoKCQlpZiAoIGl0ZW0uaW5kZXggIT09IG9sZEluZGV4ICkgewoJCQl0aGlzLl90cmlnZ2VyKCAiY2hhbmdlIiwgZXZlbnQsIHsgaXRlbTogaXRlbSB9ICk7CgkJfQoKCQl0aGlzLmNsb3NlKCBldmVudCApOwoJfSwKCglfc2V0QXJpYTogZnVuY3Rpb24oIGl0ZW0gKSB7CgkJdmFyIGlkID0gdGhpcy5tZW51SXRlbXMuZXEoIGl0ZW0uaW5kZXggKS5hdHRyKCAiaWQiICk7CgoJCXRoaXMuYnV0dG9uLmF0dHIoewoJCQkiYXJpYS1sYWJlbGxlZGJ5IjogaWQsCgkJCSJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiOiBpZAoJCX0pOwoJCXRoaXMubWVudS5hdHRyKCAiYXJpYS1hY3RpdmVkZXNjZW5kYW50IiwgaWQgKTsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJpY29ucyIgKSB7CgkJCXRoaXMuYnV0dG9uLmZpbmQoICJzcGFuLnVpLWljb24iICkKCQkJCS5yZW1vdmVDbGFzcyggdGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbiApCgkJCQkuYWRkQ2xhc3MoIHZhbHVlLmJ1dHRvbiApOwoJCX0KCgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCgkJaWYgKCBrZXkgPT09ICJhcHBlbmRUbyIgKSB7CgkJCXRoaXMubWVudVdyYXAuYXBwZW5kVG8oIHRoaXMuX2FwcGVuZFRvKCkgKTsKCQl9CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLm1lbnVJbnN0YW5jZS5vcHRpb24oICJkaXNhYmxlZCIsIHZhbHVlICk7CgkJCXRoaXMuYnV0dG9uCgkJCQkudG9nZ2xlQ2xhc3MoICJ1aS1zdGF0ZS1kaXNhYmxlZCIsIHZhbHVlICkKCQkJCS5hdHRyKCAiYXJpYS1kaXNhYmxlZCIsIHZhbHVlICk7CgoJCQl0aGlzLmVsZW1lbnQucHJvcCggImRpc2FibGVkIiwgdmFsdWUgKTsKCQkJaWYgKCB2YWx1ZSApIHsKCQkJCXRoaXMuYnV0dG9uLmF0dHIoICJ0YWJpbmRleCIsIC0xICk7CgkJCQl0aGlzLmNsb3NlKCk7CgkJCX0gZWxzZSB7CgkJCQl0aGlzLmJ1dHRvbi5hdHRyKCAidGFiaW5kZXgiLCAwICk7CgkJCX0KCQl9CgoJCWlmICgga2V5ID09PSAid2lkdGgiICkgewoJCQlpZiAoICF2YWx1ZSApIHsKCQkJCXZhbHVlID0gdGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKTsKCQkJfQoJCQl0aGlzLmJ1dHRvbi5vdXRlcldpZHRoKCB2YWx1ZSApOwoJCX0KCX0sCgoJX2FwcGVuZFRvOiBmdW5jdGlvbigpIHsKCQl2YXIgZWxlbWVudCA9IHRoaXMub3B0aW9ucy5hcHBlbmRUbzsKCgkJaWYgKCBlbGVtZW50ICkgewoJCQllbGVtZW50ID0gZWxlbWVudC5qcXVlcnkgfHwgZWxlbWVudC5ub2RlVHlwZSA/CgkJCQkkKCBlbGVtZW50ICkgOgoJCQkJdGhpcy5kb2N1bWVudC5maW5kKCBlbGVtZW50ICkuZXEoIDAgKTsKCQl9CgoJCWlmICggIWVsZW1lbnQgfHwgIWVsZW1lbnRbIDAgXSApIHsKCQkJZWxlbWVudCA9IHRoaXMuZWxlbWVudC5jbG9zZXN0KCAiLnVpLWZyb250IiApOwoJCX0KCgkJaWYgKCAhZWxlbWVudC5sZW5ndGggKSB7CgkJCWVsZW1lbnQgPSB0aGlzLmRvY3VtZW50WyAwIF0uYm9keTsKCQl9CgoJCXJldHVybiBlbGVtZW50OwoJfSwKCglfdG9nZ2xlQXR0cjogZnVuY3Rpb24oKSB7CgkJdGhpcy5idXR0b24KCQkJLnRvZ2dsZUNsYXNzKCAidWktY29ybmVyLXRvcCIsIHRoaXMuaXNPcGVuICkKCQkJLnRvZ2dsZUNsYXNzKCAidWktY29ybmVyLWFsbCIsICF0aGlzLmlzT3BlbiApCgkJCS5hdHRyKCAiYXJpYS1leHBhbmRlZCIsIHRoaXMuaXNPcGVuICk7CgkJdGhpcy5tZW51V3JhcC50b2dnbGVDbGFzcyggInVpLXNlbGVjdG1lbnUtb3BlbiIsIHRoaXMuaXNPcGVuICk7CgkJdGhpcy5tZW51LmF0dHIoICJhcmlhLWhpZGRlbiIsICF0aGlzLmlzT3BlbiApOwoJfSwKCglfcmVzaXplTWVudTogZnVuY3Rpb24oKSB7CgkJdGhpcy5tZW51Lm91dGVyV2lkdGgoIE1hdGgubWF4KAoJCQl0aGlzLmJ1dHRvbi5vdXRlcldpZHRoKCksCgoJCQkvLyBzdXBwb3J0OiBJRTEwCgkJCS8vIElFMTAgd3JhcHMgbG9uZyB0ZXh0IChwb3NzaWJseSBhIHJvdW5kaW5nIGJ1ZykKCQkJLy8gc28gd2UgYWRkIDFweCB0byBhdm9pZCB0aGUgd3JhcHBpbmcKCQkJdGhpcy5tZW51LndpZHRoKCAiIiApLm91dGVyV2lkdGgoKSArIDEKCQkpICk7Cgl9LAoKCV9nZXRDcmVhdGVPcHRpb25zOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4geyBkaXNhYmxlZDogdGhpcy5lbGVtZW50LnByb3AoICJkaXNhYmxlZCIgKSB9OwoJfSwKCglfcGFyc2VPcHRpb25zOiBmdW5jdGlvbiggb3B0aW9ucyApIHsKCQl2YXIgZGF0YSA9IFtdOwoJCW9wdGlvbnMuZWFjaChmdW5jdGlvbiggaW5kZXgsIGl0ZW0gKSB7CgkJCXZhciBvcHRpb24gPSAkKCBpdGVtICksCgkJCQlvcHRncm91cCA9IG9wdGlvbi5wYXJlbnQoICJvcHRncm91cCIgKTsKCQkJZGF0YS5wdXNoKHsKCQkJCWVsZW1lbnQ6IG9wdGlvbiwKCQkJCWluZGV4OiBpbmRleCwKCQkJCXZhbHVlOiBvcHRpb24uYXR0ciggInZhbHVlIiApLAoJCQkJbGFiZWw6IG9wdGlvbi50ZXh0KCksCgkJCQlvcHRncm91cDogb3B0Z3JvdXAuYXR0ciggImxhYmVsIiApIHx8ICIiLAoJCQkJZGlzYWJsZWQ6IG9wdGdyb3VwLnByb3AoICJkaXNhYmxlZCIgKSB8fCBvcHRpb24ucHJvcCggImRpc2FibGVkIiApCgkJCX0pOwoJCX0pOwoJCXRoaXMuaXRlbXMgPSBkYXRhOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdGhpcy5tZW51V3JhcC5yZW1vdmUoKTsKCQl0aGlzLmJ1dHRvbi5yZW1vdmUoKTsKCQl0aGlzLmVsZW1lbnQuc2hvdygpOwoJCXRoaXMuZWxlbWVudC5yZW1vdmVVbmlxdWVJZCgpOwoJCXRoaXMubGFiZWwuYXR0ciggImZvciIsIHRoaXMuaWRzLmVsZW1lbnQgKTsKCX0KfSk7CgoKLyohCiAqIGpRdWVyeSBVSSBTbGlkZXIgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vc2xpZGVyLwogKi8KCgp2YXIgc2xpZGVyID0gJC53aWRnZXQoICJ1aS5zbGlkZXIiLCAkLnVpLm1vdXNlLCB7Cgl2ZXJzaW9uOiAiMS4xMS4wIiwKCXdpZGdldEV2ZW50UHJlZml4OiAic2xpZGUiLAoKCW9wdGlvbnM6IHsKCQlhbmltYXRlOiBmYWxzZSwKCQlkaXN0YW5jZTogMCwKCQltYXg6IDEwMCwKCQltaW46IDAsCgkJb3JpZW50YXRpb246ICJob3Jpem9udGFsIiwKCQlyYW5nZTogZmFsc2UsCgkJc3RlcDogMSwKCQl2YWx1ZTogMCwKCQl2YWx1ZXM6IG51bGwsCgoJCS8vIGNhbGxiYWNrcwoJCWNoYW5nZTogbnVsbCwKCQlzbGlkZTogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsCgl9LAoKCS8vIG51bWJlciBvZiBwYWdlcyBpbiBhIHNsaWRlcgoJLy8gKGhvdyBtYW55IHRpbWVzIGNhbiB5b3UgcGFnZSB1cC9kb3duIHRvIGdvIHRocm91Z2ggdGhlIHdob2xlIHJhbmdlKQoJbnVtUGFnZXM6IDUsCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5fa2V5U2xpZGluZyA9IGZhbHNlOwoJCXRoaXMuX21vdXNlU2xpZGluZyA9IGZhbHNlOwoJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJCXRoaXMuX2hhbmRsZUluZGV4ID0gbnVsbDsKCQl0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpOwoJCXRoaXMuX21vdXNlSW5pdCgpOwoKCQl0aGlzLmVsZW1lbnQKCQkJLmFkZENsYXNzKCAidWktc2xpZGVyIiArCgkJCQkiIHVpLXNsaWRlci0iICsgdGhpcy5vcmllbnRhdGlvbiArCgkJCQkiIHVpLXdpZGdldCIgKwoJCQkJIiB1aS13aWRnZXQtY29udGVudCIgKwoJCQkJIiB1aS1jb3JuZXItYWxsIik7CgoJCXRoaXMuX3JlZnJlc2goKTsKCQl0aGlzLl9zZXRPcHRpb24oICJkaXNhYmxlZCIsIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApOwoKCQl0aGlzLl9hbmltYXRlT2ZmID0gZmFsc2U7Cgl9LAoKCV9yZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9jcmVhdGVSYW5nZSgpOwoJCXRoaXMuX2NyZWF0ZUhhbmRsZXMoKTsKCQl0aGlzLl9zZXR1cEV2ZW50cygpOwoJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJfSwKCglfY3JlYXRlSGFuZGxlczogZnVuY3Rpb24oKSB7CgkJdmFyIGksIGhhbmRsZUNvdW50LAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQlleGlzdGluZ0hhbmRsZXMgPSB0aGlzLmVsZW1lbnQuZmluZCggIi51aS1zbGlkZXItaGFuZGxlIiApLmFkZENsYXNzKCAidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIiApLAoJCQloYW5kbGUgPSAiPHNwYW4gY2xhc3M9J3VpLXNsaWRlci1oYW5kbGUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsJyB0YWJpbmRleD0nMCc+PC9zcGFuPiIsCgkJCWhhbmRsZXMgPSBbXTsKCgkJaGFuZGxlQ291bnQgPSAoIG9wdGlvbnMudmFsdWVzICYmIG9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHx8IDE7CgoJCWlmICggZXhpc3RpbmdIYW5kbGVzLmxlbmd0aCA+IGhhbmRsZUNvdW50ICkgewoJCQlleGlzdGluZ0hhbmRsZXMuc2xpY2UoIGhhbmRsZUNvdW50ICkucmVtb3ZlKCk7CgkJCWV4aXN0aW5nSGFuZGxlcyA9IGV4aXN0aW5nSGFuZGxlcy5zbGljZSggMCwgaGFuZGxlQ291bnQgKTsKCQl9CgoJCWZvciAoIGkgPSBleGlzdGluZ0hhbmRsZXMubGVuZ3RoOyBpIDwgaGFuZGxlQ291bnQ7IGkrKyApIHsKCQkJaGFuZGxlcy5wdXNoKCBoYW5kbGUgKTsKCQl9CgoJCXRoaXMuaGFuZGxlcyA9IGV4aXN0aW5nSGFuZGxlcy5hZGQoICQoIGhhbmRsZXMuam9pbiggIiIgKSApLmFwcGVuZFRvKCB0aGlzLmVsZW1lbnQgKSApOwoKCQl0aGlzLmhhbmRsZSA9IHRoaXMuaGFuZGxlcy5lcSggMCApOwoKCQl0aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJJCggdGhpcyApLmRhdGEoICJ1aS1zbGlkZXItaGFuZGxlLWluZGV4IiwgaSApOwoJCX0pOwoJfSwKCglfY3JlYXRlUmFuZ2U6IGZ1bmN0aW9uKCkgewoJCXZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLAoJCQljbGFzc2VzID0gIiI7CgoJCWlmICggb3B0aW9ucy5yYW5nZSApIHsKCQkJaWYgKCBvcHRpb25zLnJhbmdlID09PSB0cnVlICkgewoJCQkJaWYgKCAhb3B0aW9ucy52YWx1ZXMgKSB7CgkJCQkJb3B0aW9ucy52YWx1ZXMgPSBbIHRoaXMuX3ZhbHVlTWluKCksIHRoaXMuX3ZhbHVlTWluKCkgXTsKCQkJCX0gZWxzZSBpZiAoIG9wdGlvbnMudmFsdWVzLmxlbmd0aCAmJiBvcHRpb25zLnZhbHVlcy5sZW5ndGggIT09IDIgKSB7CgkJCQkJb3B0aW9ucy52YWx1ZXMgPSBbIG9wdGlvbnMudmFsdWVzWzBdLCBvcHRpb25zLnZhbHVlc1swXSBdOwoJCQkJfSBlbHNlIGlmICggJC5pc0FycmF5KCBvcHRpb25zLnZhbHVlcyApICkgewoJCQkJCW9wdGlvbnMudmFsdWVzID0gb3B0aW9ucy52YWx1ZXMuc2xpY2UoMCk7CgkJCQl9CgkJCX0KCgkJCWlmICggIXRoaXMucmFuZ2UgfHwgIXRoaXMucmFuZ2UubGVuZ3RoICkgewoJCQkJdGhpcy5yYW5nZSA9ICQoICI8ZGl2PjwvZGl2PiIgKQoJCQkJCS5hcHBlbmRUbyggdGhpcy5lbGVtZW50ICk7CgoJCQkJY2xhc3NlcyA9ICJ1aS1zbGlkZXItcmFuZ2UiICsKCQkJCS8vIG5vdGU6IHRoaXMgaXNuJ3QgdGhlIG1vc3QgZml0dGluZ2x5IHNlbWFudGljIGZyYW1ld29yayBjbGFzcyBmb3IgdGhpcyBlbGVtZW50LAoJCQkJLy8gYnV0IHdvcmtlZCBiZXN0IHZpc3VhbGx5IHdpdGggYSB2YXJpZXR5IG9mIHRoZW1lcwoJCQkJIiB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiOwoJCQl9IGVsc2UgewoJCQkJdGhpcy5yYW5nZS5yZW1vdmVDbGFzcyggInVpLXNsaWRlci1yYW5nZS1taW4gdWktc2xpZGVyLXJhbmdlLW1heCIgKQoJCQkJCS8vIEhhbmRsZSByYW5nZSBzd2l0Y2hpbmcgZnJvbSB0cnVlIHRvIG1pbi9tYXgKCQkJCQkuY3NzKHsKCQkJCQkJImxlZnQiOiAiIiwKCQkJCQkJImJvdHRvbSI6ICIiCgkJCQkJfSk7CgkJCX0KCgkJCXRoaXMucmFuZ2UuYWRkQ2xhc3MoIGNsYXNzZXMgKwoJCQkJKCAoIG9wdGlvbnMucmFuZ2UgPT09ICJtaW4iIHx8IG9wdGlvbnMucmFuZ2UgPT09ICJtYXgiICkgPyAiIHVpLXNsaWRlci1yYW5nZS0iICsgb3B0aW9ucy5yYW5nZSA6ICIiICkgKTsKCQl9IGVsc2UgewoJCQlpZiAoIHRoaXMucmFuZ2UgKSB7CgkJCQl0aGlzLnJhbmdlLnJlbW92ZSgpOwoJCQl9CgkJCXRoaXMucmFuZ2UgPSBudWxsOwoJCX0KCX0sCgoJX3NldHVwRXZlbnRzOiBmdW5jdGlvbigpIHsKCQl0aGlzLl9vZmYoIHRoaXMuaGFuZGxlcyApOwoJCXRoaXMuX29uKCB0aGlzLmhhbmRsZXMsIHRoaXMuX2hhbmRsZUV2ZW50cyApOwoJCXRoaXMuX2hvdmVyYWJsZSggdGhpcy5oYW5kbGVzICk7CgkJdGhpcy5fZm9jdXNhYmxlKCB0aGlzLmhhbmRsZXMgKTsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCXRoaXMuaGFuZGxlcy5yZW1vdmUoKTsKCQlpZiAoIHRoaXMucmFuZ2UgKSB7CgkJCXRoaXMucmFuZ2UucmVtb3ZlKCk7CgkJfQoKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCAidWktc2xpZGVyIiArCgkJCQkiIHVpLXNsaWRlci1ob3Jpem9udGFsIiArCgkJCQkiIHVpLXNsaWRlci12ZXJ0aWNhbCIgKwoJCQkJIiB1aS13aWRnZXQiICsKCQkJCSIgdWktd2lkZ2V0LWNvbnRlbnQiICsKCQkJCSIgdWktY29ybmVyLWFsbCIgKTsKCgkJdGhpcy5fbW91c2VEZXN0cm95KCk7Cgl9LAoKCV9tb3VzZUNhcHR1cmU6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgcG9zaXRpb24sIG5vcm1WYWx1ZSwgZGlzdGFuY2UsIGNsb3Nlc3RIYW5kbGUsIGluZGV4LCBhbGxvd2VkLCBvZmZzZXQsIG1vdXNlT3ZlckhhbmRsZSwKCQkJdGhhdCA9IHRoaXMsCgkJCW8gPSB0aGlzLm9wdGlvbnM7CgoJCWlmICggby5kaXNhYmxlZCApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJdGhpcy5lbGVtZW50U2l6ZSA9IHsKCQkJd2lkdGg6IHRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksCgkJCWhlaWdodDogdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCkKCQl9OwoJCXRoaXMuZWxlbWVudE9mZnNldCA9IHRoaXMuZWxlbWVudC5vZmZzZXQoKTsKCgkJcG9zaXRpb24gPSB7IHg6IGV2ZW50LnBhZ2VYLCB5OiBldmVudC5wYWdlWSB9OwoJCW5vcm1WYWx1ZSA9IHRoaXMuX25vcm1WYWx1ZUZyb21Nb3VzZSggcG9zaXRpb24gKTsKCQlkaXN0YW5jZSA9IHRoaXMuX3ZhbHVlTWF4KCkgLSB0aGlzLl92YWx1ZU1pbigpICsgMTsKCQl0aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbiggaSApIHsKCQkJdmFyIHRoaXNEaXN0YW5jZSA9IE1hdGguYWJzKCBub3JtVmFsdWUgLSB0aGF0LnZhbHVlcyhpKSApOwoJCQlpZiAoKCBkaXN0YW5jZSA+IHRoaXNEaXN0YW5jZSApIHx8CgkJCQkoIGRpc3RhbmNlID09PSB0aGlzRGlzdGFuY2UgJiYKCQkJCQkoaSA9PT0gdGhhdC5fbGFzdENoYW5nZWRWYWx1ZSB8fCB0aGF0LnZhbHVlcyhpKSA9PT0gby5taW4gKSkpIHsKCQkJCWRpc3RhbmNlID0gdGhpc0Rpc3RhbmNlOwoJCQkJY2xvc2VzdEhhbmRsZSA9ICQoIHRoaXMgKTsKCQkJCWluZGV4ID0gaTsKCQkJfQoJCX0pOwoKCQlhbGxvd2VkID0gdGhpcy5fc3RhcnQoIGV2ZW50LCBpbmRleCApOwoJCWlmICggYWxsb3dlZCA9PT0gZmFsc2UgKSB7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJdGhpcy5fbW91c2VTbGlkaW5nID0gdHJ1ZTsKCgkJdGhpcy5faGFuZGxlSW5kZXggPSBpbmRleDsKCgkJY2xvc2VzdEhhbmRsZQoJCQkuYWRkQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICkKCQkJLmZvY3VzKCk7CgoJCW9mZnNldCA9IGNsb3Nlc3RIYW5kbGUub2Zmc2V0KCk7CgkJbW91c2VPdmVySGFuZGxlID0gISQoIGV2ZW50LnRhcmdldCApLnBhcmVudHMoKS5hZGRCYWNrKCkuaXMoICIudWktc2xpZGVyLWhhbmRsZSIgKTsKCQl0aGlzLl9jbGlja09mZnNldCA9IG1vdXNlT3ZlckhhbmRsZSA/IHsgbGVmdDogMCwgdG9wOiAwIH0gOiB7CgkJCWxlZnQ6IGV2ZW50LnBhZ2VYIC0gb2Zmc2V0LmxlZnQgLSAoIGNsb3Nlc3RIYW5kbGUud2lkdGgoKSAvIDIgKSwKCQkJdG9wOiBldmVudC5wYWdlWSAtIG9mZnNldC50b3AgLQoJCQkJKCBjbG9zZXN0SGFuZGxlLmhlaWdodCgpIC8gMiApIC0KCQkJCSggcGFyc2VJbnQoIGNsb3Nlc3RIYW5kbGUuY3NzKCJib3JkZXJUb3BXaWR0aCIpLCAxMCApIHx8IDAgKSAtCgkJCQkoIHBhcnNlSW50KCBjbG9zZXN0SGFuZGxlLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwgMTAgKSB8fCAwKSArCgkJCQkoIHBhcnNlSW50KCBjbG9zZXN0SGFuZGxlLmNzcygibWFyZ2luVG9wIiksIDEwICkgfHwgMCkKCQl9OwoKCQlpZiAoICF0aGlzLmhhbmRsZXMuaGFzQ2xhc3MoICJ1aS1zdGF0ZS1ob3ZlciIgKSApIHsKCQkJdGhpcy5fc2xpZGUoIGV2ZW50LCBpbmRleCwgbm9ybVZhbHVlICk7CgkJfQoJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJCXJldHVybiB0cnVlOwoJfSwKCglfbW91c2VTdGFydDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRydWU7Cgl9LAoKCV9tb3VzZURyYWc6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgcG9zaXRpb24gPSB7IHg6IGV2ZW50LnBhZ2VYLCB5OiBldmVudC5wYWdlWSB9LAoJCQlub3JtVmFsdWUgPSB0aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UoIHBvc2l0aW9uICk7CgoJCXRoaXMuX3NsaWRlKCBldmVudCwgdGhpcy5faGFuZGxlSW5kZXgsIG5vcm1WYWx1ZSApOwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9tb3VzZVN0b3A6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl0aGlzLmhhbmRsZXMucmVtb3ZlQ2xhc3MoICJ1aS1zdGF0ZS1hY3RpdmUiICk7CgkJdGhpcy5fbW91c2VTbGlkaW5nID0gZmFsc2U7CgoJCXRoaXMuX3N0b3AoIGV2ZW50LCB0aGlzLl9oYW5kbGVJbmRleCApOwoJCXRoaXMuX2NoYW5nZSggZXZlbnQsIHRoaXMuX2hhbmRsZUluZGV4ICk7CgoJCXRoaXMuX2hhbmRsZUluZGV4ID0gbnVsbDsKCQl0aGlzLl9jbGlja09mZnNldCA9IG51bGw7CgkJdGhpcy5fYW5pbWF0ZU9mZiA9IGZhbHNlOwoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV9kZXRlY3RPcmllbnRhdGlvbjogZnVuY3Rpb24oKSB7CgkJdGhpcy5vcmllbnRhdGlvbiA9ICggdGhpcy5vcHRpb25zLm9yaWVudGF0aW9uID09PSAidmVydGljYWwiICkgPyAidmVydGljYWwiIDogImhvcml6b250YWwiOwoJfSwKCglfbm9ybVZhbHVlRnJvbU1vdXNlOiBmdW5jdGlvbiggcG9zaXRpb24gKSB7CgkJdmFyIHBpeGVsVG90YWwsCgkJCXBpeGVsTW91c2UsCgkJCXBlcmNlbnRNb3VzZSwKCQkJdmFsdWVUb3RhbCwKCQkJdmFsdWVNb3VzZTsKCgkJaWYgKCB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgKSB7CgkJCXBpeGVsVG90YWwgPSB0aGlzLmVsZW1lbnRTaXplLndpZHRoOwoJCQlwaXhlbE1vdXNlID0gcG9zaXRpb24ueCAtIHRoaXMuZWxlbWVudE9mZnNldC5sZWZ0IC0gKCB0aGlzLl9jbGlja09mZnNldCA/IHRoaXMuX2NsaWNrT2Zmc2V0LmxlZnQgOiAwICk7CgkJfSBlbHNlIHsKCQkJcGl4ZWxUb3RhbCA9IHRoaXMuZWxlbWVudFNpemUuaGVpZ2h0OwoJCQlwaXhlbE1vdXNlID0gcG9zaXRpb24ueSAtIHRoaXMuZWxlbWVudE9mZnNldC50b3AgLSAoIHRoaXMuX2NsaWNrT2Zmc2V0ID8gdGhpcy5fY2xpY2tPZmZzZXQudG9wIDogMCApOwoJCX0KCgkJcGVyY2VudE1vdXNlID0gKCBwaXhlbE1vdXNlIC8gcGl4ZWxUb3RhbCApOwoJCWlmICggcGVyY2VudE1vdXNlID4gMSApIHsKCQkJcGVyY2VudE1vdXNlID0gMTsKCQl9CgkJaWYgKCBwZXJjZW50TW91c2UgPCAwICkgewoJCQlwZXJjZW50TW91c2UgPSAwOwoJCX0KCQlpZiAoIHRoaXMub3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCIgKSB7CgkJCXBlcmNlbnRNb3VzZSA9IDEgLSBwZXJjZW50TW91c2U7CgkJfQoKCQl2YWx1ZVRvdGFsID0gdGhpcy5fdmFsdWVNYXgoKSAtIHRoaXMuX3ZhbHVlTWluKCk7CgkJdmFsdWVNb3VzZSA9IHRoaXMuX3ZhbHVlTWluKCkgKyBwZXJjZW50TW91c2UgKiB2YWx1ZVRvdGFsOwoKCQlyZXR1cm4gdGhpcy5fdHJpbUFsaWduVmFsdWUoIHZhbHVlTW91c2UgKTsKCX0sCgoJX3N0YXJ0OiBmdW5jdGlvbiggZXZlbnQsIGluZGV4ICkgewoJCXZhciB1aUhhc2ggPSB7CgkJCWhhbmRsZTogdGhpcy5oYW5kbGVzWyBpbmRleCBdLAoJCQl2YWx1ZTogdGhpcy52YWx1ZSgpCgkJfTsKCQlpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCXVpSGFzaC52YWx1ZSA9IHRoaXMudmFsdWVzKCBpbmRleCApOwoJCQl1aUhhc2gudmFsdWVzID0gdGhpcy52YWx1ZXMoKTsKCQl9CgkJcmV0dXJuIHRoaXMuX3RyaWdnZXIoICJzdGFydCIsIGV2ZW50LCB1aUhhc2ggKTsKCX0sCgoJX3NsaWRlOiBmdW5jdGlvbiggZXZlbnQsIGluZGV4LCBuZXdWYWwgKSB7CgkJdmFyIG90aGVyVmFsLAoJCQluZXdWYWx1ZXMsCgkJCWFsbG93ZWQ7CgoJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJb3RoZXJWYWwgPSB0aGlzLnZhbHVlcyggaW5kZXggPyAwIDogMSApOwoKCQkJaWYgKCAoIHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoID09PSAyICYmIHRoaXMub3B0aW9ucy5yYW5nZSA9PT0gdHJ1ZSApICYmCgkJCQkJKCAoIGluZGV4ID09PSAwICYmIG5ld1ZhbCA+IG90aGVyVmFsKSB8fCAoIGluZGV4ID09PSAxICYmIG5ld1ZhbCA8IG90aGVyVmFsICkgKQoJCQkJKSB7CgkJCQluZXdWYWwgPSBvdGhlclZhbDsKCQkJfQoKCQkJaWYgKCBuZXdWYWwgIT09IHRoaXMudmFsdWVzKCBpbmRleCApICkgewoJCQkJbmV3VmFsdWVzID0gdGhpcy52YWx1ZXMoKTsKCQkJCW5ld1ZhbHVlc1sgaW5kZXggXSA9IG5ld1ZhbDsKCQkJCS8vIEEgc2xpZGUgY2FuIGJlIGNhbmNlbGVkIGJ5IHJldHVybmluZyBmYWxzZSBmcm9tIHRoZSBzbGlkZSBjYWxsYmFjawoJCQkJYWxsb3dlZCA9IHRoaXMuX3RyaWdnZXIoICJzbGlkZSIsIGV2ZW50LCB7CgkJCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCQkJdmFsdWU6IG5ld1ZhbCwKCQkJCQl2YWx1ZXM6IG5ld1ZhbHVlcwoJCQkJfSApOwoJCQkJb3RoZXJWYWwgPSB0aGlzLnZhbHVlcyggaW5kZXggPyAwIDogMSApOwoJCQkJaWYgKCBhbGxvd2VkICE9PSBmYWxzZSApIHsKCQkJCQl0aGlzLnZhbHVlcyggaW5kZXgsIG5ld1ZhbCApOwoJCQkJfQoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCBuZXdWYWwgIT09IHRoaXMudmFsdWUoKSApIHsKCQkJCS8vIEEgc2xpZGUgY2FuIGJlIGNhbmNlbGVkIGJ5IHJldHVybmluZyBmYWxzZSBmcm9tIHRoZSBzbGlkZSBjYWxsYmFjawoJCQkJYWxsb3dlZCA9IHRoaXMuX3RyaWdnZXIoICJzbGlkZSIsIGV2ZW50LCB7CgkJCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCQkJdmFsdWU6IG5ld1ZhbAoJCQkJfSApOwoJCQkJaWYgKCBhbGxvd2VkICE9PSBmYWxzZSApIHsKCQkJCQl0aGlzLnZhbHVlKCBuZXdWYWwgKTsKCQkJCX0KCQkJfQoJCX0KCX0sCgoJX3N0b3A6IGZ1bmN0aW9uKCBldmVudCwgaW5kZXggKSB7CgkJdmFyIHVpSGFzaCA9IHsKCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCXZhbHVlOiB0aGlzLnZhbHVlKCkKCQl9OwoJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJdWlIYXNoLnZhbHVlID0gdGhpcy52YWx1ZXMoIGluZGV4ICk7CgkJCXVpSGFzaC52YWx1ZXMgPSB0aGlzLnZhbHVlcygpOwoJCX0KCgkJdGhpcy5fdHJpZ2dlciggInN0b3AiLCBldmVudCwgdWlIYXNoICk7Cgl9LAoKCV9jaGFuZ2U6IGZ1bmN0aW9uKCBldmVudCwgaW5kZXggKSB7CgkJaWYgKCAhdGhpcy5fa2V5U2xpZGluZyAmJiAhdGhpcy5fbW91c2VTbGlkaW5nICkgewoJCQl2YXIgdWlIYXNoID0gewoJCQkJaGFuZGxlOiB0aGlzLmhhbmRsZXNbIGluZGV4IF0sCgkJCQl2YWx1ZTogdGhpcy52YWx1ZSgpCgkJCX07CgkJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJCXVpSGFzaC52YWx1ZSA9IHRoaXMudmFsdWVzKCBpbmRleCApOwoJCQkJdWlIYXNoLnZhbHVlcyA9IHRoaXMudmFsdWVzKCk7CgkJCX0KCgkJCS8vc3RvcmUgdGhlIGxhc3QgY2hhbmdlZCB2YWx1ZSBpbmRleCBmb3IgcmVmZXJlbmNlIHdoZW4gaGFuZGxlcyBvdmVybGFwCgkJCXRoaXMuX2xhc3RDaGFuZ2VkVmFsdWUgPSBpbmRleDsKCgkJCXRoaXMuX3RyaWdnZXIoICJjaGFuZ2UiLCBldmVudCwgdWlIYXNoICk7CgkJfQoJfSwKCgl2YWx1ZTogZnVuY3Rpb24oIG5ld1ZhbHVlICkgewoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJdGhpcy5vcHRpb25zLnZhbHVlID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIG5ld1ZhbHVlICk7CgkJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJCQl0aGlzLl9jaGFuZ2UoIG51bGwsIDAgKTsKCQkJcmV0dXJuOwoJCX0KCgkJcmV0dXJuIHRoaXMuX3ZhbHVlKCk7Cgl9LAoKCXZhbHVlczogZnVuY3Rpb24oIGluZGV4LCBuZXdWYWx1ZSApIHsKCQl2YXIgdmFscywKCQkJbmV3VmFsdWVzLAoJCQlpOwoKCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkgewoJCQl0aGlzLm9wdGlvbnMudmFsdWVzWyBpbmRleCBdID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIG5ld1ZhbHVlICk7CgkJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJCQl0aGlzLl9jaGFuZ2UoIG51bGwsIGluZGV4ICk7CgkJCXJldHVybjsKCQl9CgoJCWlmICggYXJndW1lbnRzLmxlbmd0aCApIHsKCQkJaWYgKCAkLmlzQXJyYXkoIGFyZ3VtZW50c1sgMCBdICkgKSB7CgkJCQl2YWxzID0gdGhpcy5vcHRpb25zLnZhbHVlczsKCQkJCW5ld1ZhbHVlcyA9IGFyZ3VtZW50c1sgMCBdOwoJCQkJZm9yICggaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSArPSAxICkgewoJCQkJCXZhbHNbIGkgXSA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKCBuZXdWYWx1ZXNbIGkgXSApOwoJCQkJCXRoaXMuX2NoYW5nZSggbnVsbCwgaSApOwoJCQkJfQoJCQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCQkJcmV0dXJuIHRoaXMuX3ZhbHVlcyggaW5kZXggKTsKCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIHRoaXMudmFsdWUoKTsKCQkJCX0KCQkJfQoJCX0gZWxzZSB7CgkJCXJldHVybiB0aGlzLl92YWx1ZXMoKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb246IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewoJCXZhciBpLAoJCQl2YWxzTGVuZ3RoID0gMDsKCgkJaWYgKCBrZXkgPT09ICJyYW5nZSIgJiYgdGhpcy5vcHRpb25zLnJhbmdlID09PSB0cnVlICkgewoJCQlpZiAoIHZhbHVlID09PSAibWluIiApIHsKCQkJCXRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuX3ZhbHVlcyggMCApOwoJCQkJdGhpcy5vcHRpb25zLnZhbHVlcyA9IG51bGw7CgkJCX0gZWxzZSBpZiAoIHZhbHVlID09PSAibWF4IiApIHsKCQkJCXRoaXMub3B0aW9ucy52YWx1ZSA9IHRoaXMuX3ZhbHVlcyggdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggLSAxICk7CgkJCQl0aGlzLm9wdGlvbnMudmFsdWVzID0gbnVsbDsKCQkJfQoJCX0KCgkJaWYgKCAkLmlzQXJyYXkoIHRoaXMub3B0aW9ucy52YWx1ZXMgKSApIHsKCQkJdmFsc0xlbmd0aCA9IHRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJkaXNhYmxlZCIgKSB7CgkJCXRoaXMuZWxlbWVudC50b2dnbGVDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiwgISF2YWx1ZSApOwoJCX0KCgkJdGhpcy5fc3VwZXIoIGtleSwgdmFsdWUgKTsKCgkJc3dpdGNoICgga2V5ICkgewoJCQljYXNlICJvcmllbnRhdGlvbiI6CgkJCQl0aGlzLl9kZXRlY3RPcmllbnRhdGlvbigpOwoJCQkJdGhpcy5lbGVtZW50CgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIiApCgkJCQkJLmFkZENsYXNzKCAidWktc2xpZGVyLSIgKyB0aGlzLm9yaWVudGF0aW9uICk7CgkJCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCQkJCWJyZWFrOwoJCQljYXNlICJ2YWx1ZSI6CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gdHJ1ZTsKCQkJCXRoaXMuX3JlZnJlc2hWYWx1ZSgpOwoJCQkJdGhpcy5fY2hhbmdlKCBudWxsLCAwICk7CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gZmFsc2U7CgkJCQlicmVhazsKCQkJY2FzZSAidmFsdWVzIjoKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSB0cnVlOwoJCQkJdGhpcy5fcmVmcmVzaFZhbHVlKCk7CgkJCQlmb3IgKCBpID0gMDsgaSA8IHZhbHNMZW5ndGg7IGkgKz0gMSApIHsKCQkJCQl0aGlzLl9jaGFuZ2UoIG51bGwsIGkgKTsKCQkJCX0KCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQljYXNlICJtaW4iOgoJCQljYXNlICJtYXgiOgoJCQkJdGhpcy5fYW5pbWF0ZU9mZiA9IHRydWU7CgkJCQl0aGlzLl9yZWZyZXNoVmFsdWUoKTsKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCQljYXNlICJyYW5nZSI6CgkJCQl0aGlzLl9hbmltYXRlT2ZmID0gdHJ1ZTsKCQkJCXRoaXMuX3JlZnJlc2goKTsKCQkJCXRoaXMuX2FuaW1hdGVPZmYgPSBmYWxzZTsKCQkJCWJyZWFrOwoJCX0KCX0sCgoJLy9pbnRlcm5hbCB2YWx1ZSBnZXR0ZXIKCS8vIF92YWx1ZSgpIHJldHVybnMgdmFsdWUgdHJpbW1lZCBieSBtaW4gYW5kIG1heCwgYWxpZ25lZCBieSBzdGVwCglfdmFsdWU6IGZ1bmN0aW9uKCkgewoJCXZhciB2YWwgPSB0aGlzLm9wdGlvbnMudmFsdWU7CgkJdmFsID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIHZhbCApOwoKCQlyZXR1cm4gdmFsOwoJfSwKCgkvL2ludGVybmFsIHZhbHVlcyBnZXR0ZXIKCS8vIF92YWx1ZXMoKSByZXR1cm5zIGFycmF5IG9mIHZhbHVlcyB0cmltbWVkIGJ5IG1pbiBhbmQgbWF4LCBhbGlnbmVkIGJ5IHN0ZXAKCS8vIF92YWx1ZXMoIGluZGV4ICkgcmV0dXJucyBzaW5nbGUgdmFsdWUgdHJpbW1lZCBieSBtaW4gYW5kIG1heCwgYWxpZ25lZCBieSBzdGVwCglfdmFsdWVzOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJdmFyIHZhbCwKCQkJdmFscywKCQkJaTsKCgkJaWYgKCBhcmd1bWVudHMubGVuZ3RoICkgewoJCQl2YWwgPSB0aGlzLm9wdGlvbnMudmFsdWVzWyBpbmRleCBdOwoJCQl2YWwgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggdmFsICk7CgoJCQlyZXR1cm4gdmFsOwoJCX0gZWxzZSBpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCS8vIC5zbGljZSgpIGNyZWF0ZXMgYSBjb3B5IG9mIHRoZSBhcnJheQoJCQkvLyB0aGlzIGNvcHkgZ2V0cyB0cmltbWVkIGJ5IG1pbiBhbmQgbWF4IGFuZCB0aGVuIHJldHVybmVkCgkJCXZhbHMgPSB0aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCk7CgkJCWZvciAoIGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrPSAxKSB7CgkJCQl2YWxzWyBpIF0gPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggdmFsc1sgaSBdICk7CgkJCX0KCgkJCXJldHVybiB2YWxzOwoJCX0gZWxzZSB7CgkJCXJldHVybiBbXTsKCQl9Cgl9LAoKCS8vIHJldHVybnMgdGhlIHN0ZXAtYWxpZ25lZCB2YWx1ZSB0aGF0IHZhbCBpcyBjbG9zZXN0IHRvLCBiZXR3ZWVuIChpbmNsdXNpdmUpIG1pbiBhbmQgbWF4CglfdHJpbUFsaWduVmFsdWU6IGZ1bmN0aW9uKCB2YWwgKSB7CgkJaWYgKCB2YWwgPD0gdGhpcy5fdmFsdWVNaW4oKSApIHsKCQkJcmV0dXJuIHRoaXMuX3ZhbHVlTWluKCk7CgkJfQoJCWlmICggdmFsID49IHRoaXMuX3ZhbHVlTWF4KCkgKSB7CgkJCXJldHVybiB0aGlzLl92YWx1ZU1heCgpOwoJCX0KCQl2YXIgc3RlcCA9ICggdGhpcy5vcHRpb25zLnN0ZXAgPiAwICkgPyB0aGlzLm9wdGlvbnMuc3RlcCA6IDEsCgkJCXZhbE1vZFN0ZXAgPSAodmFsIC0gdGhpcy5fdmFsdWVNaW4oKSkgJSBzdGVwLAoJCQlhbGlnblZhbHVlID0gdmFsIC0gdmFsTW9kU3RlcDsKCgkJaWYgKCBNYXRoLmFicyh2YWxNb2RTdGVwKSAqIDIgPj0gc3RlcCApIHsKCQkJYWxpZ25WYWx1ZSArPSAoIHZhbE1vZFN0ZXAgPiAwICkgPyBzdGVwIDogKCAtc3RlcCApOwoJCX0KCgkJLy8gU2luY2UgSmF2YVNjcmlwdCBoYXMgcHJvYmxlbXMgd2l0aCBsYXJnZSBmbG9hdHMsIHJvdW5kCgkJLy8gdGhlIGZpbmFsIHZhbHVlIHRvIDUgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IChzZWUgIzQxMjQpCgkJcmV0dXJuIHBhcnNlRmxvYXQoIGFsaWduVmFsdWUudG9GaXhlZCg1KSApOwoJfSwKCglfdmFsdWVNaW46IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm9wdGlvbnMubWluOwoJfSwKCglfdmFsdWVNYXg6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLm9wdGlvbnMubWF4OwoJfSwKCglfcmVmcmVzaFZhbHVlOiBmdW5jdGlvbigpIHsKCQl2YXIgbGFzdFZhbFBlcmNlbnQsIHZhbFBlcmNlbnQsIHZhbHVlLCB2YWx1ZU1pbiwgdmFsdWVNYXgsCgkJCW9SYW5nZSA9IHRoaXMub3B0aW9ucy5yYW5nZSwKCQkJbyA9IHRoaXMub3B0aW9ucywKCQkJdGhhdCA9IHRoaXMsCgkJCWFuaW1hdGUgPSAoICF0aGlzLl9hbmltYXRlT2ZmICkgPyBvLmFuaW1hdGUgOiBmYWxzZSwKCQkJX3NldCA9IHt9OwoKCQlpZiAoIHRoaXMub3B0aW9ucy52YWx1ZXMgJiYgdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGggKSB7CgkJCXRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKCBpICkgewoJCQkJdmFsUGVyY2VudCA9ICggdGhhdC52YWx1ZXMoaSkgLSB0aGF0Ll92YWx1ZU1pbigpICkgLyAoIHRoYXQuX3ZhbHVlTWF4KCkgLSB0aGF0Ll92YWx1ZU1pbigpICkgKiAxMDA7CgkJCQlfc2V0WyB0aGF0Lm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAibGVmdCIgOiAiYm90dG9tIiBdID0gdmFsUGVyY2VudCArICIlIjsKCQkJCSQoIHRoaXMgKS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCBfc2V0LCBvLmFuaW1hdGUgKTsKCQkJCWlmICggdGhhdC5vcHRpb25zLnJhbmdlID09PSB0cnVlICkgewoJCQkJCWlmICggdGhhdC5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiICkgewoJCQkJCQlpZiAoIGkgPT09IDAgKSB7CgkJCQkJCQl0aGF0LnJhbmdlLnN0b3AoIDEsIDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIHsgbGVmdDogdmFsUGVyY2VudCArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJCQkJfQoJCQkJCQlpZiAoIGkgPT09IDEgKSB7CgkJCQkJCQl0aGF0LnJhbmdlWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyB3aWR0aDogKCB2YWxQZXJjZW50IC0gbGFzdFZhbFBlcmNlbnQgKSArICIlIiB9LCB7IHF1ZXVlOiBmYWxzZSwgZHVyYXRpb246IG8uYW5pbWF0ZSB9ICk7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlpZiAoIGkgPT09IDAgKSB7CgkJCQkJCQl0aGF0LnJhbmdlLnN0b3AoIDEsIDEgKVsgYW5pbWF0ZSA/ICJhbmltYXRlIiA6ICJjc3MiIF0oIHsgYm90dG9tOiAoIHZhbFBlcmNlbnQgKSArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJCQkJfQoJCQkJCQlpZiAoIGkgPT09IDEgKSB7CgkJCQkJCQl0aGF0LnJhbmdlWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyBoZWlnaHQ6ICggdmFsUGVyY2VudCAtIGxhc3RWYWxQZXJjZW50ICkgKyAiJSIgfSwgeyBxdWV1ZTogZmFsc2UsIGR1cmF0aW9uOiBvLmFuaW1hdGUgfSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfQoJCQkJbGFzdFZhbFBlcmNlbnQgPSB2YWxQZXJjZW50OwoJCQl9KTsKCQl9IGVsc2UgewoJCQl2YWx1ZSA9IHRoaXMudmFsdWUoKTsKCQkJdmFsdWVNaW4gPSB0aGlzLl92YWx1ZU1pbigpOwoJCQl2YWx1ZU1heCA9IHRoaXMuX3ZhbHVlTWF4KCk7CgkJCXZhbFBlcmNlbnQgPSAoIHZhbHVlTWF4ICE9PSB2YWx1ZU1pbiApID8KCQkJCQkoIHZhbHVlIC0gdmFsdWVNaW4gKSAvICggdmFsdWVNYXggLSB2YWx1ZU1pbiApICogMTAwIDoKCQkJCQkwOwoJCQlfc2V0WyB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgPyAibGVmdCIgOiAiYm90dG9tIiBdID0gdmFsUGVyY2VudCArICIlIjsKCQkJdGhpcy5oYW5kbGUuc3RvcCggMSwgMSApWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggX3NldCwgby5hbmltYXRlICk7CgoJCQlpZiAoIG9SYW5nZSA9PT0gIm1pbiIgJiYgdGhpcy5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiICkgewoJCQkJdGhpcy5yYW5nZS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IHdpZHRoOiB2YWxQZXJjZW50ICsgIiUiIH0sIG8uYW5pbWF0ZSApOwoJCQl9CgkJCWlmICggb1JhbmdlID09PSAibWF4IiAmJiB0aGlzLm9yaWVudGF0aW9uID09PSAiaG9yaXpvbnRhbCIgKSB7CgkJCQl0aGlzLnJhbmdlWyBhbmltYXRlID8gImFuaW1hdGUiIDogImNzcyIgXSggeyB3aWR0aDogKCAxMDAgLSB2YWxQZXJjZW50ICkgKyAiJSIgfSwgeyBxdWV1ZTogZmFsc2UsIGR1cmF0aW9uOiBvLmFuaW1hdGUgfSApOwoJCQl9CgkJCWlmICggb1JhbmdlID09PSAibWluIiAmJiB0aGlzLm9yaWVudGF0aW9uID09PSAidmVydGljYWwiICkgewoJCQkJdGhpcy5yYW5nZS5zdG9wKCAxLCAxIClbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IGhlaWdodDogdmFsUGVyY2VudCArICIlIiB9LCBvLmFuaW1hdGUgKTsKCQkJfQoJCQlpZiAoIG9SYW5nZSA9PT0gIm1heCIgJiYgdGhpcy5vcmllbnRhdGlvbiA9PT0gInZlcnRpY2FsIiApIHsKCQkJCXRoaXMucmFuZ2VbIGFuaW1hdGUgPyAiYW5pbWF0ZSIgOiAiY3NzIiBdKCB7IGhlaWdodDogKCAxMDAgLSB2YWxQZXJjZW50ICkgKyAiJSIgfSwgeyBxdWV1ZTogZmFsc2UsIGR1cmF0aW9uOiBvLmFuaW1hdGUgfSApOwoJCQl9CgkJfQoJfSwKCglfaGFuZGxlRXZlbnRzOiB7CgkJa2V5ZG93bjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgYWxsb3dlZCwgY3VyVmFsLCBuZXdWYWwsIHN0ZXAsCgkJCQlpbmRleCA9ICQoIGV2ZW50LnRhcmdldCApLmRhdGEoICJ1aS1zbGlkZXItaGFuZGxlLWluZGV4IiApOwoKCQkJc3dpdGNoICggZXZlbnQua2V5Q29kZSApIHsKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkhPTUU6CgkJCQljYXNlICQudWkua2V5Q29kZS5FTkQ6CgkJCQljYXNlICQudWkua2V5Q29kZS5QQUdFX1VQOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuUEFHRV9ET1dOOgoJCQkJY2FzZSAkLnVpLmtleUNvZGUuVVA6CgkJCQljYXNlICQudWkua2V5Q29kZS5SSUdIVDoKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkRPV046CgkJCQljYXNlICQudWkua2V5Q29kZS5MRUZUOgoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQkJaWYgKCAhdGhpcy5fa2V5U2xpZGluZyApIHsKCQkJCQkJdGhpcy5fa2V5U2xpZGluZyA9IHRydWU7CgkJCQkJCSQoIGV2ZW50LnRhcmdldCApLmFkZENsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQkJCQlhbGxvd2VkID0gdGhpcy5fc3RhcnQoIGV2ZW50LCBpbmRleCApOwoJCQkJCQlpZiAoIGFsbG93ZWQgPT09IGZhbHNlICkgewoJCQkJCQkJcmV0dXJuOwoJCQkJCQl9CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQl9CgoJCQlzdGVwID0gdGhpcy5vcHRpb25zLnN0ZXA7CgkJCWlmICggdGhpcy5vcHRpb25zLnZhbHVlcyAmJiB0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCApIHsKCQkJCWN1clZhbCA9IG5ld1ZhbCA9IHRoaXMudmFsdWVzKCBpbmRleCApOwoJCQl9IGVsc2UgewoJCQkJY3VyVmFsID0gbmV3VmFsID0gdGhpcy52YWx1ZSgpOwoJCQl9CgoJCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoJCQkJY2FzZSAkLnVpLmtleUNvZGUuSE9NRToKCQkJCQluZXdWYWwgPSB0aGlzLl92YWx1ZU1pbigpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUuRU5EOgoJCQkJCW5ld1ZhbCA9IHRoaXMuX3ZhbHVlTWF4KCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICQudWkua2V5Q29kZS5QQUdFX1VQOgoJCQkJCW5ld1ZhbCA9IHRoaXMuX3RyaW1BbGlnblZhbHVlKAoJCQkJCQljdXJWYWwgKyAoICggdGhpcy5fdmFsdWVNYXgoKSAtIHRoaXMuX3ZhbHVlTWluKCkgKSAvIHRoaXMubnVtUGFnZXMgKQoJCQkJCSk7CgkJCQkJYnJlYWs7CgkJCQljYXNlICQudWkua2V5Q29kZS5QQUdFX0RPV046CgkJCQkJbmV3VmFsID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoCgkJCQkJCWN1clZhbCAtICggKHRoaXMuX3ZhbHVlTWF4KCkgLSB0aGlzLl92YWx1ZU1pbigpKSAvIHRoaXMubnVtUGFnZXMgKSApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUuVVA6CgkJCQljYXNlICQudWkua2V5Q29kZS5SSUdIVDoKCQkJCQlpZiAoIGN1clZhbCA9PT0gdGhpcy5fdmFsdWVNYXgoKSApIHsKCQkJCQkJcmV0dXJuOwoJCQkJCX0KCQkJCQluZXdWYWwgPSB0aGlzLl90cmltQWxpZ25WYWx1ZSggY3VyVmFsICsgc3RlcCApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAkLnVpLmtleUNvZGUuRE9XTjoKCQkJCWNhc2UgJC51aS5rZXlDb2RlLkxFRlQ6CgkJCQkJaWYgKCBjdXJWYWwgPT09IHRoaXMuX3ZhbHVlTWluKCkgKSB7CgkJCQkJCXJldHVybjsKCQkJCQl9CgkJCQkJbmV3VmFsID0gdGhpcy5fdHJpbUFsaWduVmFsdWUoIGN1clZhbCAtIHN0ZXAgKTsKCQkJCQlicmVhazsKCQkJfQoKCQkJdGhpcy5fc2xpZGUoIGV2ZW50LCBpbmRleCwgbmV3VmFsICk7CgkJfSwKCQlrZXl1cDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQl2YXIgaW5kZXggPSAkKCBldmVudC50YXJnZXQgKS5kYXRhKCAidWktc2xpZGVyLWhhbmRsZS1pbmRleCIgKTsKCgkJCWlmICggdGhpcy5fa2V5U2xpZGluZyApIHsKCQkJCXRoaXMuX2tleVNsaWRpbmcgPSBmYWxzZTsKCQkJCXRoaXMuX3N0b3AoIGV2ZW50LCBpbmRleCApOwoJCQkJdGhpcy5fY2hhbmdlKCBldmVudCwgaW5kZXggKTsKCQkJCSQoIGV2ZW50LnRhcmdldCApLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApOwoJCQl9CgkJfQoJfQp9KTsKCgovKiEKICogalF1ZXJ5IFVJIFNwaW5uZXIgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vc3Bpbm5lci8KICovCgoKZnVuY3Rpb24gc3Bpbm5lcl9tb2RpZmllciggZm4gKSB7CglyZXR1cm4gZnVuY3Rpb24oKSB7CgkJdmFyIHByZXZpb3VzID0gdGhpcy5lbGVtZW50LnZhbCgpOwoJCWZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl0aGlzLl9yZWZyZXNoKCk7CgkJaWYgKCBwcmV2aW91cyAhPT0gdGhpcy5lbGVtZW50LnZhbCgpICkgewoJCQl0aGlzLl90cmlnZ2VyKCAiY2hhbmdlIiApOwoJCX0KCX07Cn0KCnZhciBzcGlubmVyID0gJC53aWRnZXQoICJ1aS5zcGlubmVyIiwgewoJdmVyc2lvbjogIjEuMTEuMCIsCglkZWZhdWx0RWxlbWVudDogIjxpbnB1dD4iLAoJd2lkZ2V0RXZlbnRQcmVmaXg6ICJzcGluIiwKCW9wdGlvbnM6IHsKCQljdWx0dXJlOiBudWxsLAoJCWljb25zOiB7CgkJCWRvd246ICJ1aS1pY29uLXRyaWFuZ2xlLTEtcyIsCgkJCXVwOiAidWktaWNvbi10cmlhbmdsZS0xLW4iCgkJfSwKCQlpbmNyZW1lbnRhbDogdHJ1ZSwKCQltYXg6IG51bGwsCgkJbWluOiBudWxsLAoJCW51bWJlckZvcm1hdDogbnVsbCwKCQlwYWdlOiAxMCwKCQlzdGVwOiAxLAoKCQljaGFuZ2U6IG51bGwsCgkJc3BpbjogbnVsbCwKCQlzdGFydDogbnVsbCwKCQlzdG9wOiBudWxsCgl9LAoKCV9jcmVhdGU6IGZ1bmN0aW9uKCkgewoJCS8vIGhhbmRsZSBzdHJpbmcgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSBwYXJzZWQKCQl0aGlzLl9zZXRPcHRpb24oICJtYXgiLCB0aGlzLm9wdGlvbnMubWF4ICk7CgkJdGhpcy5fc2V0T3B0aW9uKCAibWluIiwgdGhpcy5vcHRpb25zLm1pbiApOwoJCXRoaXMuX3NldE9wdGlvbiggInN0ZXAiLCB0aGlzLm9wdGlvbnMuc3RlcCApOwoKCQkvLyBPbmx5IGZvcm1hdCBpZiB0aGVyZSBpcyBhIHZhbHVlLCBwcmV2ZW50cyB0aGUgZmllbGQgZnJvbSBiZWluZyBtYXJrZWQKCQkvLyBhcyBpbnZhbGlkIGluIEZpcmVmb3gsIHNlZSAjOTU3My4KCQlpZiAoIHRoaXMudmFsdWUoKSAhPT0gIiIgKSB7CgkJCS8vIEZvcm1hdCB0aGUgdmFsdWUsIGJ1dCBkb24ndCBjb25zdHJhaW4uCgkJCXRoaXMuX3ZhbHVlKCB0aGlzLmVsZW1lbnQudmFsKCksIHRydWUgKTsKCQl9CgoJCXRoaXMuX2RyYXcoKTsKCQl0aGlzLl9vbiggdGhpcy5fZXZlbnRzICk7CgkJdGhpcy5fcmVmcmVzaCgpOwoKCQkvLyB0dXJuaW5nIG9mZiBhdXRvY29tcGxldGUgcHJldmVudHMgdGhlIGJyb3dzZXIgZnJvbSByZW1lbWJlcmluZyB0aGUKCQkvLyB2YWx1ZSB3aGVuIG5hdmlnYXRpbmcgdGhyb3VnaCBoaXN0b3J5LCBzbyB3ZSByZS1lbmFibGUgYXV0b2NvbXBsZXRlCgkJLy8gaWYgdGhlIHBhZ2UgaXMgdW5sb2FkZWQgYmVmb3JlIHRoZSB3aWRnZXQgaXMgZGVzdHJveWVkLiAjNzc5MAoJCXRoaXMuX29uKCB0aGlzLndpbmRvdywgewoJCQliZWZvcmV1bmxvYWQ6IGZ1bmN0aW9uKCkgewoJCQkJdGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoICJhdXRvY29tcGxldGUiICk7CgkJCX0KCQl9KTsKCX0sCgoJX2dldENyZWF0ZU9wdGlvbnM6IGZ1bmN0aW9uKCkgewoJCXZhciBvcHRpb25zID0ge30sCgkJCWVsZW1lbnQgPSB0aGlzLmVsZW1lbnQ7CgoJCSQuZWFjaCggWyAibWluIiwgIm1heCIsICJzdGVwIiBdLCBmdW5jdGlvbiggaSwgb3B0aW9uICkgewoJCQl2YXIgdmFsdWUgPSBlbGVtZW50LmF0dHIoIG9wdGlvbiApOwoJCQlpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubGVuZ3RoICkgewoJCQkJb3B0aW9uc1sgb3B0aW9uIF0gPSB2YWx1ZTsKCQkJfQoJCX0pOwoKCQlyZXR1cm4gb3B0aW9uczsKCX0sCgoJX2V2ZW50czogewoJCWtleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJaWYgKCB0aGlzLl9zdGFydCggZXZlbnQgKSAmJiB0aGlzLl9rZXlkb3duKCBldmVudCApICkgewoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJfQoJCX0sCgkJa2V5dXA6ICJfc3RvcCIsCgkJZm9jdXM6IGZ1bmN0aW9uKCkgewoJCQl0aGlzLnByZXZpb3VzID0gdGhpcy5lbGVtZW50LnZhbCgpOwoJCX0sCgkJYmx1cjogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQlpZiAoIHRoaXMuY2FuY2VsQmx1ciApIHsKCQkJCWRlbGV0ZSB0aGlzLmNhbmNlbEJsdXI7CgkJCQlyZXR1cm47CgkJCX0KCgkJCXRoaXMuX3N0b3AoKTsKCQkJdGhpcy5fcmVmcmVzaCgpOwoJCQlpZiAoIHRoaXMucHJldmlvdXMgIT09IHRoaXMuZWxlbWVudC52YWwoKSApIHsKCQkJCXRoaXMuX3RyaWdnZXIoICJjaGFuZ2UiLCBldmVudCApOwoJCQl9CgkJfSwKCQltb3VzZXdoZWVsOiBmdW5jdGlvbiggZXZlbnQsIGRlbHRhICkgewoJCQlpZiAoICFkZWx0YSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQlpZiAoICF0aGlzLnNwaW5uaW5nICYmICF0aGlzLl9zdGFydCggZXZlbnQgKSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoKCQkJdGhpcy5fc3BpbiggKGRlbHRhID4gMCA/IDEgOiAtMSkgKiB0aGlzLm9wdGlvbnMuc3RlcCwgZXZlbnQgKTsKCQkJY2xlYXJUaW1lb3V0KCB0aGlzLm1vdXNld2hlZWxUaW1lciApOwoJCQl0aGlzLm1vdXNld2hlZWxUaW1lciA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJaWYgKCB0aGlzLnNwaW5uaW5nICkgewoJCQkJCXRoaXMuX3N0b3AoIGV2ZW50ICk7CgkJCQl9CgkJCX0sIDEwMCApOwoJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCX0sCgkJIm1vdXNlZG93biAudWktc3Bpbm5lci1idXR0b24iOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJCXZhciBwcmV2aW91czsKCgkJCS8vIFdlIG5ldmVyIHdhbnQgdGhlIGJ1dHRvbnMgdG8gaGF2ZSBmb2N1czsgd2hlbmV2ZXIgdGhlIHVzZXIgaXMKCQkJLy8gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgc3Bpbm5lciwgdGhlIGZvY3VzIHNob3VsZCBiZSBvbiB0aGUgaW5wdXQuCgkJCS8vIElmIHRoZSBpbnB1dCBpcyBmb2N1c2VkIHRoZW4gdGhpcy5wcmV2aW91cyBpcyBwcm9wZXJseSBzZXQgZnJvbQoJCQkvLyB3aGVuIHRoZSBpbnB1dCBmaXJzdCByZWNlaXZlZCBmb2N1cy4gSWYgdGhlIGlucHV0IGlzIG5vdCBmb2N1c2VkCgkJCS8vIHRoZW4gd2UgbmVlZCB0byBzZXQgdGhpcy5wcmV2aW91cyBiYXNlZCBvbiB0aGUgdmFsdWUgYmVmb3JlIHNwaW5uaW5nLgoJCQlwcmV2aW91cyA9IHRoaXMuZWxlbWVudFswXSA9PT0gdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50ID8KCQkJCXRoaXMucHJldmlvdXMgOiB0aGlzLmVsZW1lbnQudmFsKCk7CgkJCWZ1bmN0aW9uIGNoZWNrRm9jdXMoKSB7CgkJCQl2YXIgaXNBY3RpdmUgPSB0aGlzLmVsZW1lbnRbMF0gPT09IHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudDsKCQkJCWlmICggIWlzQWN0aXZlICkgewoJCQkJCXRoaXMuZWxlbWVudC5mb2N1cygpOwoJCQkJCXRoaXMucHJldmlvdXMgPSBwcmV2aW91czsKCQkJCQkvLyBzdXBwb3J0OiBJRQoJCQkJCS8vIElFIHNldHMgZm9jdXMgYXN5bmNocm9ub3VzbHksIHNvIHdlIG5lZWQgdG8gY2hlY2sgaWYgZm9jdXMKCQkJCQkvLyBtb3ZlZCBvZmYgb2YgdGhlIGlucHV0IGJlY2F1c2UgdGhlIHVzZXIgY2xpY2tlZCBvbiB0aGUgYnV0dG9uLgoJCQkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJCQl0aGlzLnByZXZpb3VzID0gcHJldmlvdXM7CgkJCQkJfSk7CgkJCQl9CgkJCX0KCgkJCS8vIGVuc3VyZSBmb2N1cyBpcyBvbiAob3Igc3RheXMgb24pIHRoZSB0ZXh0IGZpZWxkCgkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCWNoZWNrRm9jdXMuY2FsbCggdGhpcyApOwoKCQkJLy8gc3VwcG9ydDogSUUKCQkJLy8gSUUgZG9lc24ndCBwcmV2ZW50IG1vdmluZyBmb2N1cyBldmVuIHdpdGggZXZlbnQucHJldmVudERlZmF1bHQoKQoJCQkvLyBzbyB3ZSBzZXQgYSBmbGFnIHRvIGtub3cgd2hlbiB3ZSBzaG91bGQgaWdub3JlIHRoZSBibHVyIGV2ZW50CgkJCS8vIGFuZCBjaGVjayAoYWdhaW4pIGlmIGZvY3VzIG1vdmVkIG9mZiBvZiB0aGUgaW5wdXQuCgkJCXRoaXMuY2FuY2VsQmx1ciA9IHRydWU7CgkJCXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJZGVsZXRlIHRoaXMuY2FuY2VsQmx1cjsKCQkJCWNoZWNrRm9jdXMuY2FsbCggdGhpcyApOwoJCQl9KTsKCgkJCWlmICggdGhpcy5fc3RhcnQoIGV2ZW50ICkgPT09IGZhbHNlICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5oYXNDbGFzcyggInVpLXNwaW5uZXItdXAiICkgPyAxIDogLTEsIGV2ZW50ICk7CgkJfSwKCQkibW91c2V1cCAudWktc3Bpbm5lci1idXR0b24iOiAiX3N0b3AiLAoJCSJtb3VzZWVudGVyIC51aS1zcGlubmVyLWJ1dHRvbiI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJLy8gYnV0dG9uIHdpbGwgYWRkIHVpLXN0YXRlLWFjdGl2ZSBpZiBtb3VzZSB3YXMgZG93biB3aGlsZSBtb3VzZWxlYXZlIGFuZCBrZXB0IGRvd24KCQkJaWYgKCAhJCggZXZlbnQuY3VycmVudFRhcmdldCApLmhhc0NsYXNzKCAidWktc3RhdGUtYWN0aXZlIiApICkgewoJCQkJcmV0dXJuOwoJCQl9CgoJCQlpZiAoIHRoaXMuX3N0YXJ0KCBldmVudCApID09PSBmYWxzZSApIHsKCQkJCXJldHVybiBmYWxzZTsKCQkJfQoJCQl0aGlzLl9yZXBlYXQoIG51bGwsICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKS5oYXNDbGFzcyggInVpLXNwaW5uZXItdXAiICkgPyAxIDogLTEsIGV2ZW50ICk7CgkJfSwKCQkvLyBUT0RPOiBkbyB3ZSByZWFsbHkgd2FudCB0byBjb25zaWRlciB0aGlzIGEgc3RvcD8KCQkvLyBzaG91bGRuJ3Qgd2UganVzdCBzdG9wIHRoZSByZXBlYXRlciBhbmQgd2FpdCB1bnRpbCBtb3VzZXVwIGJlZm9yZQoJCS8vIHdlIHRyaWdnZXIgdGhlIHN0b3AgZXZlbnQ/CgkJIm1vdXNlbGVhdmUgLnVpLXNwaW5uZXItYnV0dG9uIjogIl9zdG9wIgoJfSwKCglfZHJhdzogZnVuY3Rpb24oKSB7CgkJdmFyIHVpU3Bpbm5lciA9IHRoaXMudWlTcGlubmVyID0gdGhpcy5lbGVtZW50CgkJCS5hZGRDbGFzcyggInVpLXNwaW5uZXItaW5wdXQiICkKCQkJLmF0dHIoICJhdXRvY29tcGxldGUiLCAib2ZmIiApCgkJCS53cmFwKCB0aGlzLl91aVNwaW5uZXJIdG1sKCkgKQoJCQkucGFyZW50KCkKCQkJCS8vIGFkZCBidXR0b25zCgkJCQkuYXBwZW5kKCB0aGlzLl9idXR0b25IdG1sKCkgKTsKCgkJdGhpcy5lbGVtZW50LmF0dHIoICJyb2xlIiwgInNwaW5idXR0b24iICk7CgoJCS8vIGJ1dHRvbiBiaW5kaW5ncwoJCXRoaXMuYnV0dG9ucyA9IHVpU3Bpbm5lci5maW5kKCAiLnVpLXNwaW5uZXItYnV0dG9uIiApCgkJCS5hdHRyKCAidGFiSW5kZXgiLCAtMSApCgkJCS5idXR0b24oKQoJCQkucmVtb3ZlQ2xhc3MoICJ1aS1jb3JuZXItYWxsIiApOwoKCQkvLyBJRSA2IGRvZXNuJ3QgdW5kZXJzdGFuZCBoZWlnaHQ6IDUwJSBmb3IgdGhlIGJ1dHRvbnMKCQkvLyB1bmxlc3MgdGhlIHdyYXBwZXIgaGFzIGFuIGV4cGxpY2l0IGhlaWdodAoJCWlmICggdGhpcy5idXR0b25zLmhlaWdodCgpID4gTWF0aC5jZWlsKCB1aVNwaW5uZXIuaGVpZ2h0KCkgKiAwLjUgKSAmJgoJCQkJdWlTcGlubmVyLmhlaWdodCgpID4gMCApIHsKCQkJdWlTcGlubmVyLmhlaWdodCggdWlTcGlubmVyLmhlaWdodCgpICk7CgkJfQoKCQkvLyBkaXNhYmxlIHNwaW5uZXIgaWYgZWxlbWVudCB3YXMgYWxyZWFkeSBkaXNhYmxlZAoJCWlmICggdGhpcy5vcHRpb25zLmRpc2FibGVkICkgewoJCQl0aGlzLmRpc2FibGUoKTsKCQl9Cgl9LAoKCV9rZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWtleUNvZGUgPSAkLnVpLmtleUNvZGU7CgoJCXN3aXRjaCAoIGV2ZW50LmtleUNvZGUgKSB7CgkJY2FzZSBrZXlDb2RlLlVQOgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsIDEsIGV2ZW50ICk7CgkJCXJldHVybiB0cnVlOwoJCWNhc2Uga2V5Q29kZS5ET1dOOgoJCQl0aGlzLl9yZXBlYXQoIG51bGwsIC0xLCBldmVudCApOwoJCQlyZXR1cm4gdHJ1ZTsKCQljYXNlIGtleUNvZGUuUEFHRV9VUDoKCQkJdGhpcy5fcmVwZWF0KCBudWxsLCBvcHRpb25zLnBhZ2UsIGV2ZW50ICk7CgkJCXJldHVybiB0cnVlOwoJCWNhc2Uga2V5Q29kZS5QQUdFX0RPV046CgkJCXRoaXMuX3JlcGVhdCggbnVsbCwgLW9wdGlvbnMucGFnZSwgZXZlbnQgKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoKCQlyZXR1cm4gZmFsc2U7Cgl9LAoKCV91aVNwaW5uZXJIdG1sOiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gIjxzcGFuIGNsYXNzPSd1aS1zcGlubmVyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsJz48L3NwYW4+IjsKCX0sCgoJX2J1dHRvbkh0bWw6IGZ1bmN0aW9uKCkgewoJCXJldHVybiAiIiArCgkJCSI8YSBjbGFzcz0ndWktc3Bpbm5lci1idXR0b24gdWktc3Bpbm5lci11cCB1aS1jb3JuZXItdHInPiIgKwoJCQkJIjxzcGFuIGNsYXNzPSd1aS1pY29uICIgKyB0aGlzLm9wdGlvbnMuaWNvbnMudXAgKyAiJz4mIzk2NTA7PC9zcGFuPiIgKwoJCQkiPC9hPiIgKwoJCQkiPGEgY2xhc3M9J3VpLXNwaW5uZXItYnV0dG9uIHVpLXNwaW5uZXItZG93biB1aS1jb3JuZXItYnInPiIgKwoJCQkJIjxzcGFuIGNsYXNzPSd1aS1pY29uICIgKyB0aGlzLm9wdGlvbnMuaWNvbnMuZG93biArICInPiYjOTY2MDs8L3NwYW4+IiArCgkJCSI8L2E+IjsKCX0sCgoJX3N0YXJ0OiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5zcGlubmluZyAmJiB0aGlzLl90cmlnZ2VyKCAic3RhcnQiLCBldmVudCApID09PSBmYWxzZSApIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCgkJaWYgKCAhdGhpcy5jb3VudGVyICkgewoJCQl0aGlzLmNvdW50ZXIgPSAxOwoJCX0KCQl0aGlzLnNwaW5uaW5nID0gdHJ1ZTsKCQlyZXR1cm4gdHJ1ZTsKCX0sCgoJX3JlcGVhdDogZnVuY3Rpb24oIGksIHN0ZXBzLCBldmVudCApIHsKCQlpID0gaSB8fCA1MDA7CgoJCWNsZWFyVGltZW91dCggdGhpcy50aW1lciApOwoJCXRoaXMudGltZXIgPSB0aGlzLl9kZWxheShmdW5jdGlvbigpIHsKCQkJdGhpcy5fcmVwZWF0KCA0MCwgc3RlcHMsIGV2ZW50ICk7CgkJfSwgaSApOwoKCQl0aGlzLl9zcGluKCBzdGVwcyAqIHRoaXMub3B0aW9ucy5zdGVwLCBldmVudCApOwoJfSwKCglfc3BpbjogZnVuY3Rpb24oIHN0ZXAsIGV2ZW50ICkgewoJCXZhciB2YWx1ZSA9IHRoaXMudmFsdWUoKSB8fCAwOwoKCQlpZiAoICF0aGlzLmNvdW50ZXIgKSB7CgkJCXRoaXMuY291bnRlciA9IDE7CgkJfQoKCQl2YWx1ZSA9IHRoaXMuX2FkanVzdFZhbHVlKCB2YWx1ZSArIHN0ZXAgKiB0aGlzLl9pbmNyZW1lbnQoIHRoaXMuY291bnRlciApICk7CgoJCWlmICggIXRoaXMuc3Bpbm5pbmcgfHwgdGhpcy5fdHJpZ2dlciggInNwaW4iLCBldmVudCwgeyB2YWx1ZTogdmFsdWUgfSApICE9PSBmYWxzZSkgewoJCQl0aGlzLl92YWx1ZSggdmFsdWUgKTsKCQkJdGhpcy5jb3VudGVyKys7CgkJfQoJfSwKCglfaW5jcmVtZW50OiBmdW5jdGlvbiggaSApIHsKCQl2YXIgaW5jcmVtZW50YWwgPSB0aGlzLm9wdGlvbnMuaW5jcmVtZW50YWw7CgoJCWlmICggaW5jcmVtZW50YWwgKSB7CgkJCXJldHVybiAkLmlzRnVuY3Rpb24oIGluY3JlbWVudGFsICkgPwoJCQkJaW5jcmVtZW50YWwoIGkgKSA6CgkJCQlNYXRoLmZsb29yKCBpICogaSAqIGkgLyA1MDAwMCAtIGkgKiBpIC8gNTAwICsgMTcgKiBpIC8gMjAwICsgMSApOwoJCX0KCgkJcmV0dXJuIDE7Cgl9LAoKCV9wcmVjaXNpb246IGZ1bmN0aW9uKCkgewoJCXZhciBwcmVjaXNpb24gPSB0aGlzLl9wcmVjaXNpb25PZiggdGhpcy5vcHRpb25zLnN0ZXAgKTsKCQlpZiAoIHRoaXMub3B0aW9ucy5taW4gIT09IG51bGwgKSB7CgkJCXByZWNpc2lvbiA9IE1hdGgubWF4KCBwcmVjaXNpb24sIHRoaXMuX3ByZWNpc2lvbk9mKCB0aGlzLm9wdGlvbnMubWluICkgKTsKCQl9CgkJcmV0dXJuIHByZWNpc2lvbjsKCX0sCgoJX3ByZWNpc2lvbk9mOiBmdW5jdGlvbiggbnVtICkgewoJCXZhciBzdHIgPSBudW0udG9TdHJpbmcoKSwKCQkJZGVjaW1hbCA9IHN0ci5pbmRleE9mKCAiLiIgKTsKCQlyZXR1cm4gZGVjaW1hbCA9PT0gLTEgPyAwIDogc3RyLmxlbmd0aCAtIGRlY2ltYWwgLSAxOwoJfSwKCglfYWRqdXN0VmFsdWU6IGZ1bmN0aW9uKCB2YWx1ZSApIHsKCQl2YXIgYmFzZSwgYWJvdmVNaW4sCgkJCW9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7CgoJCS8vIG1ha2Ugc3VyZSB3ZSdyZSBhdCBhIHZhbGlkIHN0ZXAKCQkvLyAtIGZpbmQgb3V0IHdoZXJlIHdlIGFyZSByZWxhdGl2ZSB0byB0aGUgYmFzZSAobWluIG9yIDApCgkJYmFzZSA9IG9wdGlvbnMubWluICE9PSBudWxsID8gb3B0aW9ucy5taW4gOiAwOwoJCWFib3ZlTWluID0gdmFsdWUgLSBiYXNlOwoJCS8vIC0gcm91bmQgdG8gdGhlIG5lYXJlc3Qgc3RlcAoJCWFib3ZlTWluID0gTWF0aC5yb3VuZChhYm92ZU1pbiAvIG9wdGlvbnMuc3RlcCkgKiBvcHRpb25zLnN0ZXA7CgkJLy8gLSByb3VuZGluZyBpcyBiYXNlZCBvbiAwLCBzbyBhZGp1c3QgYmFjayB0byBvdXIgYmFzZQoJCXZhbHVlID0gYmFzZSArIGFib3ZlTWluOwoKCQkvLyBmaXggcHJlY2lzaW9uIGZyb20gYmFkIEpTIGZsb2F0aW5nIHBvaW50IG1hdGgKCQl2YWx1ZSA9IHBhcnNlRmxvYXQoIHZhbHVlLnRvRml4ZWQoIHRoaXMuX3ByZWNpc2lvbigpICkgKTsKCgkJLy8gY2xhbXAgdGhlIHZhbHVlCgkJaWYgKCBvcHRpb25zLm1heCAhPT0gbnVsbCAmJiB2YWx1ZSA+IG9wdGlvbnMubWF4KSB7CgkJCXJldHVybiBvcHRpb25zLm1heDsKCQl9CgkJaWYgKCBvcHRpb25zLm1pbiAhPT0gbnVsbCAmJiB2YWx1ZSA8IG9wdGlvbnMubWluICkgewoJCQlyZXR1cm4gb3B0aW9ucy5taW47CgkJfQoKCQlyZXR1cm4gdmFsdWU7Cgl9LAoKCV9zdG9wOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJaWYgKCAhdGhpcy5zcGlubmluZyApIHsKCQkJcmV0dXJuOwoJCX0KCgkJY2xlYXJUaW1lb3V0KCB0aGlzLnRpbWVyICk7CgkJY2xlYXJUaW1lb3V0KCB0aGlzLm1vdXNld2hlZWxUaW1lciApOwoJCXRoaXMuY291bnRlciA9IDA7CgkJdGhpcy5zcGlubmluZyA9IGZhbHNlOwoJCXRoaXMuX3RyaWdnZXIoICJzdG9wIiwgZXZlbnQgKTsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJaWYgKCBrZXkgPT09ICJjdWx0dXJlIiB8fCBrZXkgPT09ICJudW1iZXJGb3JtYXQiICkgewoJCQl2YXIgcHJldlZhbHVlID0gdGhpcy5fcGFyc2UoIHRoaXMuZWxlbWVudC52YWwoKSApOwoJCQl0aGlzLm9wdGlvbnNbIGtleSBdID0gdmFsdWU7CgkJCXRoaXMuZWxlbWVudC52YWwoIHRoaXMuX2Zvcm1hdCggcHJldlZhbHVlICkgKTsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCBrZXkgPT09ICJtYXgiIHx8IGtleSA9PT0gIm1pbiIgfHwga2V5ID09PSAic3RlcCIgKSB7CgkJCWlmICggdHlwZW9mIHZhbHVlID09PSAic3RyaW5nIiApIHsKCQkJCXZhbHVlID0gdGhpcy5fcGFyc2UoIHZhbHVlICk7CgkJCX0KCQl9CgkJaWYgKCBrZXkgPT09ICJpY29ucyIgKSB7CgkJCXRoaXMuYnV0dG9ucy5maXJzdCgpLmZpbmQoICIudWktaWNvbiIgKQoJCQkJLnJlbW92ZUNsYXNzKCB0aGlzLm9wdGlvbnMuaWNvbnMudXAgKQoJCQkJLmFkZENsYXNzKCB2YWx1ZS51cCApOwoJCQl0aGlzLmJ1dHRvbnMubGFzdCgpLmZpbmQoICIudWktaWNvbiIgKQoJCQkJLnJlbW92ZUNsYXNzKCB0aGlzLm9wdGlvbnMuaWNvbnMuZG93biApCgkJCQkuYWRkQ2xhc3MoIHZhbHVlLmRvd24gKTsKCQl9CgoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlICk7CgoJCWlmICgga2V5ID09PSAiZGlzYWJsZWQiICkgewoJCQl0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiLCAhIXZhbHVlICk7CgkJCXRoaXMuZWxlbWVudC5wcm9wKCAiZGlzYWJsZWQiLCAhIXZhbHVlICk7CgkJCXRoaXMuYnV0dG9ucy5idXR0b24oIHZhbHVlID8gImRpc2FibGUiIDogImVuYWJsZSIgKTsKCQl9Cgl9LAoKCV9zZXRPcHRpb25zOiBzcGlubmVyX21vZGlmaWVyKGZ1bmN0aW9uKCBvcHRpb25zICkgewoJCXRoaXMuX3N1cGVyKCBvcHRpb25zICk7Cgl9KSwKCglfcGFyc2U6IGZ1bmN0aW9uKCB2YWwgKSB7CgkJaWYgKCB0eXBlb2YgdmFsID09PSAic3RyaW5nIiAmJiB2YWwgIT09ICIiICkgewoJCQl2YWwgPSB3aW5kb3cuR2xvYmFsaXplICYmIHRoaXMub3B0aW9ucy5udW1iZXJGb3JtYXQgPwoJCQkJR2xvYmFsaXplLnBhcnNlRmxvYXQoIHZhbCwgMTAsIHRoaXMub3B0aW9ucy5jdWx0dXJlICkgOiArdmFsOwoJCX0KCQlyZXR1cm4gdmFsID09PSAiIiB8fCBpc05hTiggdmFsICkgPyBudWxsIDogdmFsOwoJfSwKCglfZm9ybWF0OiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJaWYgKCB2YWx1ZSA9PT0gIiIgKSB7CgkJCXJldHVybiAiIjsKCQl9CgkJcmV0dXJuIHdpbmRvdy5HbG9iYWxpemUgJiYgdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdCA/CgkJCUdsb2JhbGl6ZS5mb3JtYXQoIHZhbHVlLCB0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0LCB0aGlzLm9wdGlvbnMuY3VsdHVyZSApIDoKCQkJdmFsdWU7Cgl9LAoKCV9yZWZyZXNoOiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQuYXR0cih7CgkJCSJhcmlhLXZhbHVlbWluIjogdGhpcy5vcHRpb25zLm1pbiwKCQkJImFyaWEtdmFsdWVtYXgiOiB0aGlzLm9wdGlvbnMubWF4LAoJCQkvLyBUT0RPOiB3aGF0IHNob3VsZCB3ZSBkbyB3aXRoIHZhbHVlcyB0aGF0IGNhbid0IGJlIHBhcnNlZD8KCQkJImFyaWEtdmFsdWVub3ciOiB0aGlzLl9wYXJzZSggdGhpcy5lbGVtZW50LnZhbCgpICkKCQl9KTsKCX0sCgoJaXNWYWxpZDogZnVuY3Rpb24oKSB7CgkJdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpOwoKCQkvLyBudWxsIGlzIGludmFsaWQKCQlpZiAoIHZhbHVlID09PSBudWxsICkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoKCQkvLyBpZiB2YWx1ZSBnZXRzIGFkanVzdGVkLCBpdCdzIGludmFsaWQKCQlyZXR1cm4gdmFsdWUgPT09IHRoaXMuX2FkanVzdFZhbHVlKCB2YWx1ZSApOwoJfSwKCgkvLyB1cGRhdGUgdGhlIHZhbHVlIHdpdGhvdXQgdHJpZ2dlcmluZyBjaGFuZ2UKCV92YWx1ZTogZnVuY3Rpb24oIHZhbHVlLCBhbGxvd0FueSApIHsKCQl2YXIgcGFyc2VkOwoJCWlmICggdmFsdWUgIT09ICIiICkgewoJCQlwYXJzZWQgPSB0aGlzLl9wYXJzZSggdmFsdWUgKTsKCQkJaWYgKCBwYXJzZWQgIT09IG51bGwgKSB7CgkJCQlpZiAoICFhbGxvd0FueSApIHsKCQkJCQlwYXJzZWQgPSB0aGlzLl9hZGp1c3RWYWx1ZSggcGFyc2VkICk7CgkJCQl9CgkJCQl2YWx1ZSA9IHRoaXMuX2Zvcm1hdCggcGFyc2VkICk7CgkJCX0KCQl9CgkJdGhpcy5lbGVtZW50LnZhbCggdmFsdWUgKTsKCQl0aGlzLl9yZWZyZXNoKCk7Cgl9LAoKCV9kZXN0cm95OiBmdW5jdGlvbigpIHsKCQl0aGlzLmVsZW1lbnQKCQkJLnJlbW92ZUNsYXNzKCAidWktc3Bpbm5lci1pbnB1dCIgKQoJCQkucHJvcCggImRpc2FibGVkIiwgZmFsc2UgKQoJCQkucmVtb3ZlQXR0ciggImF1dG9jb21wbGV0ZSIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJLnJlbW92ZUF0dHIoICJhcmlhLXZhbHVlbWluIiApCgkJCS5yZW1vdmVBdHRyKCAiYXJpYS12YWx1ZW1heCIgKQoJCQkucmVtb3ZlQXR0ciggImFyaWEtdmFsdWVub3ciICk7CgkJdGhpcy51aVNwaW5uZXIucmVwbGFjZVdpdGgoIHRoaXMuZWxlbWVudCApOwoJfSwKCglzdGVwVXA6IHNwaW5uZXJfbW9kaWZpZXIoZnVuY3Rpb24oIHN0ZXBzICkgewoJCXRoaXMuX3N0ZXBVcCggc3RlcHMgKTsKCX0pLAoJX3N0ZXBVcDogZnVuY3Rpb24oIHN0ZXBzICkgewoJCWlmICggdGhpcy5fc3RhcnQoKSApIHsKCQkJdGhpcy5fc3BpbiggKHN0ZXBzIHx8IDEpICogdGhpcy5vcHRpb25zLnN0ZXAgKTsKCQkJdGhpcy5fc3RvcCgpOwoJCX0KCX0sCgoJc3RlcERvd246IHNwaW5uZXJfbW9kaWZpZXIoZnVuY3Rpb24oIHN0ZXBzICkgewoJCXRoaXMuX3N0ZXBEb3duKCBzdGVwcyApOwoJfSksCglfc3RlcERvd246IGZ1bmN0aW9uKCBzdGVwcyApIHsKCQlpZiAoIHRoaXMuX3N0YXJ0KCkgKSB7CgkJCXRoaXMuX3NwaW4oIChzdGVwcyB8fCAxKSAqIC10aGlzLm9wdGlvbnMuc3RlcCApOwoJCQl0aGlzLl9zdG9wKCk7CgkJfQoJfSwKCglwYWdlVXA6IHNwaW5uZXJfbW9kaWZpZXIoZnVuY3Rpb24oIHBhZ2VzICkgewoJCXRoaXMuX3N0ZXBVcCggKHBhZ2VzIHx8IDEpICogdGhpcy5vcHRpb25zLnBhZ2UgKTsKCX0pLAoKCXBhZ2VEb3duOiBzcGlubmVyX21vZGlmaWVyKGZ1bmN0aW9uKCBwYWdlcyApIHsKCQl0aGlzLl9zdGVwRG93biggKHBhZ2VzIHx8IDEpICogdGhpcy5vcHRpb25zLnBhZ2UgKTsKCX0pLAoKCXZhbHVlOiBmdW5jdGlvbiggbmV3VmFsICkgewoJCWlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7CgkJCXJldHVybiB0aGlzLl9wYXJzZSggdGhpcy5lbGVtZW50LnZhbCgpICk7CgkJfQoJCXNwaW5uZXJfbW9kaWZpZXIoIHRoaXMuX3ZhbHVlICkuY2FsbCggdGhpcywgbmV3VmFsICk7Cgl9LAoKCXdpZGdldDogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHRoaXMudWlTcGlubmVyOwoJfQp9KTsKCgovKiEKICogalF1ZXJ5IFVJIFRhYnMgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vdGFicy8KICovCgoKdmFyIHRhYnMgPSAkLndpZGdldCggInVpLnRhYnMiLCB7Cgl2ZXJzaW9uOiAiMS4xMS4wIiwKCWRlbGF5OiAzMDAsCglvcHRpb25zOiB7CgkJYWN0aXZlOiBudWxsLAoJCWNvbGxhcHNpYmxlOiBmYWxzZSwKCQlldmVudDogImNsaWNrIiwKCQloZWlnaHRTdHlsZTogImNvbnRlbnQiLAoJCWhpZGU6IG51bGwsCgkJc2hvdzogbnVsbCwKCgkJLy8gY2FsbGJhY2tzCgkJYWN0aXZhdGU6IG51bGwsCgkJYmVmb3JlQWN0aXZhdGU6IG51bGwsCgkJYmVmb3JlTG9hZDogbnVsbCwKCQlsb2FkOiBudWxsCgl9LAoKCV9pc0xvY2FsOiAoZnVuY3Rpb24oKSB7CgkJdmFyIHJoYXNoID0gLyMuKiQvOwoKCQlyZXR1cm4gZnVuY3Rpb24oIGFuY2hvciApIHsKCQkJdmFyIGFuY2hvclVybCwgbG9jYXRpb25Vcmw7CgoJCQkvLyBzdXBwb3J0OiBJRTcKCQkJLy8gSUU3IGRvZXNuJ3Qgbm9ybWFsaXplIHRoZSBocmVmIHByb3BlcnR5IHdoZW4gc2V0IHZpYSBzY3JpcHQgKCM5MzE3KQoJCQlhbmNob3IgPSBhbmNob3IuY2xvbmVOb2RlKCBmYWxzZSApOwoKCQkJYW5jaG9yVXJsID0gYW5jaG9yLmhyZWYucmVwbGFjZSggcmhhc2gsICIiICk7CgkJCWxvY2F0aW9uVXJsID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKCByaGFzaCwgIiIgKTsKCgkJCS8vIGRlY29kaW5nIG1heSB0aHJvdyBhbiBlcnJvciBpZiB0aGUgVVJMIGlzbid0IFVURi04ICgjOTUxOCkKCQkJdHJ5IHsKCQkJCWFuY2hvclVybCA9IGRlY29kZVVSSUNvbXBvbmVudCggYW5jaG9yVXJsICk7CgkJCX0gY2F0Y2ggKCBlcnJvciApIHt9CgkJCXRyeSB7CgkJCQlsb2NhdGlvblVybCA9IGRlY29kZVVSSUNvbXBvbmVudCggbG9jYXRpb25VcmwgKTsKCQkJfSBjYXRjaCAoIGVycm9yICkge30KCgkJCXJldHVybiBhbmNob3IuaGFzaC5sZW5ndGggPiAxICYmIGFuY2hvclVybCA9PT0gbG9jYXRpb25Vcmw7CgkJfTsKCX0pKCksCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQlvcHRpb25zID0gdGhpcy5vcHRpb25zOwoKCQl0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKCgkJdGhpcy5lbGVtZW50CgkJCS5hZGRDbGFzcyggInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiICkKCQkJLnRvZ2dsZUNsYXNzKCAidWktdGFicy1jb2xsYXBzaWJsZSIsIG9wdGlvbnMuY29sbGFwc2libGUgKQoJCQkvLyBQcmV2ZW50IHVzZXJzIGZyb20gZm9jdXNpbmcgZGlzYWJsZWQgdGFicyB2aWEgY2xpY2sKCQkJLmRlbGVnYXRlKCAiLnVpLXRhYnMtbmF2ID4gbGkiLCAibW91c2Vkb3duIiArIHRoaXMuZXZlbnROYW1lc3BhY2UsIGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWlmICggJCggdGhpcyApLmlzKCAiLnVpLXN0YXRlLWRpc2FibGVkIiApICkgewoJCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCQl9CgkJCX0pCgkJCS8vIHN1cHBvcnQ6IElFIDw5CgkJCS8vIFByZXZlbnRpbmcgdGhlIGRlZmF1bHQgYWN0aW9uIGluIG1vdXNlZG93biBkb2Vzbid0IHByZXZlbnQgSUUKCQkJLy8gZnJvbSBmb2N1c2luZyB0aGUgZWxlbWVudCwgc28gaWYgdGhlIGFuY2hvciBnZXRzIGZvY3VzZWQsIGJsdXIuCgkJCS8vIFdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgZm9jdXNpbmcgdGhlIHByZXZpb3VzbHkgZm9jdXNlZAoJCQkvLyBlbGVtZW50IHNpbmNlIGNsaWNraW5nIG9uIGEgbm9uLWZvY3VzYWJsZSBlbGVtZW50IHNob3VsZCBmb2N1cwoJCQkvLyB0aGUgYm9keSBhbnl3YXkuCgkJCS5kZWxlZ2F0ZSggIi51aS10YWJzLWFuY2hvciIsICJmb2N1cyIgKyB0aGlzLmV2ZW50TmFtZXNwYWNlLCBmdW5jdGlvbigpIHsKCQkJCWlmICggJCggdGhpcyApLmNsb3Nlc3QoICJsaSIgKS5pcyggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSApIHsKCQkJCQl0aGlzLmJsdXIoKTsKCQkJCX0KCQkJfSk7CgoJCXRoaXMuX3Byb2Nlc3NUYWJzKCk7CgkJb3B0aW9ucy5hY3RpdmUgPSB0aGlzLl9pbml0aWFsQWN0aXZlKCk7CgoJCS8vIFRha2UgZGlzYWJsaW5nIHRhYnMgdmlhIGNsYXNzIGF0dHJpYnV0ZSBmcm9tIEhUTUwKCQkvLyBpbnRvIGFjY291bnQgYW5kIHVwZGF0ZSBvcHRpb24gcHJvcGVybHkuCgkJaWYgKCAkLmlzQXJyYXkoIG9wdGlvbnMuZGlzYWJsZWQgKSApIHsKCQkJb3B0aW9ucy5kaXNhYmxlZCA9ICQudW5pcXVlKCBvcHRpb25zLmRpc2FibGVkLmNvbmNhdCgKCQkJCSQubWFwKCB0aGlzLnRhYnMuZmlsdGVyKCAiLnVpLXN0YXRlLWRpc2FibGVkIiApLCBmdW5jdGlvbiggbGkgKSB7CgkJCQkJcmV0dXJuIHRoYXQudGFicy5pbmRleCggbGkgKTsKCQkJCX0pCgkJCSkgKS5zb3J0KCk7CgkJfQoKCQkvLyBjaGVjayBmb3IgbGVuZ3RoIGF2b2lkcyBlcnJvciB3aGVuIGluaXRpYWxpemluZyBlbXB0eSBsaXN0CgkJaWYgKCB0aGlzLm9wdGlvbnMuYWN0aXZlICE9PSBmYWxzZSAmJiB0aGlzLmFuY2hvcnMubGVuZ3RoICkgewoJCQl0aGlzLmFjdGl2ZSA9IHRoaXMuX2ZpbmRBY3RpdmUoIG9wdGlvbnMuYWN0aXZlICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5hY3RpdmUgPSAkKCk7CgkJfQoKCQl0aGlzLl9yZWZyZXNoKCk7CgoJCWlmICggdGhpcy5hY3RpdmUubGVuZ3RoICkgewoJCQl0aGlzLmxvYWQoIG9wdGlvbnMuYWN0aXZlICk7CgkJfQoJfSwKCglfaW5pdGlhbEFjdGl2ZTogZnVuY3Rpb24oKSB7CgkJdmFyIGFjdGl2ZSA9IHRoaXMub3B0aW9ucy5hY3RpdmUsCgkJCWNvbGxhcHNpYmxlID0gdGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlLAoJCQlsb2NhdGlvbkhhc2ggPSBsb2NhdGlvbi5oYXNoLnN1YnN0cmluZyggMSApOwoKCQlpZiAoIGFjdGl2ZSA9PT0gbnVsbCApIHsKCQkJLy8gY2hlY2sgdGhlIGZyYWdtZW50IGlkZW50aWZpZXIgaW4gdGhlIFVSTAoJCQlpZiAoIGxvY2F0aW9uSGFzaCApIHsKCQkJCXRoaXMudGFicy5lYWNoKGZ1bmN0aW9uKCBpLCB0YWIgKSB7CgkJCQkJaWYgKCAkKCB0YWIgKS5hdHRyKCAiYXJpYS1jb250cm9scyIgKSA9PT0gbG9jYXRpb25IYXNoICkgewoJCQkJCQlhY3RpdmUgPSBpOwoJCQkJCQlyZXR1cm4gZmFsc2U7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCgkJCS8vIGNoZWNrIGZvciBhIHRhYiBtYXJrZWQgYWN0aXZlIHZpYSBhIGNsYXNzCgkJCWlmICggYWN0aXZlID09PSBudWxsICkgewoJCQkJYWN0aXZlID0gdGhpcy50YWJzLmluZGV4KCB0aGlzLnRhYnMuZmlsdGVyKCAiLnVpLXRhYnMtYWN0aXZlIiApICk7CgkJCX0KCgkJCS8vIG5vIGFjdGl2ZSB0YWIsIHNldCB0byBmYWxzZQoJCQlpZiAoIGFjdGl2ZSA9PT0gbnVsbCB8fCBhY3RpdmUgPT09IC0xICkgewoJCQkJYWN0aXZlID0gdGhpcy50YWJzLmxlbmd0aCA/IDAgOiBmYWxzZTsKCQkJfQoJCX0KCgkJLy8gaGFuZGxlIG51bWJlcnM6IG5lZ2F0aXZlLCBvdXQgb2YgcmFuZ2UKCQlpZiAoIGFjdGl2ZSAhPT0gZmFsc2UgKSB7CgkJCWFjdGl2ZSA9IHRoaXMudGFicy5pbmRleCggdGhpcy50YWJzLmVxKCBhY3RpdmUgKSApOwoJCQlpZiAoIGFjdGl2ZSA9PT0gLTEgKSB7CgkJCQlhY3RpdmUgPSBjb2xsYXBzaWJsZSA/IGZhbHNlIDogMDsKCQkJfQoJCX0KCgkJLy8gZG9uJ3QgYWxsb3cgY29sbGFwc2libGU6IGZhbHNlIGFuZCBhY3RpdmU6IGZhbHNlCgkJaWYgKCAhY29sbGFwc2libGUgJiYgYWN0aXZlID09PSBmYWxzZSAmJiB0aGlzLmFuY2hvcnMubGVuZ3RoICkgewoJCQlhY3RpdmUgPSAwOwoJCX0KCgkJcmV0dXJuIGFjdGl2ZTsKCX0sCgoJX2dldENyZWF0ZUV2ZW50RGF0YTogZnVuY3Rpb24oKSB7CgkJcmV0dXJuIHsKCQkJdGFiOiB0aGlzLmFjdGl2ZSwKCQkJcGFuZWw6ICF0aGlzLmFjdGl2ZS5sZW5ndGggPyAkKCkgOiB0aGlzLl9nZXRQYW5lbEZvclRhYiggdGhpcy5hY3RpdmUgKQoJCX07Cgl9LAoKCV90YWJLZXlkb3duOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIGZvY3VzZWRUYWIgPSAkKCB0aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQgKS5jbG9zZXN0KCAibGkiICksCgkJCXNlbGVjdGVkSW5kZXggPSB0aGlzLnRhYnMuaW5kZXgoIGZvY3VzZWRUYWIgKSwKCQkJZ29pbmdGb3J3YXJkID0gdHJ1ZTsKCgkJaWYgKCB0aGlzLl9oYW5kbGVQYWdlTmF2KCBldmVudCApICkgewoJCQlyZXR1cm47CgkJfQoKCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoJCQljYXNlICQudWkua2V5Q29kZS5SSUdIVDoKCQkJY2FzZSAkLnVpLmtleUNvZGUuRE9XTjoKCQkJCXNlbGVjdGVkSW5kZXgrKzsKCQkJCWJyZWFrOwoJCQljYXNlICQudWkua2V5Q29kZS5VUDoKCQkJY2FzZSAkLnVpLmtleUNvZGUuTEVGVDoKCQkJCWdvaW5nRm9yd2FyZCA9IGZhbHNlOwoJCQkJc2VsZWN0ZWRJbmRleC0tOwoJCQkJYnJlYWs7CgkJCWNhc2UgJC51aS5rZXlDb2RlLkVORDoKCQkJCXNlbGVjdGVkSW5kZXggPSB0aGlzLmFuY2hvcnMubGVuZ3RoIC0gMTsKCQkJCWJyZWFrOwoJCQljYXNlICQudWkua2V5Q29kZS5IT01FOgoJCQkJc2VsZWN0ZWRJbmRleCA9IDA7CgkJCQlicmVhazsKCQkJY2FzZSAkLnVpLmtleUNvZGUuU1BBQ0U6CgkJCQkvLyBBY3RpdmF0ZSBvbmx5LCBubyBjb2xsYXBzaW5nCgkJCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoJCQkJY2xlYXJUaW1lb3V0KCB0aGlzLmFjdGl2YXRpbmcgKTsKCQkJCXRoaXMuX2FjdGl2YXRlKCBzZWxlY3RlZEluZGV4ICk7CgkJCQlyZXR1cm47CgkJCWNhc2UgJC51aS5rZXlDb2RlLkVOVEVSOgoJCQkJLy8gVG9nZ2xlIChjYW5jZWwgZGVsYXllZCBhY3RpdmF0aW9uLCBhbGxvdyBjb2xsYXBzaW5nKQoJCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJCWNsZWFyVGltZW91dCggdGhpcy5hY3RpdmF0aW5nICk7CgkJCQkvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIGNvbGxhcHNlIG9yIGFjdGl2YXRlCgkJCQl0aGlzLl9hY3RpdmF0ZSggc2VsZWN0ZWRJbmRleCA9PT0gdGhpcy5vcHRpb25zLmFjdGl2ZSA/IGZhbHNlIDogc2VsZWN0ZWRJbmRleCApOwoJCQkJcmV0dXJuOwoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuOwoJCX0KCgkJLy8gRm9jdXMgdGhlIGFwcHJvcHJpYXRlIHRhYiwgYmFzZWQgb24gd2hpY2gga2V5IHdhcyBwcmVzc2VkCgkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQljbGVhclRpbWVvdXQoIHRoaXMuYWN0aXZhdGluZyApOwoJCXNlbGVjdGVkSW5kZXggPSB0aGlzLl9mb2N1c05leHRUYWIoIHNlbGVjdGVkSW5kZXgsIGdvaW5nRm9yd2FyZCApOwoKCQkvLyBOYXZpZ2F0aW5nIHdpdGggY29udHJvbCBrZXkgd2lsbCBwcmV2ZW50IGF1dG9tYXRpYyBhY3RpdmF0aW9uCgkJaWYgKCAhZXZlbnQuY3RybEtleSApIHsKCQkJLy8gVXBkYXRlIGFyaWEtc2VsZWN0ZWQgaW1tZWRpYXRlbHkgc28gdGhhdCBBVCB0aGluayB0aGUgdGFiIGlzIGFscmVhZHkgc2VsZWN0ZWQuCgkJCS8vIE90aGVyd2lzZSBBVCBtYXkgY29uZnVzZSB0aGUgdXNlciBieSBzdGF0aW5nIHRoYXQgdGhleSBuZWVkIHRvIGFjdGl2YXRlIHRoZSB0YWIsCgkJCS8vIGJ1dCB0aGUgdGFiIHdpbGwgYWxyZWFkeSBiZSBhY3RpdmF0ZWQgYnkgdGhlIHRpbWUgdGhlIGFubm91bmNlbWVudCBmaW5pc2hlcy4KCQkJZm9jdXNlZFRhYi5hdHRyKCAiYXJpYS1zZWxlY3RlZCIsICJmYWxzZSIgKTsKCQkJdGhpcy50YWJzLmVxKCBzZWxlY3RlZEluZGV4ICkuYXR0ciggImFyaWEtc2VsZWN0ZWQiLCAidHJ1ZSIgKTsKCgkJCXRoaXMuYWN0aXZhdGluZyA9IHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJdGhpcy5vcHRpb24oICJhY3RpdmUiLCBzZWxlY3RlZEluZGV4ICk7CgkJCX0sIHRoaXMuZGVsYXkgKTsKCQl9Cgl9LAoKCV9wYW5lbEtleWRvd246IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIHRoaXMuX2hhbmRsZVBhZ2VOYXYoIGV2ZW50ICkgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIEN0cmwrdXAgbW92ZXMgZm9jdXMgdG8gdGhlIGN1cnJlbnQgdGFiCgkJaWYgKCBldmVudC5jdHJsS2V5ICYmIGV2ZW50LmtleUNvZGUgPT09ICQudWkua2V5Q29kZS5VUCApIHsKCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCQkJdGhpcy5hY3RpdmUuZm9jdXMoKTsKCQl9Cgl9LAoKCS8vIEFsdCtwYWdlIHVwL2Rvd24gbW92ZXMgZm9jdXMgdG8gdGhlIHByZXZpb3VzL25leHQgdGFiIChhbmQgYWN0aXZhdGVzKQoJX2hhbmRsZVBhZ2VOYXY6IGZ1bmN0aW9uKCBldmVudCApIHsKCQlpZiAoIGV2ZW50LmFsdEtleSAmJiBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuUEFHRV9VUCApIHsKCQkJdGhpcy5fYWN0aXZhdGUoIHRoaXMuX2ZvY3VzTmV4dFRhYiggdGhpcy5vcHRpb25zLmFjdGl2ZSAtIDEsIGZhbHNlICkgKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWlmICggZXZlbnQuYWx0S2V5ICYmIGV2ZW50LmtleUNvZGUgPT09ICQudWkua2V5Q29kZS5QQUdFX0RPV04gKSB7CgkJCXRoaXMuX2FjdGl2YXRlKCB0aGlzLl9mb2N1c05leHRUYWIoIHRoaXMub3B0aW9ucy5hY3RpdmUgKyAxLCB0cnVlICkgKTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfSwKCglfZmluZE5leHRUYWI6IGZ1bmN0aW9uKCBpbmRleCwgZ29pbmdGb3J3YXJkICkgewoJCXZhciBsYXN0VGFiSW5kZXggPSB0aGlzLnRhYnMubGVuZ3RoIC0gMTsKCgkJZnVuY3Rpb24gY29uc3RyYWluKCkgewoJCQlpZiAoIGluZGV4ID4gbGFzdFRhYkluZGV4ICkgewoJCQkJaW5kZXggPSAwOwoJCQl9CgkJCWlmICggaW5kZXggPCAwICkgewoJCQkJaW5kZXggPSBsYXN0VGFiSW5kZXg7CgkJCX0KCQkJcmV0dXJuIGluZGV4OwoJCX0KCgkJd2hpbGUgKCAkLmluQXJyYXkoIGNvbnN0cmFpbigpLCB0aGlzLm9wdGlvbnMuZGlzYWJsZWQgKSAhPT0gLTEgKSB7CgkJCWluZGV4ID0gZ29pbmdGb3J3YXJkID8gaW5kZXggKyAxIDogaW5kZXggLSAxOwoJCX0KCgkJcmV0dXJuIGluZGV4OwoJfSwKCglfZm9jdXNOZXh0VGFiOiBmdW5jdGlvbiggaW5kZXgsIGdvaW5nRm9yd2FyZCApIHsKCQlpbmRleCA9IHRoaXMuX2ZpbmROZXh0VGFiKCBpbmRleCwgZ29pbmdGb3J3YXJkICk7CgkJdGhpcy50YWJzLmVxKCBpbmRleCApLmZvY3VzKCk7CgkJcmV0dXJuIGluZGV4OwoJfSwKCglfc2V0T3B0aW9uOiBmdW5jdGlvbigga2V5LCB2YWx1ZSApIHsKCQlpZiAoIGtleSA9PT0gImFjdGl2ZSIgKSB7CgkJCS8vIF9hY3RpdmF0ZSgpIHdpbGwgaGFuZGxlIGludmFsaWQgdmFsdWVzIGFuZCB1cGRhdGUgdGhpcy5vcHRpb25zCgkJCXRoaXMuX2FjdGl2YXRlKCB2YWx1ZSApOwoJCQlyZXR1cm47CgkJfQoKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJLy8gZG9uJ3QgdXNlIHRoZSB3aWRnZXQgZmFjdG9yeSdzIGRpc2FibGVkIGhhbmRsaW5nCgkJCXRoaXMuX3NldHVwRGlzYWJsZWQoIHZhbHVlICk7CgkJCXJldHVybjsKCQl9CgoJCXRoaXMuX3N1cGVyKCBrZXksIHZhbHVlKTsKCgkJaWYgKCBrZXkgPT09ICJjb2xsYXBzaWJsZSIgKSB7CgkJCXRoaXMuZWxlbWVudC50b2dnbGVDbGFzcyggInVpLXRhYnMtY29sbGFwc2libGUiLCB2YWx1ZSApOwoJCQkvLyBTZXR0aW5nIGNvbGxhcHNpYmxlOiBmYWxzZSB3aGlsZSBjb2xsYXBzZWQ7IG9wZW4gZmlyc3QgcGFuZWwKCQkJaWYgKCAhdmFsdWUgJiYgdGhpcy5vcHRpb25zLmFjdGl2ZSA9PT0gZmFsc2UgKSB7CgkJCQl0aGlzLl9hY3RpdmF0ZSggMCApOwoJCQl9CgkJfQoKCQlpZiAoIGtleSA9PT0gImV2ZW50IiApIHsKCQkJdGhpcy5fc2V0dXBFdmVudHMoIHZhbHVlICk7CgkJfQoKCQlpZiAoIGtleSA9PT0gImhlaWdodFN0eWxlIiApIHsKCQkJdGhpcy5fc2V0dXBIZWlnaHRTdHlsZSggdmFsdWUgKTsKCQl9Cgl9LAoKCV9zYW5pdGl6ZVNlbGVjdG9yOiBmdW5jdGlvbiggaGFzaCApIHsKCQlyZXR1cm4gaGFzaCA/IGhhc2gucmVwbGFjZSggL1shIiQlJicoKSorLC5cLzo7PD0+P0BcW1xdXF5ge3x9fl0vZywgIlxcJCYiICkgOiAiIjsKCX0sCgoJcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsCgkJCWxpcyA9IHRoaXMudGFibGlzdC5jaGlsZHJlbiggIjpoYXMoYVtocmVmXSkiICk7CgoJCS8vIGdldCBkaXNhYmxlZCB0YWJzIGZyb20gY2xhc3MgYXR0cmlidXRlIGZyb20gSFRNTAoJCS8vIHRoaXMgd2lsbCBnZXQgY29udmVydGVkIHRvIGEgYm9vbGVhbiBpZiBuZWVkZWQgaW4gX3JlZnJlc2goKQoJCW9wdGlvbnMuZGlzYWJsZWQgPSAkLm1hcCggbGlzLmZpbHRlciggIi51aS1zdGF0ZS1kaXNhYmxlZCIgKSwgZnVuY3Rpb24oIHRhYiApIHsKCQkJcmV0dXJuIGxpcy5pbmRleCggdGFiICk7CgkJfSk7CgoJCXRoaXMuX3Byb2Nlc3NUYWJzKCk7CgoJCS8vIHdhcyBjb2xsYXBzZWQgb3Igbm8gdGFicwoJCWlmICggb3B0aW9ucy5hY3RpdmUgPT09IGZhbHNlIHx8ICF0aGlzLmFuY2hvcnMubGVuZ3RoICkgewoJCQlvcHRpb25zLmFjdGl2ZSA9IGZhbHNlOwoJCQl0aGlzLmFjdGl2ZSA9ICQoKTsKCQkvLyB3YXMgYWN0aXZlLCBidXQgYWN0aXZlIHRhYiBpcyBnb25lCgkJfSBlbHNlIGlmICggdGhpcy5hY3RpdmUubGVuZ3RoICYmICEkLmNvbnRhaW5zKCB0aGlzLnRhYmxpc3RbIDAgXSwgdGhpcy5hY3RpdmVbIDAgXSApICkgewoJCQkvLyBhbGwgcmVtYWluaW5nIHRhYnMgYXJlIGRpc2FibGVkCgkJCWlmICggdGhpcy50YWJzLmxlbmd0aCA9PT0gb3B0aW9ucy5kaXNhYmxlZC5sZW5ndGggKSB7CgkJCQlvcHRpb25zLmFjdGl2ZSA9IGZhbHNlOwoJCQkJdGhpcy5hY3RpdmUgPSAkKCk7CgkJCS8vIGFjdGl2YXRlIHByZXZpb3VzIHRhYgoJCQl9IGVsc2UgewoJCQkJdGhpcy5fYWN0aXZhdGUoIHRoaXMuX2ZpbmROZXh0VGFiKCBNYXRoLm1heCggMCwgb3B0aW9ucy5hY3RpdmUgLSAxICksIGZhbHNlICkgKTsKCQkJfQoJCS8vIHdhcyBhY3RpdmUsIGFjdGl2ZSB0YWIgc3RpbGwgZXhpc3RzCgkJfSBlbHNlIHsKCQkJLy8gbWFrZSBzdXJlIGFjdGl2ZSBpbmRleCBpcyBjb3JyZWN0CgkJCW9wdGlvbnMuYWN0aXZlID0gdGhpcy50YWJzLmluZGV4KCB0aGlzLmFjdGl2ZSApOwoJCX0KCgkJdGhpcy5fcmVmcmVzaCgpOwoJfSwKCglfcmVmcmVzaDogZnVuY3Rpb24oKSB7CgkJdGhpcy5fc2V0dXBEaXNhYmxlZCggdGhpcy5vcHRpb25zLmRpc2FibGVkICk7CgkJdGhpcy5fc2V0dXBFdmVudHMoIHRoaXMub3B0aW9ucy5ldmVudCApOwoJCXRoaXMuX3NldHVwSGVpZ2h0U3R5bGUoIHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSApOwoKCQl0aGlzLnRhYnMubm90KCB0aGlzLmFjdGl2ZSApLmF0dHIoewoJCQkiYXJpYS1zZWxlY3RlZCI6ICJmYWxzZSIsCgkJCSJhcmlhLWV4cGFuZGVkIjogImZhbHNlIiwKCQkJdGFiSW5kZXg6IC0xCgkJfSk7CgkJdGhpcy5wYW5lbHMubm90KCB0aGlzLl9nZXRQYW5lbEZvclRhYiggdGhpcy5hY3RpdmUgKSApCgkJCS5oaWRlKCkKCQkJLmF0dHIoewoJCQkJImFyaWEtaGlkZGVuIjogInRydWUiCgkJCX0pOwoKCQkvLyBNYWtlIHN1cmUgb25lIHRhYiBpcyBpbiB0aGUgdGFiIG9yZGVyCgkJaWYgKCAhdGhpcy5hY3RpdmUubGVuZ3RoICkgewoJCQl0aGlzLnRhYnMuZXEoIDAgKS5hdHRyKCAidGFiSW5kZXgiLCAwICk7CgkJfSBlbHNlIHsKCQkJdGhpcy5hY3RpdmUKCQkJCS5hZGRDbGFzcyggInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKQoJCQkJLmF0dHIoewoJCQkJCSJhcmlhLXNlbGVjdGVkIjogInRydWUiLAoJCQkJCSJhcmlhLWV4cGFuZGVkIjogInRydWUiLAoJCQkJCXRhYkluZGV4OiAwCgkJCQl9KTsKCQkJdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIHRoaXMuYWN0aXZlICkKCQkJCS5zaG93KCkKCQkJCS5hdHRyKHsKCQkJCQkiYXJpYS1oaWRkZW4iOiAiZmFsc2UiCgkJCQl9KTsKCQl9Cgl9LAoKCV9wcm9jZXNzVGFiczogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQl0aGlzLnRhYmxpc3QgPSB0aGlzLl9nZXRMaXN0KCkKCQkJLmFkZENsYXNzKCAidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiICkKCQkJLmF0dHIoICJyb2xlIiwgInRhYmxpc3QiICk7CgoJCXRoaXMudGFicyA9IHRoaXMudGFibGlzdC5maW5kKCAiPiBsaTpoYXMoYVtocmVmXSkiICkKCQkJLmFkZENsYXNzKCAidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItdG9wIiApCgkJCS5hdHRyKHsKCQkJCXJvbGU6ICJ0YWIiLAoJCQkJdGFiSW5kZXg6IC0xCgkJCX0pOwoKCQl0aGlzLmFuY2hvcnMgPSB0aGlzLnRhYnMubWFwKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICQoICJhIiwgdGhpcyApWyAwIF07CgkJCX0pCgkJCS5hZGRDbGFzcyggInVpLXRhYnMtYW5jaG9yIiApCgkJCS5hdHRyKHsKCQkJCXJvbGU6ICJwcmVzZW50YXRpb24iLAoJCQkJdGFiSW5kZXg6IC0xCgkJCX0pOwoKCQl0aGlzLnBhbmVscyA9ICQoKTsKCgkJdGhpcy5hbmNob3JzLmVhY2goZnVuY3Rpb24oIGksIGFuY2hvciApIHsKCQkJdmFyIHNlbGVjdG9yLCBwYW5lbCwgcGFuZWxJZCwKCQkJCWFuY2hvcklkID0gJCggYW5jaG9yICkudW5pcXVlSWQoKS5hdHRyKCAiaWQiICksCgkJCQl0YWIgPSAkKCBhbmNob3IgKS5jbG9zZXN0KCAibGkiICksCgkJCQlvcmlnaW5hbEFyaWFDb250cm9scyA9IHRhYi5hdHRyKCAiYXJpYS1jb250cm9scyIgKTsKCgkJCS8vIGlubGluZSB0YWIKCQkJaWYgKCB0aGF0Ll9pc0xvY2FsKCBhbmNob3IgKSApIHsKCQkJCXNlbGVjdG9yID0gYW5jaG9yLmhhc2g7CgkJCQlwYW5lbElkID0gc2VsZWN0b3Iuc3Vic3RyaW5nKCAxICk7CgkJCQlwYW5lbCA9IHRoYXQuZWxlbWVudC5maW5kKCB0aGF0Ll9zYW5pdGl6ZVNlbGVjdG9yKCBzZWxlY3RvciApICk7CgkJCS8vIHJlbW90ZSB0YWIKCQkJfSBlbHNlIHsKCQkJCS8vIElmIHRoZSB0YWIgZG9lc24ndCBhbHJlYWR5IGhhdmUgYXJpYS1jb250cm9scywKCQkJCS8vIGdlbmVyYXRlIGFuIGlkIGJ5IHVzaW5nIGEgdGhyb3ctYXdheSBlbGVtZW50CgkJCQlwYW5lbElkID0gdGFiLmF0dHIoICJhcmlhLWNvbnRyb2xzIiApIHx8ICQoIHt9ICkudW5pcXVlSWQoKVsgMCBdLmlkOwoJCQkJc2VsZWN0b3IgPSAiIyIgKyBwYW5lbElkOwoJCQkJcGFuZWwgPSB0aGF0LmVsZW1lbnQuZmluZCggc2VsZWN0b3IgKTsKCQkJCWlmICggIXBhbmVsLmxlbmd0aCApIHsKCQkJCQlwYW5lbCA9IHRoYXQuX2NyZWF0ZVBhbmVsKCBwYW5lbElkICk7CgkJCQkJcGFuZWwuaW5zZXJ0QWZ0ZXIoIHRoYXQucGFuZWxzWyBpIC0gMSBdIHx8IHRoYXQudGFibGlzdCApOwoJCQkJfQoJCQkJcGFuZWwuYXR0ciggImFyaWEtbGl2ZSIsICJwb2xpdGUiICk7CgkJCX0KCgkJCWlmICggcGFuZWwubGVuZ3RoKSB7CgkJCQl0aGF0LnBhbmVscyA9IHRoYXQucGFuZWxzLmFkZCggcGFuZWwgKTsKCQkJfQoJCQlpZiAoIG9yaWdpbmFsQXJpYUNvbnRyb2xzICkgewoJCQkJdGFiLmRhdGEoICJ1aS10YWJzLWFyaWEtY29udHJvbHMiLCBvcmlnaW5hbEFyaWFDb250cm9scyApOwoJCQl9CgkJCXRhYi5hdHRyKHsKCQkJCSJhcmlhLWNvbnRyb2xzIjogcGFuZWxJZCwKCQkJCSJhcmlhLWxhYmVsbGVkYnkiOiBhbmNob3JJZAoJCQl9KTsKCQkJcGFuZWwuYXR0ciggImFyaWEtbGFiZWxsZWRieSIsIGFuY2hvcklkICk7CgkJfSk7CgoJCXRoaXMucGFuZWxzCgkJCS5hZGRDbGFzcyggInVpLXRhYnMtcGFuZWwgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIgKQoJCQkuYXR0ciggInJvbGUiLCAidGFicGFuZWwiICk7Cgl9LAoKCS8vIGFsbG93IG92ZXJyaWRpbmcgaG93IHRvIGZpbmQgdGhlIGxpc3QgZm9yIHJhcmUgdXNhZ2Ugc2NlbmFyaW9zICgjNzcxNSkKCV9nZXRMaXN0OiBmdW5jdGlvbigpIHsKCQlyZXR1cm4gdGhpcy50YWJsaXN0IHx8IHRoaXMuZWxlbWVudC5maW5kKCAib2wsdWwiICkuZXEoIDAgKTsKCX0sCgoJX2NyZWF0ZVBhbmVsOiBmdW5jdGlvbiggaWQgKSB7CgkJcmV0dXJuICQoICI8ZGl2PiIgKQoJCQkuYXR0ciggImlkIiwgaWQgKQoJCQkuYWRkQ2xhc3MoICJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iICkKCQkJLmRhdGEoICJ1aS10YWJzLWRlc3Ryb3kiLCB0cnVlICk7Cgl9LAoKCV9zZXR1cERpc2FibGVkOiBmdW5jdGlvbiggZGlzYWJsZWQgKSB7CgkJaWYgKCAkLmlzQXJyYXkoIGRpc2FibGVkICkgKSB7CgkJCWlmICggIWRpc2FibGVkLmxlbmd0aCApIHsKCQkJCWRpc2FibGVkID0gZmFsc2U7CgkJCX0gZWxzZSBpZiAoIGRpc2FibGVkLmxlbmd0aCA9PT0gdGhpcy5hbmNob3JzLmxlbmd0aCApIHsKCQkJCWRpc2FibGVkID0gdHJ1ZTsKCQkJfQoJCX0KCgkJLy8gZGlzYWJsZSB0YWJzCgkJZm9yICggdmFyIGkgPSAwLCBsaTsgKCBsaSA9IHRoaXMudGFic1sgaSBdICk7IGkrKyApIHsKCQkJaWYgKCBkaXNhYmxlZCA9PT0gdHJ1ZSB8fCAkLmluQXJyYXkoIGksIGRpc2FibGVkICkgIT09IC0xICkgewoJCQkJJCggbGkgKQoJCQkJCS5hZGRDbGFzcyggInVpLXN0YXRlLWRpc2FibGVkIiApCgkJCQkJLmF0dHIoICJhcmlhLWRpc2FibGVkIiwgInRydWUiICk7CgkJCX0gZWxzZSB7CgkJCQkkKCBsaSApCgkJCQkJLnJlbW92ZUNsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtZGlzYWJsZWQiICk7CgkJCX0KCQl9CgoJCXRoaXMub3B0aW9ucy5kaXNhYmxlZCA9IGRpc2FibGVkOwoJfSwKCglfc2V0dXBFdmVudHM6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgZXZlbnRzID0ge307CgkJaWYgKCBldmVudCApIHsKCQkJJC5lYWNoKCBldmVudC5zcGxpdCgiICIpLCBmdW5jdGlvbiggaW5kZXgsIGV2ZW50TmFtZSApIHsKCQkJCWV2ZW50c1sgZXZlbnROYW1lIF0gPSAiX2V2ZW50SGFuZGxlciI7CgkJCX0pOwoJCX0KCgkJdGhpcy5fb2ZmKCB0aGlzLmFuY2hvcnMuYWRkKCB0aGlzLnRhYnMgKS5hZGQoIHRoaXMucGFuZWxzICkgKTsKCQkvLyBBbHdheXMgcHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24sIGV2ZW4gd2hlbiBkaXNhYmxlZAoJCXRoaXMuX29uKCB0cnVlLCB0aGlzLmFuY2hvcnMsIHsKCQkJY2xpY2s6IGZ1bmN0aW9uKCBldmVudCApIHsKCQkJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgkJCX0KCQl9KTsKCQl0aGlzLl9vbiggdGhpcy5hbmNob3JzLCBldmVudHMgKTsKCQl0aGlzLl9vbiggdGhpcy50YWJzLCB7IGtleWRvd246ICJfdGFiS2V5ZG93biIgfSApOwoJCXRoaXMuX29uKCB0aGlzLnBhbmVscywgeyBrZXlkb3duOiAiX3BhbmVsS2V5ZG93biIgfSApOwoKCQl0aGlzLl9mb2N1c2FibGUoIHRoaXMudGFicyApOwoJCXRoaXMuX2hvdmVyYWJsZSggdGhpcy50YWJzICk7Cgl9LAoKCV9zZXR1cEhlaWdodFN0eWxlOiBmdW5jdGlvbiggaGVpZ2h0U3R5bGUgKSB7CgkJdmFyIG1heEhlaWdodCwKCQkJcGFyZW50ID0gdGhpcy5lbGVtZW50LnBhcmVudCgpOwoKCQlpZiAoIGhlaWdodFN0eWxlID09PSAiZmlsbCIgKSB7CgkJCW1heEhlaWdodCA9IHBhcmVudC5oZWlnaHQoKTsKCQkJbWF4SGVpZ2h0IC09IHRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpIC0gdGhpcy5lbGVtZW50LmhlaWdodCgpOwoKCQkJdGhpcy5lbGVtZW50LnNpYmxpbmdzKCAiOnZpc2libGUiICkuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBlbGVtID0gJCggdGhpcyApLAoJCQkJCXBvc2l0aW9uID0gZWxlbS5jc3MoICJwb3NpdGlvbiIgKTsKCgkJCQlpZiAoIHBvc2l0aW9uID09PSAiYWJzb2x1dGUiIHx8IHBvc2l0aW9uID09PSAiZml4ZWQiICkgewoJCQkJCXJldHVybjsKCQkJCX0KCQkJCW1heEhlaWdodCAtPSBlbGVtLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhpcy5lbGVtZW50LmNoaWxkcmVuKCkubm90KCB0aGlzLnBhbmVscyApLmVhY2goZnVuY3Rpb24oKSB7CgkJCQltYXhIZWlnaHQgLT0gJCggdGhpcyApLm91dGVySGVpZ2h0KCB0cnVlICk7CgkJCX0pOwoKCQkJdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpIHsKCQkJCSQoIHRoaXMgKS5oZWlnaHQoIE1hdGgubWF4KCAwLCBtYXhIZWlnaHQgLQoJCQkJCSQoIHRoaXMgKS5pbm5lckhlaWdodCgpICsgJCggdGhpcyApLmhlaWdodCgpICkgKTsKCQkJfSkKCQkJLmNzcyggIm92ZXJmbG93IiwgImF1dG8iICk7CgkJfSBlbHNlIGlmICggaGVpZ2h0U3R5bGUgPT09ICJhdXRvIiApIHsKCQkJbWF4SGVpZ2h0ID0gMDsKCQkJdGhpcy5wYW5lbHMuZWFjaChmdW5jdGlvbigpIHsKCQkJCW1heEhlaWdodCA9IE1hdGgubWF4KCBtYXhIZWlnaHQsICQoIHRoaXMgKS5oZWlnaHQoICIiICkuaGVpZ2h0KCkgKTsKCQkJfSkuaGVpZ2h0KCBtYXhIZWlnaHQgKTsKCQl9Cgl9LAoKCV9ldmVudEhhbmRsZXI6IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywKCQkJYWN0aXZlID0gdGhpcy5hY3RpdmUsCgkJCWFuY2hvciA9ICQoIGV2ZW50LmN1cnJlbnRUYXJnZXQgKSwKCQkJdGFiID0gYW5jaG9yLmNsb3Nlc3QoICJsaSIgKSwKCQkJY2xpY2tlZElzQWN0aXZlID0gdGFiWyAwIF0gPT09IGFjdGl2ZVsgMCBdLAoJCQljb2xsYXBzaW5nID0gY2xpY2tlZElzQWN0aXZlICYmIG9wdGlvbnMuY29sbGFwc2libGUsCgkJCXRvU2hvdyA9IGNvbGxhcHNpbmcgPyAkKCkgOiB0aGlzLl9nZXRQYW5lbEZvclRhYiggdGFiICksCgkJCXRvSGlkZSA9ICFhY3RpdmUubGVuZ3RoID8gJCgpIDogdGhpcy5fZ2V0UGFuZWxGb3JUYWIoIGFjdGl2ZSApLAoJCQlldmVudERhdGEgPSB7CgkJCQlvbGRUYWI6IGFjdGl2ZSwKCQkJCW9sZFBhbmVsOiB0b0hpZGUsCgkJCQluZXdUYWI6IGNvbGxhcHNpbmcgPyAkKCkgOiB0YWIsCgkJCQluZXdQYW5lbDogdG9TaG93CgkJCX07CgoJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgoJCWlmICggdGFiLmhhc0NsYXNzKCAidWktc3RhdGUtZGlzYWJsZWQiICkgfHwKCQkJCS8vIHRhYiBpcyBhbHJlYWR5IGxvYWRpbmcKCQkJCXRhYi5oYXNDbGFzcyggInVpLXRhYnMtbG9hZGluZyIgKSB8fAoJCQkJLy8gY2FuJ3Qgc3dpdGNoIGR1cm5pbmcgYW4gYW5pbWF0aW9uCgkJCQl0aGlzLnJ1bm5pbmcgfHwKCQkJCS8vIGNsaWNrIG9uIGFjdGl2ZSBoZWFkZXIsIGJ1dCBub3QgY29sbGFwc2libGUKCQkJCSggY2xpY2tlZElzQWN0aXZlICYmICFvcHRpb25zLmNvbGxhcHNpYmxlICkgfHwKCQkJCS8vIGFsbG93IGNhbmNlbGluZyBhY3RpdmF0aW9uCgkJCQkoIHRoaXMuX3RyaWdnZXIoICJiZWZvcmVBY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKSA9PT0gZmFsc2UgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJb3B0aW9ucy5hY3RpdmUgPSBjb2xsYXBzaW5nID8gZmFsc2UgOiB0aGlzLnRhYnMuaW5kZXgoIHRhYiApOwoKCQl0aGlzLmFjdGl2ZSA9IGNsaWNrZWRJc0FjdGl2ZSA/ICQoKSA6IHRhYjsKCQlpZiAoIHRoaXMueGhyICkgewoJCQl0aGlzLnhoci5hYm9ydCgpOwoJCX0KCgkJaWYgKCAhdG9IaWRlLmxlbmd0aCAmJiAhdG9TaG93Lmxlbmd0aCApIHsKCQkJJC5lcnJvciggImpRdWVyeSBVSSBUYWJzOiBNaXNtYXRjaGluZyBmcmFnbWVudCBpZGVudGlmaWVyLiIgKTsKCQl9CgoJCWlmICggdG9TaG93Lmxlbmd0aCApIHsKCQkJdGhpcy5sb2FkKCB0aGlzLnRhYnMuaW5kZXgoIHRhYiApLCBldmVudCApOwoJCX0KCQl0aGlzLl90b2dnbGUoIGV2ZW50LCBldmVudERhdGEgKTsKCX0sCgoJLy8gaGFuZGxlcyBzaG93L2hpZGUgZm9yIHNlbGVjdGluZyB0YWJzCglfdG9nZ2xlOiBmdW5jdGlvbiggZXZlbnQsIGV2ZW50RGF0YSApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRvU2hvdyA9IGV2ZW50RGF0YS5uZXdQYW5lbCwKCQkJdG9IaWRlID0gZXZlbnREYXRhLm9sZFBhbmVsOwoKCQl0aGlzLnJ1bm5pbmcgPSB0cnVlOwoKCQlmdW5jdGlvbiBjb21wbGV0ZSgpIHsKCQkJdGhhdC5ydW5uaW5nID0gZmFsc2U7CgkJCXRoYXQuX3RyaWdnZXIoICJhY3RpdmF0ZSIsIGV2ZW50LCBldmVudERhdGEgKTsKCQl9CgoJCWZ1bmN0aW9uIHNob3coKSB7CgkJCWV2ZW50RGF0YS5uZXdUYWIuY2xvc2VzdCggImxpIiApLmFkZENsYXNzKCAidWktdGFicy1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiApOwoKCQkJaWYgKCB0b1Nob3cubGVuZ3RoICYmIHRoYXQub3B0aW9ucy5zaG93ICkgewoJCQkJdGhhdC5fc2hvdyggdG9TaG93LCB0aGF0Lm9wdGlvbnMuc2hvdywgY29tcGxldGUgKTsKCQkJfSBlbHNlIHsKCQkJCXRvU2hvdy5zaG93KCk7CgkJCQljb21wbGV0ZSgpOwoJCQl9CgkJfQoKCQkvLyBzdGFydCBvdXQgYnkgaGlkaW5nLCB0aGVuIHNob3dpbmcsIHRoZW4gY29tcGxldGluZwoJCWlmICggdG9IaWRlLmxlbmd0aCAmJiB0aGlzLm9wdGlvbnMuaGlkZSApIHsKCQkJdGhpcy5faGlkZSggdG9IaWRlLCB0aGlzLm9wdGlvbnMuaGlkZSwgZnVuY3Rpb24oKSB7CgkJCQlldmVudERhdGEub2xkVGFiLmNsb3Nlc3QoICJsaSIgKS5yZW1vdmVDbGFzcyggInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIgKTsKCQkJCXNob3coKTsKCQkJfSk7CgkJfSBlbHNlIHsKCQkJZXZlbnREYXRhLm9sZFRhYi5jbG9zZXN0KCAibGkiICkucmVtb3ZlQ2xhc3MoICJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiICk7CgkJCXRvSGlkZS5oaWRlKCk7CgkJCXNob3coKTsKCQl9CgoJCXRvSGlkZS5hdHRyKCAiYXJpYS1oaWRkZW4iLCAidHJ1ZSIgKTsKCQlldmVudERhdGEub2xkVGFiLmF0dHIoewoJCQkiYXJpYS1zZWxlY3RlZCI6ICJmYWxzZSIsCgkJCSJhcmlhLWV4cGFuZGVkIjogImZhbHNlIgoJCX0pOwoJCS8vIElmIHdlJ3JlIHN3aXRjaGluZyB0YWJzLCByZW1vdmUgdGhlIG9sZCB0YWIgZnJvbSB0aGUgdGFiIG9yZGVyLgoJCS8vIElmIHdlJ3JlIG9wZW5pbmcgZnJvbSBjb2xsYXBzZWQgc3RhdGUsIHJlbW92ZSB0aGUgcHJldmlvdXMgdGFiIGZyb20gdGhlIHRhYiBvcmRlci4KCQkvLyBJZiB3ZSdyZSBjb2xsYXBzaW5nLCB0aGVuIGtlZXAgdGhlIGNvbGxhcHNpbmcgdGFiIGluIHRoZSB0YWIgb3JkZXIuCgkJaWYgKCB0b1Nob3cubGVuZ3RoICYmIHRvSGlkZS5sZW5ndGggKSB7CgkJCWV2ZW50RGF0YS5vbGRUYWIuYXR0ciggInRhYkluZGV4IiwgLTEgKTsKCQl9IGVsc2UgaWYgKCB0b1Nob3cubGVuZ3RoICkgewoJCQl0aGlzLnRhYnMuZmlsdGVyKGZ1bmN0aW9uKCkgewoJCQkJcmV0dXJuICQoIHRoaXMgKS5hdHRyKCAidGFiSW5kZXgiICkgPT09IDA7CgkJCX0pCgkJCS5hdHRyKCAidGFiSW5kZXgiLCAtMSApOwoJCX0KCgkJdG9TaG93LmF0dHIoICJhcmlhLWhpZGRlbiIsICJmYWxzZSIgKTsKCQlldmVudERhdGEubmV3VGFiLmF0dHIoewoJCQkiYXJpYS1zZWxlY3RlZCI6ICJ0cnVlIiwKCQkJImFyaWEtZXhwYW5kZWQiOiAidHJ1ZSIsCgkJCXRhYkluZGV4OiAwCgkJfSk7Cgl9LAoKCV9hY3RpdmF0ZTogZnVuY3Rpb24oIGluZGV4ICkgewoJCXZhciBhbmNob3IsCgkJCWFjdGl2ZSA9IHRoaXMuX2ZpbmRBY3RpdmUoIGluZGV4ICk7CgoJCS8vIHRyeWluZyB0byBhY3RpdmF0ZSB0aGUgYWxyZWFkeSBhY3RpdmUgcGFuZWwKCQlpZiAoIGFjdGl2ZVsgMCBdID09PSB0aGlzLmFjdGl2ZVsgMCBdICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyB0cnlpbmcgdG8gY29sbGFwc2UsIHNpbXVsYXRlIGEgY2xpY2sgb24gdGhlIGN1cnJlbnQgYWN0aXZlIGhlYWRlcgoJCWlmICggIWFjdGl2ZS5sZW5ndGggKSB7CgkJCWFjdGl2ZSA9IHRoaXMuYWN0aXZlOwoJCX0KCgkJYW5jaG9yID0gYWN0aXZlLmZpbmQoICIudWktdGFicy1hbmNob3IiIClbIDAgXTsKCQl0aGlzLl9ldmVudEhhbmRsZXIoewoJCQl0YXJnZXQ6IGFuY2hvciwKCQkJY3VycmVudFRhcmdldDogYW5jaG9yLAoJCQlwcmV2ZW50RGVmYXVsdDogJC5ub29wCgkJfSk7Cgl9LAoKCV9maW5kQWN0aXZlOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJcmV0dXJuIGluZGV4ID09PSBmYWxzZSA/ICQoKSA6IHRoaXMudGFicy5lcSggaW5kZXggKTsKCX0sCgoJX2dldEluZGV4OiBmdW5jdGlvbiggaW5kZXggKSB7CgkJLy8gbWV0YS1mdW5jdGlvbiB0byBnaXZlIHVzZXJzIG9wdGlvbiB0byBwcm92aWRlIGEgaHJlZiBzdHJpbmcgaW5zdGVhZCBvZiBhIG51bWVyaWNhbCBpbmRleC4KCQlpZiAoIHR5cGVvZiBpbmRleCA9PT0gInN0cmluZyIgKSB7CgkJCWluZGV4ID0gdGhpcy5hbmNob3JzLmluZGV4KCB0aGlzLmFuY2hvcnMuZmlsdGVyKCAiW2hyZWYkPSciICsgaW5kZXggKyAiJ10iICkgKTsKCQl9CgoJCXJldHVybiBpbmRleDsKCX0sCgoJX2Rlc3Ryb3k6IGZ1bmN0aW9uKCkgewoJCWlmICggdGhpcy54aHIgKSB7CgkJCXRoaXMueGhyLmFib3J0KCk7CgkJfQoKCQl0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoICJ1aS10YWJzIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIHVpLXRhYnMtY29sbGFwc2libGUiICk7CgoJCXRoaXMudGFibGlzdAoJCQkucmVtb3ZlQ2xhc3MoICJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICk7CgoJCXRoaXMuYW5jaG9ycwoJCQkucmVtb3ZlQ2xhc3MoICJ1aS10YWJzLWFuY2hvciIgKQoJCQkucmVtb3ZlQXR0ciggInJvbGUiICkKCQkJLnJlbW92ZUF0dHIoICJ0YWJJbmRleCIgKQoJCQkucmVtb3ZlVW5pcXVlSWQoKTsKCgkJdGhpcy50YWJzLmFkZCggdGhpcy5wYW5lbHMgKS5lYWNoKGZ1bmN0aW9uKCkgewoJCQlpZiAoICQuZGF0YSggdGhpcywgInVpLXRhYnMtZGVzdHJveSIgKSApIHsKCQkJCSQoIHRoaXMgKS5yZW1vdmUoKTsKCQkJfSBlbHNlIHsKCQkJCSQoIHRoaXMgKQoJCQkJCS5yZW1vdmVDbGFzcyggInVpLXN0YXRlLWRlZmF1bHQgdWktc3RhdGUtYWN0aXZlIHVpLXN0YXRlLWRpc2FibGVkICIgKwoJCQkJCQkidWktY29ybmVyLXRvcCB1aS1jb3JuZXItYm90dG9tIHVpLXdpZGdldC1jb250ZW50IHVpLXRhYnMtYWN0aXZlIHVpLXRhYnMtcGFuZWwiICkKCQkJCQkucmVtb3ZlQXR0ciggInRhYkluZGV4IiApCgkJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWxpdmUiICkKCQkJCQkucmVtb3ZlQXR0ciggImFyaWEtYnVzeSIgKQoJCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1zZWxlY3RlZCIgKQoJCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1sYWJlbGxlZGJ5IiApCgkJCQkJLnJlbW92ZUF0dHIoICJhcmlhLWhpZGRlbiIgKQoJCQkJCS5yZW1vdmVBdHRyKCAiYXJpYS1leHBhbmRlZCIgKQoJCQkJCS5yZW1vdmVBdHRyKCAicm9sZSIgKTsKCQkJfQoJCX0pOwoKCQl0aGlzLnRhYnMuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGxpID0gJCggdGhpcyApLAoJCQkJcHJldiA9IGxpLmRhdGEoICJ1aS10YWJzLWFyaWEtY29udHJvbHMiICk7CgkJCWlmICggcHJldiApIHsKCQkJCWxpCgkJCQkJLmF0dHIoICJhcmlhLWNvbnRyb2xzIiwgcHJldiApCgkJCQkJLnJlbW92ZURhdGEoICJ1aS10YWJzLWFyaWEtY29udHJvbHMiICk7CgkJCX0gZWxzZSB7CgkJCQlsaS5yZW1vdmVBdHRyKCAiYXJpYS1jb250cm9scyIgKTsKCQkJfQoJCX0pOwoKCQl0aGlzLnBhbmVscy5zaG93KCk7CgoJCWlmICggdGhpcy5vcHRpb25zLmhlaWdodFN0eWxlICE9PSAiY29udGVudCIgKSB7CgkJCXRoaXMucGFuZWxzLmNzcyggImhlaWdodCIsICIiICk7CgkJfQoJfSwKCgllbmFibGU6IGZ1bmN0aW9uKCBpbmRleCApIHsKCQl2YXIgZGlzYWJsZWQgPSB0aGlzLm9wdGlvbnMuZGlzYWJsZWQ7CgkJaWYgKCBkaXNhYmxlZCA9PT0gZmFsc2UgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHsKCQkJZGlzYWJsZWQgPSBmYWxzZTsKCQl9IGVsc2UgewoJCQlpbmRleCA9IHRoaXMuX2dldEluZGV4KCBpbmRleCApOwoJCQlpZiAoICQuaXNBcnJheSggZGlzYWJsZWQgKSApIHsKCQkJCWRpc2FibGVkID0gJC5tYXAoIGRpc2FibGVkLCBmdW5jdGlvbiggbnVtICkgewoJCQkJCXJldHVybiBudW0gIT09IGluZGV4ID8gbnVtIDogbnVsbDsKCQkJCX0pOwoJCQl9IGVsc2UgewoJCQkJZGlzYWJsZWQgPSAkLm1hcCggdGhpcy50YWJzLCBmdW5jdGlvbiggbGksIG51bSApIHsKCQkJCQlyZXR1cm4gbnVtICE9PSBpbmRleCA/IG51bSA6IG51bGw7CgkJCQl9KTsKCQkJfQoJCX0KCQl0aGlzLl9zZXR1cERpc2FibGVkKCBkaXNhYmxlZCApOwoJfSwKCglkaXNhYmxlOiBmdW5jdGlvbiggaW5kZXggKSB7CgkJdmFyIGRpc2FibGVkID0gdGhpcy5vcHRpb25zLmRpc2FibGVkOwoJCWlmICggZGlzYWJsZWQgPT09IHRydWUgKSB7CgkJCXJldHVybjsKCQl9CgoJCWlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHsKCQkJZGlzYWJsZWQgPSB0cnVlOwoJCX0gZWxzZSB7CgkJCWluZGV4ID0gdGhpcy5fZ2V0SW5kZXgoIGluZGV4ICk7CgkJCWlmICggJC5pbkFycmF5KCBpbmRleCwgZGlzYWJsZWQgKSAhPT0gLTEgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJaWYgKCAkLmlzQXJyYXkoIGRpc2FibGVkICkgKSB7CgkJCQlkaXNhYmxlZCA9ICQubWVyZ2UoIFsgaW5kZXggXSwgZGlzYWJsZWQgKS5zb3J0KCk7CgkJCX0gZWxzZSB7CgkJCQlkaXNhYmxlZCA9IFsgaW5kZXggXTsKCQkJfQoJCX0KCQl0aGlzLl9zZXR1cERpc2FibGVkKCBkaXNhYmxlZCApOwoJfSwKCglsb2FkOiBmdW5jdGlvbiggaW5kZXgsIGV2ZW50ICkgewoJCWluZGV4ID0gdGhpcy5fZ2V0SW5kZXgoIGluZGV4ICk7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQl0YWIgPSB0aGlzLnRhYnMuZXEoIGluZGV4ICksCgkJCWFuY2hvciA9IHRhYi5maW5kKCAiLnVpLXRhYnMtYW5jaG9yIiApLAoJCQlwYW5lbCA9IHRoaXMuX2dldFBhbmVsRm9yVGFiKCB0YWIgKSwKCQkJZXZlbnREYXRhID0gewoJCQkJdGFiOiB0YWIsCgkJCQlwYW5lbDogcGFuZWwKCQkJfTsKCgkJLy8gbm90IHJlbW90ZQoJCWlmICggdGhpcy5faXNMb2NhbCggYW5jaG9yWyAwIF0gKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJdGhpcy54aHIgPSAkLmFqYXgoIHRoaXMuX2FqYXhTZXR0aW5ncyggYW5jaG9yLCBldmVudCwgZXZlbnREYXRhICkgKTsKCgkJLy8gc3VwcG9ydDogalF1ZXJ5IDwxLjgKCQkvLyBqUXVlcnkgPDEuOCByZXR1cm5zIGZhbHNlIGlmIHRoZSByZXF1ZXN0IGlzIGNhbmNlbGVkIGluIGJlZm9yZVNlbmQsCgkJLy8gYnV0IGFzIG9mIDEuOCwgJC5hamF4KCkgYWx3YXlzIHJldHVybnMgYSBqcVhIUiBvYmplY3QuCgkJaWYgKCB0aGlzLnhociAmJiB0aGlzLnhoci5zdGF0dXNUZXh0ICE9PSAiY2FuY2VsZWQiICkgewoJCQl0YWIuYWRkQ2xhc3MoICJ1aS10YWJzLWxvYWRpbmciICk7CgkJCXBhbmVsLmF0dHIoICJhcmlhLWJ1c3kiLCAidHJ1ZSIgKTsKCgkJCXRoaXMueGhyCgkJCQkuc3VjY2VzcyhmdW5jdGlvbiggcmVzcG9uc2UgKSB7CgkJCQkJLy8gc3VwcG9ydDogalF1ZXJ5IDwxLjgKCQkJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMTc3OAoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQkJCXBhbmVsLmh0bWwoIHJlc3BvbnNlICk7CgkJCQkJCXRoYXQuX3RyaWdnZXIoICJsb2FkIiwgZXZlbnQsIGV2ZW50RGF0YSApOwoJCQkJCX0sIDEgKTsKCQkJCX0pCgkJCQkuY29tcGxldGUoZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7CgkJCQkJLy8gc3VwcG9ydDogalF1ZXJ5IDwxLjgKCQkJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMTc3OAoJCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CgkJCQkJCWlmICggc3RhdHVzID09PSAiYWJvcnQiICkgewoJCQkJCQkJdGhhdC5wYW5lbHMuc3RvcCggZmFsc2UsIHRydWUgKTsKCQkJCQkJfQoKCQkJCQkJdGFiLnJlbW92ZUNsYXNzKCAidWktdGFicy1sb2FkaW5nIiApOwoJCQkJCQlwYW5lbC5yZW1vdmVBdHRyKCAiYXJpYS1idXN5IiApOwoKCQkJCQkJaWYgKCBqcVhIUiA9PT0gdGhhdC54aHIgKSB7CgkJCQkJCQlkZWxldGUgdGhhdC54aHI7CgkJCQkJCX0KCQkJCQl9LCAxICk7CgkJCQl9KTsKCQl9Cgl9LAoKCV9hamF4U2V0dGluZ3M6IGZ1bmN0aW9uKCBhbmNob3IsIGV2ZW50LCBldmVudERhdGEgKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoJCXJldHVybiB7CgkJCXVybDogYW5jaG9yLmF0dHIoICJocmVmIiApLAoJCQliZWZvcmVTZW5kOiBmdW5jdGlvbigganFYSFIsIHNldHRpbmdzICkgewoJCQkJcmV0dXJuIHRoYXQuX3RyaWdnZXIoICJiZWZvcmVMb2FkIiwgZXZlbnQsCgkJCQkJJC5leHRlbmQoIHsganFYSFI6IGpxWEhSLCBhamF4U2V0dGluZ3M6IHNldHRpbmdzIH0sIGV2ZW50RGF0YSApICk7CgkJCX0KCQl9OwoJfSwKCglfZ2V0UGFuZWxGb3JUYWI6IGZ1bmN0aW9uKCB0YWIgKSB7CgkJdmFyIGlkID0gJCggdGFiICkuYXR0ciggImFyaWEtY29udHJvbHMiICk7CgkJcmV0dXJuIHRoaXMuZWxlbWVudC5maW5kKCB0aGlzLl9zYW5pdGl6ZVNlbGVjdG9yKCAiIyIgKyBpZCApICk7Cgl9Cn0pOwoKCi8qIQogKiBqUXVlcnkgVUkgVG9vbHRpcCAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS90b29sdGlwLwogKi8KCgp2YXIgdG9vbHRpcCA9ICQud2lkZ2V0KCAidWkudG9vbHRpcCIsIHsKCXZlcnNpb246ICIxLjExLjAiLAoJb3B0aW9uczogewoJCWNvbnRlbnQ6IGZ1bmN0aW9uKCkgewoJCQkvLyBzdXBwb3J0OiBJRTw5LCBPcGVyYSBpbiBqUXVlcnkgPDEuNwoJCQkvLyAudGV4dCgpIGNhbid0IGFjY2VwdCB1bmRlZmluZWQsIHNvIGNvZXJjZSB0byBhIHN0cmluZwoJCQl2YXIgdGl0bGUgPSAkKCB0aGlzICkuYXR0ciggInRpdGxlIiApIHx8ICIiOwoJCQkvLyBFc2NhcGUgdGl0bGUsIHNpbmNlIHdlJ3JlIGdvaW5nIGZyb20gYW4gYXR0cmlidXRlIHRvIHJhdyBIVE1MCgkJCXJldHVybiAkKCAiPGE+IiApLnRleHQoIHRpdGxlICkuaHRtbCgpOwoJCX0sCgkJaGlkZTogdHJ1ZSwKCQkvLyBEaXNhYmxlZCBlbGVtZW50cyBoYXZlIGluY29uc2lzdGVudCBiZWhhdmlvciBhY3Jvc3MgYnJvd3NlcnMgKCM4NjYxKQoJCWl0ZW1zOiAiW3RpdGxlXTpub3QoW2Rpc2FibGVkXSkiLAoJCXBvc2l0aW9uOiB7CgkJCW15OiAibGVmdCB0b3ArMTUiLAoJCQlhdDogImxlZnQgYm90dG9tIiwKCQkJY29sbGlzaW9uOiAiZmxpcGZpdCBmbGlwIgoJCX0sCgkJc2hvdzogdHJ1ZSwKCQl0b29sdGlwQ2xhc3M6IG51bGwsCgkJdHJhY2s6IGZhbHNlLAoKCQkvLyBjYWxsYmFja3MKCQljbG9zZTogbnVsbCwKCQlvcGVuOiBudWxsCgl9LAoKCV9hZGREZXNjcmliZWRCeTogZnVuY3Rpb24oIGVsZW0sIGlkICkgewoJCXZhciBkZXNjcmliZWRieSA9IChlbGVtLmF0dHIoICJhcmlhLWRlc2NyaWJlZGJ5IiApIHx8ICIiKS5zcGxpdCggL1xzKy8gKTsKCQlkZXNjcmliZWRieS5wdXNoKCBpZCApOwoJCWVsZW0KCQkJLmRhdGEoICJ1aS10b29sdGlwLWlkIiwgaWQgKQoJCQkuYXR0ciggImFyaWEtZGVzY3JpYmVkYnkiLCAkLnRyaW0oIGRlc2NyaWJlZGJ5LmpvaW4oICIgIiApICkgKTsKCX0sCgoJX3JlbW92ZURlc2NyaWJlZEJ5OiBmdW5jdGlvbiggZWxlbSApIHsKCQl2YXIgaWQgPSBlbGVtLmRhdGEoICJ1aS10b29sdGlwLWlkIiApLAoJCQlkZXNjcmliZWRieSA9IChlbGVtLmF0dHIoICJhcmlhLWRlc2NyaWJlZGJ5IiApIHx8ICIiKS5zcGxpdCggL1xzKy8gKSwKCQkJaW5kZXggPSAkLmluQXJyYXkoIGlkLCBkZXNjcmliZWRieSApOwoKCQlpZiAoIGluZGV4ICE9PSAtMSApIHsKCQkJZGVzY3JpYmVkYnkuc3BsaWNlKCBpbmRleCwgMSApOwoJCX0KCgkJZWxlbS5yZW1vdmVEYXRhKCAidWktdG9vbHRpcC1pZCIgKTsKCQlkZXNjcmliZWRieSA9ICQudHJpbSggZGVzY3JpYmVkYnkuam9pbiggIiAiICkgKTsKCQlpZiAoIGRlc2NyaWJlZGJ5ICkgewoJCQllbGVtLmF0dHIoICJhcmlhLWRlc2NyaWJlZGJ5IiwgZGVzY3JpYmVkYnkgKTsKCQl9IGVsc2UgewoJCQllbGVtLnJlbW92ZUF0dHIoICJhcmlhLWRlc2NyaWJlZGJ5IiApOwoJCX0KCX0sCgoJX2NyZWF0ZTogZnVuY3Rpb24oKSB7CgkJdGhpcy5fb24oewoJCQltb3VzZW92ZXI6ICJvcGVuIiwKCQkJZm9jdXNpbjogIm9wZW4iCgkJfSk7CgoJCS8vIElEcyBvZiBnZW5lcmF0ZWQgdG9vbHRpcHMsIG5lZWRlZCBmb3IgZGVzdHJveQoJCXRoaXMudG9vbHRpcHMgPSB7fTsKCQkvLyBJRHMgb2YgcGFyZW50IHRvb2x0aXBzIHdoZXJlIHdlIHJlbW92ZWQgdGhlIHRpdGxlIGF0dHJpYnV0ZQoJCXRoaXMucGFyZW50cyA9IHt9OwoKCQlpZiAoIHRoaXMub3B0aW9ucy5kaXNhYmxlZCApIHsKCQkJdGhpcy5fZGlzYWJsZSgpOwoJCX0KCgkJLy8gQXBwZW5kIHRoZSBhcmlhLWxpdmUgcmVnaW9uIHNvIHRvb2x0aXBzIGFubm91bmNlIGNvcnJlY3RseQoJCXRoaXMubGl2ZVJlZ2lvbiA9ICQoICI8ZGl2PiIgKQoJCQkuYXR0cih7CgkJCQlyb2xlOiAibG9nIiwKCQkJCSJhcmlhLWxpdmUiOiAiYXNzZXJ0aXZlIiwKCQkJCSJhcmlhLXJlbGV2YW50IjogImFkZGl0aW9ucyIKCQkJfSkKCQkJLmFkZENsYXNzKCAidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiApCgkJCS5hcHBlbmRUbyggdGhpcy5kb2N1bWVudFsgMCBdLmJvZHkgKTsKCX0sCgoJX3NldE9wdGlvbjogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQlpZiAoIGtleSA9PT0gImRpc2FibGVkIiApIHsKCQkJdGhpc1sgdmFsdWUgPyAiX2Rpc2FibGUiIDogIl9lbmFibGUiIF0oKTsKCQkJdGhpcy5vcHRpb25zWyBrZXkgXSA9IHZhbHVlOwoJCQkvLyBkaXNhYmxlIGVsZW1lbnQgc3R5bGUgY2hhbmdlcwoJCQlyZXR1cm47CgkJfQoKCQl0aGlzLl9zdXBlcigga2V5LCB2YWx1ZSApOwoKCQlpZiAoIGtleSA9PT0gImNvbnRlbnQiICkgewoJCQkkLmVhY2goIHRoaXMudG9vbHRpcHMsIGZ1bmN0aW9uKCBpZCwgZWxlbWVudCApIHsKCQkJCXRoYXQuX3VwZGF0ZUNvbnRlbnQoIGVsZW1lbnQgKTsKCQkJfSk7CgkJfQoJfSwKCglfZGlzYWJsZTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQkvLyBjbG9zZSBvcGVuIHRvb2x0aXBzCgkJJC5lYWNoKCB0aGlzLnRvb2x0aXBzLCBmdW5jdGlvbiggaWQsIGVsZW1lbnQgKSB7CgkJCXZhciBldmVudCA9ICQuRXZlbnQoICJibHVyIiApOwoJCQlldmVudC50YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0ID0gZWxlbWVudFswXTsKCQkJdGhhdC5jbG9zZSggZXZlbnQsIHRydWUgKTsKCQl9KTsKCgkJLy8gcmVtb3ZlIHRpdGxlIGF0dHJpYnV0ZXMgdG8gcHJldmVudCBuYXRpdmUgdG9vbHRpcHMKCQl0aGlzLmVsZW1lbnQuZmluZCggdGhpcy5vcHRpb25zLml0ZW1zICkuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKSB7CgkJCXZhciBlbGVtZW50ID0gJCggdGhpcyApOwoJCQlpZiAoIGVsZW1lbnQuaXMoICJbdGl0bGVdIiApICkgewoJCQkJZWxlbWVudAoJCQkJCS5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIsIGVsZW1lbnQuYXR0ciggInRpdGxlIiApICkKCQkJCQkucmVtb3ZlQXR0ciggInRpdGxlIiApOwoJCQl9CgkJfSk7Cgl9LAoKCV9lbmFibGU6IGZ1bmN0aW9uKCkgewoJCS8vIHJlc3RvcmUgdGl0bGUgYXR0cmlidXRlcwoJCXRoaXMuZWxlbWVudC5maW5kKCB0aGlzLm9wdGlvbnMuaXRlbXMgKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJdmFyIGVsZW1lbnQgPSAkKCB0aGlzICk7CgkJCWlmICggZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApIHsKCQkJCWVsZW1lbnQuYXR0ciggInRpdGxlIiwgZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApOwoJCQl9CgkJfSk7Cgl9LAoKCW9wZW46IGZ1bmN0aW9uKCBldmVudCApIHsKCQl2YXIgdGhhdCA9IHRoaXMsCgkJCXRhcmdldCA9ICQoIGV2ZW50ID8gZXZlbnQudGFyZ2V0IDogdGhpcy5lbGVtZW50ICkKCQkJCS8vIHdlIG5lZWQgY2xvc2VzdCBoZXJlIGR1ZSB0byBtb3VzZW92ZXIgYnViYmxpbmcsCgkJCQkvLyBidXQgYWx3YXlzIHBvaW50aW5nIGF0IHRoZSBzYW1lIGV2ZW50IHRhcmdldAoJCQkJLmNsb3Nlc3QoIHRoaXMub3B0aW9ucy5pdGVtcyApOwoKCQkvLyBObyBlbGVtZW50IHRvIHNob3cgYSB0b29sdGlwIGZvciBvciB0aGUgdG9vbHRpcCBpcyBhbHJlYWR5IG9wZW4KCQlpZiAoICF0YXJnZXQubGVuZ3RoIHx8IHRhcmdldC5kYXRhKCAidWktdG9vbHRpcC1pZCIgKSApIHsKCQkJcmV0dXJuOwoJCX0KCgkJaWYgKCB0YXJnZXQuYXR0ciggInRpdGxlIiApICkgewoJCQl0YXJnZXQuZGF0YSggInVpLXRvb2x0aXAtdGl0bGUiLCB0YXJnZXQuYXR0ciggInRpdGxlIiApICk7CgkJfQoKCQl0YXJnZXQuZGF0YSggInVpLXRvb2x0aXAtb3BlbiIsIHRydWUgKTsKCgkJLy8ga2lsbCBwYXJlbnQgdG9vbHRpcHMsIGN1c3RvbSBvciBuYXRpdmUsIGZvciBob3ZlcgoJCWlmICggZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gIm1vdXNlb3ZlciIgKSB7CgkJCXRhcmdldC5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpIHsKCQkJCXZhciBwYXJlbnQgPSAkKCB0aGlzICksCgkJCQkJYmx1ckV2ZW50OwoJCQkJaWYgKCBwYXJlbnQuZGF0YSggInVpLXRvb2x0aXAtb3BlbiIgKSApIHsKCQkJCQlibHVyRXZlbnQgPSAkLkV2ZW50KCAiYmx1ciIgKTsKCQkJCQlibHVyRXZlbnQudGFyZ2V0ID0gYmx1ckV2ZW50LmN1cnJlbnRUYXJnZXQgPSB0aGlzOwoJCQkJCXRoYXQuY2xvc2UoIGJsdXJFdmVudCwgdHJ1ZSApOwoJCQkJfQoJCQkJaWYgKCBwYXJlbnQuYXR0ciggInRpdGxlIiApICkgewoJCQkJCXBhcmVudC51bmlxdWVJZCgpOwoJCQkJCXRoYXQucGFyZW50c1sgdGhpcy5pZCBdID0gewoJCQkJCQllbGVtZW50OiB0aGlzLAoJCQkJCQl0aXRsZTogcGFyZW50LmF0dHIoICJ0aXRsZSIgKQoJCQkJCX07CgkJCQkJcGFyZW50LmF0dHIoICJ0aXRsZSIsICIiICk7CgkJCQl9CgkJCX0pOwoJCX0KCgkJdGhpcy5fdXBkYXRlQ29udGVudCggdGFyZ2V0LCBldmVudCApOwoJfSwKCglfdXBkYXRlQ29udGVudDogZnVuY3Rpb24oIHRhcmdldCwgZXZlbnQgKSB7CgkJdmFyIGNvbnRlbnQsCgkJCWNvbnRlbnRPcHRpb24gPSB0aGlzLm9wdGlvbnMuY29udGVudCwKCQkJdGhhdCA9IHRoaXMsCgkJCWV2ZW50VHlwZSA9IGV2ZW50ID8gZXZlbnQudHlwZSA6IG51bGw7CgoJCWlmICggdHlwZW9mIGNvbnRlbnRPcHRpb24gPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5fb3BlbiggZXZlbnQsIHRhcmdldCwgY29udGVudE9wdGlvbiApOwoJCX0KCgkJY29udGVudCA9IGNvbnRlbnRPcHRpb24uY2FsbCggdGFyZ2V0WzBdLCBmdW5jdGlvbiggcmVzcG9uc2UgKSB7CgkJCS8vIGlnbm9yZSBhc3luYyByZXNwb25zZSBpZiB0b29sdGlwIHdhcyBjbG9zZWQgYWxyZWFkeQoJCQlpZiAoICF0YXJnZXQuZGF0YSggInVpLXRvb2x0aXAtb3BlbiIgKSApIHsKCQkJCXJldHVybjsKCQkJfQoJCQkvLyBJRSBtYXkgaW5zdGFudGx5IHNlcnZlIGEgY2FjaGVkIHJlc3BvbnNlIGZvciBhamF4IHJlcXVlc3RzCgkJCS8vIGRlbGF5IHRoaXMgY2FsbCB0byBfb3BlbiBzbyB0aGUgb3RoZXIgY2FsbCB0byBfb3BlbiBydW5zIGZpcnN0CgkJCXRoYXQuX2RlbGF5KGZ1bmN0aW9uKCkgewoJCQkJLy8galF1ZXJ5IGNyZWF0ZXMgYSBzcGVjaWFsIGV2ZW50IGZvciBmb2N1c2luIHdoZW4gaXQgZG9lc24ndAoJCQkJLy8gZXhpc3QgbmF0aXZlbHkuIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHRoZSBuYXRpdmUgZXZlbnQKCQkJCS8vIG9iamVjdCBpcyByZXVzZWQgYW5kIHRoZSB0eXBlIGlzIGNoYW5nZWQuIFRoZXJlZm9yZSwgd2UgY2FuJ3QKCQkJCS8vIHJlbHkgb24gdGhlIHR5cGUgYmVpbmcgY29ycmVjdCBhZnRlciB0aGUgZXZlbnQgZmluaXNoZWQKCQkJCS8vIGJ1YmJsaW5nLCBzbyB3ZSBzZXQgaXQgYmFjayB0byB0aGUgcHJldmlvdXMgdmFsdWUuICgjODc0MCkKCQkJCWlmICggZXZlbnQgKSB7CgkJCQkJZXZlbnQudHlwZSA9IGV2ZW50VHlwZTsKCQkJCX0KCQkJCXRoaXMuX29wZW4oIGV2ZW50LCB0YXJnZXQsIHJlc3BvbnNlICk7CgkJCX0pOwoJCX0pOwoJCWlmICggY29udGVudCApIHsKCQkJdGhpcy5fb3BlbiggZXZlbnQsIHRhcmdldCwgY29udGVudCApOwoJCX0KCX0sCgoJX29wZW46IGZ1bmN0aW9uKCBldmVudCwgdGFyZ2V0LCBjb250ZW50ICkgewoJCXZhciB0b29sdGlwLCBldmVudHMsIGRlbGF5ZWRTaG93LCBhMTF5Q29udGVudCwKCQkJcG9zaXRpb25PcHRpb24gPSAkLmV4dGVuZCgge30sIHRoaXMub3B0aW9ucy5wb3NpdGlvbiApOwoKCQlpZiAoICFjb250ZW50ICkgewoJCQlyZXR1cm47CgkJfQoKCQkvLyBDb250ZW50IGNhbiBiZSB1cGRhdGVkIG11bHRpcGxlIHRpbWVzLiBJZiB0aGUgdG9vbHRpcCBhbHJlYWR5CgkJLy8gZXhpc3RzLCB0aGVuIGp1c3QgdXBkYXRlIHRoZSBjb250ZW50IGFuZCBiYWlsLgoJCXRvb2x0aXAgPSB0aGlzLl9maW5kKCB0YXJnZXQgKTsKCQlpZiAoIHRvb2x0aXAubGVuZ3RoICkgewoJCQl0b29sdGlwLmZpbmQoICIudWktdG9vbHRpcC1jb250ZW50IiApLmh0bWwoIGNvbnRlbnQgKTsKCQkJcmV0dXJuOwoJCX0KCgkJLy8gaWYgd2UgaGF2ZSBhIHRpdGxlLCBjbGVhciBpdCB0byBwcmV2ZW50IHRoZSBuYXRpdmUgdG9vbHRpcAoJCS8vIHdlIGhhdmUgdG8gY2hlY2sgZmlyc3QgdG8gYXZvaWQgZGVmaW5pbmcgYSB0aXRsZSBpZiBub25lIGV4aXN0cwoJCS8vICh3ZSBkb24ndCB3YW50IHRvIGNhdXNlIGFuIGVsZW1lbnQgdG8gc3RhcnQgbWF0Y2hpbmcgW3RpdGxlXSkKCQkvLwoJCS8vIFdlIHVzZSByZW1vdmVBdHRyIG9ubHkgZm9yIGtleSBldmVudHMsIHRvIGFsbG93IElFIHRvIGV4cG9ydCB0aGUgY29ycmVjdAoJCS8vIGFjY2Vzc2libGUgYXR0cmlidXRlcy4gRm9yIG1vdXNlIGV2ZW50cywgc2V0IHRvIGVtcHR5IHN0cmluZyB0byBhdm9pZAoJCS8vIG5hdGl2ZSB0b29sdGlwIHNob3dpbmcgdXAgKGhhcHBlbnMgb25seSB3aGVuIHJlbW92aW5nIGluc2lkZSBtb3VzZW92ZXIpLgoJCWlmICggdGFyZ2V0LmlzKCAiW3RpdGxlXSIgKSApIHsKCQkJaWYgKCBldmVudCAmJiBldmVudC50eXBlID09PSAibW91c2VvdmVyIiApIHsKCQkJCXRhcmdldC5hdHRyKCAidGl0bGUiLCAiIiApOwoJCQl9IGVsc2UgewoJCQkJdGFyZ2V0LnJlbW92ZUF0dHIoICJ0aXRsZSIgKTsKCQkJfQoJCX0KCgkJdG9vbHRpcCA9IHRoaXMuX3Rvb2x0aXAoIHRhcmdldCApOwoJCXRoaXMuX2FkZERlc2NyaWJlZEJ5KCB0YXJnZXQsIHRvb2x0aXAuYXR0ciggImlkIiApICk7CgkJdG9vbHRpcC5maW5kKCAiLnVpLXRvb2x0aXAtY29udGVudCIgKS5odG1sKCBjb250ZW50ICk7CgoJCS8vIFN1cHBvcnQ6IFZvaWNlb3ZlciBvbiBPUyBYLCBKQVdTIG9uIElFIDw9IDkKCQkvLyBKQVdTIGFubm91bmNlcyBkZWxldGlvbnMgZXZlbiB3aGVuIGFyaWEtcmVsZXZhbnQ9ImFkZGl0aW9ucyIKCQkvLyBWb2ljZW92ZXIgd2lsbCBzb21ldGltZXMgcmUtcmVhZCB0aGUgZW50aXJlIGxvZyByZWdpb24ncyBjb250ZW50cyBmcm9tIHRoZSBiZWdpbm5pbmcKCQl0aGlzLmxpdmVSZWdpb24uY2hpbGRyZW4oKS5oaWRlKCk7CgkJaWYgKCBjb250ZW50LmNsb25lICkgewoJCQlhMTF5Q29udGVudCA9IGNvbnRlbnQuY2xvbmUoKTsKCQkJYTExeUNvbnRlbnQucmVtb3ZlQXR0ciggImlkIiApLmZpbmQoICJbaWRdIiApLnJlbW92ZUF0dHIoICJpZCIgKTsKCQl9IGVsc2UgewoJCQlhMTF5Q29udGVudCA9IGNvbnRlbnQ7CgkJfQoJCSQoICI8ZGl2PiIgKS5odG1sKCBhMTF5Q29udGVudCApLmFwcGVuZFRvKCB0aGlzLmxpdmVSZWdpb24gKTsKCgkJZnVuY3Rpb24gcG9zaXRpb24oIGV2ZW50ICkgewoJCQlwb3NpdGlvbk9wdGlvbi5vZiA9IGV2ZW50OwoJCQlpZiAoIHRvb2x0aXAuaXMoICI6aGlkZGVuIiApICkgewoJCQkJcmV0dXJuOwoJCQl9CgkJCXRvb2x0aXAucG9zaXRpb24oIHBvc2l0aW9uT3B0aW9uICk7CgkJfQoJCWlmICggdGhpcy5vcHRpb25zLnRyYWNrICYmIGV2ZW50ICYmIC9ebW91c2UvLnRlc3QoIGV2ZW50LnR5cGUgKSApIHsKCQkJdGhpcy5fb24oIHRoaXMuZG9jdW1lbnQsIHsKCQkJCW1vdXNlbW92ZTogcG9zaXRpb24KCQkJfSk7CgkJCS8vIHRyaWdnZXIgb25jZSB0byBvdmVycmlkZSBlbGVtZW50LXJlbGF0aXZlIHBvc2l0aW9uaW5nCgkJCXBvc2l0aW9uKCBldmVudCApOwoJCX0gZWxzZSB7CgkJCXRvb2x0aXAucG9zaXRpb24oICQuZXh0ZW5kKHsKCQkJCW9mOiB0YXJnZXQKCQkJfSwgdGhpcy5vcHRpb25zLnBvc2l0aW9uICkgKTsKCQl9CgoJCXRvb2x0aXAuaGlkZSgpOwoKCQl0aGlzLl9zaG93KCB0b29sdGlwLCB0aGlzLm9wdGlvbnMuc2hvdyApOwoJCS8vIEhhbmRsZSB0cmFja2luZyB0b29sdGlwcyB0aGF0IGFyZSBzaG93biB3aXRoIGEgZGVsYXkgKCM4NjQ0KS4gQXMgc29vbgoJCS8vIGFzIHRoZSB0b29sdGlwIGlzIHZpc2libGUsIHBvc2l0aW9uIHRoZSB0b29sdGlwIHVzaW5nIHRoZSBtb3N0IHJlY2VudAoJCS8vIGV2ZW50LgoJCWlmICggdGhpcy5vcHRpb25zLnNob3cgJiYgdGhpcy5vcHRpb25zLnNob3cuZGVsYXkgKSB7CgkJCWRlbGF5ZWRTaG93ID0gdGhpcy5kZWxheWVkU2hvdyA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewoJCQkJaWYgKCB0b29sdGlwLmlzKCAiOnZpc2libGUiICkgKSB7CgkJCQkJcG9zaXRpb24oIHBvc2l0aW9uT3B0aW9uLm9mICk7CgkJCQkJY2xlYXJJbnRlcnZhbCggZGVsYXllZFNob3cgKTsKCQkJCX0KCQkJfSwgJC5meC5pbnRlcnZhbCApOwoJCX0KCgkJdGhpcy5fdHJpZ2dlciggIm9wZW4iLCBldmVudCwgeyB0b29sdGlwOiB0b29sdGlwIH0gKTsKCgkJZXZlbnRzID0gewoJCQlrZXl1cDogZnVuY3Rpb24oIGV2ZW50ICkgewoJCQkJaWYgKCBldmVudC5rZXlDb2RlID09PSAkLnVpLmtleUNvZGUuRVNDQVBFICkgewoJCQkJCXZhciBmYWtlRXZlbnQgPSAkLkV2ZW50KGV2ZW50KTsKCQkJCQlmYWtlRXZlbnQuY3VycmVudFRhcmdldCA9IHRhcmdldFswXTsKCQkJCQl0aGlzLmNsb3NlKCBmYWtlRXZlbnQsIHRydWUgKTsKCQkJCX0KCQkJfQoJCX07CgoJCS8vIE9ubHkgYmluZCByZW1vdmUgaGFuZGxlciBmb3IgZGVsZWdhdGVkIHRhcmdldHMuIE5vbi1kZWxlZ2F0ZWQKCQkvLyB0b29sdGlwcyB3aWxsIGhhbmRsZSB0aGlzIGluIGRlc3Ryb3kuCgkJaWYgKCB0YXJnZXRbIDAgXSAhPT0gdGhpcy5lbGVtZW50WyAwIF0gKSB7CgkJCWV2ZW50cy5yZW1vdmUgPSBmdW5jdGlvbigpIHsKCQkJCXRoaXMuX3JlbW92ZVRvb2x0aXAoIHRvb2x0aXAgKTsKCQkJfTsKCQl9CgoJCWlmICggIWV2ZW50IHx8IGV2ZW50LnR5cGUgPT09ICJtb3VzZW92ZXIiICkgewoJCQlldmVudHMubW91c2VsZWF2ZSA9ICJjbG9zZSI7CgkJfQoJCWlmICggIWV2ZW50IHx8IGV2ZW50LnR5cGUgPT09ICJmb2N1c2luIiApIHsKCQkJZXZlbnRzLmZvY3Vzb3V0ID0gImNsb3NlIjsKCQl9CgkJdGhpcy5fb24oIHRydWUsIHRhcmdldCwgZXZlbnRzICk7Cgl9LAoKCWNsb3NlOiBmdW5jdGlvbiggZXZlbnQgKSB7CgkJdmFyIHRoYXQgPSB0aGlzLAoJCQl0YXJnZXQgPSAkKCBldmVudCA/IGV2ZW50LmN1cnJlbnRUYXJnZXQgOiB0aGlzLmVsZW1lbnQgKSwKCQkJdG9vbHRpcCA9IHRoaXMuX2ZpbmQoIHRhcmdldCApOwoKCQkvLyBkaXNhYmxpbmcgY2xvc2VzIHRoZSB0b29sdGlwLCBzbyB3ZSBuZWVkIHRvIHRyYWNrIHdoZW4gd2UncmUgY2xvc2luZwoJCS8vIHRvIGF2b2lkIGFuIGluZmluaXRlIGxvb3AgaW4gY2FzZSB0aGUgdG9vbHRpcCBiZWNvbWVzIGRpc2FibGVkIG9uIGNsb3NlCgkJaWYgKCB0aGlzLmNsb3NpbmcgKSB7CgkJCXJldHVybjsKCQl9CgoJCS8vIENsZWFyIHRoZSBpbnRlcnZhbCBmb3IgZGVsYXllZCB0cmFja2luZyB0b29sdGlwcwoJCWNsZWFySW50ZXJ2YWwoIHRoaXMuZGVsYXllZFNob3cgKTsKCgkJLy8gb25seSBzZXQgdGl0bGUgaWYgd2UgaGFkIG9uZSBiZWZvcmUgKHNlZSBjb21tZW50IGluIF9vcGVuKCkpCgkJLy8gSWYgdGhlIHRpdGxlIGF0dHJpYnV0ZSBoYXMgY2hhbmdlZCBzaW5jZSBvcGVuKCksIGRvbid0IHJlc3RvcmUKCQlpZiAoIHRhcmdldC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSAmJiAhdGFyZ2V0LmF0dHIoICJ0aXRsZSIgKSApIHsKCQkJdGFyZ2V0LmF0dHIoICJ0aXRsZSIsIHRhcmdldC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApOwoJCX0KCgkJdGhpcy5fcmVtb3ZlRGVzY3JpYmVkQnkoIHRhcmdldCApOwoKCQl0b29sdGlwLnN0b3AoIHRydWUgKTsKCQl0aGlzLl9oaWRlKCB0b29sdGlwLCB0aGlzLm9wdGlvbnMuaGlkZSwgZnVuY3Rpb24oKSB7CgkJCXRoYXQuX3JlbW92ZVRvb2x0aXAoICQoIHRoaXMgKSApOwoJCX0pOwoKCQl0YXJnZXQucmVtb3ZlRGF0YSggInVpLXRvb2x0aXAtb3BlbiIgKTsKCQl0aGlzLl9vZmYoIHRhcmdldCwgIm1vdXNlbGVhdmUgZm9jdXNvdXQga2V5dXAiICk7CgoJCS8vIFJlbW92ZSAncmVtb3ZlJyBiaW5kaW5nIG9ubHkgb24gZGVsZWdhdGVkIHRhcmdldHMKCQlpZiAoIHRhcmdldFsgMCBdICE9PSB0aGlzLmVsZW1lbnRbIDAgXSApIHsKCQkJdGhpcy5fb2ZmKCB0YXJnZXQsICJyZW1vdmUiICk7CgkJfQoJCXRoaXMuX29mZiggdGhpcy5kb2N1bWVudCwgIm1vdXNlbW92ZSIgKTsKCgkJaWYgKCBldmVudCAmJiBldmVudC50eXBlID09PSAibW91c2VsZWF2ZSIgKSB7CgkJCSQuZWFjaCggdGhpcy5wYXJlbnRzLCBmdW5jdGlvbiggaWQsIHBhcmVudCApIHsKCQkJCSQoIHBhcmVudC5lbGVtZW50ICkuYXR0ciggInRpdGxlIiwgcGFyZW50LnRpdGxlICk7CgkJCQlkZWxldGUgdGhhdC5wYXJlbnRzWyBpZCBdOwoJCQl9KTsKCQl9CgoJCXRoaXMuY2xvc2luZyA9IHRydWU7CgkJdGhpcy5fdHJpZ2dlciggImNsb3NlIiwgZXZlbnQsIHsgdG9vbHRpcDogdG9vbHRpcCB9ICk7CgkJdGhpcy5jbG9zaW5nID0gZmFsc2U7Cgl9LAoKCV90b29sdGlwOiBmdW5jdGlvbiggZWxlbWVudCApIHsKCQl2YXIgdG9vbHRpcCA9ICQoICI8ZGl2PiIgKQoJCQkJLmF0dHIoICJyb2xlIiwgInRvb2x0aXAiICkKCQkJCS5hZGRDbGFzcyggInVpLXRvb2x0aXAgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwgdWktd2lkZ2V0LWNvbnRlbnQgIiArCgkJCQkJKCB0aGlzLm9wdGlvbnMudG9vbHRpcENsYXNzIHx8ICIiICkgKSwKCQkJaWQgPSB0b29sdGlwLnVuaXF1ZUlkKCkuYXR0ciggImlkIiApOwoKCQkkKCAiPGRpdj4iICkKCQkJLmFkZENsYXNzKCAidWktdG9vbHRpcC1jb250ZW50IiApCgkJCS5hcHBlbmRUbyggdG9vbHRpcCApOwoKCQl0b29sdGlwLmFwcGVuZFRvKCB0aGlzLmRvY3VtZW50WzBdLmJvZHkgKTsKCQl0aGlzLnRvb2x0aXBzWyBpZCBdID0gZWxlbWVudDsKCQlyZXR1cm4gdG9vbHRpcDsKCX0sCgoJX2ZpbmQ6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7CgkJdmFyIGlkID0gdGFyZ2V0LmRhdGEoICJ1aS10b29sdGlwLWlkIiApOwoJCXJldHVybiBpZCA/ICQoICIjIiArIGlkICkgOiAkKCk7Cgl9LAoKCV9yZW1vdmVUb29sdGlwOiBmdW5jdGlvbiggdG9vbHRpcCApIHsKCQl0b29sdGlwLnJlbW92ZSgpOwoJCWRlbGV0ZSB0aGlzLnRvb2x0aXBzWyB0b29sdGlwLmF0dHIoICJpZCIgKSBdOwoJfSwKCglfZGVzdHJveTogZnVuY3Rpb24oKSB7CgkJdmFyIHRoYXQgPSB0aGlzOwoKCQkvLyBjbG9zZSBvcGVuIHRvb2x0aXBzCgkJJC5lYWNoKCB0aGlzLnRvb2x0aXBzLCBmdW5jdGlvbiggaWQsIGVsZW1lbnQgKSB7CgkJCS8vIERlbGVnYXRlIHRvIGNsb3NlIG1ldGhvZCB0byBoYW5kbGUgY29tbW9uIGNsZWFudXAKCQkJdmFyIGV2ZW50ID0gJC5FdmVudCggImJsdXIiICk7CgkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBlbGVtZW50WzBdOwoJCQl0aGF0LmNsb3NlKCBldmVudCwgdHJ1ZSApOwoKCQkJLy8gUmVtb3ZlIGltbWVkaWF0ZWx5OyBkZXN0cm95aW5nIGFuIG9wZW4gdG9vbHRpcCBkb2Vzbid0IHVzZSB0aGUKCQkJLy8gaGlkZSBhbmltYXRpb24KCQkJJCggIiMiICsgaWQgKS5yZW1vdmUoKTsKCgkJCS8vIFJlc3RvcmUgdGhlIHRpdGxlCgkJCWlmICggZWxlbWVudC5kYXRhKCAidWktdG9vbHRpcC10aXRsZSIgKSApIHsKCQkJCS8vIElmIHRoZSB0aXRsZSBhdHRyaWJ1dGUgaGFzIGNoYW5nZWQgc2luY2Ugb3BlbigpLCBkb24ndCByZXN0b3JlCgkJCQlpZiAoICFlbGVtZW50LmF0dHIoICJ0aXRsZSIgKSApIHsKCQkJCQllbGVtZW50LmF0dHIoICJ0aXRsZSIsIGVsZW1lbnQuZGF0YSggInVpLXRvb2x0aXAtdGl0bGUiICkgKTsKCQkJCX0KCQkJCWVsZW1lbnQucmVtb3ZlRGF0YSggInVpLXRvb2x0aXAtdGl0bGUiICk7CgkJCX0KCQl9KTsKCQl0aGlzLmxpdmVSZWdpb24ucmVtb3ZlKCk7Cgl9Cn0pOwoKCi8qIQogKiBqUXVlcnkgVUkgRWZmZWN0cyAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9jYXRlZ29yeS9lZmZlY3RzLWNvcmUvCiAqLwoKCnZhciBkYXRhU3BhY2UgPSAidWktZWZmZWN0cy0iOwoKJC5lZmZlY3RzID0gewoJZWZmZWN0OiB7fQp9OwoKLyohCiAqIGpRdWVyeSBDb2xvciBBbmltYXRpb25zIHYyLjEuMgogKiBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS1jb2xvcgogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBEYXRlOiBXZWQgSmFuIDE2IDA4OjQ3OjA5IDIwMTMgLTA2MDAKICovCihmdW5jdGlvbiggalF1ZXJ5LCB1bmRlZmluZWQgKSB7CgoJdmFyIHN0ZXBIb29rcyA9ICJiYWNrZ3JvdW5kQ29sb3IgYm9yZGVyQm90dG9tQ29sb3IgYm9yZGVyTGVmdENvbG9yIGJvcmRlclJpZ2h0Q29sb3IgYm9yZGVyVG9wQ29sb3IgY29sb3IgY29sdW1uUnVsZUNvbG9yIG91dGxpbmVDb2xvciB0ZXh0RGVjb3JhdGlvbkNvbG9yIHRleHRFbXBoYXNpc0NvbG9yIiwKCgkvLyBwbHVzZXF1YWxzIHRlc3QgZm9yICs9IDEwMCAtPSAxMDAKCXJwbHVzZXF1YWxzID0gL14oW1wtK10pPVxzKihcZCtcLj9cZCopLywKCS8vIGEgc2V0IG9mIFJFJ3MgdGhhdCBjYW4gbWF0Y2ggc3RyaW5ncyBhbmQgZ2VuZXJhdGUgY29sb3IgdHVwbGVzLgoJc3RyaW5nUGFyc2VycyA9IFsgewoJCQlyZTogL3JnYmE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLywKCQkJcGFyc2U6IGZ1bmN0aW9uKCBleGVjUmVzdWx0ICkgewoJCQkJcmV0dXJuIFsKCQkJCQlleGVjUmVzdWx0WyAxIF0sCgkJCQkJZXhlY1Jlc3VsdFsgMiBdLAoJCQkJCWV4ZWNSZXN1bHRbIDMgXSwKCQkJCQlleGVjUmVzdWx0WyA0IF0KCQkJCV07CgkJCX0KCQl9LCB7CgkJCXJlOiAvcmdiYT9cKFxzKihcZCsoPzpcLlxkKyk/KVwlXHMqLFxzKihcZCsoPzpcLlxkKyk/KVwlXHMqLFxzKihcZCsoPzpcLlxkKyk/KVwlXHMqKD86LFxzKihcZD8oPzpcLlxkKyk/KVxzKik/XCkvLAoJCQlwYXJzZTogZnVuY3Rpb24oIGV4ZWNSZXN1bHQgKSB7CgkJCQlyZXR1cm4gWwoJCQkJCWV4ZWNSZXN1bHRbIDEgXSAqIDIuNTUsCgkJCQkJZXhlY1Jlc3VsdFsgMiBdICogMi41NSwKCQkJCQlleGVjUmVzdWx0WyAzIF0gKiAyLjU1LAoJCQkJCWV4ZWNSZXN1bHRbIDQgXQoJCQkJXTsKCQkJfQoJCX0sIHsKCQkJLy8gdGhpcyByZWdleCBpZ25vcmVzIEEtRiBiZWNhdXNlIGl0J3MgY29tcGFyZWQgYWdhaW5zdCBhbiBhbHJlYWR5IGxvd2VyY2FzZWQgc3RyaW5nCgkJCXJlOiAvIyhbYS1mMC05XXsyfSkoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KS8sCgkJCXBhcnNlOiBmdW5jdGlvbiggZXhlY1Jlc3VsdCApIHsKCQkJCXJldHVybiBbCgkJCQkJcGFyc2VJbnQoIGV4ZWNSZXN1bHRbIDEgXSwgMTYgKSwKCQkJCQlwYXJzZUludCggZXhlY1Jlc3VsdFsgMiBdLCAxNiApLAoJCQkJCXBhcnNlSW50KCBleGVjUmVzdWx0WyAzIF0sIDE2ICkKCQkJCV07CgkJCX0KCQl9LCB7CgkJCS8vIHRoaXMgcmVnZXggaWdub3JlcyBBLUYgYmVjYXVzZSBpdCdzIGNvbXBhcmVkIGFnYWluc3QgYW4gYWxyZWFkeSBsb3dlcmNhc2VkIHN0cmluZwoJCQlyZTogLyMoW2EtZjAtOV0pKFthLWYwLTldKShbYS1mMC05XSkvLAoJCQlwYXJzZTogZnVuY3Rpb24oIGV4ZWNSZXN1bHQgKSB7CgkJCQlyZXR1cm4gWwoJCQkJCXBhcnNlSW50KCBleGVjUmVzdWx0WyAxIF0gKyBleGVjUmVzdWx0WyAxIF0sIDE2ICksCgkJCQkJcGFyc2VJbnQoIGV4ZWNSZXN1bHRbIDIgXSArIGV4ZWNSZXN1bHRbIDIgXSwgMTYgKSwKCQkJCQlwYXJzZUludCggZXhlY1Jlc3VsdFsgMyBdICsgZXhlY1Jlc3VsdFsgMyBdLCAxNiApCgkJCQldOwoJCQl9CgkJfSwgewoJCQlyZTogL2hzbGE/XChccyooXGQrKD86XC5cZCspPylccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8sCgkJCXNwYWNlOiAiaHNsYSIsCgkJCXBhcnNlOiBmdW5jdGlvbiggZXhlY1Jlc3VsdCApIHsKCQkJCXJldHVybiBbCgkJCQkJZXhlY1Jlc3VsdFsgMSBdLAoJCQkJCWV4ZWNSZXN1bHRbIDIgXSAvIDEwMCwKCQkJCQlleGVjUmVzdWx0WyAzIF0gLyAxMDAsCgkJCQkJZXhlY1Jlc3VsdFsgNCBdCgkJCQldOwoJCQl9CgkJfSBdLAoKCS8vIGpRdWVyeS5Db2xvciggKQoJY29sb3IgPSBqUXVlcnkuQ29sb3IgPSBmdW5jdGlvbiggY29sb3IsIGdyZWVuLCBibHVlLCBhbHBoYSApIHsKCQlyZXR1cm4gbmV3IGpRdWVyeS5Db2xvci5mbi5wYXJzZSggY29sb3IsIGdyZWVuLCBibHVlLCBhbHBoYSApOwoJfSwKCXNwYWNlcyA9IHsKCQlyZ2JhOiB7CgkJCXByb3BzOiB7CgkJCQlyZWQ6IHsKCQkJCQlpZHg6IDAsCgkJCQkJdHlwZTogImJ5dGUiCgkJCQl9LAoJCQkJZ3JlZW46IHsKCQkJCQlpZHg6IDEsCgkJCQkJdHlwZTogImJ5dGUiCgkJCQl9LAoJCQkJYmx1ZTogewoJCQkJCWlkeDogMiwKCQkJCQl0eXBlOiAiYnl0ZSIKCQkJCX0KCQkJfQoJCX0sCgoJCWhzbGE6IHsKCQkJcHJvcHM6IHsKCQkJCWh1ZTogewoJCQkJCWlkeDogMCwKCQkJCQl0eXBlOiAiZGVncmVlcyIKCQkJCX0sCgkJCQlzYXR1cmF0aW9uOiB7CgkJCQkJaWR4OiAxLAoJCQkJCXR5cGU6ICJwZXJjZW50IgoJCQkJfSwKCQkJCWxpZ2h0bmVzczogewoJCQkJCWlkeDogMiwKCQkJCQl0eXBlOiAicGVyY2VudCIKCQkJCX0KCQkJfQoJCX0KCX0sCglwcm9wVHlwZXMgPSB7CgkJImJ5dGUiOiB7CgkJCWZsb29yOiB0cnVlLAoJCQltYXg6IDI1NQoJCX0sCgkJInBlcmNlbnQiOiB7CgkJCW1heDogMQoJCX0sCgkJImRlZ3JlZXMiOiB7CgkJCW1vZDogMzYwLAoJCQlmbG9vcjogdHJ1ZQoJCX0KCX0sCglzdXBwb3J0ID0gY29sb3Iuc3VwcG9ydCA9IHt9LAoKCS8vIGVsZW1lbnQgZm9yIHN1cHBvcnQgdGVzdHMKCXN1cHBvcnRFbGVtID0galF1ZXJ5KCAiPHA+IiApWyAwIF0sCgoJLy8gY29sb3JzID0galF1ZXJ5LkNvbG9yLm5hbWVzCgljb2xvcnMsCgoJLy8gbG9jYWwgYWxpYXNlcyBvZiBmdW5jdGlvbnMgY2FsbGVkIG9mdGVuCgllYWNoID0galF1ZXJ5LmVhY2g7CgovLyBkZXRlcm1pbmUgcmdiYSBzdXBwb3J0IGltbWVkaWF0ZWx5CnN1cHBvcnRFbGVtLnN0eWxlLmNzc1RleHQgPSAiYmFja2dyb3VuZC1jb2xvcjpyZ2JhKDEsMSwxLC41KSI7CnN1cHBvcnQucmdiYSA9IHN1cHBvcnRFbGVtLnN0eWxlLmJhY2tncm91bmRDb2xvci5pbmRleE9mKCAicmdiYSIgKSA+IC0xOwoKLy8gZGVmaW5lIGNhY2hlIG5hbWUgYW5kIGFscGhhIHByb3BlcnRpZXMKLy8gZm9yIHJnYmEgYW5kIGhzbGEgc3BhY2VzCmVhY2goIHNwYWNlcywgZnVuY3Rpb24oIHNwYWNlTmFtZSwgc3BhY2UgKSB7CglzcGFjZS5jYWNoZSA9ICJfIiArIHNwYWNlTmFtZTsKCXNwYWNlLnByb3BzLmFscGhhID0gewoJCWlkeDogMywKCQl0eXBlOiAicGVyY2VudCIsCgkJZGVmOiAxCgl9Owp9KTsKCmZ1bmN0aW9uIGNsYW1wKCB2YWx1ZSwgcHJvcCwgYWxsb3dFbXB0eSApIHsKCXZhciB0eXBlID0gcHJvcFR5cGVzWyBwcm9wLnR5cGUgXSB8fCB7fTsKCglpZiAoIHZhbHVlID09IG51bGwgKSB7CgkJcmV0dXJuIChhbGxvd0VtcHR5IHx8ICFwcm9wLmRlZikgPyBudWxsIDogcHJvcC5kZWY7Cgl9CgoJLy8gfn4gaXMgYW4gc2hvcnQgd2F5IG9mIGRvaW5nIGZsb29yIGZvciBwb3NpdGl2ZSBudW1iZXJzCgl2YWx1ZSA9IHR5cGUuZmxvb3IgPyB+fnZhbHVlIDogcGFyc2VGbG9hdCggdmFsdWUgKTsKCgkvLyBJRSB3aWxsIHBhc3MgaW4gZW1wdHkgc3RyaW5ncyBhcyB2YWx1ZSBmb3IgYWxwaGEsCgkvLyB3aGljaCB3aWxsIGhpdCB0aGlzIGNhc2UKCWlmICggaXNOYU4oIHZhbHVlICkgKSB7CgkJcmV0dXJuIHByb3AuZGVmOwoJfQoKCWlmICggdHlwZS5tb2QgKSB7CgkJLy8gd2UgYWRkIG1vZCBiZWZvcmUgbW9kZGluZyB0byBtYWtlIHN1cmUgdGhhdCBuZWdhdGl2ZXMgdmFsdWVzCgkJLy8gZ2V0IGNvbnZlcnRlZCBwcm9wZXJseTogLTEwIC0+IDM1MAoJCXJldHVybiAodmFsdWUgKyB0eXBlLm1vZCkgJSB0eXBlLm1vZDsKCX0KCgkvLyBmb3Igbm93IGFsbCBwcm9wZXJ0eSB0eXBlcyB3aXRob3V0IG1vZCBoYXZlIG1pbiBhbmQgbWF4CglyZXR1cm4gMCA+IHZhbHVlID8gMCA6IHR5cGUubWF4IDwgdmFsdWUgPyB0eXBlLm1heCA6IHZhbHVlOwp9CgpmdW5jdGlvbiBzdHJpbmdQYXJzZSggc3RyaW5nICkgewoJdmFyIGluc3QgPSBjb2xvcigpLAoJCXJnYmEgPSBpbnN0Ll9yZ2JhID0gW107CgoJc3RyaW5nID0gc3RyaW5nLnRvTG93ZXJDYXNlKCk7CgoJZWFjaCggc3RyaW5nUGFyc2VycywgZnVuY3Rpb24oIGksIHBhcnNlciApIHsKCQl2YXIgcGFyc2VkLAoJCQltYXRjaCA9IHBhcnNlci5yZS5leGVjKCBzdHJpbmcgKSwKCQkJdmFsdWVzID0gbWF0Y2ggJiYgcGFyc2VyLnBhcnNlKCBtYXRjaCApLAoJCQlzcGFjZU5hbWUgPSBwYXJzZXIuc3BhY2UgfHwgInJnYmEiOwoKCQlpZiAoIHZhbHVlcyApIHsKCQkJcGFyc2VkID0gaW5zdFsgc3BhY2VOYW1lIF0oIHZhbHVlcyApOwoKCQkJLy8gaWYgdGhpcyB3YXMgYW4gcmdiYSBwYXJzZSB0aGUgYXNzaWdubWVudCBtaWdodCBoYXBwZW4gdHdpY2UKCQkJLy8gb2ggd2VsbC4uLi4KCQkJaW5zdFsgc3BhY2VzWyBzcGFjZU5hbWUgXS5jYWNoZSBdID0gcGFyc2VkWyBzcGFjZXNbIHNwYWNlTmFtZSBdLmNhY2hlIF07CgkJCXJnYmEgPSBpbnN0Ll9yZ2JhID0gcGFyc2VkLl9yZ2JhOwoKCQkJLy8gZXhpdCBlYWNoKCBzdHJpbmdQYXJzZXJzICkgaGVyZSBiZWNhdXNlIHdlIG1hdGNoZWQKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCX0pOwoKCS8vIEZvdW5kIGEgc3RyaW5nUGFyc2VyIHRoYXQgaGFuZGxlZCBpdAoJaWYgKCByZ2JhLmxlbmd0aCApIHsKCgkJLy8gaWYgdGhpcyBjYW1lIGZyb20gYSBwYXJzZWQgc3RyaW5nLCBmb3JjZSAidHJhbnNwYXJlbnQiIHdoZW4gYWxwaGEgaXMgMAoJCS8vIGNocm9tZSwgKGFuZCBtYXliZSBvdGhlcnMpIHJldHVybiAidHJhbnNwYXJlbnQiIGFzIHJnYmEoMCwwLDAsMCkKCQlpZiAoIHJnYmEuam9pbigpID09PSAiMCwwLDAsMCIgKSB7CgkJCWpRdWVyeS5leHRlbmQoIHJnYmEsIGNvbG9ycy50cmFuc3BhcmVudCApOwoJCX0KCQlyZXR1cm4gaW5zdDsKCX0KCgkvLyBuYW1lZCBjb2xvcnMKCXJldHVybiBjb2xvcnNbIHN0cmluZyBdOwp9Cgpjb2xvci5mbiA9IGpRdWVyeS5leHRlbmQoIGNvbG9yLnByb3RvdHlwZSwgewoJcGFyc2U6IGZ1bmN0aW9uKCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSApIHsKCQlpZiAoIHJlZCA9PT0gdW5kZWZpbmVkICkgewoJCQl0aGlzLl9yZ2JhID0gWyBudWxsLCBudWxsLCBudWxsLCBudWxsIF07CgkJCXJldHVybiB0aGlzOwoJCX0KCQlpZiAoIHJlZC5qcXVlcnkgfHwgcmVkLm5vZGVUeXBlICkgewoJCQlyZWQgPSBqUXVlcnkoIHJlZCApLmNzcyggZ3JlZW4gKTsKCQkJZ3JlZW4gPSB1bmRlZmluZWQ7CgkJfQoKCQl2YXIgaW5zdCA9IHRoaXMsCgkJCXR5cGUgPSBqUXVlcnkudHlwZSggcmVkICksCgkJCXJnYmEgPSB0aGlzLl9yZ2JhID0gW107CgoJCS8vIG1vcmUgdGhhbiAxIGFyZ3VtZW50IHNwZWNpZmllZCAtIGFzc3VtZSAoIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhICkKCQlpZiAoIGdyZWVuICE9PSB1bmRlZmluZWQgKSB7CgkJCXJlZCA9IFsgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEgXTsKCQkJdHlwZSA9ICJhcnJheSI7CgkJfQoKCQlpZiAoIHR5cGUgPT09ICJzdHJpbmciICkgewoJCQlyZXR1cm4gdGhpcy5wYXJzZSggc3RyaW5nUGFyc2UoIHJlZCApIHx8IGNvbG9ycy5fZGVmYXVsdCApOwoJCX0KCgkJaWYgKCB0eXBlID09PSAiYXJyYXkiICkgewoJCQllYWNoKCBzcGFjZXMucmdiYS5wcm9wcywgZnVuY3Rpb24oIGtleSwgcHJvcCApIHsKCQkJCXJnYmFbIHByb3AuaWR4IF0gPSBjbGFtcCggcmVkWyBwcm9wLmlkeCBdLCBwcm9wICk7CgkJCX0pOwoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCWlmICggdHlwZSA9PT0gIm9iamVjdCIgKSB7CgkJCWlmICggcmVkIGluc3RhbmNlb2YgY29sb3IgKSB7CgkJCQllYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJCQkJCWlmICggcmVkWyBzcGFjZS5jYWNoZSBdICkgewoJCQkJCQlpbnN0WyBzcGFjZS5jYWNoZSBdID0gcmVkWyBzcGFjZS5jYWNoZSBdLnNsaWNlKCk7CgkJCQkJfQoJCQkJfSk7CgkJCX0gZWxzZSB7CgkJCQllYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJCQkJCXZhciBjYWNoZSA9IHNwYWNlLmNhY2hlOwoJCQkJCWVhY2goIHNwYWNlLnByb3BzLCBmdW5jdGlvbigga2V5LCBwcm9wICkgewoKCQkJCQkJLy8gaWYgdGhlIGNhY2hlIGRvZXNuJ3QgZXhpc3QsIGFuZCB3ZSBrbm93IGhvdyB0byBjb252ZXJ0CgkJCQkJCWlmICggIWluc3RbIGNhY2hlIF0gJiYgc3BhY2UudG8gKSB7CgoJCQkJCQkJLy8gaWYgdGhlIHZhbHVlIHdhcyBudWxsLCB3ZSBkb24ndCBuZWVkIHRvIGNvcHkgaXQKCQkJCQkJCS8vIGlmIHRoZSBrZXkgd2FzIGFscGhhLCB3ZSBkb24ndCBuZWVkIHRvIGNvcHkgaXQgZWl0aGVyCgkJCQkJCQlpZiAoIGtleSA9PT0gImFscGhhIiB8fCByZWRbIGtleSBdID09IG51bGwgKSB7CgkJCQkJCQkJcmV0dXJuOwoJCQkJCQkJfQoJCQkJCQkJaW5zdFsgY2FjaGUgXSA9IHNwYWNlLnRvKCBpbnN0Ll9yZ2JhICk7CgkJCQkJCX0KCgkJCQkJCS8vIHRoaXMgaXMgdGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSBhbGxvdyBudWxscyBmb3IgQUxMIHByb3BlcnRpZXMuCgkJCQkJCS8vIGNhbGwgY2xhbXAgd2l0aCBhbHdheXNBbGxvd0VtcHR5CgkJCQkJCWluc3RbIGNhY2hlIF1bIHByb3AuaWR4IF0gPSBjbGFtcCggcmVkWyBrZXkgXSwgcHJvcCwgdHJ1ZSApOwoJCQkJCX0pOwoKCQkJCQkvLyBldmVyeXRoaW5nIGRlZmluZWQgYnV0IGFscGhhPwoJCQkJCWlmICggaW5zdFsgY2FjaGUgXSAmJiBqUXVlcnkuaW5BcnJheSggbnVsbCwgaW5zdFsgY2FjaGUgXS5zbGljZSggMCwgMyApICkgPCAwICkgewoJCQkJCQkvLyB1c2UgdGhlIGRlZmF1bHQgb2YgMQoJCQkJCQlpbnN0WyBjYWNoZSBdWyAzIF0gPSAxOwoJCQkJCQlpZiAoIHNwYWNlLmZyb20gKSB7CgkJCQkJCQlpbnN0Ll9yZ2JhID0gc3BhY2UuZnJvbSggaW5zdFsgY2FjaGUgXSApOwoJCQkJCQl9CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIHRoaXM7CgkJfQoJfSwKCWlzOiBmdW5jdGlvbiggY29tcGFyZSApIHsKCQl2YXIgaXMgPSBjb2xvciggY29tcGFyZSApLAoJCQlzYW1lID0gdHJ1ZSwKCQkJaW5zdCA9IHRoaXM7CgoJCWVhY2goIHNwYWNlcywgZnVuY3Rpb24oIF8sIHNwYWNlICkgewoJCQl2YXIgbG9jYWxDYWNoZSwKCQkJCWlzQ2FjaGUgPSBpc1sgc3BhY2UuY2FjaGUgXTsKCQkJaWYgKGlzQ2FjaGUpIHsKCQkJCWxvY2FsQ2FjaGUgPSBpbnN0WyBzcGFjZS5jYWNoZSBdIHx8IHNwYWNlLnRvICYmIHNwYWNlLnRvKCBpbnN0Ll9yZ2JhICkgfHwgW107CgkJCQllYWNoKCBzcGFjZS5wcm9wcywgZnVuY3Rpb24oIF8sIHByb3AgKSB7CgkJCQkJaWYgKCBpc0NhY2hlWyBwcm9wLmlkeCBdICE9IG51bGwgKSB7CgkJCQkJCXNhbWUgPSAoIGlzQ2FjaGVbIHByb3AuaWR4IF0gPT09IGxvY2FsQ2FjaGVbIHByb3AuaWR4IF0gKTsKCQkJCQkJcmV0dXJuIHNhbWU7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQkJcmV0dXJuIHNhbWU7CgkJfSk7CgkJcmV0dXJuIHNhbWU7Cgl9LAoJX3NwYWNlOiBmdW5jdGlvbigpIHsKCQl2YXIgdXNlZCA9IFtdLAoJCQlpbnN0ID0gdGhpczsKCQllYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJCQlpZiAoIGluc3RbIHNwYWNlLmNhY2hlIF0gKSB7CgkJCQl1c2VkLnB1c2goIHNwYWNlTmFtZSApOwoJCQl9CgkJfSk7CgkJcmV0dXJuIHVzZWQucG9wKCk7Cgl9LAoJdHJhbnNpdGlvbjogZnVuY3Rpb24oIG90aGVyLCBkaXN0YW5jZSApIHsKCQl2YXIgZW5kID0gY29sb3IoIG90aGVyICksCgkJCXNwYWNlTmFtZSA9IGVuZC5fc3BhY2UoKSwKCQkJc3BhY2UgPSBzcGFjZXNbIHNwYWNlTmFtZSBdLAoJCQlzdGFydENvbG9yID0gdGhpcy5hbHBoYSgpID09PSAwID8gY29sb3IoICJ0cmFuc3BhcmVudCIgKSA6IHRoaXMsCgkJCXN0YXJ0ID0gc3RhcnRDb2xvclsgc3BhY2UuY2FjaGUgXSB8fCBzcGFjZS50byggc3RhcnRDb2xvci5fcmdiYSApLAoJCQlyZXN1bHQgPSBzdGFydC5zbGljZSgpOwoKCQllbmQgPSBlbmRbIHNwYWNlLmNhY2hlIF07CgkJZWFjaCggc3BhY2UucHJvcHMsIGZ1bmN0aW9uKCBrZXksIHByb3AgKSB7CgkJCXZhciBpbmRleCA9IHByb3AuaWR4LAoJCQkJc3RhcnRWYWx1ZSA9IHN0YXJ0WyBpbmRleCBdLAoJCQkJZW5kVmFsdWUgPSBlbmRbIGluZGV4IF0sCgkJCQl0eXBlID0gcHJvcFR5cGVzWyBwcm9wLnR5cGUgXSB8fCB7fTsKCgkJCS8vIGlmIG51bGwsIGRvbid0IG92ZXJyaWRlIHN0YXJ0IHZhbHVlCgkJCWlmICggZW5kVmFsdWUgPT09IG51bGwgKSB7CgkJCQlyZXR1cm47CgkJCX0KCQkJLy8gaWYgbnVsbCAtIHVzZSBlbmQKCQkJaWYgKCBzdGFydFZhbHVlID09PSBudWxsICkgewoJCQkJcmVzdWx0WyBpbmRleCBdID0gZW5kVmFsdWU7CgkJCX0gZWxzZSB7CgkJCQlpZiAoIHR5cGUubW9kICkgewoJCQkJCWlmICggZW5kVmFsdWUgLSBzdGFydFZhbHVlID4gdHlwZS5tb2QgLyAyICkgewoJCQkJCQlzdGFydFZhbHVlICs9IHR5cGUubW9kOwoJCQkJCX0gZWxzZSBpZiAoIHN0YXJ0VmFsdWUgLSBlbmRWYWx1ZSA+IHR5cGUubW9kIC8gMiApIHsKCQkJCQkJc3RhcnRWYWx1ZSAtPSB0eXBlLm1vZDsKCQkJCQl9CgkJCQl9CgkJCQlyZXN1bHRbIGluZGV4IF0gPSBjbGFtcCggKCBlbmRWYWx1ZSAtIHN0YXJ0VmFsdWUgKSAqIGRpc3RhbmNlICsgc3RhcnRWYWx1ZSwgcHJvcCApOwoJCQl9CgkJfSk7CgkJcmV0dXJuIHRoaXNbIHNwYWNlTmFtZSBdKCByZXN1bHQgKTsKCX0sCglibGVuZDogZnVuY3Rpb24oIG9wYXF1ZSApIHsKCQkvLyBpZiB3ZSBhcmUgYWxyZWFkeSBvcGFxdWUgLSByZXR1cm4gb3Vyc2VsZgoJCWlmICggdGhpcy5fcmdiYVsgMyBdID09PSAxICkgewoJCQlyZXR1cm4gdGhpczsKCQl9CgoJCXZhciByZ2IgPSB0aGlzLl9yZ2JhLnNsaWNlKCksCgkJCWEgPSByZ2IucG9wKCksCgkJCWJsZW5kID0gY29sb3IoIG9wYXF1ZSApLl9yZ2JhOwoKCQlyZXR1cm4gY29sb3IoIGpRdWVyeS5tYXAoIHJnYiwgZnVuY3Rpb24oIHYsIGkgKSB7CgkJCXJldHVybiAoIDEgLSBhICkgKiBibGVuZFsgaSBdICsgYSAqIHY7CgkJfSkpOwoJfSwKCXRvUmdiYVN0cmluZzogZnVuY3Rpb24oKSB7CgkJdmFyIHByZWZpeCA9ICJyZ2JhKCIsCgkJCXJnYmEgPSBqUXVlcnkubWFwKCB0aGlzLl9yZ2JhLCBmdW5jdGlvbiggdiwgaSApIHsKCQkJCXJldHVybiB2ID09IG51bGwgPyAoIGkgPiAyID8gMSA6IDAgKSA6IHY7CgkJCX0pOwoKCQlpZiAoIHJnYmFbIDMgXSA9PT0gMSApIHsKCQkJcmdiYS5wb3AoKTsKCQkJcHJlZml4ID0gInJnYigiOwoJCX0KCgkJcmV0dXJuIHByZWZpeCArIHJnYmEuam9pbigpICsgIikiOwoJfSwKCXRvSHNsYVN0cmluZzogZnVuY3Rpb24oKSB7CgkJdmFyIHByZWZpeCA9ICJoc2xhKCIsCgkJCWhzbGEgPSBqUXVlcnkubWFwKCB0aGlzLmhzbGEoKSwgZnVuY3Rpb24oIHYsIGkgKSB7CgkJCQlpZiAoIHYgPT0gbnVsbCApIHsKCQkJCQl2ID0gaSA+IDIgPyAxIDogMDsKCQkJCX0KCgkJCQkvLyBjYXRjaCAxIGFuZCAyCgkJCQlpZiAoIGkgJiYgaSA8IDMgKSB7CgkJCQkJdiA9IE1hdGgucm91bmQoIHYgKiAxMDAgKSArICIlIjsKCQkJCX0KCQkJCXJldHVybiB2OwoJCQl9KTsKCgkJaWYgKCBoc2xhWyAzIF0gPT09IDEgKSB7CgkJCWhzbGEucG9wKCk7CgkJCXByZWZpeCA9ICJoc2woIjsKCQl9CgkJcmV0dXJuIHByZWZpeCArIGhzbGEuam9pbigpICsgIikiOwoJfSwKCXRvSGV4U3RyaW5nOiBmdW5jdGlvbiggaW5jbHVkZUFscGhhICkgewoJCXZhciByZ2JhID0gdGhpcy5fcmdiYS5zbGljZSgpLAoJCQlhbHBoYSA9IHJnYmEucG9wKCk7CgoJCWlmICggaW5jbHVkZUFscGhhICkgewoJCQlyZ2JhLnB1c2goIH5+KCBhbHBoYSAqIDI1NSApICk7CgkJfQoKCQlyZXR1cm4gIiMiICsgalF1ZXJ5Lm1hcCggcmdiYSwgZnVuY3Rpb24oIHYgKSB7CgoJCQkvLyBkZWZhdWx0IHRvIDAgd2hlbiBudWxscyBleGlzdAoJCQl2ID0gKCB2IHx8IDAgKS50b1N0cmluZyggMTYgKTsKCQkJcmV0dXJuIHYubGVuZ3RoID09PSAxID8gIjAiICsgdiA6IHY7CgkJfSkuam9pbigiIik7Cgl9LAoJdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewoJCXJldHVybiB0aGlzLl9yZ2JhWyAzIF0gPT09IDAgPyAidHJhbnNwYXJlbnQiIDogdGhpcy50b1JnYmFTdHJpbmcoKTsKCX0KfSk7CmNvbG9yLmZuLnBhcnNlLnByb3RvdHlwZSA9IGNvbG9yLmZuOwoKLy8gaHNsYSBjb252ZXJzaW9ucyBhZGFwdGVkIGZyb206Ci8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvbWFhc2hhYWNrL3NvdXJjZS9icm93c2UvcGFja2FnZXMvZ3JhcGhpY3MvdHJ1bmsvc3JjL2dyYXBoaWNzL2NvbG9ycy9IVUUyUkdCLmFzP3I9NTAyMQoKZnVuY3Rpb24gaHVlMnJnYiggcCwgcSwgaCApIHsKCWggPSAoIGggKyAxICkgJSAxOwoJaWYgKCBoICogNiA8IDEgKSB7CgkJcmV0dXJuIHAgKyAoIHEgLSBwICkgKiBoICogNjsKCX0KCWlmICggaCAqIDIgPCAxKSB7CgkJcmV0dXJuIHE7Cgl9CglpZiAoIGggKiAzIDwgMiApIHsKCQlyZXR1cm4gcCArICggcSAtIHAgKSAqICggKCAyIC8gMyApIC0gaCApICogNjsKCX0KCXJldHVybiBwOwp9CgpzcGFjZXMuaHNsYS50byA9IGZ1bmN0aW9uKCByZ2JhICkgewoJaWYgKCByZ2JhWyAwIF0gPT0gbnVsbCB8fCByZ2JhWyAxIF0gPT0gbnVsbCB8fCByZ2JhWyAyIF0gPT0gbnVsbCApIHsKCQlyZXR1cm4gWyBudWxsLCBudWxsLCBudWxsLCByZ2JhWyAzIF0gXTsKCX0KCXZhciByID0gcmdiYVsgMCBdIC8gMjU1LAoJCWcgPSByZ2JhWyAxIF0gLyAyNTUsCgkJYiA9IHJnYmFbIDIgXSAvIDI1NSwKCQlhID0gcmdiYVsgMyBdLAoJCW1heCA9IE1hdGgubWF4KCByLCBnLCBiICksCgkJbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKSwKCQlkaWZmID0gbWF4IC0gbWluLAoJCWFkZCA9IG1heCArIG1pbiwKCQlsID0gYWRkICogMC41LAoJCWgsIHM7CgoJaWYgKCBtaW4gPT09IG1heCApIHsKCQloID0gMDsKCX0gZWxzZSBpZiAoIHIgPT09IG1heCApIHsKCQloID0gKCA2MCAqICggZyAtIGIgKSAvIGRpZmYgKSArIDM2MDsKCX0gZWxzZSBpZiAoIGcgPT09IG1heCApIHsKCQloID0gKCA2MCAqICggYiAtIHIgKSAvIGRpZmYgKSArIDEyMDsKCX0gZWxzZSB7CgkJaCA9ICggNjAgKiAoIHIgLSBnICkgLyBkaWZmICkgKyAyNDA7Cgl9CgoJLy8gY2hyb21hIChkaWZmKSA9PSAwIG1lYW5zIGdyZXlzY2FsZSB3aGljaCwgYnkgZGVmaW5pdGlvbiwgc2F0dXJhdGlvbiA9IDAlCgkvLyBvdGhlcndpc2UsIHNhdHVyYXRpb24gaXMgYmFzZWQgb24gdGhlIHJhdGlvIG9mIGNocm9tYSAoZGlmZikgdG8gbGlnaHRuZXNzIChhZGQpCglpZiAoIGRpZmYgPT09IDAgKSB7CgkJcyA9IDA7Cgl9IGVsc2UgaWYgKCBsIDw9IDAuNSApIHsKCQlzID0gZGlmZiAvIGFkZDsKCX0gZWxzZSB7CgkJcyA9IGRpZmYgLyAoIDIgLSBhZGQgKTsKCX0KCXJldHVybiBbIE1hdGgucm91bmQoaCkgJSAzNjAsIHMsIGwsIGEgPT0gbnVsbCA/IDEgOiBhIF07Cn07CgpzcGFjZXMuaHNsYS5mcm9tID0gZnVuY3Rpb24oIGhzbGEgKSB7CglpZiAoIGhzbGFbIDAgXSA9PSBudWxsIHx8IGhzbGFbIDEgXSA9PSBudWxsIHx8IGhzbGFbIDIgXSA9PSBudWxsICkgewoJCXJldHVybiBbIG51bGwsIG51bGwsIG51bGwsIGhzbGFbIDMgXSBdOwoJfQoJdmFyIGggPSBoc2xhWyAwIF0gLyAzNjAsCgkJcyA9IGhzbGFbIDEgXSwKCQlsID0gaHNsYVsgMiBdLAoJCWEgPSBoc2xhWyAzIF0sCgkJcSA9IGwgPD0gMC41ID8gbCAqICggMSArIHMgKSA6IGwgKyBzIC0gbCAqIHMsCgkJcCA9IDIgKiBsIC0gcTsKCglyZXR1cm4gWwoJCU1hdGgucm91bmQoIGh1ZTJyZ2IoIHAsIHEsIGggKyAoIDEgLyAzICkgKSAqIDI1NSApLAoJCU1hdGgucm91bmQoIGh1ZTJyZ2IoIHAsIHEsIGggKSAqIDI1NSApLAoJCU1hdGgucm91bmQoIGh1ZTJyZ2IoIHAsIHEsIGggLSAoIDEgLyAzICkgKSAqIDI1NSApLAoJCWEKCV07Cn07CgplYWNoKCBzcGFjZXMsIGZ1bmN0aW9uKCBzcGFjZU5hbWUsIHNwYWNlICkgewoJdmFyIHByb3BzID0gc3BhY2UucHJvcHMsCgkJY2FjaGUgPSBzcGFjZS5jYWNoZSwKCQl0byA9IHNwYWNlLnRvLAoJCWZyb20gPSBzcGFjZS5mcm9tOwoKCS8vIG1ha2VzIHJnYmEoKSBhbmQgaHNsYSgpCgljb2xvci5mblsgc3BhY2VOYW1lIF0gPSBmdW5jdGlvbiggdmFsdWUgKSB7CgoJCS8vIGdlbmVyYXRlIGEgY2FjaGUgZm9yIHRoaXMgc3BhY2UgaWYgaXQgZG9lc24ndCBleGlzdAoJCWlmICggdG8gJiYgIXRoaXNbIGNhY2hlIF0gKSB7CgkJCXRoaXNbIGNhY2hlIF0gPSB0byggdGhpcy5fcmdiYSApOwoJCX0KCQlpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgKSB7CgkJCXJldHVybiB0aGlzWyBjYWNoZSBdLnNsaWNlKCk7CgkJfQoKCQl2YXIgcmV0LAoJCQl0eXBlID0galF1ZXJ5LnR5cGUoIHZhbHVlICksCgkJCWFyciA9ICggdHlwZSA9PT0gImFycmF5IiB8fCB0eXBlID09PSAib2JqZWN0IiApID8gdmFsdWUgOiBhcmd1bWVudHMsCgkJCWxvY2FsID0gdGhpc1sgY2FjaGUgXS5zbGljZSgpOwoKCQllYWNoKCBwcm9wcywgZnVuY3Rpb24oIGtleSwgcHJvcCApIHsKCQkJdmFyIHZhbCA9IGFyclsgdHlwZSA9PT0gIm9iamVjdCIgPyBrZXkgOiBwcm9wLmlkeCBdOwoJCQlpZiAoIHZhbCA9PSBudWxsICkgewoJCQkJdmFsID0gbG9jYWxbIHByb3AuaWR4IF07CgkJCX0KCQkJbG9jYWxbIHByb3AuaWR4IF0gPSBjbGFtcCggdmFsLCBwcm9wICk7CgkJfSk7CgoJCWlmICggZnJvbSApIHsKCQkJcmV0ID0gY29sb3IoIGZyb20oIGxvY2FsICkgKTsKCQkJcmV0WyBjYWNoZSBdID0gbG9jYWw7CgkJCXJldHVybiByZXQ7CgkJfSBlbHNlIHsKCQkJcmV0dXJuIGNvbG9yKCBsb2NhbCApOwoJCX0KCX07CgoJLy8gbWFrZXMgcmVkKCkgZ3JlZW4oKSBibHVlKCkgYWxwaGEoKSBodWUoKSBzYXR1cmF0aW9uKCkgbGlnaHRuZXNzKCkKCWVhY2goIHByb3BzLCBmdW5jdGlvbigga2V5LCBwcm9wICkgewoJCS8vIGFscGhhIGlzIGluY2x1ZGVkIGluIG1vcmUgdGhhbiBvbmUgc3BhY2UKCQlpZiAoIGNvbG9yLmZuWyBrZXkgXSApIHsKCQkJcmV0dXJuOwoJCX0KCQljb2xvci5mblsga2V5IF0gPSBmdW5jdGlvbiggdmFsdWUgKSB7CgkJCXZhciB2dHlwZSA9IGpRdWVyeS50eXBlKCB2YWx1ZSApLAoJCQkJZm4gPSAoIGtleSA9PT0gImFscGhhIiA/ICggdGhpcy5faHNsYSA/ICJoc2xhIiA6ICJyZ2JhIiApIDogc3BhY2VOYW1lICksCgkJCQlsb2NhbCA9IHRoaXNbIGZuIF0oKSwKCQkJCWN1ciA9IGxvY2FsWyBwcm9wLmlkeCBdLAoJCQkJbWF0Y2g7CgoJCQlpZiAoIHZ0eXBlID09PSAidW5kZWZpbmVkIiApIHsKCQkJCXJldHVybiBjdXI7CgkJCX0KCgkJCWlmICggdnR5cGUgPT09ICJmdW5jdGlvbiIgKSB7CgkJCQl2YWx1ZSA9IHZhbHVlLmNhbGwoIHRoaXMsIGN1ciApOwoJCQkJdnR5cGUgPSBqUXVlcnkudHlwZSggdmFsdWUgKTsKCQkJfQoJCQlpZiAoIHZhbHVlID09IG51bGwgJiYgcHJvcC5lbXB0eSApIHsKCQkJCXJldHVybiB0aGlzOwoJCQl9CgkJCWlmICggdnR5cGUgPT09ICJzdHJpbmciICkgewoJCQkJbWF0Y2ggPSBycGx1c2VxdWFscy5leGVjKCB2YWx1ZSApOwoJCQkJaWYgKCBtYXRjaCApIHsKCQkJCQl2YWx1ZSA9IGN1ciArIHBhcnNlRmxvYXQoIG1hdGNoWyAyIF0gKSAqICggbWF0Y2hbIDEgXSA9PT0gIisiID8gMSA6IC0xICk7CgkJCQl9CgkJCX0KCQkJbG9jYWxbIHByb3AuaWR4IF0gPSB2YWx1ZTsKCQkJcmV0dXJuIHRoaXNbIGZuIF0oIGxvY2FsICk7CgkJfTsKCX0pOwp9KTsKCi8vIGFkZCBjc3NIb29rIGFuZCAuZnguc3RlcCBmdW5jdGlvbiBmb3IgZWFjaCBuYW1lZCBob29rLgovLyBhY2NlcHQgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIHByb3BlcnRpZXMKY29sb3IuaG9vayA9IGZ1bmN0aW9uKCBob29rICkgewoJdmFyIGhvb2tzID0gaG9vay5zcGxpdCggIiAiICk7CgllYWNoKCBob29rcywgZnVuY3Rpb24oIGksIGhvb2sgKSB7CgkJalF1ZXJ5LmNzc0hvb2tzWyBob29rIF0gPSB7CgkJCXNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkgewoJCQkJdmFyIHBhcnNlZCwgY3VyRWxlbSwKCQkJCQliYWNrZ3JvdW5kQ29sb3IgPSAiIjsKCgkJCQlpZiAoIHZhbHVlICE9PSAidHJhbnNwYXJlbnQiICYmICggalF1ZXJ5LnR5cGUoIHZhbHVlICkgIT09ICJzdHJpbmciIHx8ICggcGFyc2VkID0gc3RyaW5nUGFyc2UoIHZhbHVlICkgKSApICkgewoJCQkJCXZhbHVlID0gY29sb3IoIHBhcnNlZCB8fCB2YWx1ZSApOwoJCQkJCWlmICggIXN1cHBvcnQucmdiYSAmJiB2YWx1ZS5fcmdiYVsgMyBdICE9PSAxICkgewoJCQkJCQljdXJFbGVtID0gaG9vayA9PT0gImJhY2tncm91bmRDb2xvciIgPyBlbGVtLnBhcmVudE5vZGUgOiBlbGVtOwoJCQkJCQl3aGlsZSAoCgkJCQkJCQkoYmFja2dyb3VuZENvbG9yID09PSAiIiB8fCBiYWNrZ3JvdW5kQ29sb3IgPT09ICJ0cmFuc3BhcmVudCIpICYmCgkJCQkJCQljdXJFbGVtICYmIGN1ckVsZW0uc3R5bGUKCQkJCQkJKSB7CgkJCQkJCQl0cnkgewoJCQkJCQkJCWJhY2tncm91bmRDb2xvciA9IGpRdWVyeS5jc3MoIGN1ckVsZW0sICJiYWNrZ3JvdW5kQ29sb3IiICk7CgkJCQkJCQkJY3VyRWxlbSA9IGN1ckVsZW0ucGFyZW50Tm9kZTsKCQkJCQkJCX0gY2F0Y2ggKCBlICkgewoJCQkJCQkJfQoJCQkJCQl9CgoJCQkJCQl2YWx1ZSA9IHZhbHVlLmJsZW5kKCBiYWNrZ3JvdW5kQ29sb3IgJiYgYmFja2dyb3VuZENvbG9yICE9PSAidHJhbnNwYXJlbnQiID8KCQkJCQkJCWJhY2tncm91bmRDb2xvciA6CgkJCQkJCQkiX2RlZmF1bHQiICk7CgkJCQkJfQoKCQkJCQl2YWx1ZSA9IHZhbHVlLnRvUmdiYVN0cmluZygpOwoJCQkJfQoJCQkJdHJ5IHsKCQkJCQllbGVtLnN0eWxlWyBob29rIF0gPSB2YWx1ZTsKCQkJCX0gY2F0Y2goIGUgKSB7CgkJCQkJLy8gd3JhcHBlZCB0byBwcmV2ZW50IElFIGZyb20gdGhyb3dpbmcgZXJyb3JzIG9uICJpbnZhbGlkIiB2YWx1ZXMgbGlrZSAnYXV0bycgb3IgJ2luaGVyaXQnCgkJCQl9CgkJCX0KCQl9OwoJCWpRdWVyeS5meC5zdGVwWyBob29rIF0gPSBmdW5jdGlvbiggZnggKSB7CgkJCWlmICggIWZ4LmNvbG9ySW5pdCApIHsKCQkJCWZ4LnN0YXJ0ID0gY29sb3IoIGZ4LmVsZW0sIGhvb2sgKTsKCQkJCWZ4LmVuZCA9IGNvbG9yKCBmeC5lbmQgKTsKCQkJCWZ4LmNvbG9ySW5pdCA9IHRydWU7CgkJCX0KCQkJalF1ZXJ5LmNzc0hvb2tzWyBob29rIF0uc2V0KCBmeC5lbGVtLCBmeC5zdGFydC50cmFuc2l0aW9uKCBmeC5lbmQsIGZ4LnBvcyApICk7CgkJfTsKCX0pOwoKfTsKCmNvbG9yLmhvb2soIHN0ZXBIb29rcyApOwoKalF1ZXJ5LmNzc0hvb2tzLmJvcmRlckNvbG9yID0gewoJZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7CgkJdmFyIGV4cGFuZGVkID0ge307CgoJCWVhY2goIFsgIlRvcCIsICJSaWdodCIsICJCb3R0b20iLCAiTGVmdCIgXSwgZnVuY3Rpb24oIGksIHBhcnQgKSB7CgkJCWV4cGFuZGVkWyAiYm9yZGVyIiArIHBhcnQgKyAiQ29sb3IiIF0gPSB2YWx1ZTsKCQl9KTsKCQlyZXR1cm4gZXhwYW5kZWQ7Cgl9Cn07CgovLyBCYXNpYyBjb2xvciBuYW1lcyBvbmx5LgovLyBVc2FnZSBvZiBhbnkgb2YgdGhlIG90aGVyIGNvbG9yIG5hbWVzIHJlcXVpcmVzIGFkZGluZyB5b3Vyc2VsZiBvciBpbmNsdWRpbmcKLy8ganF1ZXJ5LmNvbG9yLnN2Zy1uYW1lcy5qcy4KY29sb3JzID0galF1ZXJ5LkNvbG9yLm5hbWVzID0gewoJLy8gNC4xLiBCYXNpYyBjb2xvciBrZXl3b3JkcwoJYXF1YTogIiMwMGZmZmYiLAoJYmxhY2s6ICIjMDAwMDAwIiwKCWJsdWU6ICIjMDAwMGZmIiwKCWZ1Y2hzaWE6ICIjZmYwMGZmIiwKCWdyYXk6ICIjODA4MDgwIiwKCWdyZWVuOiAiIzAwODAwMCIsCglsaW1lOiAiIzAwZmYwMCIsCgltYXJvb246ICIjODAwMDAwIiwKCW5hdnk6ICIjMDAwMDgwIiwKCW9saXZlOiAiIzgwODAwMCIsCglwdXJwbGU6ICIjODAwMDgwIiwKCXJlZDogIiNmZjAwMDAiLAoJc2lsdmVyOiAiI2MwYzBjMCIsCgl0ZWFsOiAiIzAwODA4MCIsCgl3aGl0ZTogIiNmZmZmZmYiLAoJeWVsbG93OiAiI2ZmZmYwMCIsCgoJLy8gNC4yLjMuICJ0cmFuc3BhcmVudCIgY29sb3Iga2V5d29yZAoJdHJhbnNwYXJlbnQ6IFsgbnVsbCwgbnVsbCwgbnVsbCwgMCBdLAoKCV9kZWZhdWx0OiAiI2ZmZmZmZiIKfTsKCn0pKCBqUXVlcnkgKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ0xBU1MgQU5JTUFUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCihmdW5jdGlvbigpIHsKCnZhciBjbGFzc0FuaW1hdGlvbkFjdGlvbnMgPSBbICJhZGQiLCAicmVtb3ZlIiwgInRvZ2dsZSIgXSwKCXNob3J0aGFuZFN0eWxlcyA9IHsKCQlib3JkZXI6IDEsCgkJYm9yZGVyQm90dG9tOiAxLAoJCWJvcmRlckNvbG9yOiAxLAoJCWJvcmRlckxlZnQ6IDEsCgkJYm9yZGVyUmlnaHQ6IDEsCgkJYm9yZGVyVG9wOiAxLAoJCWJvcmRlcldpZHRoOiAxLAoJCW1hcmdpbjogMSwKCQlwYWRkaW5nOiAxCgl9OwoKJC5lYWNoKFsgImJvcmRlckxlZnRTdHlsZSIsICJib3JkZXJSaWdodFN0eWxlIiwgImJvcmRlckJvdHRvbVN0eWxlIiwgImJvcmRlclRvcFN0eWxlIiBdLCBmdW5jdGlvbiggXywgcHJvcCApIHsKCSQuZnguc3RlcFsgcHJvcCBdID0gZnVuY3Rpb24oIGZ4ICkgewoJCWlmICggZnguZW5kICE9PSAibm9uZSIgJiYgIWZ4LnNldEF0dHIgfHwgZngucG9zID09PSAxICYmICFmeC5zZXRBdHRyICkgewoJCQlqUXVlcnkuc3R5bGUoIGZ4LmVsZW0sIHByb3AsIGZ4LmVuZCApOwoJCQlmeC5zZXRBdHRyID0gdHJ1ZTsKCQl9Cgl9Owp9KTsKCmZ1bmN0aW9uIGdldEVsZW1lbnRTdHlsZXMoIGVsZW0gKSB7Cgl2YXIga2V5LCBsZW4sCgkJc3R5bGUgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgPwoJCQllbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSwgbnVsbCApIDoKCQkJZWxlbS5jdXJyZW50U3R5bGUsCgkJc3R5bGVzID0ge307CgoJaWYgKCBzdHlsZSAmJiBzdHlsZS5sZW5ndGggJiYgc3R5bGVbIDAgXSAmJiBzdHlsZVsgc3R5bGVbIDAgXSBdICkgewoJCWxlbiA9IHN0eWxlLmxlbmd0aDsKCQl3aGlsZSAoIGxlbi0tICkgewoJCQlrZXkgPSBzdHlsZVsgbGVuIF07CgkJCWlmICggdHlwZW9mIHN0eWxlWyBrZXkgXSA9PT0gInN0cmluZyIgKSB7CgkJCQlzdHlsZXNbICQuY2FtZWxDYXNlKCBrZXkgKSBdID0gc3R5bGVbIGtleSBdOwoJCQl9CgkJfQoJLy8gc3VwcG9ydDogT3BlcmEsIElFIDw5Cgl9IGVsc2UgewoJCWZvciAoIGtleSBpbiBzdHlsZSApIHsKCQkJaWYgKCB0eXBlb2Ygc3R5bGVbIGtleSBdID09PSAic3RyaW5nIiApIHsKCQkJCXN0eWxlc1sga2V5IF0gPSBzdHlsZVsga2V5IF07CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIHN0eWxlczsKfQoKZnVuY3Rpb24gc3R5bGVEaWZmZXJlbmNlKCBvbGRTdHlsZSwgbmV3U3R5bGUgKSB7Cgl2YXIgZGlmZiA9IHt9LAoJCW5hbWUsIHZhbHVlOwoKCWZvciAoIG5hbWUgaW4gbmV3U3R5bGUgKSB7CgkJdmFsdWUgPSBuZXdTdHlsZVsgbmFtZSBdOwoJCWlmICggb2xkU3R5bGVbIG5hbWUgXSAhPT0gdmFsdWUgKSB7CgkJCWlmICggIXNob3J0aGFuZFN0eWxlc1sgbmFtZSBdICkgewoJCQkJaWYgKCAkLmZ4LnN0ZXBbIG5hbWUgXSB8fCAhaXNOYU4oIHBhcnNlRmxvYXQoIHZhbHVlICkgKSApIHsKCQkJCQlkaWZmWyBuYW1lIF0gPSB2YWx1ZTsKCQkJCX0KCQkJfQoJCX0KCX0KCglyZXR1cm4gZGlmZjsKfQoKLy8gc3VwcG9ydDogalF1ZXJ5IDwxLjgKaWYgKCAhJC5mbi5hZGRCYWNrICkgewoJJC5mbi5hZGRCYWNrID0gZnVuY3Rpb24oIHNlbGVjdG9yICkgewoJCXJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/CgkJCXRoaXMucHJldk9iamVjdCA6IHRoaXMucHJldk9iamVjdC5maWx0ZXIoIHNlbGVjdG9yICkKCQkpOwoJfTsKfQoKJC5lZmZlY3RzLmFuaW1hdGVDbGFzcyA9IGZ1bmN0aW9uKCB2YWx1ZSwgZHVyYXRpb24sIGVhc2luZywgY2FsbGJhY2sgKSB7Cgl2YXIgbyA9ICQuc3BlZWQoIGR1cmF0aW9uLCBlYXNpbmcsIGNhbGxiYWNrICk7CgoJcmV0dXJuIHRoaXMucXVldWUoIGZ1bmN0aW9uKCkgewoJCXZhciBhbmltYXRlZCA9ICQoIHRoaXMgKSwKCQkJYmFzZUNsYXNzID0gYW5pbWF0ZWQuYXR0ciggImNsYXNzIiApIHx8ICIiLAoJCQlhcHBseUNsYXNzQ2hhbmdlLAoJCQlhbGxBbmltYXRpb25zID0gby5jaGlsZHJlbiA/IGFuaW1hdGVkLmZpbmQoICIqIiApLmFkZEJhY2soKSA6IGFuaW1hdGVkOwoKCQkvLyBtYXAgdGhlIGFuaW1hdGVkIG9iamVjdHMgdG8gc3RvcmUgdGhlIG9yaWdpbmFsIHN0eWxlcy4KCQlhbGxBbmltYXRpb25zID0gYWxsQW5pbWF0aW9ucy5tYXAoZnVuY3Rpb24oKSB7CgkJCXZhciBlbCA9ICQoIHRoaXMgKTsKCQkJcmV0dXJuIHsKCQkJCWVsOiBlbCwKCQkJCXN0YXJ0OiBnZXRFbGVtZW50U3R5bGVzKCB0aGlzICkKCQkJfTsKCQl9KTsKCgkJLy8gYXBwbHkgY2xhc3MgY2hhbmdlCgkJYXBwbHlDbGFzc0NoYW5nZSA9IGZ1bmN0aW9uKCkgewoJCQkkLmVhY2goIGNsYXNzQW5pbWF0aW9uQWN0aW9ucywgZnVuY3Rpb24oaSwgYWN0aW9uKSB7CgkJCQlpZiAoIHZhbHVlWyBhY3Rpb24gXSApIHsKCQkJCQlhbmltYXRlZFsgYWN0aW9uICsgIkNsYXNzIiBdKCB2YWx1ZVsgYWN0aW9uIF0gKTsKCQkJCX0KCQkJfSk7CgkJfTsKCQlhcHBseUNsYXNzQ2hhbmdlKCk7CgoJCS8vIG1hcCBhbGwgYW5pbWF0ZWQgb2JqZWN0cyBhZ2FpbiAtIGNhbGN1bGF0ZSBuZXcgc3R5bGVzIGFuZCBkaWZmCgkJYWxsQW5pbWF0aW9ucyA9IGFsbEFuaW1hdGlvbnMubWFwKGZ1bmN0aW9uKCkgewoJCQl0aGlzLmVuZCA9IGdldEVsZW1lbnRTdHlsZXMoIHRoaXMuZWxbIDAgXSApOwoJCQl0aGlzLmRpZmYgPSBzdHlsZURpZmZlcmVuY2UoIHRoaXMuc3RhcnQsIHRoaXMuZW5kICk7CgkJCXJldHVybiB0aGlzOwoJCX0pOwoKCQkvLyBhcHBseSBvcmlnaW5hbCBjbGFzcwoJCWFuaW1hdGVkLmF0dHIoICJjbGFzcyIsIGJhc2VDbGFzcyApOwoKCQkvLyBtYXAgYWxsIGFuaW1hdGVkIG9iamVjdHMgYWdhaW4gLSB0aGlzIHRpbWUgY29sbGVjdGluZyBhIHByb21pc2UKCQlhbGxBbmltYXRpb25zID0gYWxsQW5pbWF0aW9ucy5tYXAoZnVuY3Rpb24oKSB7CgkJCXZhciBzdHlsZUluZm8gPSB0aGlzLAoJCQkJZGZkID0gJC5EZWZlcnJlZCgpLAoJCQkJb3B0cyA9ICQuZXh0ZW5kKHt9LCBvLCB7CgkJCQkJcXVldWU6IGZhbHNlLAoJCQkJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJCQkJZGZkLnJlc29sdmUoIHN0eWxlSW5mbyApOwoJCQkJCX0KCQkJCX0pOwoKCQkJdGhpcy5lbC5hbmltYXRlKCB0aGlzLmRpZmYsIG9wdHMgKTsKCQkJcmV0dXJuIGRmZC5wcm9taXNlKCk7CgkJfSk7CgoJCS8vIG9uY2UgYWxsIGFuaW1hdGlvbnMgaGF2ZSBjb21wbGV0ZWQ6CgkJJC53aGVuLmFwcGx5KCAkLCBhbGxBbmltYXRpb25zLmdldCgpICkuZG9uZShmdW5jdGlvbigpIHsKCgkJCS8vIHNldCB0aGUgZmluYWwgY2xhc3MKCQkJYXBwbHlDbGFzc0NoYW5nZSgpOwoKCQkJLy8gZm9yIGVhY2ggYW5pbWF0ZWQgZWxlbWVudCwKCQkJLy8gY2xlYXIgYWxsIGNzcyBwcm9wZXJ0aWVzIHRoYXQgd2VyZSBhbmltYXRlZAoJCQkkLmVhY2goIGFyZ3VtZW50cywgZnVuY3Rpb24oKSB7CgkJCQl2YXIgZWwgPSB0aGlzLmVsOwoJCQkJJC5lYWNoKCB0aGlzLmRpZmYsIGZ1bmN0aW9uKGtleSkgewoJCQkJCWVsLmNzcygga2V5LCAiIiApOwoJCQkJfSk7CgkJCX0pOwoKCQkJLy8gdGhpcyBpcyBndWFybnRlZWQgdG8gYmUgdGhlcmUgaWYgeW91IHVzZSBqUXVlcnkuc3BlZWQoKQoJCQkvLyBpdCBhbHNvIGhhbmRsZXMgZGVxdWV1aW5nIHRoZSBuZXh0IGFuaW0uLi4KCQkJby5jb21wbGV0ZS5jYWxsKCBhbmltYXRlZFsgMCBdICk7CgkJfSk7Cgl9KTsKfTsKCiQuZm4uZXh0ZW5kKHsKCWFkZENsYXNzOiAoZnVuY3Rpb24oIG9yaWcgKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCBjbGFzc05hbWVzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQkJcmV0dXJuIHNwZWVkID8KCQkJCSQuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCggdGhpcywKCQkJCQl7IGFkZDogY2xhc3NOYW1lcyB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIDoKCQkJCW9yaWcuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX07Cgl9KSggJC5mbi5hZGRDbGFzcyApLAoKCXJlbW92ZUNsYXNzOiAoZnVuY3Rpb24oIG9yaWcgKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCBjbGFzc05hbWVzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHsKCQkJcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxID8KCQkJCSQuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCggdGhpcywKCQkJCQl7IHJlbW92ZTogY2xhc3NOYW1lcyB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIDoKCQkJCW9yaWcuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCX07Cgl9KSggJC5mbi5yZW1vdmVDbGFzcyApLAoKCXRvZ2dsZUNsYXNzOiAoZnVuY3Rpb24oIG9yaWcgKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCBjbGFzc05hbWVzLCBmb3JjZSwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7CgkJCWlmICggdHlwZW9mIGZvcmNlID09PSAiYm9vbGVhbiIgfHwgZm9yY2UgPT09IHVuZGVmaW5lZCApIHsKCQkJCWlmICggIXNwZWVkICkgewoJCQkJCS8vIHdpdGhvdXQgc3BlZWQgcGFyYW1ldGVyCgkJCQkJcmV0dXJuIG9yaWcuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJfSBlbHNlIHsKCQkJCQlyZXR1cm4gJC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKCB0aGlzLAoJCQkJCQkoZm9yY2UgPyB7IGFkZDogY2xhc3NOYW1lcyB9IDogeyByZW1vdmU6IGNsYXNzTmFtZXMgfSksCgkJCQkJCXNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7CgkJCQl9CgkJCX0gZWxzZSB7CgkJCQkvLyB3aXRob3V0IGZvcmNlIHBhcmFtZXRlcgoJCQkJcmV0dXJuICQuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCggdGhpcywKCQkJCQl7IHRvZ2dsZTogY2xhc3NOYW1lcyB9LCBmb3JjZSwgc3BlZWQsIGVhc2luZyApOwoJCQl9CgkJfTsKCX0pKCAkLmZuLnRvZ2dsZUNsYXNzICksCgoJc3dpdGNoQ2xhc3M6IGZ1bmN0aW9uKCByZW1vdmUsIGFkZCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2spIHsKCQlyZXR1cm4gJC5lZmZlY3RzLmFuaW1hdGVDbGFzcy5jYWxsKCB0aGlzLCB7CgkJCWFkZDogYWRkLAoJCQlyZW1vdmU6IHJlbW92ZQoJCX0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7Cgl9Cn0pOwoKfSkoKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFRkZFQ1RTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgooZnVuY3Rpb24oKSB7CgokLmV4dGVuZCggJC5lZmZlY3RzLCB7Cgl2ZXJzaW9uOiAiMS4xMS4wIiwKCgkvLyBTYXZlcyBhIHNldCBvZiBwcm9wZXJ0aWVzIGluIGEgZGF0YSBzdG9yYWdlCglzYXZlOiBmdW5jdGlvbiggZWxlbWVudCwgc2V0ICkgewoJCWZvciAoIHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKyApIHsKCQkJaWYgKCBzZXRbIGkgXSAhPT0gbnVsbCApIHsKCQkJCWVsZW1lbnQuZGF0YSggZGF0YVNwYWNlICsgc2V0WyBpIF0sIGVsZW1lbnRbIDAgXS5zdHlsZVsgc2V0WyBpIF0gXSApOwoJCQl9CgkJfQoJfSwKCgkvLyBSZXN0b3JlcyBhIHNldCBvZiBwcmV2aW91c2x5IHNhdmVkIHByb3BlcnRpZXMgZnJvbSBhIGRhdGEgc3RvcmFnZQoJcmVzdG9yZTogZnVuY3Rpb24oIGVsZW1lbnQsIHNldCApIHsKCQl2YXIgdmFsLCBpOwoJCWZvciAoIGkgPSAwOyBpIDwgc2V0Lmxlbmd0aDsgaSsrICkgewoJCQlpZiAoIHNldFsgaSBdICE9PSBudWxsICkgewoJCQkJdmFsID0gZWxlbWVudC5kYXRhKCBkYXRhU3BhY2UgKyBzZXRbIGkgXSApOwoJCQkJLy8gc3VwcG9ydDogalF1ZXJ5IDEuNi4yCgkJCQkvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC85OTE3CgkJCQkvLyBqUXVlcnkgMS42LjIgaW5jb3JyZWN0bHkgcmV0dXJucyB1bmRlZmluZWQgZm9yIGFueSBmYWxzeSB2YWx1ZS4KCQkJCS8vIFdlIGNhbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiAiIiBhbmQgMCBoZXJlLCBzbyB3ZSBqdXN0IGFzc3VtZQoJCQkJLy8gZW1wdHkgc3RyaW5nIHNpbmNlIGl0J3MgbGlrZWx5IHRvIGJlIGEgbW9yZSBjb21tb24gdmFsdWUuLi4KCQkJCWlmICggdmFsID09PSB1bmRlZmluZWQgKSB7CgkJCQkJdmFsID0gIiI7CgkJCQl9CgkJCQllbGVtZW50LmNzcyggc2V0WyBpIF0sIHZhbCApOwoJCQl9CgkJfQoJfSwKCglzZXRNb2RlOiBmdW5jdGlvbiggZWwsIG1vZGUgKSB7CgkJaWYgKG1vZGUgPT09ICJ0b2dnbGUiKSB7CgkJCW1vZGUgPSBlbC5pcyggIjpoaWRkZW4iICkgPyAic2hvdyIgOiAiaGlkZSI7CgkJfQoJCXJldHVybiBtb2RlOwoJfSwKCgkvLyBUcmFuc2xhdGVzIGEgW3RvcCxsZWZ0XSBhcnJheSBpbnRvIGEgYmFzZWxpbmUgdmFsdWUKCS8vIHRoaXMgc2hvdWxkIGJlIGEgbGl0dGxlIG1vcmUgZmxleGlibGUgaW4gdGhlIGZ1dHVyZSB0byBoYW5kbGUgYSBzdHJpbmcgJiBoYXNoCglnZXRCYXNlbGluZTogZnVuY3Rpb24oIG9yaWdpbiwgb3JpZ2luYWwgKSB7CgkJdmFyIHksIHg7CgkJc3dpdGNoICggb3JpZ2luWyAwIF0gKSB7CgkJCWNhc2UgInRvcCI6IHkgPSAwOyBicmVhazsKCQkJY2FzZSAibWlkZGxlIjogeSA9IDAuNTsgYnJlYWs7CgkJCWNhc2UgImJvdHRvbSI6IHkgPSAxOyBicmVhazsKCQkJZGVmYXVsdDogeSA9IG9yaWdpblsgMCBdIC8gb3JpZ2luYWwuaGVpZ2h0OwoJCX0KCQlzd2l0Y2ggKCBvcmlnaW5bIDEgXSApIHsKCQkJY2FzZSAibGVmdCI6IHggPSAwOyBicmVhazsKCQkJY2FzZSAiY2VudGVyIjogeCA9IDAuNTsgYnJlYWs7CgkJCWNhc2UgInJpZ2h0IjogeCA9IDE7IGJyZWFrOwoJCQlkZWZhdWx0OiB4ID0gb3JpZ2luWyAxIF0gLyBvcmlnaW5hbC53aWR0aDsKCQl9CgkJcmV0dXJuIHsKCQkJeDogeCwKCQkJeTogeQoJCX07Cgl9LAoKCS8vIFdyYXBzIHRoZSBlbGVtZW50IGFyb3VuZCBhIHdyYXBwZXIgdGhhdCBjb3BpZXMgcG9zaXRpb24gcHJvcGVydGllcwoJY3JlYXRlV3JhcHBlcjogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgoJCS8vIGlmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgd3JhcHBlZCwgcmV0dXJuIGl0CgkJaWYgKCBlbGVtZW50LnBhcmVudCgpLmlzKCAiLnVpLWVmZmVjdHMtd3JhcHBlciIgKSkgewoJCQlyZXR1cm4gZWxlbWVudC5wYXJlbnQoKTsKCQl9CgoJCS8vIHdyYXAgdGhlIGVsZW1lbnQKCQl2YXIgcHJvcHMgPSB7CgkJCQl3aWR0aDogZWxlbWVudC5vdXRlcldpZHRoKHRydWUpLAoJCQkJaGVpZ2h0OiBlbGVtZW50Lm91dGVySGVpZ2h0KHRydWUpLAoJCQkJImZsb2F0IjogZWxlbWVudC5jc3MoICJmbG9hdCIgKQoJCQl9LAoJCQl3cmFwcGVyID0gJCggIjxkaXY+PC9kaXY+IiApCgkJCQkuYWRkQ2xhc3MoICJ1aS1lZmZlY3RzLXdyYXBwZXIiICkKCQkJCS5jc3MoewoJCQkJCWZvbnRTaXplOiAiMTAwJSIsCgkJCQkJYmFja2dyb3VuZDogInRyYW5zcGFyZW50IiwKCQkJCQlib3JkZXI6ICJub25lIiwKCQkJCQltYXJnaW46IDAsCgkJCQkJcGFkZGluZzogMAoJCQkJfSksCgkJCS8vIFN0b3JlIHRoZSBzaXplIGluIGNhc2Ugd2lkdGgvaGVpZ2h0IGFyZSBkZWZpbmVkIGluICUgLSBGaXhlcyAjNTI0NQoJCQlzaXplID0gewoJCQkJd2lkdGg6IGVsZW1lbnQud2lkdGgoKSwKCQkJCWhlaWdodDogZWxlbWVudC5oZWlnaHQoKQoJCQl9LAoJCQlhY3RpdmUgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwoKCQkvLyBzdXBwb3J0OiBGaXJlZm94CgkJLy8gRmlyZWZveCBpbmNvcnJlY3RseSBleHBvc2VzIGFub255bW91cyBjb250ZW50CgkJLy8gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTYxNjY0CgkJdHJ5IHsKCQkJYWN0aXZlLmlkOwoJCX0gY2F0Y2goIGUgKSB7CgkJCWFjdGl2ZSA9IGRvY3VtZW50LmJvZHk7CgkJfQoKCQllbGVtZW50LndyYXAoIHdyYXBwZXIgKTsKCgkJLy8gRml4ZXMgIzc1OTUgLSBFbGVtZW50cyBsb3NlIGZvY3VzIHdoZW4gd3JhcHBlZC4KCQlpZiAoIGVsZW1lbnRbIDAgXSA9PT0gYWN0aXZlIHx8ICQuY29udGFpbnMoIGVsZW1lbnRbIDAgXSwgYWN0aXZlICkgKSB7CgkJCSQoIGFjdGl2ZSApLmZvY3VzKCk7CgkJfQoKCQl3cmFwcGVyID0gZWxlbWVudC5wYXJlbnQoKTsgLy9Ib3RmaXggZm9yIGpRdWVyeSAxLjQgc2luY2Ugc29tZSBjaGFuZ2UgaW4gd3JhcCgpIHNlZW1zIHRvIGFjdHVhbGx5IGxvc2UgdGhlIHJlZmVyZW5jZSB0byB0aGUgd3JhcHBlZCBlbGVtZW50CgoJCS8vIHRyYW5zZmVyIHBvc2l0aW9uaW5nIHByb3BlcnRpZXMgdG8gdGhlIHdyYXBwZXIKCQlpZiAoIGVsZW1lbnQuY3NzKCAicG9zaXRpb24iICkgPT09ICJzdGF0aWMiICkgewoJCQl3cmFwcGVyLmNzcyh7IHBvc2l0aW9uOiAicmVsYXRpdmUiIH0pOwoJCQllbGVtZW50LmNzcyh7IHBvc2l0aW9uOiAicmVsYXRpdmUiIH0pOwoJCX0gZWxzZSB7CgkJCSQuZXh0ZW5kKCBwcm9wcywgewoJCQkJcG9zaXRpb246IGVsZW1lbnQuY3NzKCAicG9zaXRpb24iICksCgkJCQl6SW5kZXg6IGVsZW1lbnQuY3NzKCAiei1pbmRleCIgKQoJCQl9KTsKCQkJJC5lYWNoKFsgInRvcCIsICJsZWZ0IiwgImJvdHRvbSIsICJyaWdodCIgXSwgZnVuY3Rpb24oaSwgcG9zKSB7CgkJCQlwcm9wc1sgcG9zIF0gPSBlbGVtZW50LmNzcyggcG9zICk7CgkJCQlpZiAoIGlzTmFOKCBwYXJzZUludCggcHJvcHNbIHBvcyBdLCAxMCApICkgKSB7CgkJCQkJcHJvcHNbIHBvcyBdID0gImF1dG8iOwoJCQkJfQoJCQl9KTsKCQkJZWxlbWVudC5jc3MoewoJCQkJcG9zaXRpb246ICJyZWxhdGl2ZSIsCgkJCQl0b3A6IDAsCgkJCQlsZWZ0OiAwLAoJCQkJcmlnaHQ6ICJhdXRvIiwKCQkJCWJvdHRvbTogImF1dG8iCgkJCX0pOwoJCX0KCQllbGVtZW50LmNzcyhzaXplKTsKCgkJcmV0dXJuIHdyYXBwZXIuY3NzKCBwcm9wcyApLnNob3coKTsKCX0sCgoJcmVtb3ZlV3JhcHBlcjogZnVuY3Rpb24oIGVsZW1lbnQgKSB7CgkJdmFyIGFjdGl2ZSA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7CgoJCWlmICggZWxlbWVudC5wYXJlbnQoKS5pcyggIi51aS1lZmZlY3RzLXdyYXBwZXIiICkgKSB7CgkJCWVsZW1lbnQucGFyZW50KCkucmVwbGFjZVdpdGgoIGVsZW1lbnQgKTsKCgkJCS8vIEZpeGVzICM3NTk1IC0gRWxlbWVudHMgbG9zZSBmb2N1cyB3aGVuIHdyYXBwZWQuCgkJCWlmICggZWxlbWVudFsgMCBdID09PSBhY3RpdmUgfHwgJC5jb250YWlucyggZWxlbWVudFsgMCBdLCBhY3RpdmUgKSApIHsKCQkJCSQoIGFjdGl2ZSApLmZvY3VzKCk7CgkJCX0KCQl9CgoJCXJldHVybiBlbGVtZW50OwoJfSwKCglzZXRUcmFuc2l0aW9uOiBmdW5jdGlvbiggZWxlbWVudCwgbGlzdCwgZmFjdG9yLCB2YWx1ZSApIHsKCQl2YWx1ZSA9IHZhbHVlIHx8IHt9OwoJCSQuZWFjaCggbGlzdCwgZnVuY3Rpb24oIGksIHggKSB7CgkJCXZhciB1bml0ID0gZWxlbWVudC5jc3NVbml0KCB4ICk7CgkJCWlmICggdW5pdFsgMCBdID4gMCApIHsKCQkJCXZhbHVlWyB4IF0gPSB1bml0WyAwIF0gKiBmYWN0b3IgKyB1bml0WyAxIF07CgkJCX0KCQl9KTsKCQlyZXR1cm4gdmFsdWU7Cgl9Cn0pOwoKLy8gcmV0dXJuIGFuIGVmZmVjdCBvcHRpb25zIG9iamVjdCBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnM6CmZ1bmN0aW9uIF9ub3JtYWxpemVBcmd1bWVudHMoIGVmZmVjdCwgb3B0aW9ucywgc3BlZWQsIGNhbGxiYWNrICkgewoKCS8vIGFsbG93IHBhc3NpbmcgYWxsIG9wdGlvbnMgYXMgdGhlIGZpcnN0IHBhcmFtZXRlcgoJaWYgKCAkLmlzUGxhaW5PYmplY3QoIGVmZmVjdCApICkgewoJCW9wdGlvbnMgPSBlZmZlY3Q7CgkJZWZmZWN0ID0gZWZmZWN0LmVmZmVjdDsKCX0KCgkvLyBjb252ZXJ0IHRvIGFuIG9iamVjdAoJZWZmZWN0ID0geyBlZmZlY3Q6IGVmZmVjdCB9OwoKCS8vIGNhdGNoIChlZmZlY3QsIG51bGwsIC4uLikKCWlmICggb3B0aW9ucyA9PSBudWxsICkgewoJCW9wdGlvbnMgPSB7fTsKCX0KCgkvLyBjYXRjaCAoZWZmZWN0LCBjYWxsYmFjaykKCWlmICggJC5pc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7CgkJY2FsbGJhY2sgPSBvcHRpb25zOwoJCXNwZWVkID0gbnVsbDsKCQlvcHRpb25zID0ge307Cgl9CgoJLy8gY2F0Y2ggKGVmZmVjdCwgc3BlZWQsID8pCglpZiAoIHR5cGVvZiBvcHRpb25zID09PSAibnVtYmVyIiB8fCAkLmZ4LnNwZWVkc1sgb3B0aW9ucyBdICkgewoJCWNhbGxiYWNrID0gc3BlZWQ7CgkJc3BlZWQgPSBvcHRpb25zOwoJCW9wdGlvbnMgPSB7fTsKCX0KCgkvLyBjYXRjaCAoZWZmZWN0LCBvcHRpb25zLCBjYWxsYmFjaykKCWlmICggJC5pc0Z1bmN0aW9uKCBzcGVlZCApICkgewoJCWNhbGxiYWNrID0gc3BlZWQ7CgkJc3BlZWQgPSBudWxsOwoJfQoKCS8vIGFkZCBvcHRpb25zIHRvIGVmZmVjdAoJaWYgKCBvcHRpb25zICkgewoJCSQuZXh0ZW5kKCBlZmZlY3QsIG9wdGlvbnMgKTsKCX0KCglzcGVlZCA9IHNwZWVkIHx8IG9wdGlvbnMuZHVyYXRpb247CgllZmZlY3QuZHVyYXRpb24gPSAkLmZ4Lm9mZiA/IDAgOgoJCXR5cGVvZiBzcGVlZCA9PT0gIm51bWJlciIgPyBzcGVlZCA6CgkJc3BlZWQgaW4gJC5meC5zcGVlZHMgPyAkLmZ4LnNwZWVkc1sgc3BlZWQgXSA6CgkJJC5meC5zcGVlZHMuX2RlZmF1bHQ7CgoJZWZmZWN0LmNvbXBsZXRlID0gY2FsbGJhY2sgfHwgb3B0aW9ucy5jb21wbGV0ZTsKCglyZXR1cm4gZWZmZWN0Owp9CgpmdW5jdGlvbiBzdGFuZGFyZEFuaW1hdGlvbk9wdGlvbiggb3B0aW9uICkgewoJLy8gVmFsaWQgc3RhbmRhcmQgc3BlZWRzIChub3RoaW5nLCBudW1iZXIsIG5hbWVkIHNwZWVkKQoJaWYgKCAhb3B0aW9uIHx8IHR5cGVvZiBvcHRpb24gPT09ICJudW1iZXIiIHx8ICQuZnguc3BlZWRzWyBvcHRpb24gXSApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvLyBJbnZhbGlkIHN0cmluZ3MgLSB0cmVhdCBhcyAibm9ybWFsIiBzcGVlZAoJaWYgKCB0eXBlb2Ygb3B0aW9uID09PSAic3RyaW5nIiAmJiAhJC5lZmZlY3RzLmVmZmVjdFsgb3B0aW9uIF0gKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLy8gQ29tcGxldGUgY2FsbGJhY2sKCWlmICggJC5pc0Z1bmN0aW9uKCBvcHRpb24gKSApIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvLyBPcHRpb25zIGhhc2ggKGJ1dCBub3QgbmFtaW5nIGFuIGVmZmVjdCkKCWlmICggdHlwZW9mIG9wdGlvbiA9PT0gIm9iamVjdCIgJiYgIW9wdGlvbi5lZmZlY3QgKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJLy8gRGlkbid0IG1hdGNoIGFueSBzdGFuZGFyZCBBUEkKCXJldHVybiBmYWxzZTsKfQoKJC5mbi5leHRlbmQoewoJZWZmZWN0OiBmdW5jdGlvbiggLyogZWZmZWN0LCBvcHRpb25zLCBzcGVlZCwgY2FsbGJhY2sgKi8gKSB7CgkJdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSwKCQkJbW9kZSA9IGFyZ3MubW9kZSwKCQkJcXVldWUgPSBhcmdzLnF1ZXVlLAoJCQllZmZlY3RNZXRob2QgPSAkLmVmZmVjdHMuZWZmZWN0WyBhcmdzLmVmZmVjdCBdOwoKCQlpZiAoICQuZngub2ZmIHx8ICFlZmZlY3RNZXRob2QgKSB7CgkJCS8vIGRlbGVnYXRlIHRvIHRoZSBvcmlnaW5hbCBtZXRob2QgKGUuZy4sIC5zaG93KCkpIGlmIHBvc3NpYmxlCgkJCWlmICggbW9kZSApIHsKCQkJCXJldHVybiB0aGlzWyBtb2RlIF0oIGFyZ3MuZHVyYXRpb24sIGFyZ3MuY29tcGxldGUgKTsKCQkJfSBlbHNlIHsKCQkJCXJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkgewoJCQkJCWlmICggYXJncy5jb21wbGV0ZSApIHsKCQkJCQkJYXJncy5jb21wbGV0ZS5jYWxsKCB0aGlzICk7CgkJCQkJfQoJCQkJfSk7CgkJCX0KCQl9CgoJCWZ1bmN0aW9uIHJ1biggbmV4dCApIHsKCQkJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJCQljb21wbGV0ZSA9IGFyZ3MuY29tcGxldGUsCgkJCQltb2RlID0gYXJncy5tb2RlOwoKCQkJZnVuY3Rpb24gZG9uZSgpIHsKCQkJCWlmICggJC5pc0Z1bmN0aW9uKCBjb21wbGV0ZSApICkgewoJCQkJCWNvbXBsZXRlLmNhbGwoIGVsZW1bMF0gKTsKCQkJCX0KCQkJCWlmICggJC5pc0Z1bmN0aW9uKCBuZXh0ICkgKSB7CgkJCQkJbmV4dCgpOwoJCQkJfQoJCQl9CgoJCQkvLyBJZiB0aGUgZWxlbWVudCBhbHJlYWR5IGhhcyB0aGUgY29ycmVjdCBmaW5hbCBzdGF0ZSwgZGVsZWdhdGUgdG8KCQkJLy8gdGhlIGNvcmUgbWV0aG9kcyBzbyB0aGUgaW50ZXJuYWwgdHJhY2tpbmcgb2YgIm9sZGRpc3BsYXkiIHdvcmtzLgoJCQlpZiAoIGVsZW0uaXMoICI6aGlkZGVuIiApID8gbW9kZSA9PT0gImhpZGUiIDogbW9kZSA9PT0gInNob3ciICkgewoJCQkJZWxlbVsgbW9kZSBdKCk7CgkJCQlkb25lKCk7CgkJCX0gZWxzZSB7CgkJCQllZmZlY3RNZXRob2QuY2FsbCggZWxlbVswXSwgYXJncywgZG9uZSApOwoJCQl9CgkJfQoKCQlyZXR1cm4gcXVldWUgPT09IGZhbHNlID8gdGhpcy5lYWNoKCBydW4gKSA6IHRoaXMucXVldWUoIHF1ZXVlIHx8ICJmeCIsIHJ1biApOwoJfSwKCglzaG93OiAoZnVuY3Rpb24oIG9yaWcgKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCBvcHRpb24gKSB7CgkJCWlmICggc3RhbmRhcmRBbmltYXRpb25PcHRpb24oIG9wdGlvbiApICkgewoJCQkJcmV0dXJuIG9yaWcuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQl9IGVsc2UgewoJCQkJdmFyIGFyZ3MgPSBfbm9ybWFsaXplQXJndW1lbnRzLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJCWFyZ3MubW9kZSA9ICJzaG93IjsKCQkJCXJldHVybiB0aGlzLmVmZmVjdC5jYWxsKCB0aGlzLCBhcmdzICk7CgkJCX0KCQl9OwoJfSkoICQuZm4uc2hvdyApLAoKCWhpZGU6IChmdW5jdGlvbiggb3JpZyApIHsKCQlyZXR1cm4gZnVuY3Rpb24oIG9wdGlvbiApIHsKCQkJaWYgKCBzdGFuZGFyZEFuaW1hdGlvbk9wdGlvbiggb3B0aW9uICkgKSB7CgkJCQlyZXR1cm4gb3JpZy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCX0gZWxzZSB7CgkJCQl2YXIgYXJncyA9IF9ub3JtYWxpemVBcmd1bWVudHMuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApOwoJCQkJYXJncy5tb2RlID0gImhpZGUiOwoJCQkJcmV0dXJuIHRoaXMuZWZmZWN0LmNhbGwoIHRoaXMsIGFyZ3MgKTsKCQkJfQoJCX07Cgl9KSggJC5mbi5oaWRlICksCgoJdG9nZ2xlOiAoZnVuY3Rpb24oIG9yaWcgKSB7CgkJcmV0dXJuIGZ1bmN0aW9uKCBvcHRpb24gKSB7CgkJCWlmICggc3RhbmRhcmRBbmltYXRpb25PcHRpb24oIG9wdGlvbiApIHx8IHR5cGVvZiBvcHRpb24gPT09ICJib29sZWFuIiApIHsKCQkJCXJldHVybiBvcmlnLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQkJfSBlbHNlIHsKCQkJCXZhciBhcmdzID0gX25vcm1hbGl6ZUFyZ3VtZW50cy5hcHBseSggdGhpcywgYXJndW1lbnRzICk7CgkJCQlhcmdzLm1vZGUgPSAidG9nZ2xlIjsKCQkJCXJldHVybiB0aGlzLmVmZmVjdC5jYWxsKCB0aGlzLCBhcmdzICk7CgkJCX0KCQl9OwoJfSkoICQuZm4udG9nZ2xlICksCgoJLy8gaGVscGVyIGZ1bmN0aW9ucwoJY3NzVW5pdDogZnVuY3Rpb24oa2V5KSB7CgkJdmFyIHN0eWxlID0gdGhpcy5jc3MoIGtleSApLAoJCQl2YWwgPSBbXTsKCgkJJC5lYWNoKCBbICJlbSIsICJweCIsICIlIiwgInB0IiBdLCBmdW5jdGlvbiggaSwgdW5pdCApIHsKCQkJaWYgKCBzdHlsZS5pbmRleE9mKCB1bml0ICkgPiAwICkgewoJCQkJdmFsID0gWyBwYXJzZUZsb2F0KCBzdHlsZSApLCB1bml0IF07CgkJCX0KCQl9KTsKCQlyZXR1cm4gdmFsOwoJfQp9KTsKCn0pKCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRUFTSU5HICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKKGZ1bmN0aW9uKCkgewoKLy8gYmFzZWQgb24gZWFzaW5nIGVxdWF0aW9ucyBmcm9tIFJvYmVydCBQZW5uZXIgKGh0dHA6Ly93d3cucm9iZXJ0cGVubmVyLmNvbS9lYXNpbmcpCgp2YXIgYmFzZUVhc2luZ3MgPSB7fTsKCiQuZWFjaCggWyAiUXVhZCIsICJDdWJpYyIsICJRdWFydCIsICJRdWludCIsICJFeHBvIiBdLCBmdW5jdGlvbiggaSwgbmFtZSApIHsKCWJhc2VFYXNpbmdzWyBuYW1lIF0gPSBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gTWF0aC5wb3coIHAsIGkgKyAyICk7Cgl9Owp9KTsKCiQuZXh0ZW5kKCBiYXNlRWFzaW5ncywgewoJU2luZTogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDEgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgLyAyICk7Cgl9LAoJQ2lyYzogZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDEgLSBNYXRoLnNxcnQoIDEgLSBwICogcCApOwoJfSwKCUVsYXN0aWM6IGZ1bmN0aW9uKCBwICkgewoJCXJldHVybiBwID09PSAwIHx8IHAgPT09IDEgPyBwIDoKCQkJLU1hdGgucG93KCAyLCA4ICogKHAgLSAxKSApICogTWF0aC5zaW4oICggKHAgLSAxKSAqIDgwIC0gNy41ICkgKiBNYXRoLlBJIC8gMTUgKTsKCX0sCglCYWNrOiBmdW5jdGlvbiggcCApIHsKCQlyZXR1cm4gcCAqIHAgKiAoIDMgKiBwIC0gMiApOwoJfSwKCUJvdW5jZTogZnVuY3Rpb24oIHAgKSB7CgkJdmFyIHBvdzIsCgkJCWJvdW5jZSA9IDQ7CgoJCXdoaWxlICggcCA8ICggKCBwb3cyID0gTWF0aC5wb3coIDIsIC0tYm91bmNlICkgKSAtIDEgKSAvIDExICkge30KCQlyZXR1cm4gMSAvIE1hdGgucG93KCA0LCAzIC0gYm91bmNlICkgLSA3LjU2MjUgKiBNYXRoLnBvdyggKCBwb3cyICogMyAtIDIgKSAvIDIyIC0gcCwgMiApOwoJfQp9KTsKCiQuZWFjaCggYmFzZUVhc2luZ3MsIGZ1bmN0aW9uKCBuYW1lLCBlYXNlSW4gKSB7CgkkLmVhc2luZ1sgImVhc2VJbiIgKyBuYW1lIF0gPSBlYXNlSW47CgkkLmVhc2luZ1sgImVhc2VPdXQiICsgbmFtZSBdID0gZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIDEgLSBlYXNlSW4oIDEgLSBwICk7Cgl9OwoJJC5lYXNpbmdbICJlYXNlSW5PdXQiICsgbmFtZSBdID0gZnVuY3Rpb24oIHAgKSB7CgkJcmV0dXJuIHAgPCAwLjUgPwoJCQllYXNlSW4oIHAgKiAyICkgLyAyIDoKCQkJMSAtIGVhc2VJbiggcCAqIC0yICsgMiApIC8gMjsKCX07Cn0pOwoKfSkoKTsKCnZhciBlZmZlY3QgPSAkLmVmZmVjdHM7CgoKLyohCiAqIGpRdWVyeSBVSSBFZmZlY3RzIEJsaW5kIDEuMTEuMAogKiBodHRwOi8vanF1ZXJ5dWkuY29tCiAqCiAqIENvcHlyaWdodCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2JsaW5kLWVmZmVjdC8KICovCgoKdmFyIGVmZmVjdEJsaW5kID0gJC5lZmZlY3RzLmVmZmVjdC5ibGluZCA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJLy8gQ3JlYXRlIGVsZW1lbnQKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlydmVydGljYWwgPSAvdXB8ZG93bnx2ZXJ0aWNhbC8sCgkJcnBvc2l0aXZlbW90aW9uID0gL3VwfGxlZnR8dmVydGljYWx8aG9yaXpvbnRhbC8sCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAidXAiLAoJCXZlcnRpY2FsID0gcnZlcnRpY2FsLnRlc3QoIGRpcmVjdGlvbiApLAoJCXJlZiA9IHZlcnRpY2FsID8gImhlaWdodCIgOiAid2lkdGgiLAoJCXJlZjIgPSB2ZXJ0aWNhbCA/ICJ0b3AiIDogImxlZnQiLAoJCW1vdGlvbiA9IHJwb3NpdGl2ZW1vdGlvbi50ZXN0KCBkaXJlY3Rpb24gKSwKCQlhbmltYXRpb24gPSB7fSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCXdyYXBwZXIsIGRpc3RhbmNlLCBtYXJnaW47CgoJLy8gaWYgYWxyZWFkeSB3cmFwcGVkLCB0aGUgd3JhcHBlcidzIHByb3BlcnRpZXMgYXJlIG15IHByb3BlcnR5LiAjNjI0NQoJaWYgKCBlbC5wYXJlbnQoKS5pcyggIi51aS1lZmZlY3RzLXdyYXBwZXIiICkgKSB7CgkJJC5lZmZlY3RzLnNhdmUoIGVsLnBhcmVudCgpLCBwcm9wcyApOwoJfSBlbHNlIHsKCQkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7Cgl9CgllbC5zaG93KCk7Cgl3cmFwcGVyID0gJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICkuY3NzKHsKCQlvdmVyZmxvdzogImhpZGRlbiIKCX0pOwoKCWRpc3RhbmNlID0gd3JhcHBlclsgcmVmIF0oKTsKCW1hcmdpbiA9IHBhcnNlRmxvYXQoIHdyYXBwZXIuY3NzKCByZWYyICkgKSB8fCAwOwoKCWFuaW1hdGlvblsgcmVmIF0gPSBzaG93ID8gZGlzdGFuY2UgOiAwOwoJaWYgKCAhbW90aW9uICkgewoJCWVsCgkJCS5jc3MoIHZlcnRpY2FsID8gImJvdHRvbSIgOiAicmlnaHQiLCAwICkKCQkJLmNzcyggdmVydGljYWwgPyAidG9wIiA6ICJsZWZ0IiwgImF1dG8iICkKCQkJLmNzcyh7IHBvc2l0aW9uOiAiYWJzb2x1dGUiIH0pOwoKCQlhbmltYXRpb25bIHJlZjIgXSA9IHNob3cgPyBtYXJnaW4gOiBkaXN0YW5jZSArIG1hcmdpbjsKCX0KCgkvLyBzdGFydCBhdCAwIGlmIHdlIGFyZSBzaG93aW5nCglpZiAoIHNob3cgKSB7CgkJd3JhcHBlci5jc3MoIHJlZiwgMCApOwoJCWlmICggIW1vdGlvbiApIHsKCQkJd3JhcHBlci5jc3MoIHJlZjIsIG1hcmdpbiArIGRpc3RhbmNlICk7CgkJfQoJfQoKCS8vIEFuaW1hdGUKCXdyYXBwZXIuYW5pbWF0ZSggYW5pbWF0aW9uLCB7CgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5nOiBvLmVhc2luZywKCQlxdWV1ZTogZmFsc2UsCgkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfQoJfSk7Cn07CgoKLyohCiAqIGpRdWVyeSBVSSBFZmZlY3RzIEJvdW5jZSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9ib3VuY2UtZWZmZWN0LwogKi8KCgp2YXIgZWZmZWN0Qm91bmNlID0gJC5lZmZlY3RzLmVmZmVjdC5ib3VuY2UgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAid2lkdGgiIF0sCgoJCS8vIGRlZmF1bHRzOgoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiZWZmZWN0IiApLAoJCWhpZGUgPSBtb2RlID09PSAiaGlkZSIsCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAidXAiLAoJCWRpc3RhbmNlID0gby5kaXN0YW5jZSwKCQl0aW1lcyA9IG8udGltZXMgfHwgNSwKCgkJLy8gbnVtYmVyIG9mIGludGVybmFsIGFuaW1hdGlvbnMKCQlhbmltcyA9IHRpbWVzICogMiArICggc2hvdyB8fCBoaWRlID8gMSA6IDAgKSwKCQlzcGVlZCA9IG8uZHVyYXRpb24gLyBhbmltcywKCQllYXNpbmcgPSBvLmVhc2luZywKCgkJLy8gdXRpbGl0eToKCQlyZWYgPSAoIGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24gPT09ICJkb3duIiApID8gInRvcCIgOiAibGVmdCIsCgkJbW90aW9uID0gKCBkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAibGVmdCIgKSwKCQlpLAoJCXVwQW5pbSwKCQlkb3duQW5pbSwKCgkJLy8gd2Ugd2lsbCBuZWVkIHRvIHJlLWFzc2VtYmxlIHRoZSBxdWV1ZSB0byBzdGFjayBvdXIgYW5pbWF0aW9ucyBpbiBwbGFjZQoJCXF1ZXVlID0gZWwucXVldWUoKSwKCQlxdWV1ZWxlbiA9IHF1ZXVlLmxlbmd0aDsKCgkvLyBBdm9pZCB0b3VjaGluZyBvcGFjaXR5IHRvIHByZXZlbnQgY2xlYXJUeXBlIGFuZCBQTkcgaXNzdWVzIGluIElFCglpZiAoIHNob3cgfHwgaGlkZSApIHsKCQlwcm9wcy5wdXNoKCAib3BhY2l0eSIgKTsKCX0KCgkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7CgllbC5zaG93KCk7CgkkLmVmZmVjdHMuY3JlYXRlV3JhcHBlciggZWwgKTsgLy8gQ3JlYXRlIFdyYXBwZXIKCgkvLyBkZWZhdWx0IGRpc3RhbmNlIGZvciB0aGUgQklHR0VTVCBib3VuY2UgaXMgdGhlIG91dGVyIERpc3RhbmNlIC8gMwoJaWYgKCAhZGlzdGFuY2UgKSB7CgkJZGlzdGFuY2UgPSBlbFsgcmVmID09PSAidG9wIiA/ICJvdXRlckhlaWdodCIgOiAib3V0ZXJXaWR0aCIgXSgpIC8gMzsKCX0KCglpZiAoIHNob3cgKSB7CgkJZG93bkFuaW0gPSB7IG9wYWNpdHk6IDEgfTsKCQlkb3duQW5pbVsgcmVmIF0gPSAwOwoKCQkvLyBpZiB3ZSBhcmUgc2hvd2luZywgZm9yY2Ugb3BhY2l0eSAwIGFuZCBzZXQgdGhlIGluaXRpYWwgcG9zaXRpb24KCQkvLyB0aGVuIGRvIHRoZSAiZmlyc3QiIGFuaW1hdGlvbgoJCWVsLmNzcyggIm9wYWNpdHkiLCAwICkKCQkJLmNzcyggcmVmLCBtb3Rpb24gPyAtZGlzdGFuY2UgKiAyIDogZGlzdGFuY2UgKiAyICkKCQkJLmFuaW1hdGUoIGRvd25BbmltLCBzcGVlZCwgZWFzaW5nICk7Cgl9CgoJLy8gc3RhcnQgYXQgdGhlIHNtYWxsZXN0IGRpc3RhbmNlIGlmIHdlIGFyZSBoaWRpbmcKCWlmICggaGlkZSApIHsKCQlkaXN0YW5jZSA9IGRpc3RhbmNlIC8gTWF0aC5wb3coIDIsIHRpbWVzIC0gMSApOwoJfQoKCWRvd25BbmltID0ge307Cglkb3duQW5pbVsgcmVmIF0gPSAwOwoJLy8gQm91bmNlcyB1cC9kb3duL2xlZnQvcmlnaHQgdGhlbiBiYWNrIHRvIDAgLS0gdGltZXMgKiAyIGFuaW1hdGlvbnMgaGFwcGVuIGhlcmUKCWZvciAoIGkgPSAwOyBpIDwgdGltZXM7IGkrKyApIHsKCQl1cEFuaW0gPSB7fTsKCQl1cEFuaW1bIHJlZiBdID0gKCBtb3Rpb24gPyAiLT0iIDogIis9IiApICsgZGlzdGFuY2U7CgoJCWVsLmFuaW1hdGUoIHVwQW5pbSwgc3BlZWQsIGVhc2luZyApCgkJCS5hbmltYXRlKCBkb3duQW5pbSwgc3BlZWQsIGVhc2luZyApOwoKCQlkaXN0YW5jZSA9IGhpZGUgPyBkaXN0YW5jZSAqIDIgOiBkaXN0YW5jZSAvIDI7Cgl9CgoJLy8gTGFzdCBCb3VuY2Ugd2hlbiBIaWRpbmcKCWlmICggaGlkZSApIHsKCQl1cEFuaW0gPSB7IG9wYWNpdHk6IDAgfTsKCQl1cEFuaW1bIHJlZiBdID0gKCBtb3Rpb24gPyAiLT0iIDogIis9IiApICsgZGlzdGFuY2U7CgoJCWVsLmFuaW1hdGUoIHVwQW5pbSwgc3BlZWQsIGVhc2luZyApOwoJfQoKCWVsLnF1ZXVlKGZ1bmN0aW9uKCkgewoJCWlmICggaGlkZSApIHsKCQkJZWwuaGlkZSgpOwoJCX0KCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJJC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVsICk7CgkJZG9uZSgpOwoJfSk7CgoJLy8gaW5qZWN0IGFsbCB0aGUgYW5pbWF0aW9ucyB3ZSBqdXN0IHF1ZXVlZCB0byBiZSBmaXJzdCBpbiBsaW5lIChhZnRlciAiaW5wcm9ncmVzcyIpCglpZiAoIHF1ZXVlbGVuID4gMSkgewoJCXF1ZXVlLnNwbGljZS5hcHBseSggcXVldWUsCgkJCVsgMSwgMCBdLmNvbmNhdCggcXVldWUuc3BsaWNlKCBxdWV1ZWxlbiwgYW5pbXMgKyAxICkgKSApOwoJfQoJZWwuZGVxdWV1ZSgpOwoKfTsKCgovKiEKICogalF1ZXJ5IFVJIEVmZmVjdHMgQ2xpcCAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9jbGlwLWVmZmVjdC8KICovCgoKdmFyIGVmZmVjdENsaXAgPSAkLmVmZmVjdHMuZWZmZWN0LmNsaXAgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgZWwgPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAiaGVpZ2h0IiwgIndpZHRoIiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCWRpcmVjdGlvbiA9IG8uZGlyZWN0aW9uIHx8ICJ2ZXJ0aWNhbCIsCgkJdmVydCA9IGRpcmVjdGlvbiA9PT0gInZlcnRpY2FsIiwKCQlzaXplID0gdmVydCA/ICJoZWlnaHQiIDogIndpZHRoIiwKCQlwb3NpdGlvbiA9IHZlcnQgPyAidG9wIiA6ICJsZWZ0IiwKCQlhbmltYXRpb24gPSB7fSwKCQl3cmFwcGVyLCBhbmltYXRlLCBkaXN0YW5jZTsKCgkvLyBTYXZlICYgU2hvdwoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoKCS8vIENyZWF0ZSBXcmFwcGVyCgl3cmFwcGVyID0gJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICkuY3NzKHsKCQlvdmVyZmxvdzogImhpZGRlbiIKCX0pOwoJYW5pbWF0ZSA9ICggZWxbMF0udGFnTmFtZSA9PT0gIklNRyIgKSA/IHdyYXBwZXIgOiBlbDsKCWRpc3RhbmNlID0gYW5pbWF0ZVsgc2l6ZSBdKCk7CgoJLy8gU2hpZnQKCWlmICggc2hvdyApIHsKCQlhbmltYXRlLmNzcyggc2l6ZSwgMCApOwoJCWFuaW1hdGUuY3NzKCBwb3NpdGlvbiwgZGlzdGFuY2UgLyAyICk7Cgl9CgoJLy8gQ3JlYXRlIEFuaW1hdGlvbiBPYmplY3Q6CglhbmltYXRpb25bIHNpemUgXSA9IHNob3cgPyBkaXN0YW5jZSA6IDA7CglhbmltYXRpb25bIHBvc2l0aW9uIF0gPSBzaG93ID8gMCA6IGRpc3RhbmNlIC8gMjsKCgkvLyBBbmltYXRlCglhbmltYXRlLmFuaW1hdGUoIGFuaW1hdGlvbiwgewoJCXF1ZXVlOiBmYWxzZSwKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQllYXNpbmc6IG8uZWFzaW5nLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJaWYgKCAhc2hvdyApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfQoJfSk7Cgp9OwoKCi8qIQogKiBqUXVlcnkgVUkgRWZmZWN0cyBEcm9wIDEuMTEuMAogKiBodHRwOi8vanF1ZXJ5dWkuY29tCiAqCiAqIENvcHlyaWdodCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2Ryb3AtZWZmZWN0LwogKi8KCgp2YXIgZWZmZWN0RHJvcCA9ICQuZWZmZWN0cy5lZmZlY3QuZHJvcCA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJvcGFjaXR5IiwgImhlaWdodCIsICJ3aWR0aCIgXSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImhpZGUiICksCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAibGVmdCIsCgkJcmVmID0gKCBkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAiZG93biIgKSA/ICJ0b3AiIDogImxlZnQiLAoJCW1vdGlvbiA9ICggZGlyZWN0aW9uID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImxlZnQiICkgPyAicG9zIiA6ICJuZWciLAoJCWFuaW1hdGlvbiA9IHsKCQkJb3BhY2l0eTogc2hvdyA/IDEgOiAwCgkJfSwKCQlkaXN0YW5jZTsKCgkvLyBBZGp1c3QKCSQuZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMgKTsKCWVsLnNob3coKTsKCSQuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBlbCApOwoKCWRpc3RhbmNlID0gby5kaXN0YW5jZSB8fCBlbFsgcmVmID09PSAidG9wIiA/ICJvdXRlckhlaWdodCI6ICJvdXRlcldpZHRoIiBdKCB0cnVlICkgLyAyOwoKCWlmICggc2hvdyApIHsKCQllbAoJCQkuY3NzKCAib3BhY2l0eSIsIDAgKQoJCQkuY3NzKCByZWYsIG1vdGlvbiA9PT0gInBvcyIgPyAtZGlzdGFuY2UgOiBkaXN0YW5jZSApOwoJfQoKCS8vIEFuaW1hdGlvbgoJYW5pbWF0aW9uWyByZWYgXSA9ICggc2hvdyA/CgkJKCBtb3Rpb24gPT09ICJwb3MiID8gIis9IiA6ICItPSIgKSA6CgkJKCBtb3Rpb24gPT09ICJwb3MiID8gIi09IiA6ICIrPSIgKSApICsKCQlkaXN0YW5jZTsKCgkvLyBBbmltYXRlCgllbC5hbmltYXRlKCBhbmltYXRpb24sIHsKCQlxdWV1ZTogZmFsc2UsCgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5nOiBvLmVhc2luZywKCQljb21wbGV0ZTogZnVuY3Rpb24oKSB7CgkJCWlmICggbW9kZSA9PT0gImhpZGUiICkgewoJCQkJZWwuaGlkZSgpOwoJCQl9CgkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMgKTsKCQkJJC5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoIGVsICk7CgkJCWRvbmUoKTsKCQl9Cgl9KTsKfTsKCgovKiEKICogalF1ZXJ5IFVJIEVmZmVjdHMgRXhwbG9kZSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9leHBsb2RlLWVmZmVjdC8KICovCgoKdmFyIGVmZmVjdEV4cGxvZGUgPSAkLmVmZmVjdHMuZWZmZWN0LmV4cGxvZGUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCgl2YXIgcm93cyA9IG8ucGllY2VzID8gTWF0aC5yb3VuZCggTWF0aC5zcXJ0KCBvLnBpZWNlcyApICkgOiAzLAoJCWNlbGxzID0gcm93cywKCQllbCA9ICQoIHRoaXMgKSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImhpZGUiICksCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCgkJLy8gc2hvdyBhbmQgdGhlbiB2aXNpYmlsaXR5OmhpZGRlbiB0aGUgZWxlbWVudCBiZWZvcmUgY2FsY3VsYXRpbmcgb2Zmc2V0CgkJb2Zmc2V0ID0gZWwuc2hvdygpLmNzcyggInZpc2liaWxpdHkiLCAiaGlkZGVuIiApLm9mZnNldCgpLAoKCQkvLyB3aWR0aCBhbmQgaGVpZ2h0IG9mIGEgcGllY2UKCQl3aWR0aCA9IE1hdGguY2VpbCggZWwub3V0ZXJXaWR0aCgpIC8gY2VsbHMgKSwKCQloZWlnaHQgPSBNYXRoLmNlaWwoIGVsLm91dGVySGVpZ2h0KCkgLyByb3dzICksCgkJcGllY2VzID0gW10sCgoJCS8vIGxvb3AKCQlpLCBqLCBsZWZ0LCB0b3AsIG14LCBteTsKCgkvLyBjaGlsZHJlbiBhbmltYXRlIGNvbXBsZXRlOgoJZnVuY3Rpb24gY2hpbGRDb21wbGV0ZSgpIHsKCQlwaWVjZXMucHVzaCggdGhpcyApOwoJCWlmICggcGllY2VzLmxlbmd0aCA9PT0gcm93cyAqIGNlbGxzICkgewoJCQlhbmltQ29tcGxldGUoKTsKCQl9Cgl9CgoJLy8gY2xvbmUgdGhlIGVsZW1lbnQgZm9yIGVhY2ggcm93IGFuZCBjZWxsLgoJZm9yICggaSA9IDA7IGkgPCByb3dzIDsgaSsrICkgeyAvLyA9PT0+CgkJdG9wID0gb2Zmc2V0LnRvcCArIGkgKiBoZWlnaHQ7CgkJbXkgPSBpIC0gKCByb3dzIC0gMSApIC8gMiA7CgoJCWZvciAoIGogPSAwOyBqIDwgY2VsbHMgOyBqKysgKSB7IC8vIHx8fAoJCQlsZWZ0ID0gb2Zmc2V0LmxlZnQgKyBqICogd2lkdGg7CgkJCW14ID0gaiAtICggY2VsbHMgLSAxICkgLyAyIDsKCgkJCS8vIENyZWF0ZSBhIGNsb25lIG9mIHRoZSBub3cgaGlkZGVuIG1haW4gZWxlbWVudCB0aGF0IHdpbGwgYmUgYWJzb2x1dGUgcG9zaXRpb25lZAoJCQkvLyB3aXRoaW4gYSB3cmFwcGVyIGRpdiBvZmYgdGhlIC1sZWZ0IGFuZCAtdG9wIGVxdWFsIHRvIHNpemUgb2Ygb3VyIHBpZWNlcwoJCQllbAoJCQkJLmNsb25lKCkKCQkJCS5hcHBlbmRUbyggImJvZHkiICkKCQkJCS53cmFwKCAiPGRpdj48L2Rpdj4iICkKCQkJCS5jc3MoewoJCQkJCXBvc2l0aW9uOiAiYWJzb2x1dGUiLAoJCQkJCXZpc2liaWxpdHk6ICJ2aXNpYmxlIiwKCQkJCQlsZWZ0OiAtaiAqIHdpZHRoLAoJCQkJCXRvcDogLWkgKiBoZWlnaHQKCQkJCX0pCgoJCQkvLyBzZWxlY3QgdGhlIHdyYXBwZXIgLSBtYWtlIGl0IG92ZXJmbG93OiBoaWRkZW4gYW5kIGFic29sdXRlIHBvc2l0aW9uZWQgYmFzZWQgb24KCQkJLy8gd2hlcmUgdGhlIG9yaWdpbmFsIHdhcyBsb2NhdGVkICtsZWZ0IGFuZCArdG9wIGVxdWFsIHRvIHRoZSBzaXplIG9mIHBpZWNlcwoJCQkJLnBhcmVudCgpCgkJCQkuYWRkQ2xhc3MoICJ1aS1lZmZlY3RzLWV4cGxvZGUiICkKCQkJCS5jc3MoewoJCQkJCXBvc2l0aW9uOiAiYWJzb2x1dGUiLAoJCQkJCW92ZXJmbG93OiAiaGlkZGVuIiwKCQkJCQl3aWR0aDogd2lkdGgsCgkJCQkJaGVpZ2h0OiBoZWlnaHQsCgkJCQkJbGVmdDogbGVmdCArICggc2hvdyA/IG14ICogd2lkdGggOiAwICksCgkJCQkJdG9wOiB0b3AgKyAoIHNob3cgPyBteSAqIGhlaWdodCA6IDAgKSwKCQkJCQlvcGFjaXR5OiBzaG93ID8gMCA6IDEKCQkJCX0pLmFuaW1hdGUoewoJCQkJCWxlZnQ6IGxlZnQgKyAoIHNob3cgPyAwIDogbXggKiB3aWR0aCApLAoJCQkJCXRvcDogdG9wICsgKCBzaG93ID8gMCA6IG15ICogaGVpZ2h0ICksCgkJCQkJb3BhY2l0eTogc2hvdyA/IDEgOiAwCgkJCQl9LCBvLmR1cmF0aW9uIHx8IDUwMCwgby5lYXNpbmcsIGNoaWxkQ29tcGxldGUgKTsKCQl9Cgl9CgoJZnVuY3Rpb24gYW5pbUNvbXBsZXRlKCkgewoJCWVsLmNzcyh7CgkJCXZpc2liaWxpdHk6ICJ2aXNpYmxlIgoJCX0pOwoJCSQoIHBpZWNlcyApLnJlbW92ZSgpOwoJCWlmICggIXNob3cgKSB7CgkJCWVsLmhpZGUoKTsKCQl9CgkJZG9uZSgpOwoJfQp9OwoKCi8qIQogKiBqUXVlcnkgVUkgRWZmZWN0cyBGYWRlIDEuMTEuMAogKiBodHRwOi8vanF1ZXJ5dWkuY29tCiAqCiAqIENvcHlyaWdodCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL2ZhZGUtZWZmZWN0LwogKi8KCgp2YXIgZWZmZWN0RmFkZSA9ICQuZWZmZWN0cy5lZmZlY3QuZmFkZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJdmFyIGVsID0gJCggdGhpcyApLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAidG9nZ2xlIiApOwoKCWVsLmFuaW1hdGUoewoJCW9wYWNpdHk6IG1vZGUKCX0sIHsKCQlxdWV1ZTogZmFsc2UsCgkJZHVyYXRpb246IG8uZHVyYXRpb24sCgkJZWFzaW5nOiBvLmVhc2luZywKCQljb21wbGV0ZTogZG9uZQoJfSk7Cn07CgoKLyohCiAqIGpRdWVyeSBVSSBFZmZlY3RzIEZvbGQgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vZm9sZC1lZmZlY3QvCiAqLwoKCnZhciBlZmZlY3RGb2xkID0gJC5lZmZlY3RzLmVmZmVjdC5mb2xkID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7CgoJLy8gQ3JlYXRlIGVsZW1lbnQKCXZhciBlbCA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJoZWlnaHQiLCAid2lkdGgiIF0sCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbCwgby5tb2RlIHx8ICJoaWRlIiApLAoJCXNob3cgPSBtb2RlID09PSAic2hvdyIsCgkJaGlkZSA9IG1vZGUgPT09ICJoaWRlIiwKCQlzaXplID0gby5zaXplIHx8IDE1LAoJCXBlcmNlbnQgPSAvKFswLTldKyklLy5leGVjKCBzaXplICksCgkJaG9yaXpGaXJzdCA9ICEhby5ob3JpekZpcnN0LAoJCXdpZHRoRmlyc3QgPSBzaG93ICE9PSBob3JpekZpcnN0LAoJCXJlZiA9IHdpZHRoRmlyc3QgPyBbICJ3aWR0aCIsICJoZWlnaHQiIF0gOiBbICJoZWlnaHQiLCAid2lkdGgiIF0sCgkJZHVyYXRpb24gPSBvLmR1cmF0aW9uIC8gMiwKCQl3cmFwcGVyLCBkaXN0YW5jZSwKCQlhbmltYXRpb24xID0ge30sCgkJYW5pbWF0aW9uMiA9IHt9OwoKCSQuZWZmZWN0cy5zYXZlKCBlbCwgcHJvcHMgKTsKCWVsLnNob3coKTsKCgkvLyBDcmVhdGUgV3JhcHBlcgoJd3JhcHBlciA9ICQuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKCBlbCApLmNzcyh7CgkJb3ZlcmZsb3c6ICJoaWRkZW4iCgl9KTsKCWRpc3RhbmNlID0gd2lkdGhGaXJzdCA/CgkJWyB3cmFwcGVyLndpZHRoKCksIHdyYXBwZXIuaGVpZ2h0KCkgXSA6CgkJWyB3cmFwcGVyLmhlaWdodCgpLCB3cmFwcGVyLndpZHRoKCkgXTsKCglpZiAoIHBlcmNlbnQgKSB7CgkJc2l6ZSA9IHBhcnNlSW50KCBwZXJjZW50WyAxIF0sIDEwICkgLyAxMDAgKiBkaXN0YW5jZVsgaGlkZSA/IDAgOiAxIF07Cgl9CglpZiAoIHNob3cgKSB7CgkJd3JhcHBlci5jc3MoIGhvcml6Rmlyc3QgPyB7CgkJCWhlaWdodDogMCwKCQkJd2lkdGg6IHNpemUKCQl9IDogewoJCQloZWlnaHQ6IHNpemUsCgkJCXdpZHRoOiAwCgkJfSk7Cgl9CgoJLy8gQW5pbWF0aW9uCglhbmltYXRpb24xWyByZWZbIDAgXSBdID0gc2hvdyA/IGRpc3RhbmNlWyAwIF0gOiBzaXplOwoJYW5pbWF0aW9uMlsgcmVmWyAxIF0gXSA9IHNob3cgPyBkaXN0YW5jZVsgMSBdIDogMDsKCgkvLyBBbmltYXRlCgl3cmFwcGVyCgkJLmFuaW1hdGUoIGFuaW1hdGlvbjEsIGR1cmF0aW9uLCBvLmVhc2luZyApCgkJLmFuaW1hdGUoIGFuaW1hdGlvbjIsIGR1cmF0aW9uLCBvLmVhc2luZywgZnVuY3Rpb24oKSB7CgkJCWlmICggaGlkZSApIHsKCQkJCWVsLmhpZGUoKTsKCQkJfQoJCQkkLmVmZmVjdHMucmVzdG9yZSggZWwsIHByb3BzICk7CgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfSk7Cgp9OwoKCi8qIQogKiBqUXVlcnkgVUkgRWZmZWN0cyBIaWdobGlnaHQgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vaGlnaGxpZ2h0LWVmZmVjdC8KICovCgoKdmFyIGVmZmVjdEhpZ2hsaWdodCA9ICQuZWZmZWN0cy5lZmZlY3QuaGlnaGxpZ2h0ID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7Cgl2YXIgZWxlbSA9ICQoIHRoaXMgKSwKCQlwcm9wcyA9IFsgImJhY2tncm91bmRJbWFnZSIsICJiYWNrZ3JvdW5kQ29sb3IiLCAib3BhY2l0eSIgXSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsZW0sIG8ubW9kZSB8fCAic2hvdyIgKSwKCQlhbmltYXRpb24gPSB7CgkJCWJhY2tncm91bmRDb2xvcjogZWxlbS5jc3MoICJiYWNrZ3JvdW5kQ29sb3IiICkKCQl9OwoKCWlmIChtb2RlID09PSAiaGlkZSIpIHsKCQlhbmltYXRpb24ub3BhY2l0eSA9IDA7Cgl9CgoJJC5lZmZlY3RzLnNhdmUoIGVsZW0sIHByb3BzICk7CgoJZWxlbQoJCS5zaG93KCkKCQkuY3NzKHsKCQkJYmFja2dyb3VuZEltYWdlOiAibm9uZSIsCgkJCWJhY2tncm91bmRDb2xvcjogby5jb2xvciB8fCAiI2ZmZmY5OSIKCQl9KQoJCS5hbmltYXRlKCBhbmltYXRpb24sIHsKCQkJcXVldWU6IGZhbHNlLAoJCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQkJZWFzaW5nOiBvLmVhc2luZywKCQkJY29tcGxldGU6IGZ1bmN0aW9uKCkgewoJCQkJaWYgKCBtb2RlID09PSAiaGlkZSIgKSB7CgkJCQkJZWxlbS5oaWRlKCk7CgkJCQl9CgkJCQkkLmVmZmVjdHMucmVzdG9yZSggZWxlbSwgcHJvcHMgKTsKCQkJCWRvbmUoKTsKCQkJfQoJCX0pOwp9OwoKCi8qIQogKiBqUXVlcnkgVUkgRWZmZWN0cyBTaXplIDEuMTEuMAogKiBodHRwOi8vanF1ZXJ5dWkuY29tCiAqCiAqIENvcHlyaWdodCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL3NpemUtZWZmZWN0LwogKi8KCgp2YXIgZWZmZWN0U2l6ZSA9ICQuZWZmZWN0cy5lZmZlY3Quc2l6ZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgb3JpZ2luYWwsIGJhc2VsaW5lLCBmYWN0b3IsCgkJZWwgPSAkKCB0aGlzICksCgkJcHJvcHMwID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgIndpZHRoIiwgImhlaWdodCIsICJvdmVyZmxvdyIsICJvcGFjaXR5IiBdLAoKCQkvLyBBbHdheXMgcmVzdG9yZQoJCXByb3BzMSA9IFsgInBvc2l0aW9uIiwgInRvcCIsICJib3R0b20iLCAibGVmdCIsICJyaWdodCIsICJvdmVyZmxvdyIsICJvcGFjaXR5IiBdLAoKCQkvLyBDb3B5IGZvciBjaGlsZHJlbgoJCXByb3BzMiA9IFsgIndpZHRoIiwgImhlaWdodCIsICJvdmVyZmxvdyIgXSwKCQljUHJvcHMgPSBbICJmb250U2l6ZSIgXSwKCQl2UHJvcHMgPSBbICJib3JkZXJUb3BXaWR0aCIsICJib3JkZXJCb3R0b21XaWR0aCIsICJwYWRkaW5nVG9wIiwgInBhZGRpbmdCb3R0b20iIF0sCgkJaFByb3BzID0gWyAiYm9yZGVyTGVmdFdpZHRoIiwgImJvcmRlclJpZ2h0V2lkdGgiLCAicGFkZGluZ0xlZnQiLCAicGFkZGluZ1JpZ2h0IiBdLAoKCQkvLyBTZXQgb3B0aW9ucwoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAiZWZmZWN0IiApLAoJCXJlc3RvcmUgPSBvLnJlc3RvcmUgfHwgbW9kZSAhPT0gImVmZmVjdCIsCgkJc2NhbGUgPSBvLnNjYWxlIHx8ICJib3RoIiwKCQlvcmlnaW4gPSBvLm9yaWdpbiB8fCBbICJtaWRkbGUiLCAiY2VudGVyIiBdLAoJCXBvc2l0aW9uID0gZWwuY3NzKCAicG9zaXRpb24iICksCgkJcHJvcHMgPSByZXN0b3JlID8gcHJvcHMwIDogcHJvcHMxLAoJCXplcm8gPSB7CgkJCWhlaWdodDogMCwKCQkJd2lkdGg6IDAsCgkJCW91dGVySGVpZ2h0OiAwLAoJCQlvdXRlcldpZHRoOiAwCgkJfTsKCglpZiAoIG1vZGUgPT09ICJzaG93IiApIHsKCQllbC5zaG93KCk7Cgl9CglvcmlnaW5hbCA9IHsKCQloZWlnaHQ6IGVsLmhlaWdodCgpLAoJCXdpZHRoOiBlbC53aWR0aCgpLAoJCW91dGVySGVpZ2h0OiBlbC5vdXRlckhlaWdodCgpLAoJCW91dGVyV2lkdGg6IGVsLm91dGVyV2lkdGgoKQoJfTsKCglpZiAoIG8ubW9kZSA9PT0gInRvZ2dsZSIgJiYgbW9kZSA9PT0gInNob3ciICkgewoJCWVsLmZyb20gPSBvLnRvIHx8IHplcm87CgkJZWwudG8gPSBvLmZyb20gfHwgb3JpZ2luYWw7Cgl9IGVsc2UgewoJCWVsLmZyb20gPSBvLmZyb20gfHwgKCBtb2RlID09PSAic2hvdyIgPyB6ZXJvIDogb3JpZ2luYWwgKTsKCQllbC50byA9IG8udG8gfHwgKCBtb2RlID09PSAiaGlkZSIgPyB6ZXJvIDogb3JpZ2luYWwgKTsKCX0KCgkvLyBTZXQgc2NhbGluZyBmYWN0b3IKCWZhY3RvciA9IHsKCQlmcm9tOiB7CgkJCXk6IGVsLmZyb20uaGVpZ2h0IC8gb3JpZ2luYWwuaGVpZ2h0LAoJCQl4OiBlbC5mcm9tLndpZHRoIC8gb3JpZ2luYWwud2lkdGgKCQl9LAoJCXRvOiB7CgkJCXk6IGVsLnRvLmhlaWdodCAvIG9yaWdpbmFsLmhlaWdodCwKCQkJeDogZWwudG8ud2lkdGggLyBvcmlnaW5hbC53aWR0aAoJCX0KCX07CgoJLy8gU2NhbGUgdGhlIGNzcyBib3gKCWlmICggc2NhbGUgPT09ICJib3giIHx8IHNjYWxlID09PSAiYm90aCIgKSB7CgoJCS8vIFZlcnRpY2FsIHByb3BzIHNjYWxpbmcKCQlpZiAoIGZhY3Rvci5mcm9tLnkgIT09IGZhY3Rvci50by55ICkgewoJCQlwcm9wcyA9IHByb3BzLmNvbmNhdCggdlByb3BzICk7CgkJCWVsLmZyb20gPSAkLmVmZmVjdHMuc2V0VHJhbnNpdGlvbiggZWwsIHZQcm9wcywgZmFjdG9yLmZyb20ueSwgZWwuZnJvbSApOwoJCQllbC50byA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgdlByb3BzLCBmYWN0b3IudG8ueSwgZWwudG8gKTsKCQl9CgoJCS8vIEhvcml6b250YWwgcHJvcHMgc2NhbGluZwoJCWlmICggZmFjdG9yLmZyb20ueCAhPT0gZmFjdG9yLnRvLnggKSB7CgkJCXByb3BzID0gcHJvcHMuY29uY2F0KCBoUHJvcHMgKTsKCQkJZWwuZnJvbSA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgaFByb3BzLCBmYWN0b3IuZnJvbS54LCBlbC5mcm9tICk7CgkJCWVsLnRvID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGVsLCBoUHJvcHMsIGZhY3Rvci50by54LCBlbC50byApOwoJCX0KCX0KCgkvLyBTY2FsZSB0aGUgY29udGVudAoJaWYgKCBzY2FsZSA9PT0gImNvbnRlbnQiIHx8IHNjYWxlID09PSAiYm90aCIgKSB7CgoJCS8vIFZlcnRpY2FsIHByb3BzIHNjYWxpbmcKCQlpZiAoIGZhY3Rvci5mcm9tLnkgIT09IGZhY3Rvci50by55ICkgewoJCQlwcm9wcyA9IHByb3BzLmNvbmNhdCggY1Byb3BzICkuY29uY2F0KCBwcm9wczIgKTsKCQkJZWwuZnJvbSA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBlbCwgY1Byb3BzLCBmYWN0b3IuZnJvbS55LCBlbC5mcm9tICk7CgkJCWVsLnRvID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGVsLCBjUHJvcHMsIGZhY3Rvci50by55LCBlbC50byApOwoJCX0KCX0KCgkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7CgllbC5zaG93KCk7CgkkLmVmZmVjdHMuY3JlYXRlV3JhcHBlciggZWwgKTsKCWVsLmNzcyggIm92ZXJmbG93IiwgImhpZGRlbiIgKS5jc3MoIGVsLmZyb20gKTsKCgkvLyBBZGp1c3QKCWlmIChvcmlnaW4pIHsgLy8gQ2FsY3VsYXRlIGJhc2VsaW5lIHNoaWZ0cwoJCWJhc2VsaW5lID0gJC5lZmZlY3RzLmdldEJhc2VsaW5lKCBvcmlnaW4sIG9yaWdpbmFsICk7CgkJZWwuZnJvbS50b3AgPSAoIG9yaWdpbmFsLm91dGVySGVpZ2h0IC0gZWwub3V0ZXJIZWlnaHQoKSApICogYmFzZWxpbmUueTsKCQllbC5mcm9tLmxlZnQgPSAoIG9yaWdpbmFsLm91dGVyV2lkdGggLSBlbC5vdXRlcldpZHRoKCkgKSAqIGJhc2VsaW5lLng7CgkJZWwudG8udG9wID0gKCBvcmlnaW5hbC5vdXRlckhlaWdodCAtIGVsLnRvLm91dGVySGVpZ2h0ICkgKiBiYXNlbGluZS55OwoJCWVsLnRvLmxlZnQgPSAoIG9yaWdpbmFsLm91dGVyV2lkdGggLSBlbC50by5vdXRlcldpZHRoICkgKiBiYXNlbGluZS54OwoJfQoJZWwuY3NzKCBlbC5mcm9tICk7IC8vIHNldCB0b3AgJiBsZWZ0CgoJLy8gQW5pbWF0ZQoJaWYgKCBzY2FsZSA9PT0gImNvbnRlbnQiIHx8IHNjYWxlID09PSAiYm90aCIgKSB7IC8vIFNjYWxlIHRoZSBjaGlsZHJlbgoKCQkvLyBBZGQgbWFyZ2lucy9mb250LXNpemUKCQl2UHJvcHMgPSB2UHJvcHMuY29uY2F0KFsgIm1hcmdpblRvcCIsICJtYXJnaW5Cb3R0b20iIF0pLmNvbmNhdChjUHJvcHMpOwoJCWhQcm9wcyA9IGhQcm9wcy5jb25jYXQoWyAibWFyZ2luTGVmdCIsICJtYXJnaW5SaWdodCIgXSk7CgkJcHJvcHMyID0gcHJvcHMwLmNvbmNhdCh2UHJvcHMpLmNvbmNhdChoUHJvcHMpOwoKCQllbC5maW5kKCAiKlt3aWR0aF0iICkuZWFjaCggZnVuY3Rpb24oKSB7CgkJCXZhciBjaGlsZCA9ICQoIHRoaXMgKSwKCQkJCWNfb3JpZ2luYWwgPSB7CgkJCQkJaGVpZ2h0OiBjaGlsZC5oZWlnaHQoKSwKCQkJCQl3aWR0aDogY2hpbGQud2lkdGgoKSwKCQkJCQlvdXRlckhlaWdodDogY2hpbGQub3V0ZXJIZWlnaHQoKSwKCQkJCQlvdXRlcldpZHRoOiBjaGlsZC5vdXRlcldpZHRoKCkKCQkJCX07CgkJCWlmIChyZXN0b3JlKSB7CgkJCQkkLmVmZmVjdHMuc2F2ZShjaGlsZCwgcHJvcHMyKTsKCQkJfQoKCQkJY2hpbGQuZnJvbSA9IHsKCQkJCWhlaWdodDogY19vcmlnaW5hbC5oZWlnaHQgKiBmYWN0b3IuZnJvbS55LAoJCQkJd2lkdGg6IGNfb3JpZ2luYWwud2lkdGggKiBmYWN0b3IuZnJvbS54LAoJCQkJb3V0ZXJIZWlnaHQ6IGNfb3JpZ2luYWwub3V0ZXJIZWlnaHQgKiBmYWN0b3IuZnJvbS55LAoJCQkJb3V0ZXJXaWR0aDogY19vcmlnaW5hbC5vdXRlcldpZHRoICogZmFjdG9yLmZyb20ueAoJCQl9OwoJCQljaGlsZC50byA9IHsKCQkJCWhlaWdodDogY19vcmlnaW5hbC5oZWlnaHQgKiBmYWN0b3IudG8ueSwKCQkJCXdpZHRoOiBjX29yaWdpbmFsLndpZHRoICogZmFjdG9yLnRvLngsCgkJCQlvdXRlckhlaWdodDogY19vcmlnaW5hbC5oZWlnaHQgKiBmYWN0b3IudG8ueSwKCQkJCW91dGVyV2lkdGg6IGNfb3JpZ2luYWwud2lkdGggKiBmYWN0b3IudG8ueAoJCQl9OwoKCQkJLy8gVmVydGljYWwgcHJvcHMgc2NhbGluZwoJCQlpZiAoIGZhY3Rvci5mcm9tLnkgIT09IGZhY3Rvci50by55ICkgewoJCQkJY2hpbGQuZnJvbSA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBjaGlsZCwgdlByb3BzLCBmYWN0b3IuZnJvbS55LCBjaGlsZC5mcm9tICk7CgkJCQljaGlsZC50byA9ICQuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKCBjaGlsZCwgdlByb3BzLCBmYWN0b3IudG8ueSwgY2hpbGQudG8gKTsKCQkJfQoKCQkJLy8gSG9yaXpvbnRhbCBwcm9wcyBzY2FsaW5nCgkJCWlmICggZmFjdG9yLmZyb20ueCAhPT0gZmFjdG9yLnRvLnggKSB7CgkJCQljaGlsZC5mcm9tID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGNoaWxkLCBoUHJvcHMsIGZhY3Rvci5mcm9tLngsIGNoaWxkLmZyb20gKTsKCQkJCWNoaWxkLnRvID0gJC5lZmZlY3RzLnNldFRyYW5zaXRpb24oIGNoaWxkLCBoUHJvcHMsIGZhY3Rvci50by54LCBjaGlsZC50byApOwoJCQl9CgoJCQkvLyBBbmltYXRlIGNoaWxkcmVuCgkJCWNoaWxkLmNzcyggY2hpbGQuZnJvbSApOwoJCQljaGlsZC5hbmltYXRlKCBjaGlsZC50bywgby5kdXJhdGlvbiwgby5lYXNpbmcsIGZ1bmN0aW9uKCkgewoKCQkJCS8vIFJlc3RvcmUgY2hpbGRyZW4KCQkJCWlmICggcmVzdG9yZSApIHsKCQkJCQkkLmVmZmVjdHMucmVzdG9yZSggY2hpbGQsIHByb3BzMiApOwoJCQkJfQoJCQl9KTsKCQl9KTsKCX0KCgkvLyBBbmltYXRlCgllbC5hbmltYXRlKCBlbC50bywgewoJCXF1ZXVlOiBmYWxzZSwKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQllYXNpbmc6IG8uZWFzaW5nLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJaWYgKCBlbC50by5vcGFjaXR5ID09PSAwICkgewoJCQkJZWwuY3NzKCAib3BhY2l0eSIsIGVsLmZyb20ub3BhY2l0eSApOwoJCQl9CgkJCWlmICggbW9kZSA9PT0gImhpZGUiICkgewoJCQkJZWwuaGlkZSgpOwoJCQl9CgkJCSQuZWZmZWN0cy5yZXN0b3JlKCBlbCwgcHJvcHMgKTsKCQkJaWYgKCAhcmVzdG9yZSApIHsKCgkJCQkvLyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBvdXIgbmV3IHBvc2l0aW9uaW5nIGJhc2VkIG9uIHRoZSBzY2FsaW5nCgkJCQlpZiAoIHBvc2l0aW9uID09PSAic3RhdGljIiApIHsKCQkJCQllbC5jc3MoewoJCQkJCQlwb3NpdGlvbjogInJlbGF0aXZlIiwKCQkJCQkJdG9wOiBlbC50by50b3AsCgkJCQkJCWxlZnQ6IGVsLnRvLmxlZnQKCQkJCQl9KTsKCQkJCX0gZWxzZSB7CgkJCQkJJC5lYWNoKFsgInRvcCIsICJsZWZ0IiBdLCBmdW5jdGlvbiggaWR4LCBwb3MgKSB7CgkJCQkJCWVsLmNzcyggcG9zLCBmdW5jdGlvbiggXywgc3RyICkgewoJCQkJCQkJdmFyIHZhbCA9IHBhcnNlSW50KCBzdHIsIDEwICksCgkJCQkJCQkJdG9SZWYgPSBpZHggPyBlbC50by5sZWZ0IDogZWwudG8udG9wOwoKCQkJCQkJCS8vIGlmIG9yaWdpbmFsIHdhcyAiYXV0byIsIHJlY2FsY3VsYXRlIHRoZSBuZXcgdmFsdWUgZnJvbSB3cmFwcGVyCgkJCQkJCQlpZiAoIHN0ciA9PT0gImF1dG8iICkgewoJCQkJCQkJCXJldHVybiB0b1JlZiArICJweCI7CgkJCQkJCQl9CgoJCQkJCQkJcmV0dXJuIHZhbCArIHRvUmVmICsgInB4IjsKCQkJCQkJfSk7CgkJCQkJfSk7CgkJCQl9CgkJCX0KCgkJCSQuZWZmZWN0cy5yZW1vdmVXcmFwcGVyKCBlbCApOwoJCQlkb25lKCk7CgkJfQoJfSk7Cgp9OwoKCi8qIQogKiBqUXVlcnkgVUkgRWZmZWN0cyBTY2FsZSAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS9zY2FsZS1lZmZlY3QvCiAqLwoKCnZhciBlZmZlY3RTY2FsZSA9ICQuZWZmZWN0cy5lZmZlY3Quc2NhbGUgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCgkvLyBDcmVhdGUgZWxlbWVudAoJdmFyIGVsID0gJCggdGhpcyApLAoJCW9wdGlvbnMgPSAkLmV4dGVuZCggdHJ1ZSwge30sIG8gKSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImVmZmVjdCIgKSwKCQlwZXJjZW50ID0gcGFyc2VJbnQoIG8ucGVyY2VudCwgMTAgKSB8fAoJCQkoIHBhcnNlSW50KCBvLnBlcmNlbnQsIDEwICkgPT09IDAgPyAwIDogKCBtb2RlID09PSAiaGlkZSIgPyAwIDogMTAwICkgKSwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAiYm90aCIsCgkJb3JpZ2luID0gby5vcmlnaW4sCgkJb3JpZ2luYWwgPSB7CgkJCWhlaWdodDogZWwuaGVpZ2h0KCksCgkJCXdpZHRoOiBlbC53aWR0aCgpLAoJCQlvdXRlckhlaWdodDogZWwub3V0ZXJIZWlnaHQoKSwKCQkJb3V0ZXJXaWR0aDogZWwub3V0ZXJXaWR0aCgpCgkJfSwKCQlmYWN0b3IgPSB7CgkJCXk6IGRpcmVjdGlvbiAhPT0gImhvcml6b250YWwiID8gKHBlcmNlbnQgLyAxMDApIDogMSwKCQkJeDogZGlyZWN0aW9uICE9PSAidmVydGljYWwiID8gKHBlcmNlbnQgLyAxMDApIDogMQoJCX07CgoJLy8gV2UgYXJlIGdvaW5nIHRvIHBhc3MgdGhpcyBlZmZlY3QgdG8gdGhlIHNpemUgZWZmZWN0OgoJb3B0aW9ucy5lZmZlY3QgPSAic2l6ZSI7CglvcHRpb25zLnF1ZXVlID0gZmFsc2U7CglvcHRpb25zLmNvbXBsZXRlID0gZG9uZTsKCgkvLyBTZXQgZGVmYXVsdCBvcmlnaW4gYW5kIHJlc3RvcmUgZm9yIHNob3cvaGlkZQoJaWYgKCBtb2RlICE9PSAiZWZmZWN0IiApIHsKCQlvcHRpb25zLm9yaWdpbiA9IG9yaWdpbiB8fCBbICJtaWRkbGUiLCAiY2VudGVyIiBdOwoJCW9wdGlvbnMucmVzdG9yZSA9IHRydWU7Cgl9CgoJb3B0aW9ucy5mcm9tID0gby5mcm9tIHx8ICggbW9kZSA9PT0gInNob3ciID8gewoJCWhlaWdodDogMCwKCQl3aWR0aDogMCwKCQlvdXRlckhlaWdodDogMCwKCQlvdXRlcldpZHRoOiAwCgl9IDogb3JpZ2luYWwgKTsKCW9wdGlvbnMudG8gPSB7CgkJaGVpZ2h0OiBvcmlnaW5hbC5oZWlnaHQgKiBmYWN0b3IueSwKCQl3aWR0aDogb3JpZ2luYWwud2lkdGggKiBmYWN0b3IueCwKCQlvdXRlckhlaWdodDogb3JpZ2luYWwub3V0ZXJIZWlnaHQgKiBmYWN0b3IueSwKCQlvdXRlcldpZHRoOiBvcmlnaW5hbC5vdXRlcldpZHRoICogZmFjdG9yLngKCX07CgoJLy8gRmFkZSBvcHRpb24gdG8gc3VwcG9ydCBwdWZmCglpZiAoIG9wdGlvbnMuZmFkZSApIHsKCQlpZiAoIG1vZGUgPT09ICJzaG93IiApIHsKCQkJb3B0aW9ucy5mcm9tLm9wYWNpdHkgPSAwOwoJCQlvcHRpb25zLnRvLm9wYWNpdHkgPSAxOwoJCX0KCQlpZiAoIG1vZGUgPT09ICJoaWRlIiApIHsKCQkJb3B0aW9ucy5mcm9tLm9wYWNpdHkgPSAxOwoJCQlvcHRpb25zLnRvLm9wYWNpdHkgPSAwOwoJCX0KCX0KCgkvLyBBbmltYXRlCgllbC5lZmZlY3QoIG9wdGlvbnMgKTsKCn07CgoKLyohCiAqIGpRdWVyeSBVSSBFZmZlY3RzIFB1ZmYgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vcHVmZi1lZmZlY3QvCiAqLwoKCnZhciBlZmZlY3RQdWZmID0gJC5lZmZlY3RzLmVmZmVjdC5wdWZmID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7Cgl2YXIgZWxlbSA9ICQoIHRoaXMgKSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsZW0sIG8ubW9kZSB8fCAiaGlkZSIgKSwKCQloaWRlID0gbW9kZSA9PT0gImhpZGUiLAoJCXBlcmNlbnQgPSBwYXJzZUludCggby5wZXJjZW50LCAxMCApIHx8IDE1MCwKCQlmYWN0b3IgPSBwZXJjZW50IC8gMTAwLAoJCW9yaWdpbmFsID0gewoJCQloZWlnaHQ6IGVsZW0uaGVpZ2h0KCksCgkJCXdpZHRoOiBlbGVtLndpZHRoKCksCgkJCW91dGVySGVpZ2h0OiBlbGVtLm91dGVySGVpZ2h0KCksCgkJCW91dGVyV2lkdGg6IGVsZW0ub3V0ZXJXaWR0aCgpCgkJfTsKCgkkLmV4dGVuZCggbywgewoJCWVmZmVjdDogInNjYWxlIiwKCQlxdWV1ZTogZmFsc2UsCgkJZmFkZTogdHJ1ZSwKCQltb2RlOiBtb2RlLAoJCWNvbXBsZXRlOiBkb25lLAoJCXBlcmNlbnQ6IGhpZGUgPyBwZXJjZW50IDogMTAwLAoJCWZyb206IGhpZGUgPwoJCQlvcmlnaW5hbCA6CgkJCXsKCQkJCWhlaWdodDogb3JpZ2luYWwuaGVpZ2h0ICogZmFjdG9yLAoJCQkJd2lkdGg6IG9yaWdpbmFsLndpZHRoICogZmFjdG9yLAoJCQkJb3V0ZXJIZWlnaHQ6IG9yaWdpbmFsLm91dGVySGVpZ2h0ICogZmFjdG9yLAoJCQkJb3V0ZXJXaWR0aDogb3JpZ2luYWwub3V0ZXJXaWR0aCAqIGZhY3RvcgoJCQl9Cgl9KTsKCgllbGVtLmVmZmVjdCggbyApOwp9OwoKCi8qIQogKiBqUXVlcnkgVUkgRWZmZWN0cyBQdWxzYXRlIDEuMTEuMAogKiBodHRwOi8vanF1ZXJ5dWkuY29tCiAqCiAqIENvcHlyaWdodCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL3B1bHNhdGUtZWZmZWN0LwogKi8KCgp2YXIgZWZmZWN0UHVsc2F0ZSA9ICQuZWZmZWN0cy5lZmZlY3QucHVsc2F0ZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoJdmFyIGVsZW0gPSAkKCB0aGlzICksCgkJbW9kZSA9ICQuZWZmZWN0cy5zZXRNb2RlKCBlbGVtLCBvLm1vZGUgfHwgInNob3ciICksCgkJc2hvdyA9IG1vZGUgPT09ICJzaG93IiwKCQloaWRlID0gbW9kZSA9PT0gImhpZGUiLAoJCXNob3doaWRlID0gKCBzaG93IHx8IG1vZGUgPT09ICJoaWRlIiApLAoKCQkvLyBzaG93aW5nIG9yIGhpZGluZyBsZWF2ZXMgb2YgdGhlICJsYXN0IiBhbmltYXRpb24KCQlhbmltcyA9ICggKCBvLnRpbWVzIHx8IDUgKSAqIDIgKSArICggc2hvd2hpZGUgPyAxIDogMCApLAoJCWR1cmF0aW9uID0gby5kdXJhdGlvbiAvIGFuaW1zLAoJCWFuaW1hdGVUbyA9IDAsCgkJcXVldWUgPSBlbGVtLnF1ZXVlKCksCgkJcXVldWVsZW4gPSBxdWV1ZS5sZW5ndGgsCgkJaTsKCglpZiAoIHNob3cgfHwgIWVsZW0uaXMoIjp2aXNpYmxlIikpIHsKCQllbGVtLmNzcyggIm9wYWNpdHkiLCAwICkuc2hvdygpOwoJCWFuaW1hdGVUbyA9IDE7Cgl9CgoJLy8gYW5pbXMgLSAxIG9wYWNpdHkgInRvZ2dsZXMiCglmb3IgKCBpID0gMTsgaSA8IGFuaW1zOyBpKysgKSB7CgkJZWxlbS5hbmltYXRlKHsKCQkJb3BhY2l0eTogYW5pbWF0ZVRvCgkJfSwgZHVyYXRpb24sIG8uZWFzaW5nICk7CgkJYW5pbWF0ZVRvID0gMSAtIGFuaW1hdGVUbzsKCX0KCgllbGVtLmFuaW1hdGUoewoJCW9wYWNpdHk6IGFuaW1hdGVUbwoJfSwgZHVyYXRpb24sIG8uZWFzaW5nKTsKCgllbGVtLnF1ZXVlKGZ1bmN0aW9uKCkgewoJCWlmICggaGlkZSApIHsKCQkJZWxlbS5oaWRlKCk7CgkJfQoJCWRvbmUoKTsKCX0pOwoKCS8vIFdlIGp1c3QgcXVldWVkIHVwICJhbmltcyIgYW5pbWF0aW9ucywgd2UgbmVlZCB0byBwdXQgdGhlbSBuZXh0IGluIHRoZSBxdWV1ZQoJaWYgKCBxdWV1ZWxlbiA+IDEgKSB7CgkJcXVldWUuc3BsaWNlLmFwcGx5KCBxdWV1ZSwKCQkJWyAxLCAwIF0uY29uY2F0KCBxdWV1ZS5zcGxpY2UoIHF1ZXVlbGVuLCBhbmltcyArIDEgKSApICk7Cgl9CgllbGVtLmRlcXVldWUoKTsKfTsKCgovKiEKICogalF1ZXJ5IFVJIEVmZmVjdHMgU2hha2UgMS4xMS4wCiAqIGh0dHA6Ly9qcXVlcnl1aS5jb20KICoKICogQ29weXJpZ2h0IDIwMTQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycwogKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuCiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKICoKICogaHR0cDovL2FwaS5qcXVlcnl1aS5jb20vc2hha2UtZWZmZWN0LwogKi8KCgp2YXIgZWZmZWN0U2hha2UgPSAkLmVmZmVjdHMuZWZmZWN0LnNoYWtlID0gZnVuY3Rpb24oIG8sIGRvbmUgKSB7CgoJdmFyIGVsID0gJCggdGhpcyApLAoJCXByb3BzID0gWyAicG9zaXRpb24iLCAidG9wIiwgImJvdHRvbSIsICJsZWZ0IiwgInJpZ2h0IiwgImhlaWdodCIsICJ3aWR0aCIgXSwKCQltb2RlID0gJC5lZmZlY3RzLnNldE1vZGUoIGVsLCBvLm1vZGUgfHwgImVmZmVjdCIgKSwKCQlkaXJlY3Rpb24gPSBvLmRpcmVjdGlvbiB8fCAibGVmdCIsCgkJZGlzdGFuY2UgPSBvLmRpc3RhbmNlIHx8IDIwLAoJCXRpbWVzID0gby50aW1lcyB8fCAzLAoJCWFuaW1zID0gdGltZXMgKiAyICsgMSwKCQlzcGVlZCA9IE1hdGgucm91bmQoIG8uZHVyYXRpb24gLyBhbmltcyApLAoJCXJlZiA9IChkaXJlY3Rpb24gPT09ICJ1cCIgfHwgZGlyZWN0aW9uID09PSAiZG93biIpID8gInRvcCIgOiAibGVmdCIsCgkJcG9zaXRpdmVNb3Rpb24gPSAoZGlyZWN0aW9uID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImxlZnQiKSwKCQlhbmltYXRpb24gPSB7fSwKCQlhbmltYXRpb24xID0ge30sCgkJYW5pbWF0aW9uMiA9IHt9LAoJCWksCgoJCS8vIHdlIHdpbGwgbmVlZCB0byByZS1hc3NlbWJsZSB0aGUgcXVldWUgdG8gc3RhY2sgb3VyIGFuaW1hdGlvbnMgaW4gcGxhY2UKCQlxdWV1ZSA9IGVsLnF1ZXVlKCksCgkJcXVldWVsZW4gPSBxdWV1ZS5sZW5ndGg7CgoJJC5lZmZlY3RzLnNhdmUoIGVsLCBwcm9wcyApOwoJZWwuc2hvdygpOwoJJC5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoIGVsICk7CgoJLy8gQW5pbWF0aW9uCglhbmltYXRpb25bIHJlZiBdID0gKCBwb3NpdGl2ZU1vdGlvbiA/ICItPSIgOiAiKz0iICkgKyBkaXN0YW5jZTsKCWFuaW1hdGlvbjFbIHJlZiBdID0gKCBwb3NpdGl2ZU1vdGlvbiA/ICIrPSIgOiAiLT0iICkgKyBkaXN0YW5jZSAqIDI7CglhbmltYXRpb24yWyByZWYgXSA9ICggcG9zaXRpdmVNb3Rpb24gPyAiLT0iIDogIis9IiApICsgZGlzdGFuY2UgKiAyOwoKCS8vIEFuaW1hdGUKCWVsLmFuaW1hdGUoIGFuaW1hdGlvbiwgc3BlZWQsIG8uZWFzaW5nICk7CgoJLy8gU2hha2VzCglmb3IgKCBpID0gMTsgaSA8IHRpbWVzOyBpKysgKSB7CgkJZWwuYW5pbWF0ZSggYW5pbWF0aW9uMSwgc3BlZWQsIG8uZWFzaW5nICkuYW5pbWF0ZSggYW5pbWF0aW9uMiwgc3BlZWQsIG8uZWFzaW5nICk7Cgl9CgllbAoJCS5hbmltYXRlKCBhbmltYXRpb24xLCBzcGVlZCwgby5lYXNpbmcgKQoJCS5hbmltYXRlKCBhbmltYXRpb24sIHNwZWVkIC8gMiwgby5lYXNpbmcgKQoJCS5xdWV1ZShmdW5jdGlvbigpIHsKCQkJaWYgKCBtb2RlID09PSAiaGlkZSIgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQkJZG9uZSgpOwoJCX0pOwoKCS8vIGluamVjdCBhbGwgdGhlIGFuaW1hdGlvbnMgd2UganVzdCBxdWV1ZWQgdG8gYmUgZmlyc3QgaW4gbGluZSAoYWZ0ZXIgImlucHJvZ3Jlc3MiKQoJaWYgKCBxdWV1ZWxlbiA+IDEpIHsKCQlxdWV1ZS5zcGxpY2UuYXBwbHkoIHF1ZXVlLAoJCQlbIDEsIDAgXS5jb25jYXQoIHF1ZXVlLnNwbGljZSggcXVldWVsZW4sIGFuaW1zICsgMSApICkgKTsKCX0KCWVsLmRlcXVldWUoKTsKCn07CgoKLyohCiAqIGpRdWVyeSBVSSBFZmZlY3RzIFNsaWRlIDEuMTEuMAogKiBodHRwOi8vanF1ZXJ5dWkuY29tCiAqCiAqIENvcHlyaWdodCAyMDE0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLgogKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlCiAqCiAqIGh0dHA6Ly9hcGkuanF1ZXJ5dWkuY29tL3NsaWRlLWVmZmVjdC8KICovCgoKdmFyIGVmZmVjdFNsaWRlID0gJC5lZmZlY3RzLmVmZmVjdC5zbGlkZSA9IGZ1bmN0aW9uKCBvLCBkb25lICkgewoKCS8vIENyZWF0ZSBlbGVtZW50Cgl2YXIgZWwgPSAkKCB0aGlzICksCgkJcHJvcHMgPSBbICJwb3NpdGlvbiIsICJ0b3AiLCAiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAid2lkdGgiLCAiaGVpZ2h0IiBdLAoJCW1vZGUgPSAkLmVmZmVjdHMuc2V0TW9kZSggZWwsIG8ubW9kZSB8fCAic2hvdyIgKSwKCQlzaG93ID0gbW9kZSA9PT0gInNob3ciLAoJCWRpcmVjdGlvbiA9IG8uZGlyZWN0aW9uIHx8ICJsZWZ0IiwKCQlyZWYgPSAoZGlyZWN0aW9uID09PSAidXAiIHx8IGRpcmVjdGlvbiA9PT0gImRvd24iKSA/ICJ0b3AiIDogImxlZnQiLAoJCXBvc2l0aXZlTW90aW9uID0gKGRpcmVjdGlvbiA9PT0gInVwIiB8fCBkaXJlY3Rpb24gPT09ICJsZWZ0IiksCgkJZGlzdGFuY2UsCgkJYW5pbWF0aW9uID0ge307CgoJLy8gQWRqdXN0CgkkLmVmZmVjdHMuc2F2ZSggZWwsIHByb3BzICk7CgllbC5zaG93KCk7CglkaXN0YW5jZSA9IG8uZGlzdGFuY2UgfHwgZWxbIHJlZiA9PT0gInRvcCIgPyAib3V0ZXJIZWlnaHQiIDogIm91dGVyV2lkdGgiIF0oIHRydWUgKTsKCgkkLmVmZmVjdHMuY3JlYXRlV3JhcHBlciggZWwgKS5jc3MoewoJCW92ZXJmbG93OiAiaGlkZGVuIgoJfSk7CgoJaWYgKCBzaG93ICkgewoJCWVsLmNzcyggcmVmLCBwb3NpdGl2ZU1vdGlvbiA/IChpc05hTihkaXN0YW5jZSkgPyAiLSIgKyBkaXN0YW5jZSA6IC1kaXN0YW5jZSkgOiBkaXN0YW5jZSApOwoJfQoKCS8vIEFuaW1hdGlvbgoJYW5pbWF0aW9uWyByZWYgXSA9ICggc2hvdyA/CgkJKCBwb3NpdGl2ZU1vdGlvbiA/ICIrPSIgOiAiLT0iKSA6CgkJKCBwb3NpdGl2ZU1vdGlvbiA/ICItPSIgOiAiKz0iKSkgKwoJCWRpc3RhbmNlOwoKCS8vIEFuaW1hdGUKCWVsLmFuaW1hdGUoIGFuaW1hdGlvbiwgewoJCXF1ZXVlOiBmYWxzZSwKCQlkdXJhdGlvbjogby5kdXJhdGlvbiwKCQllYXNpbmc6IG8uZWFzaW5nLAoJCWNvbXBsZXRlOiBmdW5jdGlvbigpIHsKCQkJaWYgKCBtb2RlID09PSAiaGlkZSIgKSB7CgkJCQllbC5oaWRlKCk7CgkJCX0KCQkJJC5lZmZlY3RzLnJlc3RvcmUoIGVsLCBwcm9wcyApOwoJCQkkLmVmZmVjdHMucmVtb3ZlV3JhcHBlciggZWwgKTsKCQkJZG9uZSgpOwoJCX0KCX0pOwp9OwoKCi8qIQogKiBqUXVlcnkgVUkgRWZmZWN0cyBUcmFuc2ZlciAxLjExLjAKICogaHR0cDovL2pxdWVyeXVpLmNvbQogKgogKiBDb3B5cmlnaHQgMjAxNCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4KICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQogKgogKiBodHRwOi8vYXBpLmpxdWVyeXVpLmNvbS90cmFuc2Zlci1lZmZlY3QvCiAqLwoKCnZhciBlZmZlY3RUcmFuc2ZlciA9ICQuZWZmZWN0cy5lZmZlY3QudHJhbnNmZXIgPSBmdW5jdGlvbiggbywgZG9uZSApIHsKCXZhciBlbGVtID0gJCggdGhpcyApLAoJCXRhcmdldCA9ICQoIG8udG8gKSwKCQl0YXJnZXRGaXhlZCA9IHRhcmdldC5jc3MoICJwb3NpdGlvbiIgKSA9PT0gImZpeGVkIiwKCQlib2R5ID0gJCgiYm9keSIpLAoJCWZpeFRvcCA9IHRhcmdldEZpeGVkID8gYm9keS5zY3JvbGxUb3AoKSA6IDAsCgkJZml4TGVmdCA9IHRhcmdldEZpeGVkID8gYm9keS5zY3JvbGxMZWZ0KCkgOiAwLAoJCWVuZFBvc2l0aW9uID0gdGFyZ2V0Lm9mZnNldCgpLAoJCWFuaW1hdGlvbiA9IHsKCQkJdG9wOiBlbmRQb3NpdGlvbi50b3AgLSBmaXhUb3AsCgkJCWxlZnQ6IGVuZFBvc2l0aW9uLmxlZnQgLSBmaXhMZWZ0LAoJCQloZWlnaHQ6IHRhcmdldC5pbm5lckhlaWdodCgpLAoJCQl3aWR0aDogdGFyZ2V0LmlubmVyV2lkdGgoKQoJCX0sCgkJc3RhcnRQb3NpdGlvbiA9IGVsZW0ub2Zmc2V0KCksCgkJdHJhbnNmZXIgPSAkKCAiPGRpdiBjbGFzcz0ndWktZWZmZWN0cy10cmFuc2Zlcic+PC9kaXY+IiApCgkJCS5hcHBlbmRUbyggZG9jdW1lbnQuYm9keSApCgkJCS5hZGRDbGFzcyggby5jbGFzc05hbWUgKQoJCQkuY3NzKHsKCQkJCXRvcDogc3RhcnRQb3NpdGlvbi50b3AgLSBmaXhUb3AsCgkJCQlsZWZ0OiBzdGFydFBvc2l0aW9uLmxlZnQgLSBmaXhMZWZ0LAoJCQkJaGVpZ2h0OiBlbGVtLmlubmVySGVpZ2h0KCksCgkJCQl3aWR0aDogZWxlbS5pbm5lcldpZHRoKCksCgkJCQlwb3NpdGlvbjogdGFyZ2V0Rml4ZWQgPyAiZml4ZWQiIDogImFic29sdXRlIgoJCQl9KQoJCQkuYW5pbWF0ZSggYW5pbWF0aW9uLCBvLmR1cmF0aW9uLCBvLmVhc2luZywgZnVuY3Rpb24oKSB7CgkJCQl0cmFuc2Zlci5yZW1vdmUoKTsKCQkJCWRvbmUoKTsKCQkJfSk7Cn07CgoKCn0pKTs=]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/jquery-ui.min.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjExLjQgLSAyMDE1LTAzLTExCiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBjb3JlLmNzcywgYWNjb3JkaW9uLmNzcywgYXV0b2NvbXBsZXRlLmNzcywgYnV0dG9uLmNzcywgZGF0ZXBpY2tlci5jc3MsIGRpYWxvZy5jc3MsIGRyYWdnYWJsZS5jc3MsIG1lbnUuY3NzLCBwcm9ncmVzc2Jhci5jc3MsIHJlc2l6YWJsZS5jc3MsIHNlbGVjdGFibGUuY3NzLCBzZWxlY3RtZW51LmNzcywgc2xpZGVyLmNzcywgc29ydGFibGUuY3NzLCBzcGlubmVyLmNzcywgdGFicy5jc3MsIHRvb2x0aXAuY3NzLCB0aGVtZS5jc3MKKiBUbyB2aWV3IGFuZCBtb2RpZnkgdGhpcyB0aGVtZSwgdmlzaXQgaHR0cDovL2pxdWVyeXVpLmNvbS90aGVtZXJvbGxlci8/ZmZEZWZhdWx0PVRyZWJ1Y2hldCUyME1TJTJDVGFob21hJTJDVmVyZGFuYSUyQ0FyaWFsJTJDc2Fucy1zZXJpZiZmd0RlZmF1bHQ9Ym9sZCZmc0RlZmF1bHQ9MS4xZW0mY29ybmVyUmFkaXVzPTRweCZiZ0NvbG9ySGVhZGVyPWY2YTgyOCZiZ1RleHR1cmVIZWFkZXI9Z2xvc3Nfd2F2ZSZiZ0ltZ09wYWNpdHlIZWFkZXI9MzUmYm9yZGVyQ29sb3JIZWFkZXI9ZTc4ZjA4JmZjSGVhZGVyPWZmZmZmZiZpY29uQ29sb3JIZWFkZXI9ZmZmZmZmJmJnQ29sb3JDb250ZW50PWVlZWVlZSZiZ1RleHR1cmVDb250ZW50PWhpZ2hsaWdodF9zb2Z0JmJnSW1nT3BhY2l0eUNvbnRlbnQ9MTAwJmJvcmRlckNvbG9yQ29udGVudD1kZGRkZGQmZmNDb250ZW50PTMzMzMzMyZpY29uQ29sb3JDb250ZW50PTIyMjIyMiZiZ0NvbG9yRGVmYXVsdD1mNmY2ZjYmYmdUZXh0dXJlRGVmYXVsdD1nbGFzcyZiZ0ltZ09wYWNpdHlEZWZhdWx0PTEwMCZib3JkZXJDb2xvckRlZmF1bHQ9Y2NjY2NjJmZjRGVmYXVsdD0xYzk0YzQmaWNvbkNvbG9yRGVmYXVsdD1lZjhjMDgmYmdDb2xvckhvdmVyPWZkZjVjZSZiZ1RleHR1cmVIb3Zlcj1nbGFzcyZiZ0ltZ09wYWNpdHlIb3Zlcj0xMDAmYm9yZGVyQ29sb3JIb3Zlcj1mYmNiMDkmZmNIb3Zlcj1jNzc0MDUmaWNvbkNvbG9ySG92ZXI9ZWY4YzA4JmJnQ29sb3JBY3RpdmU9ZmZmZmZmJmJnVGV4dHVyZUFjdGl2ZT1nbGFzcyZiZ0ltZ09wYWNpdHlBY3RpdmU9NjUmYm9yZGVyQ29sb3JBY3RpdmU9ZmJkODUwJmZjQWN0aXZlPWViOGYwMCZpY29uQ29sb3JBY3RpdmU9ZWY4YzA4JmJnQ29sb3JIaWdobGlnaHQ9ZmZlNDVjJmJnVGV4dHVyZUhpZ2hsaWdodD1oaWdobGlnaHRfc29mdCZiZ0ltZ09wYWNpdHlIaWdobGlnaHQ9NzUmYm9yZGVyQ29sb3JIaWdobGlnaHQ9ZmVkMjJmJmZjSGlnaGxpZ2h0PTM2MzYzNiZpY29uQ29sb3JIaWdobGlnaHQ9MjI4ZWYxJmJnQ29sb3JFcnJvcj1iODE5MDAmYmdUZXh0dXJlRXJyb3I9ZGlhZ29uYWxzX3RoaWNrJmJnSW1nT3BhY2l0eUVycm9yPTE4JmJvcmRlckNvbG9yRXJyb3I9Y2QwYTBhJmZjRXJyb3I9ZmZmZmZmJmljb25Db2xvckVycm9yPWZmZDI3YSZiZ0NvbG9yT3ZlcmxheT02NjY2NjYmYmdUZXh0dXJlT3ZlcmxheT1kaWFnb25hbHNfdGhpY2smYmdJbWdPcGFjaXR5T3ZlcmxheT0yMCZvcGFjaXR5T3ZlcmxheT01MCZiZ0NvbG9yU2hhZG93PTAwMDAwMCZiZ1RleHR1cmVTaGFkb3c9ZmxhdCZiZ0ltZ09wYWNpdHlTaGFkb3c9MTAmb3BhY2l0eVNoYWRvdz0yMCZ0aGlja25lc3NTaGFkb3c9NXB4Jm9mZnNldFRvcFNoYWRvdz0tNXB4Jm9mZnNldExlZnRTaGFkb3c9LTVweCZjb3JuZXJSYWRpdXNTaGFkb3c9NXB4CiogQ29weXJpZ2h0IDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCgoudWktaGVscGVyLWhpZGRlbntkaXNwbGF5Om5vbmV9LnVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweH0udWktaGVscGVyLXJlc2V0e21hcmdpbjowO3BhZGRpbmc6MDtib3JkZXI6MDtvdXRsaW5lOjA7bGluZS1oZWlnaHQ6MS4zO3RleHQtZGVjb3JhdGlvbjpub25lO2ZvbnQtc2l6ZToxMDAlO2xpc3Qtc3R5bGU6bm9uZX0udWktaGVscGVyLWNsZWFyZml4OmJlZm9yZSwudWktaGVscGVyLWNsZWFyZml4OmFmdGVye2NvbnRlbnQ6IiI7ZGlzcGxheTp0YWJsZTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2V9LnVpLWhlbHBlci1jbGVhcmZpeDphZnRlcntjbGVhcjpib3RofS51aS1oZWxwZXItY2xlYXJmaXh7bWluLWhlaWdodDowfS51aS1oZWxwZXItemZpeHt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RvcDowO2xlZnQ6MDtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MCl9LnVpLWZyb250e3otaW5kZXg6MTAwfS51aS1zdGF0ZS1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdCFpbXBvcnRhbnR9LnVpLWljb257ZGlzcGxheTpibG9jazt0ZXh0LWluZGVudDotOTk5OTlweDtvdmVyZmxvdzpoaWRkZW47YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fS51aS13aWRnZXQtb3ZlcmxheXtwb3NpdGlvbjpmaXhlZDt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJX0udWktYWNjb3JkaW9uIC51aS1hY2NvcmRpb24taGVhZGVye2Rpc3BsYXk6YmxvY2s7Y3Vyc29yOnBvaW50ZXI7cG9zaXRpb246cmVsYXRpdmU7bWFyZ2luOjJweCAwIDAgMDtwYWRkaW5nOi41ZW0gLjVlbSAuNWVtIC43ZW07bWluLWhlaWdodDowO2ZvbnQtc2l6ZToxMDAlfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1pY29uc3twYWRkaW5nLWxlZnQ6Mi4yZW19LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWljb25zIC51aS1hY2NvcmRpb24taWNvbnN7cGFkZGluZy1sZWZ0OjIuMmVtfS51aS1hY2NvcmRpb24gLnVpLWFjY29yZGlvbi1oZWFkZXIgLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbntwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi41ZW07dG9wOjUwJTttYXJnaW4tdG9wOi04cHh9LnVpLWFjY29yZGlvbiAudWktYWNjb3JkaW9uLWNvbnRlbnR7cGFkZGluZzoxZW0gMi4yZW07Ym9yZGVyLXRvcDowO292ZXJmbG93OmF1dG99LnVpLWF1dG9jb21wbGV0ZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Y3Vyc29yOmRlZmF1bHR9LnVpLWJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOjA7bGluZS1oZWlnaHQ6bm9ybWFsO21hcmdpbi1yaWdodDouMWVtO2N1cnNvcjpwb2ludGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt0ZXh0LWFsaWduOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS51aS1idXR0b24sLnVpLWJ1dHRvbjpsaW5rLC51aS1idXR0b246dmlzaXRlZCwudWktYnV0dG9uOmhvdmVyLC51aS1idXR0b246YWN0aXZle3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1idXR0b24taWNvbi1vbmx5e3dpZHRoOjIuMmVtfWJ1dHRvbi51aS1idXR0b24taWNvbi1vbmx5e3dpZHRoOjIuNGVtfS51aS1idXR0b24taWNvbnMtb25seXt3aWR0aDozLjRlbX1idXR0b24udWktYnV0dG9uLWljb25zLW9ubHl7d2lkdGg6My43ZW19LnVpLWJ1dHRvbiAudWktYnV0dG9uLXRleHR7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDpub3JtYWx9LnVpLWJ1dHRvbi10ZXh0LW9ubHkgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmc6LjRlbSAxZW19LnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWJ1dHRvbi10ZXh0LC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLXRleHR7cGFkZGluZzouNGVtO3RleHQtaW5kZW50Oi05OTk5OTk5cHh9LnVpLWJ1dHRvbi10ZXh0LWljb24tcHJpbWFyeSAudWktYnV0dG9uLXRleHQsLnVpLWJ1dHRvbi10ZXh0LWljb25zIC51aS1idXR0b24tdGV4dHtwYWRkaW5nOi40ZW0gMWVtIC40ZW0gMi4xZW19LnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1idXR0b24tdGV4dCwudWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmc6LjRlbSAyLjFlbSAuNGVtIDFlbX0udWktYnV0dG9uLXRleHQtaWNvbnMgLnVpLWJ1dHRvbi10ZXh0e3BhZGRpbmctbGVmdDoyLjFlbTtwYWRkaW5nLXJpZ2h0OjIuMWVtfWlucHV0LnVpLWJ1dHRvbntwYWRkaW5nOi40ZW0gMWVtfS51aS1idXR0b24taWNvbi1vbmx5IC51aS1pY29uLC51aS1idXR0b24tdGV4dC1pY29uLXByaW1hcnkgLnVpLWljb24sLnVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IC51aS1pY29uLC51aS1idXR0b24tdGV4dC1pY29ucyAudWktaWNvbiwudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTttYXJnaW4tdG9wOi04cHh9LnVpLWJ1dHRvbi1pY29uLW9ubHkgLnVpLWljb257bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LThweH0udWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IC51aS1idXR0b24taWNvbi1wcmltYXJ5LC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tcHJpbWFyeSwudWktYnV0dG9uLWljb25zLW9ubHkgLnVpLWJ1dHRvbi1pY29uLXByaW1hcnl7bGVmdDouNWVtfS51aS1idXR0b24tdGV4dC1pY29uLXNlY29uZGFyeSAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5LC51aS1idXR0b24tdGV4dC1pY29ucyAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5LC51aS1idXR0b24taWNvbnMtb25seSAudWktYnV0dG9uLWljb24tc2Vjb25kYXJ5e3JpZ2h0Oi41ZW19LnVpLWJ1dHRvbnNldHttYXJnaW4tcmlnaHQ6N3B4fS51aS1idXR0b25zZXQgLnVpLWJ1dHRvbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDotLjNlbX1pbnB1dC51aS1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsYnV0dG9uLnVpLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MDtwYWRkaW5nOjB9LnVpLWRhdGVwaWNrZXJ7d2lkdGg6MTdlbTtwYWRkaW5nOi4yZW0gLjJlbSAwO2Rpc3BsYXk6bm9uZX0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1oZWFkZXJ7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzouMmVtIDB9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldiwudWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0e3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7d2lkdGg6MS44ZW07aGVpZ2h0OjEuOGVtfS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXYtaG92ZXIsLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dC1ob3Zlcnt0b3A6MXB4fS51aS1kYXRlcGlja2VyIC51aS1kYXRlcGlja2VyLXByZXZ7bGVmdDoycHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dHtyaWdodDoycHh9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItcHJldi1ob3ZlcntsZWZ0OjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1uZXh0LWhvdmVye3JpZ2h0OjFweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci1wcmV2IHNwYW4sLnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItbmV4dCBzcGFue2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7bGVmdDo1MCU7bWFyZ2luLWxlZnQ6LThweDt0b3A6NTAlO21hcmdpbi10b3A6LThweH0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZXttYXJnaW46MCAyLjNlbTtsaW5lLWhlaWdodDoxLjhlbTt0ZXh0LWFsaWduOmNlbnRlcn0udWktZGF0ZXBpY2tlciAudWktZGF0ZXBpY2tlci10aXRsZSBzZWxlY3R7Zm9udC1zaXplOjFlbTttYXJnaW46MXB4IDB9LnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXItbW9udGgsLnVpLWRhdGVwaWNrZXIgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcnt3aWR0aDo0NSV9LnVpLWRhdGVwaWNrZXIgdGFibGV7d2lkdGg6MTAwJTtmb250LXNpemU6LjllbTtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7bWFyZ2luOjAgMCAuNGVtfS51aS1kYXRlcGlja2VyIHRoe3BhZGRpbmc6LjdlbSAuM2VtO3RleHQtYWxpZ246Y2VudGVyO2ZvbnQtd2VpZ2h0OmJvbGQ7Ym9yZGVyOjB9LnVpLWRhdGVwaWNrZXIgdGR7Ym9yZGVyOjA7cGFkZGluZzoxcHh9LnVpLWRhdGVwaWNrZXIgdGQgc3BhbiwudWktZGF0ZXBpY2tlciB0ZCBhe2Rpc3BsYXk6YmxvY2s7cGFkZGluZzouMmVtO3RleHQtYWxpZ246cmlnaHQ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZXtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7bWFyZ2luOi43ZW0gMCAwIDA7cGFkZGluZzowIC4yZW07Ym9yZGVyLWxlZnQ6MDtib3JkZXItcmlnaHQ6MDtib3JkZXItYm90dG9tOjB9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b257ZmxvYXQ6cmlnaHQ7bWFyZ2luOi41ZW0gLjJlbSAuNGVtO2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6LjJlbSAuNmVtIC4zZW0gLjZlbTt3aWR0aDphdXRvO292ZXJmbG93OnZpc2libGV9LnVpLWRhdGVwaWNrZXIgLnVpLWRhdGVwaWNrZXItYnV0dG9ucGFuZSBidXR0b24udWktZGF0ZXBpY2tlci1jdXJyZW50e2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXIudWktZGF0ZXBpY2tlci1tdWx0aXt3aWR0aDphdXRvfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3Vwe2Zsb2F0OmxlZnR9LnVpLWRhdGVwaWNrZXItbXVsdGkgLnVpLWRhdGVwaWNrZXItZ3JvdXAgdGFibGV7d2lkdGg6OTUlO21hcmdpbjowIGF1dG8gLjRlbX0udWktZGF0ZXBpY2tlci1tdWx0aS0yIC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjUwJX0udWktZGF0ZXBpY2tlci1tdWx0aS0zIC51aS1kYXRlcGlja2VyLWdyb3Vwe3dpZHRoOjMzLjMlfS51aS1kYXRlcGlja2VyLW11bHRpLTQgLnVpLWRhdGVwaWNrZXItZ3JvdXB7d2lkdGg6MjUlfS51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLWxhc3QgLnVpLWRhdGVwaWNrZXItaGVhZGVyLC51aS1kYXRlcGlja2VyLW11bHRpIC51aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSAudWktZGF0ZXBpY2tlci1oZWFkZXJ7Ym9yZGVyLWxlZnQtd2lkdGg6MH0udWktZGF0ZXBpY2tlci1tdWx0aSAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2NsZWFyOmxlZnR9LnVpLWRhdGVwaWNrZXItcm93LWJyZWFre2NsZWFyOmJvdGg7d2lkdGg6MTAwJTtmb250LXNpemU6MH0udWktZGF0ZXBpY2tlci1ydGx7ZGlyZWN0aW9uOnJ0bH0udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItcHJldntyaWdodDoycHg7bGVmdDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1uZXh0e2xlZnQ6MnB4O3JpZ2h0OmF1dG99LnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLXByZXY6aG92ZXJ7cmlnaHQ6MXB4O2xlZnQ6YXV0b30udWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItbmV4dDpob3ZlcntsZWZ0OjFweDtyaWdodDphdXRvfS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5le2NsZWFyOnJpZ2h0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbntmbG9hdDpsZWZ0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1idXR0b25wYW5lIGJ1dHRvbi51aS1kYXRlcGlja2VyLWN1cnJlbnQsLnVpLWRhdGVwaWNrZXItcnRsIC51aS1kYXRlcGlja2VyLWdyb3Vwe2Zsb2F0OnJpZ2h0fS51aS1kYXRlcGlja2VyLXJ0bCAudWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IC51aS1kYXRlcGlja2VyLWhlYWRlciwudWktZGF0ZXBpY2tlci1ydGwgLnVpLWRhdGVwaWNrZXItZ3JvdXAtbWlkZGxlIC51aS1kYXRlcGlja2VyLWhlYWRlcntib3JkZXItcmlnaHQtd2lkdGg6MDtib3JkZXItbGVmdC13aWR0aDoxcHh9LnVpLWRpYWxvZ3tvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO3BhZGRpbmc6LjJlbTtvdXRsaW5lOjB9LnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxlYmFye3BhZGRpbmc6LjRlbSAxZW07cG9zaXRpb246cmVsYXRpdmV9LnVpLWRpYWxvZyAudWktZGlhbG9nLXRpdGxle2Zsb2F0OmxlZnQ7bWFyZ2luOi4xZW0gMDt3aGl0ZS1zcGFjZTpub3dyYXA7d2lkdGg6OTAlO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS51aS1kaWFsb2cgLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZXtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDouM2VtO3RvcDo1MCU7d2lkdGg6MjBweDttYXJnaW46LTEwcHggMCAwIDA7cGFkZGluZzoxcHg7aGVpZ2h0OjIwcHh9LnVpLWRpYWxvZyAudWktZGlhbG9nLWNvbnRlbnR7cG9zaXRpb246cmVsYXRpdmU7Ym9yZGVyOjA7cGFkZGluZzouNWVtIDFlbTtiYWNrZ3JvdW5kOm5vbmU7b3ZlcmZsb3c6YXV0b30udWktZGlhbG9nIC51aS1kaWFsb2ctYnV0dG9ucGFuZXt0ZXh0LWFsaWduOmxlZnQ7Ym9yZGVyLXdpZHRoOjFweCAwIDAgMDtiYWNrZ3JvdW5kLWltYWdlOm5vbmU7bWFyZ2luLXRvcDouNWVtO3BhZGRpbmc6LjNlbSAxZW0gLjVlbSAuNGVtfS51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIC51aS1kaWFsb2ctYnV0dG9uc2V0e2Zsb2F0OnJpZ2h0fS51aS1kaWFsb2cgLnVpLWRpYWxvZy1idXR0b25wYW5lIGJ1dHRvbnttYXJnaW46LjVlbSAuNGVtIC41ZW0gMDtjdXJzb3I6cG9pbnRlcn0udWktZGlhbG9nIC51aS1yZXNpemFibGUtc2V7d2lkdGg6MTJweDtoZWlnaHQ6MTJweDtyaWdodDotNXB4O2JvdHRvbTotNXB4O2JhY2tncm91bmQtcG9zaXRpb246MTZweCAxNnB4fS51aS1kcmFnZ2FibGUgLnVpLWRpYWxvZy10aXRsZWJhcntjdXJzb3I6bW92ZX0udWktZHJhZ2dhYmxlLWhhbmRsZXstbXMtdG91Y2gtYWN0aW9uOm5vbmU7dG91Y2gtYWN0aW9uOm5vbmV9LnVpLW1lbnV7bGlzdC1zdHlsZTpub25lO3BhZGRpbmc6MDttYXJnaW46MDtkaXNwbGF5OmJsb2NrO291dGxpbmU6bm9uZX0udWktbWVudSAudWktbWVudXtwb3NpdGlvbjphYnNvbHV0ZX0udWktbWVudSAudWktbWVudS1pdGVte3Bvc2l0aW9uOnJlbGF0aXZlO21hcmdpbjowO3BhZGRpbmc6M3B4IDFlbSAzcHggLjRlbTtjdXJzb3I6cG9pbnRlcjttaW4taGVpZ2h0OjA7bGlzdC1zdHlsZS1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBSUFBQUFBQUFQLy8veUg1QkFFQUFBQUFMQUFBQUFBQkFBRUFBQUlCUkFBNyIpfS51aS1tZW51IC51aS1tZW51LWRpdmlkZXJ7bWFyZ2luOjVweCAwO2hlaWdodDowO2ZvbnQtc2l6ZTowO2xpbmUtaGVpZ2h0OjA7Ym9yZGVyLXdpZHRoOjFweCAwIDAgMH0udWktbWVudSAudWktc3RhdGUtZm9jdXMsLnVpLW1lbnUgLnVpLXN0YXRlLWFjdGl2ZXttYXJnaW46LTFweH0udWktbWVudS1pY29uc3twb3NpdGlvbjpyZWxhdGl2ZX0udWktbWVudS1pY29ucyAudWktbWVudS1pdGVte3BhZGRpbmctbGVmdDoyZW19LnVpLW1lbnUgLnVpLWljb257cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDouMmVtO21hcmdpbjphdXRvIDB9LnVpLW1lbnUgLnVpLW1lbnUtaWNvbntsZWZ0OmF1dG87cmlnaHQ6MH0udWktcHJvZ3Jlc3NiYXJ7aGVpZ2h0OjJlbTt0ZXh0LWFsaWduOmxlZnQ7b3ZlcmZsb3c6aGlkZGVufS51aS1wcm9ncmVzc2JhciAudWktcHJvZ3Jlc3NiYXItdmFsdWV7bWFyZ2luOi0xcHg7aGVpZ2h0OjEwMCV9LnVpLXByb2dyZXNzYmFyIC51aS1wcm9ncmVzc2Jhci1vdmVybGF5e2JhY2tncm91bmQ6dXJsKCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhLQUFvQUlBQkFBQUFBUC8vL3lIL0MwNUZWRk5EUVZCRk1pNHdBd0VBQUFBaCtRUUpBUUFCQUN3QUFBQUFLQUFvQUFBQ2tZd05xWHJkQzUyRFMwNmE3TUZaSSs0RkhCQ0tvRGVXS1hxeW1QcUdxeHZKclhaYk14N1R0Yyt3OVhnVTJGQjNsT3lRUldFVDJJRkdpVTltMWZyRFZweFpaYzZiZkh3djRjMVlYUDZrMVZkeTI5MkZiNlVrdXZGdFhwdldTekErSHljWEpIVVhpR1lJaU1nMlI2VzQ1OWduV0dmSE5kaklxRFdWcWVtSDJla3BPYmtwT2xwcFdVcVppcXI2ZWRxcVdRQUFJZmtFQ1FFQUFRQXNBQUFBQUNnQUtBQUFBcFNNZ1puR2ZhcWNnMUUydXV6RG1tSFVCUjhRaWw5NWhpUEtxV24zYXF0THNTMTh5N0cxU3pOZW93V0JFTnRRZCtUMUprdFAwNW56UFRkSlpsUjZ2VXhOV1dqVit2VVdoV05rV0Z3eGw5VnBaUmVkWWNmbElPTGFmYWEyOFhkc0gveW5sY2MxdVBWRFp4UUlSMEsyNStjSUNDbW9xQ2U1bUdoWk9mZVlTVWg1eUpjSnlya1pXV3BhUjhkb0oybzROWXE2MmxBQUFDSDVCQWtCQUFFQUxBQUFBQUFvQUNnQUFBS1ZESTRZeTIyWm5JTlJOcW9zdzBCdjdpMWd5SFVrRmo3b1NhV2x1M292QzhHeE5zbzVmbHV6M3FMVmhCVmVUL0x6N1pUSHl4TDVkRGFsUVdQVk9zUVd0Um51d1hhRlRqOWpWVmg4cG1hOUpqWjR6WVNqNVpPeW1hN3V1b2xmZmgrSVI1YVc5N2NIdUJVWEtHS1hsS2puK0RpSFdNY1lKYWg0TjBsWUNNbEpPWGlwR1JyNXFkZ29TVHJxV1NxNldGbDJ5cG9hVUFBQUlma0VDUUVBQVFBc0FBQUFBQ2dBS0FBQUFwYUViNkhMZ2QvaU83Rk5XdGNGV2UrdWZPREdqUmZvaUoyYWtTaGJ1ZWIwd3RJNTB6bTAycGJ2d2ZXRU1XQlExektHbExJaHNraUVQbTlSNnZSWHhWNFp6V1QyeUhPR3BXTXlvcmJsS2xOcDhIbUhFYi9sQ1hqY1c3Ym10WFA4WHQyMjlPVldSMWZvZDJlV3FOZkh1TWpYQ1BrSUdOaWxlT2lJbVZtQ09FbW9TZm4zeVhsSldtb0hHaHFwNmlsWXVXWXBtVHFLVWdBQUlma0VDUUVBQVFBc0FBQUFBQ2dBS0FBQUFwaUVINmtiNThiaVEzRk5XdE1GV1czZU5WY29qdUZHZnFuWnFTZWJ1UzA2dzVWODAvWDAycEtlOHpGd1A2RUZXT1QxbERGazhyR0VSaDFUVE5Pb2NRNjFIbTRYbTJWZXhVSHB6anltVmlIckZiaUVMc2VmVnJuNlhLZm50MlE5Ry8rWGRpZTQ5OVhIZDJnNGg3aW9PR2hYR0pib0dBblhTQm5vQndLWXlmaW91YlpKMkhuMFJ1UlphZmxaT2lsNTZacDZpaW9LU1hwVUFBQWgrUVFKQVFBQkFDd0FBQUFBS0FBb0FBQUNrb1FScVJ2bnh1STdrVTFhMVVVNWJkNXRuU2VPWlhobW41bFdLM3FOVFd2UmRReFA4cXZhQysveWFZUXpYTzdCTXZhVUVtSlJkM1RzaU1BZ3N3bU5ZclNnWmRZclRYNnRTSEdaTzczZXp1QXcydXh1UStCYmVaZk14c2V4WTM1Ky9RZTRKMWluVjBnNHgzV0h1TWhJbDJqWE9LVDJRK1ZVNWZnb1NVSTUyVmZaeWZrSkdraGE2am1ZK2FhWWRpcnErbFFBQUNINUJBa0JBQUVBTEFBQUFBQW9BQ2dBQUFLV0JJS3BZZTBMM1lOS1RvcXN3VWx2em5pZ2Q0d2lSNEtoWnJLdDlVcHFpcDYxaTlFM3ZNdnhSZEhsYkVGaUVYZms5WUFSWXhPWlpENlZRMnBVdW5CbXRSWG8xTGY4aE1WVmNObDhKYWZWMzhhTTIvRnU1VjE2Qm42M3I2eHQ5N2owOStNWFNGaTRCbmlHRmFlM2h6Ykg5K2hZQnprcHVVaDVhWm1IdWFuWk9aZ0l1dmJHaU5lb21DbmF4eGFwMnVwYUNac3ErMWtBQUNINUJBa0JBQUVBTEFBQUFBQW9BQ2dBQUFLWGpJOEJ5NXpmNGtPeFRWclhOVmx2MVgwZDhJR1pHS0xuTnBZdG04THI5Y3FWZXVPU3ZmT1c3OUQ5YURIaXpOaERKaWRGWmhOeWRFYWhPYURINm5vbXRKanAxdHV0S29OV2t2QTZKcWZSVkxIVS9RVWZhdTlsMng3RzU0ZDFmbDk5NXhjSUdBZFhxTWZCTmFkb1lyaEgrTWcyS0JscFZwYmx1Q2lYbU1uWjJTaDRHQnFKK2NrSU9xcUo2TG1LU2xsWm1zb3E2d3BRQUFBaCtRUUpBUUFCQUN3QUFBQUFLQUFvQUFBQ2xZeC9vTHZveHVKRGtVMWExWVVaYko1OW5TZDJaWGhXcWJSYTIvZ0Y4R3UyRFkzaXFzN3lycSt4QllFa1l2RlNNOGFTU09iRStaZ1JsMUJIRlpOcjdwUkNhdlo1QlcyMTQyaFkzQU4veld0c21mMTJwOVh4eEZsMmxwTG4xcnNlenRmWFpqZElXSWYyczVkSXR3allLQmdvOXlnNXBIZ3pKWFRFZUdsWnVlbnB5UG1wR1FvS09Xa1ltU3BhU25xS2lsZUkyRkFBQUNINUJBa0JBQUVBTEFBQUFBQW9BQ2dBQUFLVmpCK2d1K2pHNGtPUlRWclZoUmxzbm4yZEozWmxlRmFwdEZyYitDWG1POU9vemVMNVZmUDk5SHZBV2hwaVVkY3drcEJIMzgyNUF3WWRVOHhUcWxMR2h0Q29zQXJLTXB2ZmExbU1SYWU5VnZXWmZlQjJYZlBrZUxtbTE4bFVjQmorcDVkbk44alhaM1lJR0VoWXVPVW40NWFvQ0RrcDE2aGw1SWpZSnZqV0tjbm9HUXBxeVBscE9ocjNhRWxhcXJxNTZCcTdWQUFBT3c9PSIpO2hlaWdodDoxMDAlO2ZpbHRlcjphbHBoYShvcGFjaXR5PTI1KTtvcGFjaXR5OjAuMjV9LnVpLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUgLnVpLXByb2dyZXNzYmFyLXZhbHVle2JhY2tncm91bmQtaW1hZ2U6bm9uZX0udWktcmVzaXphYmxle3Bvc2l0aW9uOnJlbGF0aXZlfS51aS1yZXNpemFibGUtaGFuZGxle3Bvc2l0aW9uOmFic29sdXRlO2ZvbnQtc2l6ZTowLjFweDtkaXNwbGF5OmJsb2NrOy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktcmVzaXphYmxlLWRpc2FibGVkIC51aS1yZXNpemFibGUtaGFuZGxlLC51aS1yZXNpemFibGUtYXV0b2hpZGUgLnVpLXJlc2l6YWJsZS1oYW5kbGV7ZGlzcGxheTpub25lfS51aS1yZXNpemFibGUtbntjdXJzb3I6bi1yZXNpemU7aGVpZ2h0OjdweDt3aWR0aDoxMDAlO3RvcDotNXB4O2xlZnQ6MH0udWktcmVzaXphYmxlLXN7Y3Vyc29yOnMtcmVzaXplO2hlaWdodDo3cHg7d2lkdGg6MTAwJTtib3R0b206LTVweDtsZWZ0OjB9LnVpLXJlc2l6YWJsZS1le2N1cnNvcjplLXJlc2l6ZTt3aWR0aDo3cHg7cmlnaHQ6LTVweDt0b3A6MDtoZWlnaHQ6MTAwJX0udWktcmVzaXphYmxlLXd7Y3Vyc29yOnctcmVzaXplO3dpZHRoOjdweDtsZWZ0Oi01cHg7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXJlc2l6YWJsZS1zZXtjdXJzb3I6c2UtcmVzaXplO3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7cmlnaHQ6MXB4O2JvdHRvbToxcHh9LnVpLXJlc2l6YWJsZS1zd3tjdXJzb3I6c3ctcmVzaXplO3dpZHRoOjlweDtoZWlnaHQ6OXB4O2xlZnQ6LTVweDtib3R0b206LTVweH0udWktcmVzaXphYmxlLW53e2N1cnNvcjpudy1yZXNpemU7d2lkdGg6OXB4O2hlaWdodDo5cHg7bGVmdDotNXB4O3RvcDotNXB4fS51aS1yZXNpemFibGUtbmV7Y3Vyc29yOm5lLXJlc2l6ZTt3aWR0aDo5cHg7aGVpZ2h0OjlweDtyaWdodDotNXB4O3RvcDotNXB4fS51aS1zZWxlY3RhYmxley1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc2VsZWN0YWJsZS1oZWxwZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDA7Ym9yZGVyOjFweCBkb3R0ZWQgYmxhY2t9LnVpLXNlbGVjdG1lbnUtbWVudXtwYWRkaW5nOjA7bWFyZ2luOjA7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2Rpc3BsYXk6bm9uZX0udWktc2VsZWN0bWVudS1tZW51IC51aS1tZW51e292ZXJmbG93OmF1dG87b3ZlcmZsb3cteDpoaWRkZW47cGFkZGluZy1ib3R0b206MXB4fS51aS1zZWxlY3RtZW51LW1lbnUgLnVpLW1lbnUgLnVpLXNlbGVjdG1lbnUtb3B0Z3JvdXB7Zm9udC1zaXplOjFlbTtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjEuNTtwYWRkaW5nOjJweCAwLjRlbTttYXJnaW46MC41ZW0gMCAwIDA7aGVpZ2h0OmF1dG87Ym9yZGVyOjB9LnVpLXNlbGVjdG1lbnUtb3BlbntkaXNwbGF5OmJsb2NrfS51aS1zZWxlY3RtZW51LWJ1dHRvbntkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7dGV4dC1kZWNvcmF0aW9uOm5vbmU7Y3Vyc29yOnBvaW50ZXJ9LnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktaWNvbntyaWdodDowLjVlbTtsZWZ0OmF1dG87bWFyZ2luLXRvcDotOHB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCV9LnVpLXNlbGVjdG1lbnUtYnV0dG9uIHNwYW4udWktc2VsZWN0bWVudS10ZXh0e3RleHQtYWxpZ246bGVmdDtwYWRkaW5nOjAuNGVtIDIuMWVtIDAuNGVtIDFlbTtkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjEuNDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLXNsaWRlcntwb3NpdGlvbjpyZWxhdGl2ZTt0ZXh0LWFsaWduOmxlZnR9LnVpLXNsaWRlciAudWktc2xpZGVyLWhhbmRsZXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjI7d2lkdGg6MS4yZW07aGVpZ2h0OjEuMmVtO2N1cnNvcjpkZWZhdWx0Oy1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc2xpZGVyIC51aS1zbGlkZXItcmFuZ2V7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxO2ZvbnQtc2l6ZTouN2VtO2Rpc3BsYXk6YmxvY2s7Ym9yZGVyOjA7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9LnVpLXNsaWRlci51aS1zdGF0ZS1kaXNhYmxlZCAudWktc2xpZGVyLWhhbmRsZSwudWktc2xpZGVyLnVpLXN0YXRlLWRpc2FibGVkIC51aS1zbGlkZXItcmFuZ2V7ZmlsdGVyOmluaGVyaXR9LnVpLXNsaWRlci1ob3Jpem9udGFse2hlaWdodDouOGVtfS51aS1zbGlkZXItaG9yaXpvbnRhbCAudWktc2xpZGVyLWhhbmRsZXt0b3A6LS4zZW07bWFyZ2luLWxlZnQ6LS42ZW19LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2V7dG9wOjA7aGVpZ2h0OjEwMCV9LnVpLXNsaWRlci1ob3Jpem9udGFsIC51aS1zbGlkZXItcmFuZ2UtbWlue2xlZnQ6MH0udWktc2xpZGVyLWhvcml6b250YWwgLnVpLXNsaWRlci1yYW5nZS1tYXh7cmlnaHQ6MH0udWktc2xpZGVyLXZlcnRpY2Fse3dpZHRoOi44ZW07aGVpZ2h0OjEwMHB4fS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1oYW5kbGV7bGVmdDotLjNlbTttYXJnaW4tbGVmdDowO21hcmdpbi1ib3R0b206LS42ZW19LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdle2xlZnQ6MDt3aWR0aDoxMDAlfS51aS1zbGlkZXItdmVydGljYWwgLnVpLXNsaWRlci1yYW5nZS1taW57Ym90dG9tOjB9LnVpLXNsaWRlci12ZXJ0aWNhbCAudWktc2xpZGVyLXJhbmdlLW1heHt0b3A6MH0udWktc29ydGFibGUtaGFuZGxley1tcy10b3VjaC1hY3Rpb246bm9uZTt0b3VjaC1hY3Rpb246bm9uZX0udWktc3Bpbm5lcntwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1ibG9jaztvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0udWktc3Bpbm5lci1pbnB1dHtib3JkZXI6bm9uZTtiYWNrZ3JvdW5kOm5vbmU7Y29sb3I6aW5oZXJpdDtwYWRkaW5nOjA7bWFyZ2luOi4yZW0gMDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7bWFyZ2luLWxlZnQ6LjRlbTttYXJnaW4tcmlnaHQ6MjJweH0udWktc3Bpbm5lci1idXR0b257d2lkdGg6MTZweDtoZWlnaHQ6NTAlO2ZvbnQtc2l6ZTouNWVtO3BhZGRpbmc6MDttYXJnaW46MDt0ZXh0LWFsaWduOmNlbnRlcjtwb3NpdGlvbjphYnNvbHV0ZTtjdXJzb3I6ZGVmYXVsdDtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtyaWdodDowfS51aS1zcGlubmVyIGEudWktc3Bpbm5lci1idXR0b257Ym9yZGVyLXRvcDpub25lO2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItcmlnaHQ6bm9uZX0udWktc3Bpbm5lciAudWktaWNvbntwb3NpdGlvbjphYnNvbHV0ZTttYXJnaW4tdG9wOi04cHg7dG9wOjUwJTtsZWZ0OjB9LnVpLXNwaW5uZXItdXB7dG9wOjB9LnVpLXNwaW5uZXItZG93bntib3R0b206MH0udWktc3Bpbm5lciAudWktaWNvbi10cmlhbmdsZS0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjVweCAtMTZweH0udWktdGFic3twb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nOi4yZW19LnVpLXRhYnMgLnVpLXRhYnMtbmF2e21hcmdpbjowO3BhZGRpbmc6LjJlbSAuMmVtIDB9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpe2xpc3Qtc3R5bGU6bm9uZTtmbG9hdDpsZWZ0O3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDowO21hcmdpbjoxcHggLjJlbSAwIDA7Ym9yZGVyLWJvdHRvbS13aWR0aDowO3BhZGRpbmc6MDt3aGl0ZS1zcGFjZTpub3dyYXB9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IC51aS10YWJzLWFuY2hvcntmbG9hdDpsZWZ0O3BhZGRpbmc6LjVlbSAxZW07dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZle21hcmdpbi1ib3R0b206LTFweDtwYWRkaW5nLWJvdHRvbToxcHh9LnVpLXRhYnMgLnVpLXRhYnMtbmF2IGxpLnVpLXRhYnMtYWN0aXZlIC51aS10YWJzLWFuY2hvciwudWktdGFicyAudWktdGFicy1uYXYgbGkudWktc3RhdGUtZGlzYWJsZWQgLnVpLXRhYnMtYW5jaG9yLC51aS10YWJzIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWxvYWRpbmcgLnVpLXRhYnMtYW5jaG9ye2N1cnNvcjp0ZXh0fS51aS10YWJzLWNvbGxhcHNpYmxlIC51aS10YWJzLW5hdiBsaS51aS10YWJzLWFjdGl2ZSAudWktdGFicy1hbmNob3J7Y3Vyc29yOnBvaW50ZXJ9LnVpLXRhYnMgLnVpLXRhYnMtcGFuZWx7ZGlzcGxheTpibG9jaztib3JkZXItd2lkdGg6MDtwYWRkaW5nOjFlbSAxLjRlbTtiYWNrZ3JvdW5kOm5vbmV9LnVpLXRvb2x0aXB7cGFkZGluZzo4cHg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDo5OTk5O21heC13aWR0aDozMDBweDstd2Via2l0LWJveC1zaGFkb3c6MCAwIDVweCAjYWFhO2JveC1zaGFkb3c6MCAwIDVweCAjYWFhfWJvZHkgLnVpLXRvb2x0aXB7Ym9yZGVyLXdpZHRoOjJweH0udWktd2lkZ2V0e2ZvbnQtZmFtaWx5OlRyZWJ1Y2hldCBNUyxUYWhvbWEsVmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxLjFlbX0udWktd2lkZ2V0IC51aS13aWRnZXR7Zm9udC1zaXplOjFlbX0udWktd2lkZ2V0IGlucHV0LC51aS13aWRnZXQgc2VsZWN0LC51aS13aWRnZXQgdGV4dGFyZWEsLnVpLXdpZGdldCBidXR0b257Zm9udC1mYW1pbHk6VHJlYnVjaGV0IE1TLFRhaG9tYSxWZXJkYW5hLEFyaWFsLHNhbnMtc2VyaWY7Zm9udC1zaXplOjFlbX0udWktd2lkZ2V0LWNvbnRlbnR7Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JhY2tncm91bmQ6I2VlZSB1cmwoImltYWdlcy91aS1iZ19oaWdobGlnaHQtc29mdF8xMDBfZWVlZWVlXzF4MTAwLnBuZyIpIDUwJSB0b3AgcmVwZWF0LXg7Y29sb3I6IzMzM30udWktd2lkZ2V0LWNvbnRlbnQgYXtjb2xvcjojMzMzfS51aS13aWRnZXQtaGVhZGVye2JvcmRlcjoxcHggc29saWQgI2U3OGYwODtiYWNrZ3JvdW5kOiNmNmE4MjggdXJsKCJpbWFnZXMvdWktYmdfZ2xvc3Mtd2F2ZV8zNV9mNmE4MjhfNTAweDEwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2NvbG9yOiNmZmY7Zm9udC13ZWlnaHQ6Ym9sZH0udWktd2lkZ2V0LWhlYWRlciBhe2NvbG9yOiNmZmZ9LnVpLXN0YXRlLWRlZmF1bHQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1kZWZhdWx0LC51aS13aWRnZXQtaGVhZGVyIC51aS1zdGF0ZS1kZWZhdWx0e2JvcmRlcjoxcHggc29saWQgI2NjYztiYWNrZ3JvdW5kOiNmNmY2ZjYgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfMTAwX2Y2ZjZmNl8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6IzFjOTRjNH0udWktc3RhdGUtZGVmYXVsdCBhLC51aS1zdGF0ZS1kZWZhdWx0IGE6bGluaywudWktc3RhdGUtZGVmYXVsdCBhOnZpc2l0ZWR7Y29sb3I6IzFjOTRjNDt0ZXh0LWRlY29yYXRpb246bm9uZX0udWktc3RhdGUtaG92ZXIsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1ob3ZlciwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtaG92ZXIsLnVpLXN0YXRlLWZvY3VzLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZm9jdXMsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWZvY3Vze2JvcmRlcjoxcHggc29saWQgI2ZiY2IwOTtiYWNrZ3JvdW5kOiNmZGY1Y2UgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfMTAwX2ZkZjVjZV8xeDQwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O2ZvbnQtd2VpZ2h0OmJvbGQ7Y29sb3I6I2M3NzQwNX0udWktc3RhdGUtaG92ZXIgYSwudWktc3RhdGUtaG92ZXIgYTpob3ZlciwudWktc3RhdGUtaG92ZXIgYTpsaW5rLC51aS1zdGF0ZS1ob3ZlciBhOnZpc2l0ZWQsLnVpLXN0YXRlLWZvY3VzIGEsLnVpLXN0YXRlLWZvY3VzIGE6aG92ZXIsLnVpLXN0YXRlLWZvY3VzIGE6bGluaywudWktc3RhdGUtZm9jdXMgYTp2aXNpdGVke2NvbG9yOiNjNzc0MDU7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LnVpLXN0YXRlLWFjdGl2ZSwudWktd2lkZ2V0LWNvbnRlbnQgLnVpLXN0YXRlLWFjdGl2ZSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtYWN0aXZle2JvcmRlcjoxcHggc29saWQgI2ZiZDg1MDtiYWNrZ3JvdW5kOiNmZmYgdXJsKCJpbWFnZXMvdWktYmdfZ2xhc3NfNjVfZmZmZmZmXzF4NDAwLnBuZyIpIDUwJSA1MCUgcmVwZWF0LXg7Zm9udC13ZWlnaHQ6Ym9sZDtjb2xvcjojZWI4ZjAwfS51aS1zdGF0ZS1hY3RpdmUgYSwudWktc3RhdGUtYWN0aXZlIGE6bGluaywudWktc3RhdGUtYWN0aXZlIGE6dmlzaXRlZHtjb2xvcjojZWI4ZjAwO3RleHQtZGVjb3JhdGlvbjpub25lfS51aS1zdGF0ZS1oaWdobGlnaHQsLnVpLXdpZGdldC1jb250ZW50IC51aS1zdGF0ZS1oaWdobGlnaHQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodHtib3JkZXI6MXB4IHNvbGlkICNmZWQyMmY7YmFja2dyb3VuZDojZmZlNDVjIHVybCgiaW1hZ2VzL3VpLWJnX2hpZ2hsaWdodC1zb2Z0Xzc1X2ZmZTQ1Y18xeDEwMC5wbmciKSA1MCUgdG9wIHJlcGVhdC14O2NvbG9yOiMzNjM2MzZ9LnVpLXN0YXRlLWhpZ2hsaWdodCBhLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtaGlnaGxpZ2h0IGEsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWhpZ2hsaWdodCBhe2NvbG9yOiMzNjM2MzZ9LnVpLXN0YXRlLWVycm9yLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWVycm9ye2JvcmRlcjoxcHggc29saWQgI2NkMGEwYTtiYWNrZ3JvdW5kOiNiODE5MDAgdXJsKCJpbWFnZXMvdWktYmdfZGlhZ29uYWxzLXRoaWNrXzE4X2I4MTkwMF80MHg0MC5wbmciKSA1MCUgNTAlIHJlcGVhdDtjb2xvcjojZmZmfS51aS1zdGF0ZS1lcnJvciBhLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3IgYSwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3IgYXtjb2xvcjojZmZmfS51aS1zdGF0ZS1lcnJvci10ZXh0LC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZXJyb3ItdGV4dCwudWktd2lkZ2V0LWhlYWRlciAudWktc3RhdGUtZXJyb3ItdGV4dHtjb2xvcjojZmZmfS51aS1wcmlvcml0eS1wcmltYXJ5LC51aS13aWRnZXQtY29udGVudCAudWktcHJpb3JpdHktcHJpbWFyeSwudWktd2lkZ2V0LWhlYWRlciAudWktcHJpb3JpdHktcHJpbWFyeXtmb250LXdlaWdodDpib2xkfS51aS1wcmlvcml0eS1zZWNvbmRhcnksLnVpLXdpZGdldC1jb250ZW50IC51aS1wcmlvcml0eS1zZWNvbmRhcnksLnVpLXdpZGdldC1oZWFkZXIgLnVpLXByaW9yaXR5LXNlY29uZGFyeXtvcGFjaXR5Oi43O2ZpbHRlcjpBbHBoYShPcGFjaXR5PTcwKTtmb250LXdlaWdodDpub3JtYWx9LnVpLXN0YXRlLWRpc2FibGVkLC51aS13aWRnZXQtY29udGVudCAudWktc3RhdGUtZGlzYWJsZWQsLnVpLXdpZGdldC1oZWFkZXIgLnVpLXN0YXRlLWRpc2FibGVke29wYWNpdHk6LjM1O2ZpbHRlcjpBbHBoYShPcGFjaXR5PTM1KTtiYWNrZ3JvdW5kLWltYWdlOm5vbmV9LnVpLXN0YXRlLWRpc2FibGVkIC51aS1pY29ue2ZpbHRlcjpBbHBoYShPcGFjaXR5PTM1KX0udWktaWNvbnt3aWR0aDoxNnB4O2hlaWdodDoxNnB4fS51aS1pY29uLC51aS13aWRnZXQtY29udGVudCAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zXzIyMjIyMl8yNTZ4MjQwLnBuZyIpfS51aS13aWRnZXQtaGVhZGVyIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZmZmZmZmXzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWRlZmF1bHQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc19lZjhjMDhfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtaG92ZXIgLnVpLWljb24sLnVpLXN0YXRlLWZvY3VzIC51aS1pY29ue2JhY2tncm91bmQtaW1hZ2U6dXJsKCJpbWFnZXMvdWktaWNvbnNfZWY4YzA4XzI1NngyNDAucG5nIil9LnVpLXN0YXRlLWFjdGl2ZSAudWktaWNvbntiYWNrZ3JvdW5kLWltYWdlOnVybCgiaW1hZ2VzL3VpLWljb25zX2VmOGMwOF8yNTZ4MjQwLnBuZyIpfS51aS1zdGF0ZS1oaWdobGlnaHQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc18yMjhlZjFfMjU2eDI0MC5wbmciKX0udWktc3RhdGUtZXJyb3IgLnVpLWljb24sLnVpLXN0YXRlLWVycm9yLXRleHQgLnVpLWljb257YmFja2dyb3VuZC1pbWFnZTp1cmwoImltYWdlcy91aS1pY29uc19mZmQyN2FfMjU2eDI0MC5wbmciKX0udWktaWNvbi1ibGFua3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjE2cHggMTZweH0udWktaWNvbi1jYXJhdC0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9LnVpLWljb24tY2FyYXQtMS1uZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IDB9LnVpLWljb24tY2FyYXQtMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggMH0udWktaWNvbi1jYXJhdC0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggMH0udWktaWNvbi1jYXJhdC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAwfS51aS1pY29uLWNhcmF0LTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAwfS51aS1pY29uLWNhcmF0LTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IDB9LnVpLWljb24tY2FyYXQtMS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAwfS51aS1pY29uLWNhcmF0LTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IDB9LnVpLWljb24tY2FyYXQtMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggMH0udWktaWNvbi10cmlhbmdsZS0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTZweH0udWktaWNvbi10cmlhbmdsZS0xLXNle2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMS1zd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNnB4fS51aS1pY29uLXRyaWFuZ2xlLTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMi1uLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE2cHh9LnVpLWljb24tdHJpYW5nbGUtMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTE2cHh9LnVpLWljb24tYXJyb3ctMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtMzJweH0udWktaWNvbi1hcnJvdy0xLW5le2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTMycHh9LnVpLWljb24tYXJyb3ctMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0zMnB4fS51aS1pY29uLWFycm93LTEtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMzJweH0udWktaWNvbi1hcnJvdy0xLW53e2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0zMnB4fS51aS1pY29uLWFycm93LTItbi1ze2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0zMnB4fS51aS1pY29uLWFycm93LTItbmUtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTMycHh9LnVpLWljb24tYXJyb3ctMi1zZS1ud3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0zMnB4fS51aS1pY29uLWFycm93c3RvcC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMjA4cHggLTMycHh9LnVpLWljb24tYXJyb3dzdG9wLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMzJweH0udWktaWNvbi1hcnJvd3N0b3AtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC0zMnB4fS51aS1pY29uLWFycm93dGhpY2stMS1ue2JhY2tncm91bmQtcG9zaXRpb246MCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbmV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2stMS1ze2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXN3e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTEtbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItbmUtc3d7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGljay0yLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrLTItc2Utbnd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTc2cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC00OHB4fS51aS1pY29uLWFycm93dGhpY2tzdG9wLTEtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtNDhweH0udWktaWNvbi1hcnJvd3RoaWNrc3RvcC0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTQ4cHh9LnVpLWljb24tYXJyb3d0aGlja3N0b3AtMS13e2JhY2tncm91bmQtcG9zaXRpb246LTI0MHB4IC00OHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS13e2JhY2tncm91bmQtcG9zaXRpb246MCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybnRoaWNrLTEtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC02NHB4fS51aS1pY29uLWFycm93cmV0dXJudGhpY2stMS1le2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTY0cHh9LnVpLWljb24tYXJyb3dyZXR1cm50aGljay0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLW57YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtNjRweH0udWktaWNvbi1hcnJvd3JldHVybi0xLXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMjhweCAtNjRweH0udWktaWNvbi1hcnJvd3JlZnJlc2gtMS1ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC02NHB4fS51aS1pY29uLWFycm93cmVmcmVzaC0xLWV7YmFja2dyb3VuZC1wb3NpdGlvbjotMTYwcHggLTY0cHh9LnVpLWljb24tYXJyb3dyZWZyZXNoLTEtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtNjRweH0udWktaWNvbi1hcnJvdy00e2JhY2tncm91bmQtcG9zaXRpb246MCAtODBweH0udWktaWNvbi1hcnJvdy00LWRpYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtODBweH0udWktaWNvbi1leHRsaW5re2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTgwcHh9LnVpLWljb24tbmV3d2lue2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTgwcHh9LnVpLWljb24tcmVmcmVzaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC04MHB4fS51aS1pY29uLXNodWZmbGV7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtODBweH0udWktaWNvbi10cmFuc2Zlci1lLXd7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtODBweH0udWktaWNvbi10cmFuc2ZlcnRoaWNrLWUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtODBweH0udWktaWNvbi1mb2xkZXItY29sbGFwc2Vke2JhY2tncm91bmQtcG9zaXRpb246MCAtOTZweH0udWktaWNvbi1mb2xkZXItb3BlbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC05NnB4fS51aS1pY29uLWRvY3VtZW50e2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTk2cHh9LnVpLWljb24tZG9jdW1lbnQtYntiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC05NnB4fS51aS1pY29uLW5vdGV7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtOTZweH0udWktaWNvbi1tYWlsLWNsb3NlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC05NnB4fS51aS1pY29uLW1haWwtb3BlbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC05NnB4fS51aS1pY29uLXN1aXRjYXNle2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC05NnB4fS51aS1pY29uLWNvbW1lbnR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTk2cHh9LnVpLWljb24tcGVyc29ue2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC05NnB4fS51aS1pY29uLXByaW50e2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC05NnB4fS51aS1pY29uLXRyYXNoe2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC05NnB4fS51aS1pY29uLWxvY2tlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xOTJweCAtOTZweH0udWktaWNvbi11bmxvY2tlZHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtOTZweH0udWktaWNvbi1ib29rbWFya3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtOTZweH0udWktaWNvbi10YWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMjQwcHggLTk2cHh9LnVpLWljb24taG9tZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTExMnB4fS51aS1pY29uLWZsYWd7YmFja2dyb3VuZC1wb3NpdGlvbjotMTZweCAtMTEycHh9LnVpLWljb24tY2FsZW5kYXJ7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTEycHh9LnVpLWljb24tY2FydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xMTJweH0udWktaWNvbi1wZW5jaWx7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTEycHh9LnVpLWljb24tY2xvY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTEycHh9LnVpLWljb24tZGlza3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xMTJweH0udWktaWNvbi1jYWxjdWxhdG9ye2JhY2tncm91bmQtcG9zaXRpb246LTExMnB4IC0xMTJweH0udWktaWNvbi16b29taW57YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTExMnB4fS51aS1pY29uLXpvb21vdXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTQ0cHggLTExMnB4fS51aS1pY29uLXNlYXJjaHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTEycHh9LnVpLWljb24td3JlbmNoe2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xMTJweH0udWktaWNvbi1nZWFye2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xMTJweH0udWktaWNvbi1oZWFydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTEycHh9LnVpLWljb24tc3RhcntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMjRweCAtMTEycHh9LnVpLWljb24tbGlua3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMTEycHh9LnVpLWljb24tY2FuY2Vse2JhY2tncm91bmQtcG9zaXRpb246MCAtMTI4cHh9LnVpLWljb24tcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xMjhweH0udWktaWNvbi1wbHVzdGhpY2t7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTI4cHh9LnVpLWljb24tbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTI4cHh9LnVpLWljb24tbWludXN0aGlja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xMjhweH0udWktaWNvbi1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xMjhweH0udWktaWNvbi1jbG9zZXRoaWNre2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTEyOHB4fS51aS1pY29uLWtleXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTI4cHh9LnVpLWljb24tbGlnaHRidWxie2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xMjhweH0udWktaWNvbi1zY2lzc29yc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTI4cHh9LnVpLWljb24tY2xpcGJvYXJke2JhY2tncm91bmQtcG9zaXRpb246LTE2MHB4IC0xMjhweH0udWktaWNvbi1jb3B5e2JhY2tncm91bmQtcG9zaXRpb246LTE3NnB4IC0xMjhweH0udWktaWNvbi1jb250YWN0e2JhY2tncm91bmQtcG9zaXRpb246LTE5MnB4IC0xMjhweH0udWktaWNvbi1pbWFnZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTI4cHh9LnVpLWljb24tdmlkZW97YmFja2dyb3VuZC1wb3NpdGlvbjotMjI0cHggLTEyOHB4fS51aS1pY29uLXNjcmlwdHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yNDBweCAtMTI4cHh9LnVpLWljb24tYWxlcnR7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNDRweH0udWktaWNvbi1pbmZve2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE0NHB4fS51aS1pY29uLW5vdGljZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNDRweH0udWktaWNvbi1oZWxwe2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE0NHB4fS51aS1pY29uLWNoZWNre2JhY2tncm91bmQtcG9zaXRpb246LTY0cHggLTE0NHB4fS51aS1pY29uLWJ1bGxldHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNDRweH0udWktaWNvbi1yYWRpby1vbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xNDRweH0udWktaWNvbi1yYWRpby1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE0NHB4fS51aS1pY29uLXBpbi13e2JhY2tncm91bmQtcG9zaXRpb246LTEyOHB4IC0xNDRweH0udWktaWNvbi1waW4tc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTQ0cHh9LnVpLWljb24tcGxheXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTE2MHB4fS51aS1pY29uLXBhdXNle2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE2MHB4fS51aS1pY29uLXNlZWstbmV4dHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xNjBweH0udWktaWNvbi1zZWVrLXByZXZ7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMTYwcHh9LnVpLWljb24tc2Vlay1lbmR7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMTYwcHh9LnVpLWljb24tc2Vlay1zdGFydHtiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xNjBweH0udWktaWNvbi1zZWVrLWZpcnN0e2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTE2MHB4fS51aS1pY29uLXN0b3B7YmFja2dyb3VuZC1wb3NpdGlvbjotOTZweCAtMTYwcHh9LnVpLWljb24tZWplY3R7YmFja2dyb3VuZC1wb3NpdGlvbjotMTEycHggLTE2MHB4fS51aS1pY29uLXZvbHVtZS1vZmZ7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE2MHB4fS51aS1pY29uLXZvbHVtZS1vbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNDRweCAtMTYwcHh9LnVpLWljb24tcG93ZXJ7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0xNzZweH0udWktaWNvbi1zaWduYWwtZGlhZ3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNnB4IC0xNzZweH0udWktaWNvbi1zaWduYWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0we2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTE3NnB4fS51aS1pY29uLWJhdHRlcnktMXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xNzZweH0udWktaWNvbi1iYXR0ZXJ5LTJ7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMTc2cHh9LnVpLWljb24tYmF0dGVyeS0ze2JhY2tncm91bmQtcG9zaXRpb246LTk2cHggLTE3NnB4fS51aS1pY29uLWNpcmNsZS1wbHVze2JhY2tncm91bmQtcG9zaXRpb246MCAtMTkycHh9LnVpLWljb24tY2lyY2xlLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1jbG9zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0zMnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi00OHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtc3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtd3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi04MHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi05NnB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMTJweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLWFycm93LXN7YmFja2dyb3VuZC1wb3NpdGlvbjotMTI4cHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1hcnJvdy13e2JhY2tncm91bmQtcG9zaXRpb246LTE0NHB4IC0xOTJweH0udWktaWNvbi1jaXJjbGUtYXJyb3ctbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNjBweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXpvb21pbntiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xNzZweCAtMTkycHh9LnVpLWljb24tY2lyY2xlLXpvb21vdXR7YmFja2dyb3VuZC1wb3NpdGlvbjotMTkycHggLTE5MnB4fS51aS1pY29uLWNpcmNsZS1jaGVja3tiYWNrZ3JvdW5kLXBvc2l0aW9uOi0yMDhweCAtMTkycHh9LnVpLWljb24tY2lyY2xlc21hbGwtcGx1c3tiYWNrZ3JvdW5kLXBvc2l0aW9uOjAgLTIwOHB4fS51aS1pY29uLWNpcmNsZXNtYWxsLW1pbnVze2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTIwOHB4fS51aS1pY29uLWNpcmNsZXNtYWxsLWNsb3Nle2JhY2tncm91bmQtcG9zaXRpb246LTMycHggLTIwOHB4fS51aS1pY29uLXNxdWFyZXNtYWxsLXBsdXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNDhweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtbWludXN7YmFja2dyb3VuZC1wb3NpdGlvbjotNjRweCAtMjA4cHh9LnVpLWljb24tc3F1YXJlc21hbGwtY2xvc2V7YmFja2dyb3VuZC1wb3NpdGlvbjotODBweCAtMjA4cHh9LnVpLWljb24tZ3JpcC1kb3R0ZWQtdmVydGljYWx7YmFja2dyb3VuZC1wb3NpdGlvbjowIC0yMjRweH0udWktaWNvbi1ncmlwLWRvdHRlZC1ob3Jpem9udGFse2JhY2tncm91bmQtcG9zaXRpb246LTE2cHggLTIyNHB4fS51aS1pY29uLWdyaXAtc29saWQtdmVydGljYWx7YmFja2dyb3VuZC1wb3NpdGlvbjotMzJweCAtMjI0cHh9LnVpLWljb24tZ3JpcC1zb2xpZC1ob3Jpem9udGFse2JhY2tncm91bmQtcG9zaXRpb246LTQ4cHggLTIyNHB4fS51aS1pY29uLWdyaXBzbWFsbC1kaWFnb25hbC1zZXtiYWNrZ3JvdW5kLXBvc2l0aW9uOi02NHB4IC0yMjRweH0udWktaWNvbi1ncmlwLWRpYWdvbmFsLXNle2JhY2tncm91bmQtcG9zaXRpb246LTgwcHggLTIyNHB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItdG9wLC51aS1jb3JuZXItbGVmdCwudWktY29ybmVyLXRse2JvcmRlci10b3AtbGVmdC1yYWRpdXM6NHB4fS51aS1jb3JuZXItYWxsLC51aS1jb3JuZXItdG9wLC51aS1jb3JuZXItcmlnaHQsLnVpLWNvcm5lci10cntib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci1ib3R0b20sLnVpLWNvcm5lci1sZWZ0LC51aS1jb3JuZXItYmx7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czo0cHh9LnVpLWNvcm5lci1hbGwsLnVpLWNvcm5lci1ib3R0b20sLnVpLWNvcm5lci1yaWdodCwudWktY29ybmVyLWJye2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweH0udWktd2lkZ2V0LW92ZXJsYXl7YmFja2dyb3VuZDojNjY2IHVybCgiaW1hZ2VzL3VpLWJnX2RpYWdvbmFscy10aGlja18yMF82NjY2NjZfNDB4NDAucG5nIikgNTAlIDUwJSByZXBlYXQ7b3BhY2l0eTouNTtmaWx0ZXI6QWxwaGEoT3BhY2l0eT01MCl9LnVpLXdpZGdldC1zaGFkb3d7bWFyZ2luOi01cHggMCAwIC01cHg7cGFkZGluZzo1cHg7YmFja2dyb3VuZDojMDAwIHVybCgiaW1hZ2VzL3VpLWJnX2ZsYXRfMTBfMDAwMDAwXzQweDEwMC5wbmciKSA1MCUgNTAlIHJlcGVhdC14O29wYWNpdHk6LjI7ZmlsdGVyOkFscGhhKE9wYWNpdHk9MjApO2JvcmRlci1yYWRpdXM6NXB4fQ==]]></data>
	</file>
	<file>
	  <filename>/lib/ui.lib/jquery-ui.min.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyohIGpRdWVyeSBVSSAtIHYxLjExLjQgLSAyMDE1LTAzLTExCiogaHR0cDovL2pxdWVyeXVpLmNvbQoqIEluY2x1ZGVzOiBjb3JlLmpzLCB3aWRnZXQuanMsIG1vdXNlLmpzLCBwb3NpdGlvbi5qcywgYWNjb3JkaW9uLmpzLCBhdXRvY29tcGxldGUuanMsIGJ1dHRvbi5qcywgZGF0ZXBpY2tlci5qcywgZGlhbG9nLmpzLCBkcmFnZ2FibGUuanMsIGRyb3BwYWJsZS5qcywgZWZmZWN0LmpzLCBlZmZlY3QtYmxpbmQuanMsIGVmZmVjdC1ib3VuY2UuanMsIGVmZmVjdC1jbGlwLmpzLCBlZmZlY3QtZHJvcC5qcywgZWZmZWN0LWV4cGxvZGUuanMsIGVmZmVjdC1mYWRlLmpzLCBlZmZlY3QtZm9sZC5qcywgZWZmZWN0LWhpZ2hsaWdodC5qcywgZWZmZWN0LXB1ZmYuanMsIGVmZmVjdC1wdWxzYXRlLmpzLCBlZmZlY3Qtc2NhbGUuanMsIGVmZmVjdC1zaGFrZS5qcywgZWZmZWN0LXNpemUuanMsIGVmZmVjdC1zbGlkZS5qcywgZWZmZWN0LXRyYW5zZmVyLmpzLCBtZW51LmpzLCBwcm9ncmVzc2Jhci5qcywgcmVzaXphYmxlLmpzLCBzZWxlY3RhYmxlLmpzLCBzZWxlY3RtZW51LmpzLCBzbGlkZXIuanMsIHNvcnRhYmxlLmpzLCBzcGlubmVyLmpzLCB0YWJzLmpzLCB0b29sdGlwLmpzCiogQ29weXJpZ2h0IDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yczsgTGljZW5zZWQgTUlUICovCgooZnVuY3Rpb24oZSl7ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJqcXVlcnkiXSxlKTplKGpRdWVyeSl9KShmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHQscyl7dmFyIG4sYSxvLHI9dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiJhcmVhIj09PXI/KG49dC5wYXJlbnROb2RlLGE9bi5uYW1lLHQuaHJlZiYmYSYmIm1hcCI9PT1uLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/KG89ZSgiaW1nW3VzZW1hcD0nIyIrYSsiJ10iKVswXSwhIW8mJmkobykpOiExKTooL14oaW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbnxvYmplY3QpJC8udGVzdChyKT8hdC5kaXNhYmxlZDoiYSI9PT1yP3QuaHJlZnx8czpzKSYmaSh0KX1mdW5jdGlvbiBpKHQpe3JldHVybiBlLmV4cHIuZmlsdGVycy52aXNpYmxlKHQpJiYhZSh0KS5wYXJlbnRzKCkuYWRkQmFjaygpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiJoaWRkZW4iPT09ZS5jc3ModGhpcywidmlzaWJpbGl0eSIpfSkubGVuZ3RofWZ1bmN0aW9uIHMoZSl7Zm9yKHZhciB0LGk7ZS5sZW5ndGgmJmVbMF0hPT1kb2N1bWVudDspe2lmKHQ9ZS5jc3MoInBvc2l0aW9uIiksKCJhYnNvbHV0ZSI9PT10fHwicmVsYXRpdmUiPT09dHx8ImZpeGVkIj09PXQpJiYoaT1wYXJzZUludChlLmNzcygiekluZGV4IiksMTApLCFpc05hTihpKSYmMCE9PWkpKXJldHVybiBpO2U9ZS5wYXJlbnQoKX1yZXR1cm4gMH1mdW5jdGlvbiBuKCl7dGhpcy5fY3VySW5zdD1udWxsLHRoaXMuX2tleUV2ZW50PSExLHRoaXMuX2Rpc2FibGVkSW5wdXRzPVtdLHRoaXMuX2RhdGVwaWNrZXJTaG93aW5nPSExLHRoaXMuX2luRGlhbG9nPSExLHRoaXMuX21haW5EaXZJZD0idWktZGF0ZXBpY2tlci1kaXYiLHRoaXMuX2lubGluZUNsYXNzPSJ1aS1kYXRlcGlja2VyLWlubGluZSIsdGhpcy5fYXBwZW5kQ2xhc3M9InVpLWRhdGVwaWNrZXItYXBwZW5kIix0aGlzLl90cmlnZ2VyQ2xhc3M9InVpLWRhdGVwaWNrZXItdHJpZ2dlciIsdGhpcy5fZGlhbG9nQ2xhc3M9InVpLWRhdGVwaWNrZXItZGlhbG9nIix0aGlzLl9kaXNhYmxlQ2xhc3M9InVpLWRhdGVwaWNrZXItZGlzYWJsZWQiLHRoaXMuX3Vuc2VsZWN0YWJsZUNsYXNzPSJ1aS1kYXRlcGlja2VyLXVuc2VsZWN0YWJsZSIsdGhpcy5fY3VycmVudENsYXNzPSJ1aS1kYXRlcGlja2VyLWN1cnJlbnQtZGF5Iix0aGlzLl9kYXlPdmVyQ2xhc3M9InVpLWRhdGVwaWNrZXItZGF5cy1jZWxsLW92ZXIiLHRoaXMucmVnaW9uYWw9W10sdGhpcy5yZWdpb25hbFsiIl09e2Nsb3NlVGV4dDoiRG9uZSIscHJldlRleHQ6IlByZXYiLG5leHRUZXh0OiJOZXh0IixjdXJyZW50VGV4dDoiVG9kYXkiLG1vbnRoTmFtZXM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLG1vbnRoTmFtZXNTaG9ydDpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdLGRheU5hbWVzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxkYXlOYW1lc1Nob3J0OlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sZGF5TmFtZXNNaW46WyJTdSIsIk1vIiwiVHUiLCJXZSIsIlRoIiwiRnIiLCJTYSJdLHdlZWtIZWFkZXI6IldrIixkYXRlRm9ybWF0OiJtbS9kZC95eSIsZmlyc3REYXk6MCxpc1JUTDohMSxzaG93TW9udGhBZnRlclllYXI6ITEseWVhclN1ZmZpeDoiIn0sdGhpcy5fZGVmYXVsdHM9e3Nob3dPbjoiZm9jdXMiLHNob3dBbmltOiJmYWRlSW4iLHNob3dPcHRpb25zOnt9LGRlZmF1bHREYXRlOm51bGwsYXBwZW5kVGV4dDoiIixidXR0b25UZXh0OiIuLi4iLGJ1dHRvbkltYWdlOiIiLGJ1dHRvbkltYWdlT25seTohMSxoaWRlSWZOb1ByZXZOZXh0OiExLG5hdmlnYXRpb25Bc0RhdGVGb3JtYXQ6ITEsZ290b0N1cnJlbnQ6ITEsY2hhbmdlTW9udGg6ITEsY2hhbmdlWWVhcjohMSx5ZWFyUmFuZ2U6ImMtMTA6YysxMCIsc2hvd090aGVyTW9udGhzOiExLHNlbGVjdE90aGVyTW9udGhzOiExLHNob3dXZWVrOiExLGNhbGN1bGF0ZVdlZWs6dGhpcy5pc284NjAxV2VlayxzaG9ydFllYXJDdXRvZmY6IisxMCIsbWluRGF0ZTpudWxsLG1heERhdGU6bnVsbCxkdXJhdGlvbjoiZmFzdCIsYmVmb3JlU2hvd0RheTpudWxsLGJlZm9yZVNob3c6bnVsbCxvblNlbGVjdDpudWxsLG9uQ2hhbmdlTW9udGhZZWFyOm51bGwsb25DbG9zZTpudWxsLG51bWJlck9mTW9udGhzOjEsc2hvd0N1cnJlbnRBdFBvczowLHN0ZXBNb250aHM6MSxzdGVwQmlnTW9udGhzOjEyLGFsdEZpZWxkOiIiLGFsdEZvcm1hdDoiIixjb25zdHJhaW5JbnB1dDohMCxzaG93QnV0dG9uUGFuZWw6ITEsYXV0b1NpemU6ITEsZGlzYWJsZWQ6ITF9LGUuZXh0ZW5kKHRoaXMuX2RlZmF1bHRzLHRoaXMucmVnaW9uYWxbIiJdKSx0aGlzLnJlZ2lvbmFsLmVuPWUuZXh0ZW5kKCEwLHt9LHRoaXMucmVnaW9uYWxbIiJdKSx0aGlzLnJlZ2lvbmFsWyJlbi1VUyJdPWUuZXh0ZW5kKCEwLHt9LHRoaXMucmVnaW9uYWwuZW4pLHRoaXMuZHBEaXY9YShlKCI8ZGl2IGlkPSciK3RoaXMuX21haW5EaXZJZCsiJyBjbGFzcz0ndWktZGF0ZXBpY2tlciB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IHVpLWNvcm5lci1hbGwnPjwvZGl2PiIpKX1mdW5jdGlvbiBhKHQpe3ZhciBpPSJidXR0b24sIC51aS1kYXRlcGlja2VyLXByZXYsIC51aS1kYXRlcGlja2VyLW5leHQsIC51aS1kYXRlcGlja2VyLWNhbGVuZGFyIHRkIGEiO3JldHVybiB0LmRlbGVnYXRlKGksIm1vdXNlb3V0IixmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSYmZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIil9KS5kZWxlZ2F0ZShpLCJtb3VzZW92ZXIiLG8pfWZ1bmN0aW9uIG8oKXtlLmRhdGVwaWNrZXIuX2lzRGlzYWJsZWREYXRlcGlja2VyKHYuaW5saW5lP3YuZHBEaXYucGFyZW50KClbMF06di5pbnB1dFswXSl8fChlKHRoaXMpLnBhcmVudHMoIi51aS1kYXRlcGlja2VyLWNhbGVuZGFyIikuZmluZCgiYSIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLGUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLXByZXYiKSYmZSh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1wcmV2LWhvdmVyIiksLTEhPT10aGlzLmNsYXNzTmFtZS5pbmRleE9mKCJ1aS1kYXRlcGlja2VyLW5leHQiKSYmZSh0aGlzKS5hZGRDbGFzcygidWktZGF0ZXBpY2tlci1uZXh0LWhvdmVyIikpfWZ1bmN0aW9uIHIodCxpKXtlLmV4dGVuZCh0LGkpO2Zvcih2YXIgcyBpbiBpKW51bGw9PWlbc10mJih0W3NdPWlbc10pO3JldHVybiB0fWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LnZhbCgpO2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX3JlZnJlc2goKSx0IT09dGhpcy5lbGVtZW50LnZhbCgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKX19ZS51aT1lLnVpfHx7fSxlLmV4dGVuZChlLnVpLHt2ZXJzaW9uOiIxLjExLjQiLGtleUNvZGU6e0JBQ0tTUEFDRTo4LENPTU1BOjE4OCxERUxFVEU6NDYsRE9XTjo0MCxFTkQ6MzUsRU5URVI6MTMsRVNDQVBFOjI3LEhPTUU6MzYsTEVGVDozNyxQQUdFX0RPV046MzQsUEFHRV9VUDozMyxQRVJJT0Q6MTkwLFJJR0hUOjM5LFNQQUNFOjMyLFRBQjo5LFVQOjM4fX0pLGUuZm4uZXh0ZW5kKHtzY3JvbGxQYXJlbnQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5jc3MoInBvc2l0aW9uIikscz0iYWJzb2x1dGUiPT09aSxuPXQ/LyhhdXRvfHNjcm9sbHxoaWRkZW4pLzovKGF1dG98c2Nyb2xsKS8sYT10aGlzLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3JldHVybiBzJiYic3RhdGljIj09PXQuY3NzKCJwb3NpdGlvbiIpPyExOm4udGVzdCh0LmNzcygib3ZlcmZsb3ciKSt0LmNzcygib3ZlcmZsb3cteSIpK3QuY3NzKCJvdmVyZmxvdy14IikpfSkuZXEoMCk7cmV0dXJuImZpeGVkIiE9PWkmJmEubGVuZ3RoP2E6ZSh0aGlzWzBdLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KX0sdW5pcXVlSWQ6ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0aGlzLmlkfHwodGhpcy5pZD0idWktaWQtIisgKytlKX0pfX0oKSxyZW1vdmVVbmlxdWVJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsvXnVpLWlkLVxkKyQvLnRlc3QodGhpcy5pZCkmJmUodGhpcykucmVtb3ZlQXR0cigiaWQiKX0pfX0pLGUuZXh0ZW5kKGUuZXhwclsiOiJdLHtkYXRhOmUuZXhwci5jcmVhdGVQc2V1ZG8/ZS5leHByLmNyZWF0ZVBzZXVkbyhmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuISFlLmRhdGEoaSx0KX19KTpmdW5jdGlvbih0LGkscyl7cmV0dXJuISFlLmRhdGEodCxzWzNdKX0sZm9jdXNhYmxlOmZ1bmN0aW9uKGkpe3JldHVybiB0KGksIWlzTmFOKGUuYXR0cihpLCJ0YWJpbmRleCIpKSl9LHRhYmJhYmxlOmZ1bmN0aW9uKGkpe3ZhciBzPWUuYXR0cihpLCJ0YWJpbmRleCIpLG49aXNOYU4ocyk7cmV0dXJuKG58fHM+PTApJiZ0KGksIW4pfX0pLGUoIjxhPiIpLm91dGVyV2lkdGgoMSkuanF1ZXJ5fHxlLmVhY2goWyJXaWR0aCIsIkhlaWdodCJdLGZ1bmN0aW9uKHQsaSl7ZnVuY3Rpb24gcyh0LGkscyxhKXtyZXR1cm4gZS5lYWNoKG4sZnVuY3Rpb24oKXtpLT1wYXJzZUZsb2F0KGUuY3NzKHQsInBhZGRpbmciK3RoaXMpKXx8MCxzJiYoaS09cGFyc2VGbG9hdChlLmNzcyh0LCJib3JkZXIiK3RoaXMrIldpZHRoIikpfHwwKSxhJiYoaS09cGFyc2VGbG9hdChlLmNzcyh0LCJtYXJnaW4iK3RoaXMpKXx8MCl9KSxpfXZhciBuPSJXaWR0aCI9PT1pP1siTGVmdCIsIlJpZ2h0Il06WyJUb3AiLCJCb3R0b20iXSxhPWkudG9Mb3dlckNhc2UoKSxvPXtpbm5lcldpZHRoOmUuZm4uaW5uZXJXaWR0aCxpbm5lckhlaWdodDplLmZuLmlubmVySGVpZ2h0LG91dGVyV2lkdGg6ZS5mbi5vdXRlcldpZHRoLG91dGVySGVpZ2h0OmUuZm4ub3V0ZXJIZWlnaHR9O2UuZm5bImlubmVyIitpXT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD9vWyJpbm5lciIraV0uY2FsbCh0aGlzKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmNzcyhhLHModGhpcyx0KSsicHgiKX0pfSxlLmZuWyJvdXRlciIraV09ZnVuY3Rpb24odCxuKXtyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQ/b1sib3V0ZXIiK2ldLmNhbGwodGhpcyx0KTp0aGlzLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmNzcyhhLHModGhpcyx0LCEwLG4pKyJweCIpfSl9fSksZS5mbi5hZGRCYWNrfHwoZS5mbi5hZGRCYWNrPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmFkZChudWxsPT1lP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGUpKX0pLGUoIjxhPiIpLmRhdGEoImEtYiIsImEiKS5yZW1vdmVEYXRhKCJhLWIiKS5kYXRhKCJhLWIiKSYmKGUuZm4ucmVtb3ZlRGF0YT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jYWxsKHRoaXMsZS5jYW1lbENhc2UoaSkpOnQuY2FsbCh0aGlzKX19KGUuZm4ucmVtb3ZlRGF0YSkpLGUudWkuaWU9ISEvbXNpZSBbXHcuXSsvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpKSxlLmZuLmV4dGVuZCh7Zm9jdXM6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkscyl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBpP3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UodCkuZm9jdXMoKSxzJiZzLmNhbGwodCl9LGkpfSk6dC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fShlLmZuLmZvY3VzKSxkaXNhYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9Im9uc2VsZWN0c3RhcnQiaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik/InNlbGVjdHN0YXJ0IjoibW91c2Vkb3duIjtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iaW5kKGUrIi51aS1kaXNhYmxlU2VsZWN0aW9uIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9KX19KCksZW5hYmxlU2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5iaW5kKCIudWktZGlzYWJsZVNlbGVjdGlvbiIpfSx6SW5kZXg6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dClyZXR1cm4gdGhpcy5jc3MoInpJbmRleCIsdCk7aWYodGhpcy5sZW5ndGgpZm9yKHZhciBpLHMsbj1lKHRoaXNbMF0pO24ubGVuZ3RoJiZuWzBdIT09ZG9jdW1lbnQ7KXtpZihpPW4uY3NzKCJwb3NpdGlvbiIpLCgiYWJzb2x1dGUiPT09aXx8InJlbGF0aXZlIj09PWl8fCJmaXhlZCI9PT1pKSYmKHM9cGFyc2VJbnQobi5jc3MoInpJbmRleCIpLDEwKSwhaXNOYU4ocykmJjAhPT1zKSlyZXR1cm4gcztuPW4ucGFyZW50KCl9cmV0dXJuIDB9fSksZS51aS5wbHVnaW49e2FkZDpmdW5jdGlvbih0LGkscyl7dmFyIG4sYT1lLnVpW3RdLnByb3RvdHlwZTtmb3IobiBpbiBzKWEucGx1Z2luc1tuXT1hLnBsdWdpbnNbbl18fFtdLGEucGx1Z2luc1tuXS5wdXNoKFtpLHNbbl1dKX0sY2FsbDpmdW5jdGlvbihlLHQsaSxzKXt2YXIgbixhPWUucGx1Z2luc1t0XTtpZihhJiYoc3x8ZS5lbGVtZW50WzBdLnBhcmVudE5vZGUmJjExIT09ZS5lbGVtZW50WzBdLnBhcmVudE5vZGUubm9kZVR5cGUpKWZvcihuPTA7YS5sZW5ndGg+bjtuKyspZS5vcHRpb25zW2Fbbl1bMF1dJiZhW25dWzFdLmFwcGx5KGUuZWxlbWVudCxpKX19O3ZhciBsPTAsdT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZS5jbGVhbkRhdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBzLG4sYTtmb3IoYT0wO251bGwhPShuPWlbYV0pO2ErKyl0cnl7cz1lLl9kYXRhKG4sImV2ZW50cyIpLHMmJnMucmVtb3ZlJiZlKG4pLnRyaWdnZXJIYW5kbGVyKCJyZW1vdmUiKX1jYXRjaChvKXt9dChpKX19KGUuY2xlYW5EYXRhKSxlLndpZGdldD1mdW5jdGlvbih0LGkscyl7dmFyIG4sYSxvLHIsaD17fSxsPXQuc3BsaXQoIi4iKVswXTtyZXR1cm4gdD10LnNwbGl0KCIuIilbMV0sbj1sKyItIit0LHN8fChzPWksaT1lLldpZGdldCksZS5leHByWyI6Il1bbi50b0xvd2VyQ2FzZSgpXT1mdW5jdGlvbih0KXtyZXR1cm4hIWUuZGF0YSh0LG4pfSxlW2xdPWVbbF18fHt9LGE9ZVtsXVt0XSxvPWVbbF1bdF09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fY3JlYXRlV2lkZ2V0Pyhhcmd1bWVudHMubGVuZ3RoJiZ0aGlzLl9jcmVhdGVXaWRnZXQoZSx0KSx2b2lkIDApOm5ldyBvKGUsdCl9LGUuZXh0ZW5kKG8sYSx7dmVyc2lvbjpzLnZlcnNpb24sX3Byb3RvOmUuZXh0ZW5kKHt9LHMpLF9jaGlsZENvbnN0cnVjdG9yczpbXX0pLHI9bmV3IGksci5vcHRpb25zPWUud2lkZ2V0LmV4dGVuZCh7fSxyLm9wdGlvbnMpLGUuZWFjaChzLGZ1bmN0aW9uKHQscyl7cmV0dXJuIGUuaXNGdW5jdGlvbihzKT8oaFt0XT1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKCl7cmV0dXJuIGkucHJvdG90eXBlW3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbj1mdW5jdGlvbihlKXtyZXR1cm4gaS5wcm90b3R5cGVbdF0uYXBwbHkodGhpcyxlKX07cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzLl9zdXBlcixhPXRoaXMuX3N1cGVyQXBwbHk7cmV0dXJuIHRoaXMuX3N1cGVyPWUsdGhpcy5fc3VwZXJBcHBseT1uLHQ9cy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fc3VwZXI9aSx0aGlzLl9zdXBlckFwcGx5PWEsdH19KCksdm9pZCAwKTooaFt0XT1zLHZvaWQgMCl9KSxvLnByb3RvdHlwZT1lLndpZGdldC5leHRlbmQocix7d2lkZ2V0RXZlbnRQcmVmaXg6YT9yLndpZGdldEV2ZW50UHJlZml4fHx0OnR9LGgse2NvbnN0cnVjdG9yOm8sbmFtZXNwYWNlOmwsd2lkZ2V0TmFtZTp0LHdpZGdldEZ1bGxOYW1lOm59KSxhPyhlLmVhY2goYS5fY2hpbGRDb25zdHJ1Y3RvcnMsZnVuY3Rpb24odCxpKXt2YXIgcz1pLnByb3RvdHlwZTtlLndpZGdldChzLm5hbWVzcGFjZSsiLiIrcy53aWRnZXROYW1lLG8saS5fcHJvdG8pfSksZGVsZXRlIGEuX2NoaWxkQ29uc3RydWN0b3JzKTppLl9jaGlsZENvbnN0cnVjdG9ycy5wdXNoKG8pLGUud2lkZ2V0LmJyaWRnZSh0LG8pLG99LGUud2lkZ2V0LmV4dGVuZD1mdW5jdGlvbih0KXtmb3IodmFyIGkscyxuPXUuY2FsbChhcmd1bWVudHMsMSksYT0wLG89bi5sZW5ndGg7bz5hO2ErKylmb3IoaSBpbiBuW2FdKXM9blthXVtpXSxuW2FdLmhhc093blByb3BlcnR5KGkpJiZ2b2lkIDAhPT1zJiYodFtpXT1lLmlzUGxhaW5PYmplY3Qocyk/ZS5pc1BsYWluT2JqZWN0KHRbaV0pP2Uud2lkZ2V0LmV4dGVuZCh7fSx0W2ldLHMpOmUud2lkZ2V0LmV4dGVuZCh7fSxzKTpzKTtyZXR1cm4gdH0sZS53aWRnZXQuYnJpZGdlPWZ1bmN0aW9uKHQsaSl7dmFyIHM9aS5wcm90b3R5cGUud2lkZ2V0RnVsbE5hbWV8fHQ7ZS5mblt0XT1mdW5jdGlvbihuKXt2YXIgYT0ic3RyaW5nIj09dHlwZW9mIG4sbz11LmNhbGwoYXJndW1lbnRzLDEpLHI9dGhpcztyZXR1cm4gYT90aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgaSxhPWUuZGF0YSh0aGlzLHMpO3JldHVybiJpbnN0YW5jZSI9PT1uPyhyPWEsITEpOmE/ZS5pc0Z1bmN0aW9uKGFbbl0pJiYiXyIhPT1uLmNoYXJBdCgwKT8oaT1hW25dLmFwcGx5KGEsbyksaSE9PWEmJnZvaWQgMCE9PWk/KHI9aSYmaS5qcXVlcnk/ci5wdXNoU3RhY2soaS5nZXQoKSk6aSwhMSk6dm9pZCAwKTplLmVycm9yKCJubyBzdWNoIG1ldGhvZCAnIituKyInIGZvciAiK3QrIiB3aWRnZXQgaW5zdGFuY2UiKTplLmVycm9yKCJjYW5ub3QgY2FsbCBtZXRob2RzIG9uICIrdCsiIHByaW9yIHRvIGluaXRpYWxpemF0aW9uOyAiKyJhdHRlbXB0ZWQgdG8gY2FsbCBtZXRob2QgJyIrbisiJyIpfSk6KG8ubGVuZ3RoJiYobj1lLndpZGdldC5leHRlbmQuYXBwbHkobnVsbCxbbl0uY29uY2F0KG8pKSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5kYXRhKHRoaXMscyk7dD8odC5vcHRpb24obnx8e30pLHQuX2luaXQmJnQuX2luaXQoKSk6ZS5kYXRhKHRoaXMscyxuZXcgaShuLHRoaXMpKX0pKSxyfX0sZS5XaWRnZXQ9ZnVuY3Rpb24oKXt9LGUuV2lkZ2V0Ll9jaGlsZENvbnN0cnVjdG9ycz1bXSxlLldpZGdldC5wcm90b3R5cGU9e3dpZGdldE5hbWU6IndpZGdldCIsd2lkZ2V0RXZlbnRQcmVmaXg6IiIsZGVmYXVsdEVsZW1lbnQ6IjxkaXY+IixvcHRpb25zOntkaXNhYmxlZDohMSxjcmVhdGU6bnVsbH0sX2NyZWF0ZVdpZGdldDpmdW5jdGlvbih0LGkpe2k9ZShpfHx0aGlzLmRlZmF1bHRFbGVtZW50fHx0aGlzKVswXSx0aGlzLmVsZW1lbnQ9ZShpKSx0aGlzLnV1aWQ9bCsrLHRoaXMuZXZlbnROYW1lc3BhY2U9Ii4iK3RoaXMud2lkZ2V0TmFtZSt0aGlzLnV1aWQsdGhpcy5iaW5kaW5ncz1lKCksdGhpcy5ob3ZlcmFibGU9ZSgpLHRoaXMuZm9jdXNhYmxlPWUoKSxpIT09dGhpcyYmKGUuZGF0YShpLHRoaXMud2lkZ2V0RnVsbE5hbWUsdGhpcyksdGhpcy5fb24oITAsdGhpcy5lbGVtZW50LHtyZW1vdmU6ZnVuY3Rpb24oZSl7ZS50YXJnZXQ9PT1pJiZ0aGlzLmRlc3Ryb3koKX19KSx0aGlzLmRvY3VtZW50PWUoaS5zdHlsZT9pLm93bmVyRG9jdW1lbnQ6aS5kb2N1bWVudHx8aSksdGhpcy53aW5kb3c9ZSh0aGlzLmRvY3VtZW50WzBdLmRlZmF1bHRWaWV3fHx0aGlzLmRvY3VtZW50WzBdLnBhcmVudFdpbmRvdykpLHRoaXMub3B0aW9ucz1lLndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zLHRoaXMuX2dldENyZWF0ZU9wdGlvbnMoKSx0KSx0aGlzLl9jcmVhdGUoKSx0aGlzLl90cmlnZ2VyKCJjcmVhdGUiLG51bGwsdGhpcy5fZ2V0Q3JlYXRlRXZlbnREYXRhKCkpLHRoaXMuX2luaXQoKX0sX2dldENyZWF0ZU9wdGlvbnM6ZS5ub29wLF9nZXRDcmVhdGVFdmVudERhdGE6ZS5ub29wLF9jcmVhdGU6ZS5ub29wLF9pbml0OmUubm9vcCxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5fZGVzdHJveSgpLHRoaXMuZWxlbWVudC51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSkucmVtb3ZlRGF0YSh0aGlzLndpZGdldEZ1bGxOYW1lKS5yZW1vdmVEYXRhKGUuY2FtZWxDYXNlKHRoaXMud2lkZ2V0RnVsbE5hbWUpKSx0aGlzLndpZGdldCgpLnVuYmluZCh0aGlzLmV2ZW50TmFtZXNwYWNlKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlQ2xhc3ModGhpcy53aWRnZXRGdWxsTmFtZSsiLWRpc2FibGVkICIrInVpLXN0YXRlLWRpc2FibGVkIiksdGhpcy5iaW5kaW5ncy51bmJpbmQodGhpcy5ldmVudE5hbWVzcGFjZSksdGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIil9LF9kZXN0cm95OmUubm9vcCx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50fSxvcHRpb246ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz10O2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zKTtpZigic3RyaW5nIj09dHlwZW9mIHQpaWYobz17fSxzPXQuc3BsaXQoIi4iKSx0PXMuc2hpZnQoKSxzLmxlbmd0aCl7Zm9yKG49b1t0XT1lLndpZGdldC5leHRlbmQoe30sdGhpcy5vcHRpb25zW3RdKSxhPTA7cy5sZW5ndGgtMT5hO2ErKyluW3NbYV1dPW5bc1thXV18fHt9LG49bltzW2FdXTtpZih0PXMucG9wKCksMT09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHZvaWQgMD09PW5bdF0/bnVsbDpuW3RdO25bdF09aX1lbHNle2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT10aGlzLm9wdGlvbnNbdF0/bnVsbDp0aGlzLm9wdGlvbnNbdF07b1t0XT1pfXJldHVybiB0aGlzLl9zZXRPcHRpb25zKG8pLHRoaXN9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpdGhpcy5fc2V0T3B0aW9uKHQsZVt0XSk7cmV0dXJuIHRoaXN9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5vcHRpb25zW2VdPXQsImRpc2FibGVkIj09PWUmJih0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKHRoaXMud2lkZ2V0RnVsbE5hbWUrIi1kaXNhYmxlZCIsISF0KSx0JiYodGhpcy5ob3ZlcmFibGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWhvdmVyIiksdGhpcy5mb2N1c2FibGUucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIikpKSx0aGlzfSxlbmFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2V0T3B0aW9ucyh7ZGlzYWJsZWQ6ITF9KX0sZGlzYWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9zZXRPcHRpb25zKHtkaXNhYmxlZDohMH0pfSxfb246ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGE9dGhpczsiYm9vbGVhbiIhPXR5cGVvZiB0JiYocz1pLGk9dCx0PSExKSxzPyhpPW49ZShpKSx0aGlzLmJpbmRpbmdzPXRoaXMuYmluZGluZ3MuYWRkKGkpKToocz1pLGk9dGhpcy5lbGVtZW50LG49dGhpcy53aWRnZXQoKSksZS5lYWNoKHMsZnVuY3Rpb24ocyxvKXtmdW5jdGlvbiByKCl7cmV0dXJuIHR8fGEub3B0aW9ucy5kaXNhYmxlZCE9PSEwJiYhZSh0aGlzKS5oYXNDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKT8oInN0cmluZyI9PXR5cGVvZiBvP2Fbb106bykuYXBwbHkoYSxhcmd1bWVudHMpOnZvaWQgMH0ic3RyaW5nIiE9dHlwZW9mIG8mJihyLmd1aWQ9by5ndWlkPW8uZ3VpZHx8ci5ndWlkfHxlLmd1aWQrKyk7dmFyIGg9cy5tYXRjaCgvXihbXHc6LV0qKVxzKiguKikkLyksbD1oWzFdK2EuZXZlbnROYW1lc3BhY2UsdT1oWzJdO3U/bi5kZWxlZ2F0ZSh1LGwscik6aS5iaW5kKGwscil9KX0sX29mZjpmdW5jdGlvbih0LGkpe2k9KGl8fCIiKS5zcGxpdCgiICIpLmpvaW4odGhpcy5ldmVudE5hbWVzcGFjZSsiICIpK3RoaXMuZXZlbnROYW1lc3BhY2UsdC51bmJpbmQoaSkudW5kZWxlZ2F0ZShpKSx0aGlzLmJpbmRpbmdzPWUodGhpcy5iaW5kaW5ncy5ub3QodCkuZ2V0KCkpLHRoaXMuZm9jdXNhYmxlPWUodGhpcy5mb2N1c2FibGUubm90KHQpLmdldCgpKSx0aGlzLmhvdmVyYWJsZT1lKHRoaXMuaG92ZXJhYmxlLm5vdCh0KS5nZXQoKSl9LF9kZWxheTpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoKXtyZXR1cm4oInN0cmluZyI9PXR5cGVvZiBlP3NbZV06ZSkuYXBwbHkocyxhcmd1bWVudHMpfXZhciBzPXRoaXM7cmV0dXJuIHNldFRpbWVvdXQoaSx0fHwwKX0sX2hvdmVyYWJsZTpmdW5jdGlvbih0KXt0aGlzLmhvdmVyYWJsZT10aGlzLmhvdmVyYWJsZS5hZGQodCksdGhpcy5fb24odCx7bW91c2VlbnRlcjpmdW5jdGlvbih0KXtlKHQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoInVpLXN0YXRlLWhvdmVyIil9LG1vdXNlbGVhdmU6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpfX0pfSxfZm9jdXNhYmxlOmZ1bmN0aW9uKHQpe3RoaXMuZm9jdXNhYmxlPXRoaXMuZm9jdXNhYmxlLmFkZCh0KSx0aGlzLl9vbih0LHtmb2N1c2luOmZ1bmN0aW9uKHQpe2UodC5jdXJyZW50VGFyZ2V0KS5hZGRDbGFzcygidWktc3RhdGUtZm9jdXMiKX0sZm9jdXNvdXQ6ZnVuY3Rpb24odCl7ZSh0LmN1cnJlbnRUYXJnZXQpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfX0pfSxfdHJpZ2dlcjpmdW5jdGlvbih0LGkscyl7dmFyIG4sYSxvPXRoaXMub3B0aW9uc1t0XTtpZihzPXN8fHt9LGk9ZS5FdmVudChpKSxpLnR5cGU9KHQ9PT10aGlzLndpZGdldEV2ZW50UHJlZml4P3Q6dGhpcy53aWRnZXRFdmVudFByZWZpeCt0KS50b0xvd2VyQ2FzZSgpLGkudGFyZ2V0PXRoaXMuZWxlbWVudFswXSxhPWkub3JpZ2luYWxFdmVudClmb3IobiBpbiBhKW4gaW4gaXx8KGlbbl09YVtuXSk7cmV0dXJuIHRoaXMuZWxlbWVudC50cmlnZ2VyKGkscyksIShlLmlzRnVuY3Rpb24obykmJm8uYXBwbHkodGhpcy5lbGVtZW50WzBdLFtpXS5jb25jYXQocykpPT09ITF8fGkuaXNEZWZhdWx0UHJldmVudGVkKCkpfX0sZS5lYWNoKHtzaG93OiJmYWRlSW4iLGhpZGU6ImZhZGVPdXQifSxmdW5jdGlvbih0LGkpe2UuV2lkZ2V0LnByb3RvdHlwZVsiXyIrdF09ZnVuY3Rpb24ocyxuLGEpeyJzdHJpbmciPT10eXBlb2YgbiYmKG49e2VmZmVjdDpufSk7dmFyIG8scj1uP249PT0hMHx8Im51bWJlciI9PXR5cGVvZiBuP2k6bi5lZmZlY3R8fGk6dDtuPW58fHt9LCJudW1iZXIiPT10eXBlb2YgbiYmKG49e2R1cmF0aW9uOm59KSxvPSFlLmlzRW1wdHlPYmplY3Qobiksbi5jb21wbGV0ZT1hLG4uZGVsYXkmJnMuZGVsYXkobi5kZWxheSksbyYmZS5lZmZlY3RzJiZlLmVmZmVjdHMuZWZmZWN0W3JdP3NbdF0obik6ciE9PXQmJnNbcl0/c1tyXShuLmR1cmF0aW9uLG4uZWFzaW5nLGEpOnMucXVldWUoZnVuY3Rpb24oaSl7ZSh0aGlzKVt0XSgpLGEmJmEuY2FsbChzWzBdKSxpKCl9KX19KSxlLndpZGdldDt2YXIgZD0hMTtlKGRvY3VtZW50KS5tb3VzZXVwKGZ1bmN0aW9uKCl7ZD0hMX0pLGUud2lkZ2V0KCJ1aS5tb3VzZSIse3ZlcnNpb246IjEuMTEuNCIsb3B0aW9uczp7Y2FuY2VsOiJpbnB1dCx0ZXh0YXJlYSxidXR0b24sc2VsZWN0LG9wdGlvbiIsZGlzdGFuY2U6MSxkZWxheTowfSxfbW91c2VJbml0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmVsZW1lbnQuYmluZCgibW91c2Vkb3duLiIrdGhpcy53aWRnZXROYW1lLGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9tb3VzZURvd24oZSl9KS5iaW5kKCJjbGljay4iK3RoaXMud2lkZ2V0TmFtZSxmdW5jdGlvbihpKXtyZXR1cm4hMD09PWUuZGF0YShpLnRhcmdldCx0LndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpPyhlLnJlbW92ZURhdGEoaS50YXJnZXQsdC53aWRnZXROYW1lKyIucHJldmVudENsaWNrRXZlbnQiKSxpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLCExKTp2b2lkIDB9KSx0aGlzLnN0YXJ0ZWQ9ITF9LF9tb3VzZURlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQudW5iaW5kKCIuIit0aGlzLndpZGdldE5hbWUpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlJiZ0aGlzLmRvY3VtZW50LnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKX0sX21vdXNlRG93bjpmdW5jdGlvbih0KXtpZighZCl7dGhpcy5fbW91c2VNb3ZlZD0hMSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJnRoaXMuX21vdXNlVXAodCksdGhpcy5fbW91c2VEb3duRXZlbnQ9dDt2YXIgaT10aGlzLHM9MT09PXQud2hpY2gsbj0ic3RyaW5nIj09dHlwZW9mIHRoaXMub3B0aW9ucy5jYW5jZWwmJnQudGFyZ2V0Lm5vZGVOYW1lP2UodC50YXJnZXQpLmNsb3Nlc3QodGhpcy5vcHRpb25zLmNhbmNlbCkubGVuZ3RoOiExO3JldHVybiBzJiYhbiYmdGhpcy5fbW91c2VDYXB0dXJlKHQpPyh0aGlzLm1vdXNlRGVsYXlNZXQ9IXRoaXMub3B0aW9ucy5kZWxheSx0aGlzLm1vdXNlRGVsYXlNZXR8fCh0aGlzLl9tb3VzZURlbGF5VGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe2kubW91c2VEZWxheU1ldD0hMH0sdGhpcy5vcHRpb25zLmRlbGF5KSksdGhpcy5fbW91c2VEaXN0YW5jZU1ldCh0KSYmdGhpcy5fbW91c2VEZWxheU1ldCh0KSYmKHRoaXMuX21vdXNlU3RhcnRlZD10aGlzLl9tb3VzZVN0YXJ0KHQpIT09ITEsIXRoaXMuX21vdXNlU3RhcnRlZCk/KHQucHJldmVudERlZmF1bHQoKSwhMCk6KCEwPT09ZS5kYXRhKHQudGFyZ2V0LHRoaXMud2lkZ2V0TmFtZSsiLnByZXZlbnRDbGlja0V2ZW50IikmJmUucmVtb3ZlRGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIpLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBpLl9tb3VzZU1vdmUoZSl9LHRoaXMuX21vdXNlVXBEZWxlZ2F0ZT1mdW5jdGlvbihlKXtyZXR1cm4gaS5fbW91c2VVcChlKX0sdGhpcy5kb2N1bWVudC5iaW5kKCJtb3VzZW1vdmUuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VNb3ZlRGVsZWdhdGUpLmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSx0LnByZXZlbnREZWZhdWx0KCksZD0hMCwhMCkpOiEwfX0sX21vdXNlTW92ZTpmdW5jdGlvbih0KXtpZih0aGlzLl9tb3VzZU1vdmVkKXtpZihlLnVpLmllJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OT5kb2N1bWVudC5kb2N1bWVudE1vZGUpJiYhdC5idXR0b24pcmV0dXJuIHRoaXMuX21vdXNlVXAodCk7aWYoIXQud2hpY2gpcmV0dXJuIHRoaXMuX21vdXNlVXAodCl9cmV0dXJuKHQud2hpY2h8fHQuYnV0dG9uKSYmKHRoaXMuX21vdXNlTW92ZWQ9ITApLHRoaXMuX21vdXNlU3RhcnRlZD8odGhpcy5fbW91c2VEcmFnKHQpLHQucHJldmVudERlZmF1bHQoKSk6KHRoaXMuX21vdXNlRGlzdGFuY2VNZXQodCkmJnRoaXMuX21vdXNlRGVsYXlNZXQodCkmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9dGhpcy5fbW91c2VTdGFydCh0aGlzLl9tb3VzZURvd25FdmVudCx0KSE9PSExLHRoaXMuX21vdXNlU3RhcnRlZD90aGlzLl9tb3VzZURyYWcodCk6dGhpcy5fbW91c2VVcCh0KSksIXRoaXMuX21vdXNlU3RhcnRlZCl9LF9tb3VzZVVwOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRvY3VtZW50LnVuYmluZCgibW91c2Vtb3ZlLiIrdGhpcy53aWRnZXROYW1lLHRoaXMuX21vdXNlTW92ZURlbGVnYXRlKS51bmJpbmQoIm1vdXNldXAuIit0aGlzLndpZGdldE5hbWUsdGhpcy5fbW91c2VVcERlbGVnYXRlKSx0aGlzLl9tb3VzZVN0YXJ0ZWQmJih0aGlzLl9tb3VzZVN0YXJ0ZWQ9ITEsdC50YXJnZXQ9PT10aGlzLl9tb3VzZURvd25FdmVudC50YXJnZXQmJmUuZGF0YSh0LnRhcmdldCx0aGlzLndpZGdldE5hbWUrIi5wcmV2ZW50Q2xpY2tFdmVudCIsITApLHRoaXMuX21vdXNlU3RvcCh0KSksZD0hMSwhMX0sX21vdXNlRGlzdGFuY2VNZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VYLWUucGFnZVgpLE1hdGguYWJzKHRoaXMuX21vdXNlRG93bkV2ZW50LnBhZ2VZLWUucGFnZVkpKT49dGhpcy5vcHRpb25zLmRpc3RhbmNlfSxfbW91c2VEZWxheU1ldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1vdXNlRGVsYXlNZXR9LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKCl7fSxfbW91c2VEcmFnOmZ1bmN0aW9uKCl7fSxfbW91c2VTdG9wOmZ1bmN0aW9uKCl7fSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9fSksZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsdCxpKXtyZXR1cm5bcGFyc2VGbG9hdChlWzBdKSoocC50ZXN0KGVbMF0pP3QvMTAwOjEpLHBhcnNlRmxvYXQoZVsxXSkqKHAudGVzdChlWzFdKT9pLzEwMDoxKV19ZnVuY3Rpb24gaSh0LGkpe3JldHVybiBwYXJzZUludChlLmNzcyh0LGkpLDEwKXx8MH1mdW5jdGlvbiBzKHQpe3ZhciBpPXRbMF07cmV0dXJuIDk9PT1pLm5vZGVUeXBlP3t3aWR0aDp0LndpZHRoKCksaGVpZ2h0OnQuaGVpZ2h0KCksb2Zmc2V0Ont0b3A6MCxsZWZ0OjB9fTplLmlzV2luZG93KGkpP3t3aWR0aDp0LndpZHRoKCksaGVpZ2h0OnQuaGVpZ2h0KCksb2Zmc2V0Ont0b3A6dC5zY3JvbGxUb3AoKSxsZWZ0OnQuc2Nyb2xsTGVmdCgpfX06aS5wcmV2ZW50RGVmYXVsdD97d2lkdGg6MCxoZWlnaHQ6MCxvZmZzZXQ6e3RvcDppLnBhZ2VZLGxlZnQ6aS5wYWdlWH19Ont3aWR0aDp0Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dC5vdXRlckhlaWdodCgpLG9mZnNldDp0Lm9mZnNldCgpfX1lLnVpPWUudWl8fHt9O3ZhciBuLGEsbz1NYXRoLm1heCxyPU1hdGguYWJzLGg9TWF0aC5yb3VuZCxsPS9sZWZ0fGNlbnRlcnxyaWdodC8sdT0vdG9wfGNlbnRlcnxib3R0b20vLGQ9L1tcK1wtXVxkKyhcLltcZF0rKT8lPy8sYz0vXlx3Ky8scD0vJSQvLGY9ZS5mbi5wb3NpdGlvbjtlLnBvc2l0aW9uPXtzY3JvbGxiYXJXaWR0aDpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47dmFyIHQsaSxzPWUoIjxkaXYgc3R5bGU9J2Rpc3BsYXk6YmxvY2s7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6NTBweDtoZWlnaHQ6NTBweDtvdmVyZmxvdzpoaWRkZW47Jz48ZGl2IHN0eWxlPSdoZWlnaHQ6MTAwcHg7d2lkdGg6YXV0bzsnPjwvZGl2PjwvZGl2PiIpLGE9cy5jaGlsZHJlbigpWzBdO3JldHVybiBlKCJib2R5IikuYXBwZW5kKHMpLHQ9YS5vZmZzZXRXaWR0aCxzLmNzcygib3ZlcmZsb3ciLCJzY3JvbGwiKSxpPWEub2Zmc2V0V2lkdGgsdD09PWkmJihpPXNbMF0uY2xpZW50V2lkdGgpLHMucmVtb3ZlKCksbj10LWl9LGdldFNjcm9sbEluZm86ZnVuY3Rpb24odCl7dmFyIGk9dC5pc1dpbmRvd3x8dC5pc0RvY3VtZW50PyIiOnQuZWxlbWVudC5jc3MoIm92ZXJmbG93LXgiKSxzPXQuaXNXaW5kb3d8fHQuaXNEb2N1bWVudD8iIjp0LmVsZW1lbnQuY3NzKCJvdmVyZmxvdy15Iiksbj0ic2Nyb2xsIj09PWl8fCJhdXRvIj09PWkmJnQud2lkdGg8dC5lbGVtZW50WzBdLnNjcm9sbFdpZHRoLGE9InNjcm9sbCI9PT1zfHwiYXV0byI9PT1zJiZ0LmhlaWdodDx0LmVsZW1lbnRbMF0uc2Nyb2xsSGVpZ2h0O3JldHVybnt3aWR0aDphP2UucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowLGhlaWdodDpuP2UucG9zaXRpb24uc2Nyb2xsYmFyV2lkdGgoKTowfX0sZ2V0V2l0aGluSW5mbzpmdW5jdGlvbih0KXt2YXIgaT1lKHR8fHdpbmRvdykscz1lLmlzV2luZG93KGlbMF0pLG49ISFpWzBdJiY5PT09aVswXS5ub2RlVHlwZTtyZXR1cm57ZWxlbWVudDppLGlzV2luZG93OnMsaXNEb2N1bWVudDpuLG9mZnNldDppLm9mZnNldCgpfHx7bGVmdDowLHRvcDowfSxzY3JvbGxMZWZ0Omkuc2Nyb2xsTGVmdCgpLHNjcm9sbFRvcDppLnNjcm9sbFRvcCgpLHdpZHRoOnN8fG4/aS53aWR0aCgpOmkub3V0ZXJXaWR0aCgpLGhlaWdodDpzfHxuP2kuaGVpZ2h0KCk6aS5vdXRlckhlaWdodCgpfX19LGUuZm4ucG9zaXRpb249ZnVuY3Rpb24obil7aWYoIW58fCFuLm9mKXJldHVybiBmLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtuPWUuZXh0ZW5kKHt9LG4pO3ZhciBwLG0sZyx2LHksYixfPWUobi5vZikseD1lLnBvc2l0aW9uLmdldFdpdGhpbkluZm8obi53aXRoaW4pLHc9ZS5wb3NpdGlvbi5nZXRTY3JvbGxJbmZvKHgpLGs9KG4uY29sbGlzaW9ufHwiZmxpcCIpLnNwbGl0KCIgIiksVD17fTtyZXR1cm4gYj1zKF8pLF9bMF0ucHJldmVudERlZmF1bHQmJihuLmF0PSJsZWZ0IHRvcCIpLG09Yi53aWR0aCxnPWIuaGVpZ2h0LHY9Yi5vZmZzZXQseT1lLmV4dGVuZCh7fSx2KSxlLmVhY2goWyJteSIsImF0Il0sZnVuY3Rpb24oKXt2YXIgZSx0LGk9KG5bdGhpc118fCIiKS5zcGxpdCgiICIpOzE9PT1pLmxlbmd0aCYmKGk9bC50ZXN0KGlbMF0pP2kuY29uY2F0KFsiY2VudGVyIl0pOnUudGVzdChpWzBdKT9bImNlbnRlciJdLmNvbmNhdChpKTpbImNlbnRlciIsImNlbnRlciJdKSxpWzBdPWwudGVzdChpWzBdKT9pWzBdOiJjZW50ZXIiLGlbMV09dS50ZXN0KGlbMV0pP2lbMV06ImNlbnRlciIsZT1kLmV4ZWMoaVswXSksdD1kLmV4ZWMoaVsxXSksVFt0aGlzXT1bZT9lWzBdOjAsdD90WzBdOjBdLG5bdGhpc109W2MuZXhlYyhpWzBdKVswXSxjLmV4ZWMoaVsxXSlbMF1dfSksMT09PWsubGVuZ3RoJiYoa1sxXT1rWzBdKSwicmlnaHQiPT09bi5hdFswXT95LmxlZnQrPW06ImNlbnRlciI9PT1uLmF0WzBdJiYoeS5sZWZ0Kz1tLzIpLCJib3R0b20iPT09bi5hdFsxXT95LnRvcCs9ZzoiY2VudGVyIj09PW4uYXRbMV0mJih5LnRvcCs9Zy8yKSxwPXQoVC5hdCxtLGcpLHkubGVmdCs9cFswXSx5LnRvcCs9cFsxXSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgcyxsLHU9ZSh0aGlzKSxkPXUub3V0ZXJXaWR0aCgpLGM9dS5vdXRlckhlaWdodCgpLGY9aSh0aGlzLCJtYXJnaW5MZWZ0IiksYj1pKHRoaXMsIm1hcmdpblRvcCIpLEQ9ZCtmK2kodGhpcywibWFyZ2luUmlnaHQiKSt3LndpZHRoLFM9YytiK2kodGhpcywibWFyZ2luQm90dG9tIikrdy5oZWlnaHQsTT1lLmV4dGVuZCh7fSx5KSxDPXQoVC5teSx1Lm91dGVyV2lkdGgoKSx1Lm91dGVySGVpZ2h0KCkpOyJyaWdodCI9PT1uLm15WzBdP00ubGVmdC09ZDoiY2VudGVyIj09PW4ubXlbMF0mJihNLmxlZnQtPWQvMiksImJvdHRvbSI9PT1uLm15WzFdP00udG9wLT1jOiJjZW50ZXIiPT09bi5teVsxXSYmKE0udG9wLT1jLzIpLE0ubGVmdCs9Q1swXSxNLnRvcCs9Q1sxXSxhfHwoTS5sZWZ0PWgoTS5sZWZ0KSxNLnRvcD1oKE0udG9wKSkscz17bWFyZ2luTGVmdDpmLG1hcmdpblRvcDpifSxlLmVhY2goWyJsZWZ0IiwidG9wIl0sZnVuY3Rpb24odCxpKXtlLnVpLnBvc2l0aW9uW2tbdF1dJiZlLnVpLnBvc2l0aW9uW2tbdF1dW2ldKE0se3RhcmdldFdpZHRoOm0sdGFyZ2V0SGVpZ2h0OmcsZWxlbVdpZHRoOmQsZWxlbUhlaWdodDpjLGNvbGxpc2lvblBvc2l0aW9uOnMsY29sbGlzaW9uV2lkdGg6RCxjb2xsaXNpb25IZWlnaHQ6UyxvZmZzZXQ6W3BbMF0rQ1swXSxwWzFdK0NbMV1dLG15Om4ubXksYXQ6bi5hdCx3aXRoaW46eCxlbGVtOnV9KX0pLG4udXNpbmcmJihsPWZ1bmN0aW9uKGUpe3ZhciB0PXYubGVmdC1NLmxlZnQsaT10K20tZCxzPXYudG9wLU0udG9wLGE9cytnLWMsaD17dGFyZ2V0OntlbGVtZW50Ol8sbGVmdDp2LmxlZnQsdG9wOnYudG9wLHdpZHRoOm0saGVpZ2h0Omd9LGVsZW1lbnQ6e2VsZW1lbnQ6dSxsZWZ0Ok0ubGVmdCx0b3A6TS50b3Asd2lkdGg6ZCxoZWlnaHQ6Y30saG9yaXpvbnRhbDowPmk/ImxlZnQiOnQ+MD8icmlnaHQiOiJjZW50ZXIiLHZlcnRpY2FsOjA+YT8idG9wIjpzPjA/ImJvdHRvbSI6Im1pZGRsZSJ9O2Q+bSYmbT5yKHQraSkmJihoLmhvcml6b250YWw9ImNlbnRlciIpLGM+ZyYmZz5yKHMrYSkmJihoLnZlcnRpY2FsPSJtaWRkbGUiKSxoLmltcG9ydGFudD1vKHIodCkscihpKSk+byhyKHMpLHIoYSkpPyJob3Jpem9udGFsIjoidmVydGljYWwiLG4udXNpbmcuY2FsbCh0aGlzLGUsaCl9KSx1Lm9mZnNldChlLmV4dGVuZChNLHt1c2luZzpsfSkpfSl9LGUudWkucG9zaXRpb249e2ZpdDp7bGVmdDpmdW5jdGlvbihlLHQpe3ZhciBpLHM9dC53aXRoaW4sbj1zLmlzV2luZG93P3Muc2Nyb2xsTGVmdDpzLm9mZnNldC5sZWZ0LGE9cy53aWR0aCxyPWUubGVmdC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQsaD1uLXIsbD1yK3QuY29sbGlzaW9uV2lkdGgtYS1uO3QuY29sbGlzaW9uV2lkdGg+YT9oPjAmJjA+PWw/KGk9ZS5sZWZ0K2grdC5jb2xsaXNpb25XaWR0aC1hLW4sZS5sZWZ0Kz1oLWkpOmUubGVmdD1sPjAmJjA+PWg/bjpoPmw/bithLXQuY29sbGlzaW9uV2lkdGg6bjpoPjA/ZS5sZWZ0Kz1oOmw+MD9lLmxlZnQtPWw6ZS5sZWZ0PW8oZS5sZWZ0LXIsZS5sZWZ0KX0sdG9wOmZ1bmN0aW9uKGUsdCl7dmFyIGkscz10LndpdGhpbixuPXMuaXNXaW5kb3c/cy5zY3JvbGxUb3A6cy5vZmZzZXQudG9wLGE9dC53aXRoaW4uaGVpZ2h0LHI9ZS50b3AtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsaD1uLXIsbD1yK3QuY29sbGlzaW9uSGVpZ2h0LWEtbjt0LmNvbGxpc2lvbkhlaWdodD5hP2g+MCYmMD49bD8oaT1lLnRvcCtoK3QuY29sbGlzaW9uSGVpZ2h0LWEtbixlLnRvcCs9aC1pKTplLnRvcD1sPjAmJjA+PWg/bjpoPmw/bithLXQuY29sbGlzaW9uSGVpZ2h0Om46aD4wP2UudG9wKz1oOmw+MD9lLnRvcC09bDplLnRvcD1vKGUudG9wLXIsZS50b3ApfX0sZmxpcDp7bGVmdDpmdW5jdGlvbihlLHQpe3ZhciBpLHMsbj10LndpdGhpbixhPW4ub2Zmc2V0LmxlZnQrbi5zY3JvbGxMZWZ0LG89bi53aWR0aCxoPW4uaXNXaW5kb3c/bi5zY3JvbGxMZWZ0Om4ub2Zmc2V0LmxlZnQsbD1lLmxlZnQtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5MZWZ0LHU9bC1oLGQ9bCt0LmNvbGxpc2lvbldpZHRoLW8taCxjPSJsZWZ0Ij09PXQubXlbMF0/LXQuZWxlbVdpZHRoOiJyaWdodCI9PT10Lm15WzBdP3QuZWxlbVdpZHRoOjAscD0ibGVmdCI9PT10LmF0WzBdP3QudGFyZ2V0V2lkdGg6InJpZ2h0Ij09PXQuYXRbMF0/LXQudGFyZ2V0V2lkdGg6MCxmPS0yKnQub2Zmc2V0WzBdOzA+dT8oaT1lLmxlZnQrYytwK2YrdC5jb2xsaXNpb25XaWR0aC1vLWEsKDA+aXx8cih1KT5pKSYmKGUubGVmdCs9YytwK2YpKTpkPjAmJihzPWUubGVmdC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpbkxlZnQrYytwK2YtaCwocz4wfHxkPnIocykpJiYoZS5sZWZ0Kz1jK3ArZikpfSx0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dC53aXRoaW4sYT1uLm9mZnNldC50b3Arbi5zY3JvbGxUb3Asbz1uLmhlaWdodCxoPW4uaXNXaW5kb3c/bi5zY3JvbGxUb3A6bi5vZmZzZXQudG9wLGw9ZS50b3AtdC5jb2xsaXNpb25Qb3NpdGlvbi5tYXJnaW5Ub3AsdT1sLWgsZD1sK3QuY29sbGlzaW9uSGVpZ2h0LW8taCxjPSJ0b3AiPT09dC5teVsxXSxwPWM/LXQuZWxlbUhlaWdodDoiYm90dG9tIj09PXQubXlbMV0/dC5lbGVtSGVpZ2h0OjAsZj0idG9wIj09PXQuYXRbMV0/dC50YXJnZXRIZWlnaHQ6ImJvdHRvbSI9PT10LmF0WzFdPy10LnRhcmdldEhlaWdodDowLG09LTIqdC5vZmZzZXRbMV07MD51PyhzPWUudG9wK3ArZittK3QuY29sbGlzaW9uSGVpZ2h0LW8tYSwoMD5zfHxyKHUpPnMpJiYoZS50b3ArPXArZittKSk6ZD4wJiYoaT1lLnRvcC10LmNvbGxpc2lvblBvc2l0aW9uLm1hcmdpblRvcCtwK2YrbS1oLChpPjB8fGQ+cihpKSkmJihlLnRvcCs9cCtmK20pKX19LGZsaXBmaXQ6e2xlZnQ6ZnVuY3Rpb24oKXtlLnVpLnBvc2l0aW9uLmZsaXAubGVmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS51aS5wb3NpdGlvbi5maXQubGVmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHRvcDpmdW5jdGlvbigpe2UudWkucG9zaXRpb24uZmxpcC50b3AuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudWkucG9zaXRpb24uZml0LnRvcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24oKXt2YXIgdCxpLHMsbixvLHI9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyPyJkaXYiOiJib2R5Iikscz17dmlzaWJpbGl0eToiaGlkZGVuIix3aWR0aDowLGhlaWdodDowLGJvcmRlcjowLG1hcmdpbjowLGJhY2tncm91bmQ6Im5vbmUifSxyJiZlLmV4dGVuZChzLHtwb3NpdGlvbjoiYWJzb2x1dGUiLGxlZnQ6Ii0xMDAwcHgiLHRvcDoiLTEwMDBweCJ9KTtmb3IobyBpbiBzKXQuc3R5bGVbb109c1tvXTt0LmFwcGVuZENoaWxkKGgpLGk9cnx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGkuaW5zZXJ0QmVmb3JlKHQsaS5maXJzdENoaWxkKSxoLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTAuNzQzMjIyMnB4OyIsbj1lKGgpLm9mZnNldCgpLmxlZnQsYT1uPjEwJiYxMT5uLHQuaW5uZXJIVE1MPSIiLGkucmVtb3ZlQ2hpbGQodCl9KCl9KCksZS51aS5wb3NpdGlvbixlLndpZGdldCgidWkuYWNjb3JkaW9uIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnthY3RpdmU6MCxhbmltYXRlOnt9LGNvbGxhcHNpYmxlOiExLGV2ZW50OiJjbGljayIsaGVhZGVyOiI+IGxpID4gOmZpcnN0LWNoaWxkLD4gOm5vdChsaSk6ZXZlbiIsaGVpZ2h0U3R5bGU6ImF1dG8iLGljb25zOnthY3RpdmVIZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1zIixoZWFkZXI6InVpLWljb24tdHJpYW5nbGUtMS1lIn0sYWN0aXZhdGU6bnVsbCxiZWZvcmVBY3RpdmF0ZTpudWxsfSxoaWRlUHJvcHM6e2JvcmRlclRvcFdpZHRoOiJoaWRlIixib3JkZXJCb3R0b21XaWR0aDoiaGlkZSIscGFkZGluZ1RvcDoiaGlkZSIscGFkZGluZ0JvdHRvbToiaGlkZSIsaGVpZ2h0OiJoaWRlIn0sc2hvd1Byb3BzOntib3JkZXJUb3BXaWR0aDoic2hvdyIsYm9yZGVyQm90dG9tV2lkdGg6InNob3ciLHBhZGRpbmdUb3A6InNob3ciLHBhZGRpbmdCb3R0b206InNob3ciLGhlaWdodDoic2hvdyJ9LF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnM7dGhpcy5wcmV2U2hvdz10aGlzLnByZXZIaWRlPWUoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWFjY29yZGlvbiB1aS13aWRnZXQgdWktaGVscGVyLXJlc2V0IikuYXR0cigicm9sZSIsInRhYmxpc3QiKSx0LmNvbGxhcHNpYmxlfHx0LmFjdGl2ZSE9PSExJiZudWxsIT10LmFjdGl2ZXx8KHQuYWN0aXZlPTApLHRoaXMuX3Byb2Nlc3NQYW5lbHMoKSwwPnQuYWN0aXZlJiYodC5hY3RpdmUrPXRoaXMuaGVhZGVycy5sZW5ndGgpLHRoaXMuX3JlZnJlc2goKX0sX2dldENyZWF0ZUV2ZW50RGF0YTpmdW5jdGlvbigpe3JldHVybntoZWFkZXI6dGhpcy5hY3RpdmUscGFuZWw6dGhpcy5hY3RpdmUubGVuZ3RoP3RoaXMuYWN0aXZlLm5leHQoKTplKCl9fSxfY3JlYXRlSWNvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuaWNvbnM7dCYmKGUoIjxzcGFuPiIpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taGVhZGVyLWljb24gdWktaWNvbiAiK3QuaGVhZGVyKS5wcmVwZW5kVG8odGhpcy5oZWFkZXJzKSx0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZUNsYXNzKHQuaGVhZGVyKS5hZGRDbGFzcyh0LmFjdGl2ZUhlYWRlciksdGhpcy5oZWFkZXJzLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24taWNvbnMiKSl9LF9kZXN0cm95SWNvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlYWRlcnMucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1pY29ucyIpLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hY2NvcmRpb24gdWktd2lkZ2V0IHVpLWhlbHBlci1yZXNldCIpLnJlbW92ZUF0dHIoInJvbGUiKSx0aGlzLmhlYWRlcnMucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXIgdWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItYWxsIHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZXhwYW5kZWQiKS5yZW1vdmVBdHRyKCJhcmlhLXNlbGVjdGVkIikucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLl9kZXN0cm95SWNvbnMoKSxlPXRoaXMuaGVhZGVycy5uZXh0KCkucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1yZXNldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIHVpLWFjY29yZGlvbi1jb250ZW50IHVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCIpLmNzcygiZGlzcGxheSIsIiIpLnJlbW92ZUF0dHIoInJvbGUiKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLnJlbW92ZUF0dHIoImFyaWEtbGFiZWxsZWRieSIpLnJlbW92ZVVuaXF1ZUlkKCksImNvbnRlbnQiIT09dGhpcy5vcHRpb25zLmhlaWdodFN0eWxlJiZlLmNzcygiaGVpZ2h0IiwiIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4iYWN0aXZlIj09PWU/KHRoaXMuX2FjdGl2YXRlKHQpLHZvaWQgMCk6KCJldmVudCI9PT1lJiYodGhpcy5vcHRpb25zLmV2ZW50JiZ0aGlzLl9vZmYodGhpcy5oZWFkZXJzLHRoaXMub3B0aW9ucy5ldmVudCksdGhpcy5fc2V0dXBFdmVudHModCkpLHRoaXMuX3N1cGVyKGUsdCksImNvbGxhcHNpYmxlIiE9PWV8fHR8fHRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMXx8dGhpcy5fYWN0aXZhdGUoMCksImljb25zIj09PWUmJih0aGlzLl9kZXN0cm95SWNvbnMoKSx0JiZ0aGlzLl9jcmVhdGVJY29ucygpKSwiZGlzYWJsZWQiPT09ZSYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKS50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkpLHZvaWQgMCl9LF9rZXlkb3duOmZ1bmN0aW9uKHQpe2lmKCF0LmFsdEtleSYmIXQuY3RybEtleSl7dmFyIGk9ZS51aS5rZXlDb2RlLHM9dGhpcy5oZWFkZXJzLmxlbmd0aCxuPXRoaXMuaGVhZGVycy5pbmRleCh0LnRhcmdldCksYT0hMTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGkuUklHSFQ6Y2FzZSBpLkRPV046YT10aGlzLmhlYWRlcnNbKG4rMSklc107YnJlYWs7Y2FzZSBpLkxFRlQ6Y2FzZSBpLlVQOmE9dGhpcy5oZWFkZXJzWyhuLTErcyklc107YnJlYWs7Y2FzZSBpLlNQQUNFOmNhc2UgaS5FTlRFUjp0aGlzLl9ldmVudEhhbmRsZXIodCk7YnJlYWs7Y2FzZSBpLkhPTUU6YT10aGlzLmhlYWRlcnNbMF07YnJlYWs7Y2FzZSBpLkVORDphPXRoaXMuaGVhZGVyc1tzLTFdfWEmJihlKHQudGFyZ2V0KS5hdHRyKCJ0YWJJbmRleCIsLTEpLGUoYSkuYXR0cigidGFiSW5kZXgiLDApLGEuZm9jdXMoKSx0LnByZXZlbnREZWZhdWx0KCkpfX0sX3BhbmVsS2V5RG93bjpmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuVVAmJnQuY3RybEtleSYmZSh0LmN1cnJlbnRUYXJnZXQpLnByZXYoKS5mb2N1cygpfSxyZWZyZXNoOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zO3RoaXMuX3Byb2Nlc3NQYW5lbHMoKSx0LmFjdGl2ZT09PSExJiZ0LmNvbGxhcHNpYmxlPT09ITB8fCF0aGlzLmhlYWRlcnMubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnQuYWN0aXZlPT09ITE/dGhpcy5fYWN0aXZhdGUoMCk6dGhpcy5hY3RpdmUubGVuZ3RoJiYhZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sdGhpcy5hY3RpdmVbMF0pP3RoaXMuaGVhZGVycy5sZW5ndGg9PT10aGlzLmhlYWRlcnMuZmluZCgiLnVpLXN0YXRlLWRpc2FibGVkIikubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKE1hdGgubWF4KDAsdC5hY3RpdmUtMSkpOnQuYWN0aXZlPXRoaXMuaGVhZGVycy5pbmRleCh0aGlzLmFjdGl2ZSksdGhpcy5fZGVzdHJveUljb25zKCksdGhpcy5fcmVmcmVzaCgpfSxfcHJvY2Vzc1BhbmVsczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuaGVhZGVycyx0PXRoaXMucGFuZWxzO3RoaXMuaGVhZGVycz10aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaGVhZGVyKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlciB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKSx0aGlzLnBhbmVscz10aGlzLmhlYWRlcnMubmV4dCgpLmFkZENsYXNzKCJ1aS1hY2NvcmRpb24tY29udGVudCB1aS1oZWxwZXItcmVzZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWJvdHRvbSIpLmZpbHRlcigiOm5vdCgudWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlKSIpLmhpZGUoKSx0JiYodGhpcy5fb2ZmKGUubm90KHRoaXMuaGVhZGVycykpLHRoaXMuX29mZih0Lm5vdCh0aGlzLnBhbmVscykpKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxpPXRoaXMub3B0aW9ucyxzPWkuaGVpZ2h0U3R5bGUsbj10aGlzLmVsZW1lbnQucGFyZW50KCk7dGhpcy5hY3RpdmU9dGhpcy5fZmluZEFjdGl2ZShpLmFjdGl2ZSkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1oZWFkZXItYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSB1aS1jb3JuZXItdG9wIikucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0aGlzLmFjdGl2ZS5uZXh0KCkuYWRkQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpLnNob3coKSx0aGlzLmhlYWRlcnMuYXR0cigicm9sZSIsInRhYiIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC51bmlxdWVJZCgpLmF0dHIoImlkIikscz10Lm5leHQoKSxuPXMudW5pcXVlSWQoKS5hdHRyKCJpZCIpO3QuYXR0cigiYXJpYS1jb250cm9scyIsbikscy5hdHRyKCJhcmlhLWxhYmVsbGVkYnkiLGkpfSkubmV4dCgpLmF0dHIoInJvbGUiLCJ0YWJwYW5lbCIpLHRoaXMuaGVhZGVycy5ub3QodGhpcy5hY3RpdmUpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoiZmFsc2UiLCJhcmlhLWV4cGFuZGVkIjoiZmFsc2UiLHRhYkluZGV4Oi0xfSkubmV4dCgpLmF0dHIoeyJhcmlhLWhpZGRlbiI6InRydWUifSkuaGlkZSgpLHRoaXMuYWN0aXZlLmxlbmd0aD90aGlzLmFjdGl2ZS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLm5leHQoKS5hdHRyKHsiYXJpYS1oaWRkZW4iOiJmYWxzZSJ9KTp0aGlzLmhlYWRlcnMuZXEoMCkuYXR0cigidGFiSW5kZXgiLDApLHRoaXMuX2NyZWF0ZUljb25zKCksdGhpcy5fc2V0dXBFdmVudHMoaS5ldmVudCksImZpbGwiPT09cz8odD1uLmhlaWdodCgpLHRoaXMuZWxlbWVudC5zaWJsaW5ncygiOnZpc2libGUiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKSxzPWkuY3NzKCJwb3NpdGlvbiIpOyJhYnNvbHV0ZSIhPT1zJiYiZml4ZWQiIT09cyYmKHQtPWkub3V0ZXJIZWlnaHQoITApKX0pLHRoaXMuaGVhZGVycy5lYWNoKGZ1bmN0aW9uKCl7dC09ZSh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLmhlYWRlcnMubmV4dCgpLmVhY2goZnVuY3Rpb24oKXtlKHRoaXMpLmhlaWdodChNYXRoLm1heCgwLHQtZSh0aGlzKS5pbm5lckhlaWdodCgpK2UodGhpcykuaGVpZ2h0KCkpKX0pLmNzcygib3ZlcmZsb3ciLCJhdXRvIikpOiJhdXRvIj09PXMmJih0PTAsdGhpcy5oZWFkZXJzLm5leHQoKS5lYWNoKGZ1bmN0aW9uKCl7dD1NYXRoLm1heCh0LGUodGhpcykuY3NzKCJoZWlnaHQiLCIiKS5oZWlnaHQoKSl9KS5oZWlnaHQodCkpfSxfYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZmluZEFjdGl2ZSh0KVswXTtpIT09dGhpcy5hY3RpdmVbMF0mJihpPWl8fHRoaXMuYWN0aXZlWzBdLHRoaXMuX2V2ZW50SGFuZGxlcih7dGFyZ2V0OmksY3VycmVudFRhcmdldDppLHByZXZlbnREZWZhdWx0OmUubm9vcH0pKX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3RoaXMuaGVhZGVycy5lcSh0KTplKCl9LF9zZXR1cEV2ZW50czpmdW5jdGlvbih0KXt2YXIgaT17a2V5ZG93bjoiX2tleWRvd24ifTt0JiZlLmVhY2godC5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7aVt0XT0iX2V2ZW50SGFuZGxlciJ9KSx0aGlzLl9vZmYodGhpcy5oZWFkZXJzLmFkZCh0aGlzLmhlYWRlcnMubmV4dCgpKSksdGhpcy5fb24odGhpcy5oZWFkZXJzLGkpLHRoaXMuX29uKHRoaXMuaGVhZGVycy5uZXh0KCkse2tleWRvd246Il9wYW5lbEtleURvd24ifSksdGhpcy5faG92ZXJhYmxlKHRoaXMuaGVhZGVycyksdGhpcy5fZm9jdXNhYmxlKHRoaXMuaGVhZGVycyl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9dGhpcy5hY3RpdmUsbj1lKHQuY3VycmVudFRhcmdldCksYT1uWzBdPT09c1swXSxvPWEmJmkuY29sbGFwc2libGUscj1vP2UoKTpuLm5leHQoKSxoPXMubmV4dCgpLGw9e29sZEhlYWRlcjpzLG9sZFBhbmVsOmgsbmV3SGVhZGVyOm8/ZSgpOm4sbmV3UGFuZWw6cn07dC5wcmV2ZW50RGVmYXVsdCgpLGEmJiFpLmNvbGxhcHNpYmxlfHx0aGlzLl90cmlnZ2VyKCJiZWZvcmVBY3RpdmF0ZSIsdCxsKT09PSExfHwoaS5hY3RpdmU9bz8hMTp0aGlzLmhlYWRlcnMuaW5kZXgobiksdGhpcy5hY3RpdmU9YT9lKCk6bix0aGlzLl90b2dnbGUobCkscy5yZW1vdmVDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIiksaS5pY29ucyYmcy5jaGlsZHJlbigiLnVpLWFjY29yZGlvbi1oZWFkZXItaWNvbiIpLnJlbW92ZUNsYXNzKGkuaWNvbnMuYWN0aXZlSGVhZGVyKS5hZGRDbGFzcyhpLmljb25zLmhlYWRlciksYXx8KG4ucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWhlYWRlci1hY3RpdmUgdWktc3RhdGUtYWN0aXZlIHVpLWNvcm5lci10b3AiKSxpLmljb25zJiZuLmNoaWxkcmVuKCIudWktYWNjb3JkaW9uLWhlYWRlci1pY29uIikucmVtb3ZlQ2xhc3MoaS5pY29ucy5oZWFkZXIpLmFkZENsYXNzKGkuaWNvbnMuYWN0aXZlSGVhZGVyKSxuLm5leHQoKS5hZGRDbGFzcygidWktYWNjb3JkaW9uLWNvbnRlbnQtYWN0aXZlIikpKX0sX3RvZ2dsZTpmdW5jdGlvbih0KXt2YXIgaT10Lm5ld1BhbmVsLHM9dGhpcy5wcmV2U2hvdy5sZW5ndGg/dGhpcy5wcmV2U2hvdzp0Lm9sZFBhbmVsO3RoaXMucHJldlNob3cuYWRkKHRoaXMucHJldkhpZGUpLnN0b3AoITAsITApLHRoaXMucHJldlNob3c9aSx0aGlzLnByZXZIaWRlPXMsdGhpcy5vcHRpb25zLmFuaW1hdGU/dGhpcy5fYW5pbWF0ZShpLHMsdCk6KHMuaGlkZSgpLGkuc2hvdygpLHRoaXMuX3RvZ2dsZUNvbXBsZXRlKHQpKSxzLmF0dHIoeyJhcmlhLWhpZGRlbiI6InRydWUifSkscy5wcmV2KCkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSJ9KSxpLmxlbmd0aCYmcy5sZW5ndGg/cy5wcmV2KCkuYXR0cih7dGFiSW5kZXg6LTEsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSJ9KTppLmxlbmd0aCYmdGhpcy5oZWFkZXJzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAwPT09cGFyc2VJbnQoZSh0aGlzKS5hdHRyKCJ0YWJJbmRleCIpLDEwKX0pLmF0dHIoInRhYkluZGV4IiwtMSksaS5hdHRyKCJhcmlhLWhpZGRlbiIsImZhbHNlIikucHJldigpLmF0dHIoeyJhcmlhLXNlbGVjdGVkIjoidHJ1ZSIsImFyaWEtZXhwYW5kZWQiOiJ0cnVlIix0YWJJbmRleDowfSl9LF9hbmltYXRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcyxuLGEsbz10aGlzLHI9MCxoPWUuY3NzKCJib3gtc2l6aW5nIiksbD1lLmxlbmd0aCYmKCF0Lmxlbmd0aHx8ZS5pbmRleCgpPHQuaW5kZXgoKSksdT10aGlzLm9wdGlvbnMuYW5pbWF0ZXx8e30sZD1sJiZ1LmRvd258fHUsYz1mdW5jdGlvbigpe28uX3RvZ2dsZUNvbXBsZXRlKGkpfTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGQmJihhPWQpLCJzdHJpbmciPT10eXBlb2YgZCYmKG49ZCksbj1ufHxkLmVhc2luZ3x8dS5lYXNpbmcsYT1hfHxkLmR1cmF0aW9ufHx1LmR1cmF0aW9uLHQubGVuZ3RoP2UubGVuZ3RoPyhzPWUuc2hvdygpLm91dGVySGVpZ2h0KCksdC5hbmltYXRlKHRoaXMuaGlkZVByb3BzLHtkdXJhdGlvbjphLGVhc2luZzpuLHN0ZXA6ZnVuY3Rpb24oZSx0KXt0Lm5vdz1NYXRoLnJvdW5kKGUpfX0pLGUuaGlkZSgpLmFuaW1hdGUodGhpcy5zaG93UHJvcHMse2R1cmF0aW9uOmEsZWFzaW5nOm4sY29tcGxldGU6YyxzdGVwOmZ1bmN0aW9uKGUsaSl7aS5ub3c9TWF0aC5yb3VuZChlKSwiaGVpZ2h0IiE9PWkucHJvcD8iY29udGVudC1ib3giPT09aCYmKHIrPWkubm93KToiY29udGVudCIhPT1vLm9wdGlvbnMuaGVpZ2h0U3R5bGUmJihpLm5vdz1NYXRoLnJvdW5kKHMtdC5vdXRlckhlaWdodCgpLXIpLHI9MCl9fSksdm9pZCAwKTp0LmFuaW1hdGUodGhpcy5oaWRlUHJvcHMsYSxuLGMpOmUuYW5pbWF0ZSh0aGlzLnNob3dQcm9wcyxhLG4sYyl9LF90b2dnbGVDb21wbGV0ZTpmdW5jdGlvbihlKXt2YXIgdD1lLm9sZFBhbmVsO3QucmVtb3ZlQ2xhc3MoInVpLWFjY29yZGlvbi1jb250ZW50LWFjdGl2ZSIpLnByZXYoKS5yZW1vdmVDbGFzcygidWktY29ybmVyLXRvcCIpLmFkZENsYXNzKCJ1aS1jb3JuZXItYWxsIiksdC5sZW5ndGgmJih0LnBhcmVudCgpWzBdLmNsYXNzTmFtZT10LnBhcmVudCgpWzBdLmNsYXNzTmFtZSksdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLG51bGwsZSl9fSksZS53aWRnZXQoInVpLm1lbnUiLHt2ZXJzaW9uOiIxLjExLjQiLGRlZmF1bHRFbGVtZW50OiI8dWw+IixkZWxheTozMDAsb3B0aW9uczp7aWNvbnM6e3N1Ym1lbnU6InVpLWljb24tY2FyYXQtMS1lIn0saXRlbXM6Ij4gKiIsbWVudXM6InVsIixwb3NpdGlvbjp7bXk6ImxlZnQtMSB0b3AiLGF0OiJyaWdodCB0b3AifSxyb2xlOiJtZW51IixibHVyOm51bGwsZm9jdXM6bnVsbCxzZWxlY3Q6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuYWN0aXZlTWVudT10aGlzLmVsZW1lbnQsdGhpcy5tb3VzZUhhbmRsZWQ9ITEsdGhpcy5lbGVtZW50LnVuaXF1ZUlkKCkuYWRkQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IikudG9nZ2xlQ2xhc3MoInVpLW1lbnUtaWNvbnMiLCEhdGhpcy5lbGVtZW50LmZpbmQoIi51aS1pY29uIikubGVuZ3RoKS5hdHRyKHtyb2xlOnRoaXMub3B0aW9ucy5yb2xlLHRhYkluZGV4OjB9KSx0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJnRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiKS5hdHRyKCJhcmlhLWRpc2FibGVkIiwidHJ1ZSIpLHRoaXMuX29uKHsibW91c2Vkb3duIC51aS1tZW51LWl0ZW0iOmZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKX0sImNsaWNrIC51aS1tZW51LWl0ZW0iOmZ1bmN0aW9uKHQpe3ZhciBpPWUodC50YXJnZXQpOyF0aGlzLm1vdXNlSGFuZGxlZCYmaS5ub3QoIi51aS1zdGF0ZS1kaXNhYmxlZCIpLmxlbmd0aCYmKHRoaXMuc2VsZWN0KHQpLHQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKXx8KHRoaXMubW91c2VIYW5kbGVkPSEwKSxpLmhhcygiLnVpLW1lbnUiKS5sZW5ndGg/dGhpcy5leHBhbmQodCk6IXRoaXMuZWxlbWVudC5pcygiOmZvY3VzIikmJmUodGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KCIudWktbWVudSIpLmxlbmd0aCYmKHRoaXMuZWxlbWVudC50cmlnZ2VyKCJmb2N1cyIsWyEwXSksdGhpcy5hY3RpdmUmJjE9PT10aGlzLmFjdGl2ZS5wYXJlbnRzKCIudWktbWVudSIpLmxlbmd0aCYmY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpKSl9LCJtb3VzZWVudGVyIC51aS1tZW51LWl0ZW0iOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLnByZXZpb3VzRmlsdGVyKXt2YXIgaT1lKHQuY3VycmVudFRhcmdldCk7Cmkuc2libGluZ3MoIi51aS1zdGF0ZS1hY3RpdmUiKS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5mb2N1cyh0LGkpfX0sbW91c2VsZWF2ZToiY29sbGFwc2VBbGwiLCJtb3VzZWxlYXZlIC51aS1tZW51IjoiY29sbGFwc2VBbGwiLGZvY3VzOmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5hY3RpdmV8fHRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuZXEoMCk7dHx8dGhpcy5mb2N1cyhlLGkpfSxibHVyOmZ1bmN0aW9uKHQpe3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sdGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KXx8dGhpcy5jb2xsYXBzZUFsbCh0KX0pfSxrZXlkb3duOiJfa2V5ZG93biJ9KSx0aGlzLnJlZnJlc2goKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHtjbGljazpmdW5jdGlvbihlKXt0aGlzLl9jbG9zZU9uRG9jdW1lbnRDbGljayhlKSYmdGhpcy5jb2xsYXBzZUFsbChlKSx0aGlzLm1vdXNlSGFuZGxlZD0hMX19KX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS1hY3RpdmVkZXNjZW5kYW50IikuZmluZCgiLnVpLW1lbnUiKS5hZGRCYWNrKCkucmVtb3ZlQ2xhc3MoInVpLW1lbnUgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtaWNvbnMgdWktZnJvbnQiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigidGFiSW5kZXgiKS5yZW1vdmVBdHRyKCJhcmlhLWxhYmVsbGVkYnkiKS5yZW1vdmVBdHRyKCJhcmlhLWV4cGFuZGVkIikucmVtb3ZlQXR0cigiYXJpYS1oaWRkZW4iKS5yZW1vdmVBdHRyKCJhcmlhLWRpc2FibGVkIikucmVtb3ZlVW5pcXVlSWQoKS5zaG93KCksdGhpcy5lbGVtZW50LmZpbmQoIi51aS1tZW51LWl0ZW0iKS5yZW1vdmVDbGFzcygidWktbWVudS1pdGVtIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKS5yZW1vdmVVbmlxdWVJZCgpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1ob3ZlciIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtaGFzcG9wdXAiKS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuZGF0YSgidWktbWVudS1zdWJtZW51LWNhcmF0IikmJnQucmVtb3ZlKCl9KSx0aGlzLmVsZW1lbnQuZmluZCgiLnVpLW1lbnUtZGl2aWRlciIpLnJlbW92ZUNsYXNzKCJ1aS1tZW51LWRpdmlkZXIgdWktd2lkZ2V0LWNvbnRlbnQiKX0sX2tleWRvd246ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz0hMDtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMucHJldmlvdXNQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlBBR0VfRE9XTjp0aGlzLm5leHRQYWdlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6dGhpcy5fbW92ZSgiZmlyc3QiLCJmaXJzdCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnRoaXMuX21vdmUoImxhc3QiLCJsYXN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDp0aGlzLnByZXZpb3VzKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046dGhpcy5uZXh0KHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5jb2xsYXBzZSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5SSUdIVDp0aGlzLmFjdGl2ZSYmIXRoaXMuYWN0aXZlLmlzKCIudWktc3RhdGUtZGlzYWJsZWQiKSYmdGhpcy5leHBhbmQodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5URVI6Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5fYWN0aXZhdGUodCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRVNDQVBFOnRoaXMuY29sbGFwc2UodCk7YnJlYWs7ZGVmYXVsdDpvPSExLHM9dGhpcy5wcmV2aW91c0ZpbHRlcnx8IiIsbj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksYT0hMSxjbGVhclRpbWVvdXQodGhpcy5maWx0ZXJUaW1lciksbj09PXM/YT0hMDpuPXMrbixpPXRoaXMuX2ZpbHRlck1lbnVJdGVtcyhuKSxpPWEmJi0xIT09aS5pbmRleCh0aGlzLmFjdGl2ZS5uZXh0KCkpP3RoaXMuYWN0aXZlLm5leHRBbGwoIi51aS1tZW51LWl0ZW0iKTppLGkubGVuZ3RofHwobj1TdHJpbmcuZnJvbUNoYXJDb2RlKHQua2V5Q29kZSksaT10aGlzLl9maWx0ZXJNZW51SXRlbXMobikpLGkubGVuZ3RoPyh0aGlzLmZvY3VzKHQsaSksdGhpcy5wcmV2aW91c0ZpbHRlcj1uLHRoaXMuZmlsdGVyVGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcmV2aW91c0ZpbHRlcn0sMWUzKSk6ZGVsZXRlIHRoaXMucHJldmlvdXNGaWx0ZXJ9byYmdC5wcmV2ZW50RGVmYXVsdCgpfSxfYWN0aXZhdGU6ZnVuY3Rpb24oZSl7dGhpcy5hY3RpdmUuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpfHwodGhpcy5hY3RpdmUuaXMoIlthcmlhLWhhc3BvcHVwPSd0cnVlJ10iKT90aGlzLmV4cGFuZChlKTp0aGlzLnNlbGVjdChlKSl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcyxuPXRoaXMub3B0aW9ucy5pY29ucy5zdWJtZW51LGE9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLm1lbnVzKTt0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLW1lbnUtaWNvbnMiLCEhdGhpcy5lbGVtZW50LmZpbmQoIi51aS1pY29uIikubGVuZ3RoKSxhLmZpbHRlcigiOm5vdCgudWktbWVudSkiKS5hZGRDbGFzcygidWktbWVudSB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktZnJvbnQiKS5oaWRlKCkuYXR0cih7cm9sZTp0aGlzLm9wdGlvbnMucm9sZSwiYXJpYS1oaWRkZW4iOiJ0cnVlIiwiYXJpYS1leHBhbmRlZCI6ImZhbHNlIn0pLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5wYXJlbnQoKSxzPWUoIjxzcGFuPiIpLmFkZENsYXNzKCJ1aS1tZW51LWljb24gdWktaWNvbiAiK24pLmRhdGEoInVpLW1lbnUtc3VibWVudS1jYXJhdCIsITApO2kuYXR0cigiYXJpYS1oYXNwb3B1cCIsInRydWUiKS5wcmVwZW5kKHMpLHQuYXR0cigiYXJpYS1sYWJlbGxlZGJ5IixpLmF0dHIoImlkIikpfSksdD1hLmFkZCh0aGlzLmVsZW1lbnQpLGk9dC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcyksaS5ub3QoIi51aS1tZW51LWl0ZW0iKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtzLl9pc0RpdmlkZXIodCkmJnQuYWRkQ2xhc3MoInVpLXdpZGdldC1jb250ZW50IHVpLW1lbnUtZGl2aWRlciIpfSksaS5ub3QoIi51aS1tZW51LWl0ZW0sIC51aS1tZW51LWRpdmlkZXIiKS5hZGRDbGFzcygidWktbWVudS1pdGVtIikudW5pcXVlSWQoKS5hdHRyKHt0YWJJbmRleDotMSxyb2xlOnRoaXMuX2l0ZW1Sb2xlKCl9KSxpLmZpbHRlcigiLnVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKSx0aGlzLmFjdGl2ZSYmIWUuY29udGFpbnModGhpcy5lbGVtZW50WzBdLHRoaXMuYWN0aXZlWzBdKSYmdGhpcy5ibHVyKCl9LF9pdGVtUm9sZTpmdW5jdGlvbigpe3JldHVybnttZW51OiJtZW51aXRlbSIsbGlzdGJveDoib3B0aW9uIn1bdGhpcy5vcHRpb25zLnJvbGVdfSxfc2V0T3B0aW9uOmZ1bmN0aW9uKGUsdCl7Imljb25zIj09PWUmJnRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLnN1Ym1lbnUpLmFkZENsYXNzKHQuc3VibWVudSksImRpc2FibGVkIj09PWUmJnRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCkuYXR0cigiYXJpYS1kaXNhYmxlZCIsdCksdGhpcy5fc3VwZXIoZSx0KX0sZm9jdXM6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO3RoaXMuYmx1cihlLGUmJiJmb2N1cyI9PT1lLnR5cGUpLHRoaXMuX3Njcm9sbEludG9WaWV3KHQpLHRoaXMuYWN0aXZlPXQuZmlyc3QoKSxzPXRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLm9wdGlvbnMucm9sZSYmdGhpcy5lbGVtZW50LmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIscy5hdHRyKCJpZCIpKSx0aGlzLmFjdGl2ZS5wYXJlbnQoKS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGUmJiJrZXlkb3duIj09PWUudHlwZT90aGlzLl9jbG9zZSgpOnRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9jbG9zZSgpfSx0aGlzLmRlbGF5KSxpPXQuY2hpbGRyZW4oIi51aS1tZW51IiksaS5sZW5ndGgmJmUmJi9ebW91c2UvLnRlc3QoZS50eXBlKSYmdGhpcy5fc3RhcnRPcGVuaW5nKGkpLHRoaXMuYWN0aXZlTWVudT10LnBhcmVudCgpLHRoaXMuX3RyaWdnZXIoImZvY3VzIixlLHtpdGVtOnR9KX0sX3Njcm9sbEludG9WaWV3OmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG8scjt0aGlzLl9oYXNTY3JvbGwoKSYmKGk9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sImJvcmRlclRvcFdpZHRoIikpfHwwLHM9cGFyc2VGbG9hdChlLmNzcyh0aGlzLmFjdGl2ZU1lbnVbMF0sInBhZGRpbmdUb3AiKSl8fDAsbj10Lm9mZnNldCgpLnRvcC10aGlzLmFjdGl2ZU1lbnUub2Zmc2V0KCkudG9wLWktcyxhPXRoaXMuYWN0aXZlTWVudS5zY3JvbGxUb3AoKSxvPXRoaXMuYWN0aXZlTWVudS5oZWlnaHQoKSxyPXQub3V0ZXJIZWlnaHQoKSwwPm4/dGhpcy5hY3RpdmVNZW51LnNjcm9sbFRvcChhK24pOm4rcj5vJiZ0aGlzLmFjdGl2ZU1lbnUuc2Nyb2xsVG9wKGErbi1vK3IpKX0sYmx1cjpmdW5jdGlvbihlLHQpe3R8fGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKSx0aGlzLmFjdGl2ZSYmKHRoaXMuYWN0aXZlLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLHRoaXMuYWN0aXZlPW51bGwsdGhpcy5fdHJpZ2dlcigiYmx1ciIsZSx7aXRlbTp0aGlzLmFjdGl2ZX0pKX0sX3N0YXJ0T3BlbmluZzpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy50aW1lciksInRydWUiPT09ZS5hdHRyKCJhcmlhLWhpZGRlbiIpJiYodGhpcy50aW1lcj10aGlzLl9kZWxheShmdW5jdGlvbigpe3RoaXMuX2Nsb3NlKCksdGhpcy5fb3BlbihlKX0sdGhpcy5kZWxheSkpfSxfb3BlbjpmdW5jdGlvbih0KXt2YXIgaT1lLmV4dGVuZCh7b2Y6dGhpcy5hY3RpdmV9LHRoaXMub3B0aW9ucy5wb3NpdGlvbik7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpLm5vdCh0LnBhcmVudHMoIi51aS1tZW51IikpLmhpZGUoKS5hdHRyKCJhcmlhLWhpZGRlbiIsInRydWUiKSx0LnNob3coKS5yZW1vdmVBdHRyKCJhcmlhLWhpZGRlbiIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJ0cnVlIikucG9zaXRpb24oaSl9LGNvbGxhcHNlQWxsOmZ1bmN0aW9uKHQsaSl7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt2YXIgcz1pP3RoaXMuZWxlbWVudDplKHQmJnQudGFyZ2V0KS5jbG9zZXN0KHRoaXMuZWxlbWVudC5maW5kKCIudWktbWVudSIpKTtzLmxlbmd0aHx8KHM9dGhpcy5lbGVtZW50KSx0aGlzLl9jbG9zZShzKSx0aGlzLmJsdXIodCksdGhpcy5hY3RpdmVNZW51PXN9LHRoaXMuZGVsYXkpfSxfY2xvc2U6ZnVuY3Rpb24oZSl7ZXx8KGU9dGhpcy5hY3RpdmU/dGhpcy5hY3RpdmUucGFyZW50KCk6dGhpcy5lbGVtZW50KSxlLmZpbmQoIi51aS1tZW51IikuaGlkZSgpLmF0dHIoImFyaWEtaGlkZGVuIiwidHJ1ZSIpLmF0dHIoImFyaWEtZXhwYW5kZWQiLCJmYWxzZSIpLmVuZCgpLmZpbmQoIi51aS1zdGF0ZS1hY3RpdmUiKS5ub3QoIi51aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKX0sX2Nsb3NlT25Eb2N1bWVudENsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiFlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudSIpLmxlbmd0aH0sX2lzRGl2aWRlcjpmdW5jdGlvbihlKXtyZXR1cm4hL1teXC1cdTIwMTRcdTIwMTNcc10vLnRlc3QoZS50ZXh0KCkpfSxjb2xsYXBzZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmFjdGl2ZSYmdGhpcy5hY3RpdmUucGFyZW50KCkuY2xvc2VzdCgiLnVpLW1lbnUtaXRlbSIsdGhpcy5lbGVtZW50KTt0JiZ0Lmxlbmd0aCYmKHRoaXMuX2Nsb3NlKCksdGhpcy5mb2N1cyhlLHQpKX0sZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYWN0aXZlJiZ0aGlzLmFjdGl2ZS5jaGlsZHJlbigiLnVpLW1lbnUgIikuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpLmZpcnN0KCk7dCYmdC5sZW5ndGgmJih0aGlzLl9vcGVuKHQucGFyZW50KCkpLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5mb2N1cyhlLHQpfSkpfSxuZXh0OmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoIm5leHQiLCJmaXJzdCIsZSl9LHByZXZpb3VzOmZ1bmN0aW9uKGUpe3RoaXMuX21vdmUoInByZXYiLCJsYXN0IixlKX0saXNGaXJzdEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hY3RpdmUmJiF0aGlzLmFjdGl2ZS5wcmV2QWxsKCIudWktbWVudS1pdGVtIikubGVuZ3RofSxpc0xhc3RJdGVtOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlJiYhdGhpcy5hY3RpdmUubmV4dEFsbCgiLnVpLW1lbnUtaXRlbSIpLmxlbmd0aH0sX21vdmU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzO3RoaXMuYWN0aXZlJiYocz0iZmlyc3QiPT09ZXx8Imxhc3QiPT09ZT90aGlzLmFjdGl2ZVsiZmlyc3QiPT09ZT8icHJldkFsbCI6Im5leHRBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKC0xKTp0aGlzLmFjdGl2ZVtlKyJBbGwiXSgiLnVpLW1lbnUtaXRlbSIpLmVxKDApKSxzJiZzLmxlbmd0aCYmdGhpcy5hY3RpdmV8fChzPXRoaXMuYWN0aXZlTWVudS5maW5kKHRoaXMub3B0aW9ucy5pdGVtcylbdF0oKSksdGhpcy5mb2N1cyhpLHMpfSxuZXh0UGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzTGFzdEl0ZW0oKXx8KHRoaXMuX2hhc1Njcm9sbCgpPyhzPXRoaXMuYWN0aXZlLm9mZnNldCgpLnRvcCxuPXRoaXMuZWxlbWVudC5oZWlnaHQoKSx0aGlzLmFjdGl2ZS5uZXh0QWxsKCIudWktbWVudS1pdGVtIikuZWFjaChmdW5jdGlvbigpe3JldHVybiBpPWUodGhpcyksMD5pLm9mZnNldCgpLnRvcC1zLW59KSx0aGlzLmZvY3VzKHQsaSkpOnRoaXMuZm9jdXModCx0aGlzLmFjdGl2ZU1lbnUuZmluZCh0aGlzLm9wdGlvbnMuaXRlbXMpW3RoaXMuYWN0aXZlPyJsYXN0IjoiZmlyc3QiXSgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LHByZXZpb3VzUGFnZTpmdW5jdGlvbih0KXt2YXIgaSxzLG47cmV0dXJuIHRoaXMuYWN0aXZlPyh0aGlzLmlzRmlyc3RJdGVtKCl8fCh0aGlzLl9oYXNTY3JvbGwoKT8ocz10aGlzLmFjdGl2ZS5vZmZzZXQoKS50b3Asbj10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5hY3RpdmUucHJldkFsbCgiLnVpLW1lbnUtaXRlbSIpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gaT1lKHRoaXMpLGkub2Zmc2V0KCkudG9wLXMrbj4wfSksdGhpcy5mb2N1cyh0LGkpKTp0aGlzLmZvY3VzKHQsdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maXJzdCgpKSksdm9pZCAwKToodGhpcy5uZXh0KHQpLHZvaWQgMCl9LF9oYXNTY3JvbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCk8dGhpcy5lbGVtZW50LnByb3AoInNjcm9sbEhlaWdodCIpfSxzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5hY3RpdmU9dGhpcy5hY3RpdmV8fGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1tZW51LWl0ZW0iKTt2YXIgaT17aXRlbTp0aGlzLmFjdGl2ZX07dGhpcy5hY3RpdmUuaGFzKCIudWktbWVudSIpLmxlbmd0aHx8dGhpcy5jb2xsYXBzZUFsbCh0LCEwKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLHQsaSl9LF9maWx0ZXJNZW51SXRlbXM6ZnVuY3Rpb24odCl7dmFyIGk9dC5yZXBsYWNlKC9bXC1cW1xde30oKSorPy4sXFxcXiR8I1xzXS9nLCJcXCQmIikscz1SZWdFeHAoIl4iK2ksImkiKTtyZXR1cm4gdGhpcy5hY3RpdmVNZW51LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKS5maWx0ZXIoIi51aS1tZW51LWl0ZW0iKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gcy50ZXN0KGUudHJpbShlKHRoaXMpLnRleHQoKSkpfSl9fSksZS53aWRnZXQoInVpLmF1dG9jb21wbGV0ZSIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxpbnB1dD4iLG9wdGlvbnM6e2FwcGVuZFRvOm51bGwsYXV0b0ZvY3VzOiExLGRlbGF5OjMwMCxtaW5MZW5ndGg6MSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHNvdXJjZTpudWxsLGNoYW5nZTpudWxsLGNsb3NlOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzcG9uc2U6bnVsbCxzZWFyY2g6bnVsbCxzZWxlY3Q6bnVsbH0scmVxdWVzdEluZGV4OjAscGVuZGluZzowLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbj10aGlzLmVsZW1lbnRbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxhPSJ0ZXh0YXJlYSI9PT1uLG89ImlucHV0Ij09PW47dGhpcy5pc011bHRpTGluZT1hPyEwOm8/ITE6dGhpcy5lbGVtZW50LnByb3AoImlzQ29udGVudEVkaXRhYmxlIiksdGhpcy52YWx1ZU1ldGhvZD10aGlzLmVsZW1lbnRbYXx8bz8idmFsIjoidGV4dCJdLHRoaXMuaXNOZXdNZW51PSEwLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYXV0b2NvbXBsZXRlLWlucHV0IikuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIiksdGhpcy5fb24odGhpcy5lbGVtZW50LHtrZXlkb3duOmZ1bmN0aW9uKG4pe2lmKHRoaXMuZWxlbWVudC5wcm9wKCJyZWFkT25seSIpKXJldHVybiB0PSEwLHM9ITAsaT0hMCx2b2lkIDA7dD0hMSxzPSExLGk9ITE7dmFyIGE9ZS51aS5rZXlDb2RlO3N3aXRjaChuLmtleUNvZGUpe2Nhc2UgYS5QQUdFX1VQOnQ9ITAsdGhpcy5fbW92ZSgicHJldmlvdXNQYWdlIixuKTticmVhaztjYXNlIGEuUEFHRV9ET1dOOnQ9ITAsdGhpcy5fbW92ZSgibmV4dFBhZ2UiLG4pO2JyZWFrO2Nhc2UgYS5VUDp0PSEwLHRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIsbik7YnJlYWs7Y2FzZSBhLkRPV046dD0hMCx0aGlzLl9rZXlFdmVudCgibmV4dCIsbik7YnJlYWs7Y2FzZSBhLkVOVEVSOnRoaXMubWVudS5hY3RpdmUmJih0PSEwLG4ucHJldmVudERlZmF1bHQoKSx0aGlzLm1lbnUuc2VsZWN0KG4pKTticmVhaztjYXNlIGEuVEFCOnRoaXMubWVudS5hY3RpdmUmJnRoaXMubWVudS5zZWxlY3Qobik7YnJlYWs7Y2FzZSBhLkVTQ0FQRTp0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSYmKHRoaXMuaXNNdWx0aUxpbmV8fHRoaXMuX3ZhbHVlKHRoaXMudGVybSksdGhpcy5jbG9zZShuKSxuLnByZXZlbnREZWZhdWx0KCkpO2JyZWFrO2RlZmF1bHQ6aT0hMCx0aGlzLl9zZWFyY2hUaW1lb3V0KG4pfX0sa2V5cHJlc3M6ZnVuY3Rpb24ocyl7aWYodClyZXR1cm4gdD0hMSwoIXRoaXMuaXNNdWx0aUxpbmV8fHRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKSYmcy5wcmV2ZW50RGVmYXVsdCgpLHZvaWQgMDtpZighaSl7dmFyIG49ZS51aS5rZXlDb2RlO3N3aXRjaChzLmtleUNvZGUpe2Nhc2Ugbi5QQUdFX1VQOnRoaXMuX21vdmUoInByZXZpb3VzUGFnZSIscyk7YnJlYWs7Y2FzZSBuLlBBR0VfRE9XTjp0aGlzLl9tb3ZlKCJuZXh0UGFnZSIscyk7YnJlYWs7Y2FzZSBuLlVQOnRoaXMuX2tleUV2ZW50KCJwcmV2aW91cyIscyk7YnJlYWs7Y2FzZSBuLkRPV046dGhpcy5fa2V5RXZlbnQoIm5leHQiLHMpfX19LGlucHV0OmZ1bmN0aW9uKGUpe3JldHVybiBzPyhzPSExLGUucHJldmVudERlZmF1bHQoKSx2b2lkIDApOih0aGlzLl9zZWFyY2hUaW1lb3V0KGUpLHZvaWQgMCl9LGZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZEl0ZW09bnVsbCx0aGlzLnByZXZpb3VzPXRoaXMuX3ZhbHVlKCl9LGJsdXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2FuY2VsQmx1cj8oZGVsZXRlIHRoaXMuY2FuY2VsQmx1cix2b2lkIDApOihjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuY2xvc2UoZSksdGhpcy5fY2hhbmdlKGUpLHZvaWQgMCl9fSksdGhpcy5faW5pdFNvdXJjZSgpLHRoaXMubWVudT1lKCI8dWw+IikuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZSB1aS1mcm9udCIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLm1lbnUoe3JvbGU6bnVsbH0pLmhpZGUoKS5tZW51KCJpbnN0YW5jZSIpLHRoaXMuX29uKHRoaXMubWVudS5lbGVtZW50LHttb3VzZWRvd246ZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuY2FuY2VsQmx1cj0hMCx0aGlzLl9kZWxheShmdW5jdGlvbigpe2RlbGV0ZSB0aGlzLmNhbmNlbEJsdXJ9KTt2YXIgaT10aGlzLm1lbnUuZWxlbWVudFswXTtlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktbWVudS1pdGVtIikubGVuZ3RofHx0aGlzLl9kZWxheShmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kb2N1bWVudC5vbmUoIm1vdXNlZG93biIsZnVuY3Rpb24ocyl7cy50YXJnZXQ9PT10LmVsZW1lbnRbMF18fHMudGFyZ2V0PT09aXx8ZS5jb250YWlucyhpLHMudGFyZ2V0KXx8dC5jbG9zZSgpfSl9KX0sbWVudWZvY3VzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbjtyZXR1cm4gdGhpcy5pc05ld01lbnUmJih0aGlzLmlzTmV3TWVudT0hMSx0Lm9yaWdpbmFsRXZlbnQmJi9ebW91c2UvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpKT8odGhpcy5tZW51LmJsdXIoKSx0aGlzLmRvY3VtZW50Lm9uZSgibW91c2Vtb3ZlIixmdW5jdGlvbigpe2UodC50YXJnZXQpLnRyaWdnZXIodC5vcmlnaW5hbEV2ZW50KX0pLHZvaWQgMCk6KG49aS5pdGVtLmRhdGEoInVpLWF1dG9jb21wbGV0ZS1pdGVtIiksITEhPT10aGlzLl90cmlnZ2VyKCJmb2N1cyIsdCx7aXRlbTpufSkmJnQub3JpZ2luYWxFdmVudCYmL15rZXkvLnRlc3QodC5vcmlnaW5hbEV2ZW50LnR5cGUpJiZ0aGlzLl92YWx1ZShuLnZhbHVlKSxzPWkuaXRlbS5hdHRyKCJhcmlhLWxhYmVsIil8fG4udmFsdWUscyYmZS50cmltKHMpLmxlbmd0aCYmKHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKCI8ZGl2PiIpLnRleHQocykuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSksdm9pZCAwKX0sbWVudXNlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXQuaXRlbS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIpLHM9dGhpcy5wcmV2aW91czt0aGlzLmVsZW1lbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdLmFjdGl2ZUVsZW1lbnQmJih0aGlzLmVsZW1lbnQuZm9jdXMoKSx0aGlzLnByZXZpb3VzPXMsdGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLnByZXZpb3VzPXMsdGhpcy5zZWxlY3RlZEl0ZW09aX0pKSwhMSE9PXRoaXMuX3RyaWdnZXIoInNlbGVjdCIsZSx7aXRlbTppfSkmJnRoaXMuX3ZhbHVlKGkudmFsdWUpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLHRoaXMuY2xvc2UoZSksdGhpcy5zZWxlY3RlZEl0ZW09aX19KSx0aGlzLmxpdmVSZWdpb249ZSgiPHNwYW4+Iix7cm9sZToic3RhdHVzIiwiYXJpYS1saXZlIjoiYXNzZXJ0aXZlIiwiYXJpYS1yZWxldmFudCI6ImFkZGl0aW9ucyJ9KS5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIikuYXBwZW5kVG8odGhpcy5kb2N1bWVudFswXS5ib2R5KSx0aGlzLl9vbih0aGlzLndpbmRvdyx7YmVmb3JldW5sb2FkOmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUF0dHIoImF1dG9jb21wbGV0ZSIpfX0pfSxfZGVzdHJveTpmdW5jdGlvbigpe2NsZWFyVGltZW91dCh0aGlzLnNlYXJjaGluZyksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1hdXRvY29tcGxldGUtaW5wdXQiKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKSx0aGlzLm1lbnUuZWxlbWVudC5yZW1vdmUoKSx0aGlzLmxpdmVSZWdpb24ucmVtb3ZlKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJzb3VyY2UiPT09ZSYmdGhpcy5faW5pdFNvdXJjZSgpLCJhcHBlbmRUbyI9PT1lJiZ0aGlzLm1lbnUuZWxlbWVudC5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwiZGlzYWJsZWQiPT09ZSYmdCYmdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCl9LF9hcHBlbmRUbzpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5hcHBlbmRUbztyZXR1cm4gdCYmKHQ9dC5qcXVlcnl8fHQubm9kZVR5cGU/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodCkuZXEoMCkpLHQmJnRbMF18fCh0PXRoaXMuZWxlbWVudC5jbG9zZXN0KCIudWktZnJvbnQiKSksdC5sZW5ndGh8fCh0PXRoaXMuZG9jdW1lbnRbMF0uYm9keSksdH0sX2luaXRTb3VyY2U6ZnVuY3Rpb24oKXt2YXIgdCxpLHM9dGhpcztlLmlzQXJyYXkodGhpcy5vcHRpb25zLnNvdXJjZSk/KHQ9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbihpLHMpe3MoZS51aS5hdXRvY29tcGxldGUuZmlsdGVyKHQsaS50ZXJtKSl9KToic3RyaW5nIj09dHlwZW9mIHRoaXMub3B0aW9ucy5zb3VyY2U/KGk9dGhpcy5vcHRpb25zLnNvdXJjZSx0aGlzLnNvdXJjZT1mdW5jdGlvbih0LG4pe3MueGhyJiZzLnhoci5hYm9ydCgpLHMueGhyPWUuYWpheCh7dXJsOmksZGF0YTp0LGRhdGFUeXBlOiJqc29uIixzdWNjZXNzOmZ1bmN0aW9uKGUpe24oZSl9LGVycm9yOmZ1bmN0aW9uKCl7bihbXSl9fSl9KTp0aGlzLnNvdXJjZT10aGlzLm9wdGlvbnMuc291cmNlfSxfc2VhcmNoVGltZW91dDpmdW5jdGlvbihlKXtjbGVhclRpbWVvdXQodGhpcy5zZWFyY2hpbmcpLHRoaXMuc2VhcmNoaW5nPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy50ZXJtPT09dGhpcy5fdmFsdWUoKSxpPXRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpLHM9ZS5hbHRLZXl8fGUuY3RybEtleXx8ZS5tZXRhS2V5fHxlLnNoaWZ0S2V5OyghdHx8dCYmIWkmJiFzKSYmKHRoaXMuc2VsZWN0ZWRJdGVtPW51bGwsdGhpcy5zZWFyY2gobnVsbCxlKSl9LHRoaXMub3B0aW9ucy5kZWxheSl9LHNlYXJjaDpmdW5jdGlvbihlLHQpe3JldHVybiBlPW51bGwhPWU/ZTp0aGlzLl92YWx1ZSgpLHRoaXMudGVybT10aGlzLl92YWx1ZSgpLGUubGVuZ3RoPHRoaXMub3B0aW9ucy5taW5MZW5ndGg/dGhpcy5jbG9zZSh0KTp0aGlzLl90cmlnZ2VyKCJzZWFyY2giLHQpIT09ITE/dGhpcy5fc2VhcmNoKGUpOnZvaWQgMH0sX3NlYXJjaDpmdW5jdGlvbihlKXt0aGlzLnBlbmRpbmcrKyx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIiksdGhpcy5jYW5jZWxTZWFyY2g9ITEsdGhpcy5zb3VyY2Uoe3Rlcm06ZX0sdGhpcy5fcmVzcG9uc2UoKSl9LF9yZXNwb25zZTpmdW5jdGlvbigpe3ZhciB0PSsrdGhpcy5yZXF1ZXN0SW5kZXg7cmV0dXJuIGUucHJveHkoZnVuY3Rpb24oZSl7dD09PXRoaXMucmVxdWVzdEluZGV4JiZ0aGlzLl9fcmVzcG9uc2UoZSksdGhpcy5wZW5kaW5nLS0sdGhpcy5wZW5kaW5nfHx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWF1dG9jb21wbGV0ZS1sb2FkaW5nIil9LHRoaXMpfSxfX3Jlc3BvbnNlOmZ1bmN0aW9uKGUpe2UmJihlPXRoaXMuX25vcm1hbGl6ZShlKSksdGhpcy5fdHJpZ2dlcigicmVzcG9uc2UiLG51bGwse2NvbnRlbnQ6ZX0pLCF0aGlzLm9wdGlvbnMuZGlzYWJsZWQmJmUmJmUubGVuZ3RoJiYhdGhpcy5jYW5jZWxTZWFyY2g/KHRoaXMuX3N1Z2dlc3QoZSksdGhpcy5fdHJpZ2dlcigib3BlbiIpKTp0aGlzLl9jbG9zZSgpfSxjbG9zZTpmdW5jdGlvbihlKXt0aGlzLmNhbmNlbFNlYXJjaD0hMCx0aGlzLl9jbG9zZShlKX0sX2Nsb3NlOmZ1bmN0aW9uKGUpe3RoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpJiYodGhpcy5tZW51LmVsZW1lbnQuaGlkZSgpLHRoaXMubWVudS5ibHVyKCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLGUpKX0sX2NoYW5nZTpmdW5jdGlvbihlKXt0aGlzLnByZXZpb3VzIT09dGhpcy5fdmFsdWUoKSYmdGhpcy5fdHJpZ2dlcigiY2hhbmdlIixlLHtpdGVtOnRoaXMuc2VsZWN0ZWRJdGVtfSl9LF9ub3JtYWxpemU6ZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RoJiZ0WzBdLmxhYmVsJiZ0WzBdLnZhbHVlP3Q6ZS5tYXAodCxmdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/e2xhYmVsOnQsdmFsdWU6dH06ZS5leHRlbmQoe30sdCx7bGFiZWw6dC5sYWJlbHx8dC52YWx1ZSx2YWx1ZTp0LnZhbHVlfHx0LmxhYmVsfSl9KX0sX3N1Z2dlc3Q6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5tZW51LmVsZW1lbnQuZW1wdHkoKTt0aGlzLl9yZW5kZXJNZW51KGksdCksdGhpcy5pc05ld01lbnU9ITAsdGhpcy5tZW51LnJlZnJlc2goKSxpLnNob3coKSx0aGlzLl9yZXNpemVNZW51KCksaS5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5lbGVtZW50fSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSx0aGlzLm9wdGlvbnMuYXV0b0ZvY3VzJiZ0aGlzLm1lbnUubmV4dCgpfSxfcmVzaXplTWVudTpmdW5jdGlvbigpe3ZhciBlPXRoaXMubWVudS5lbGVtZW50O2Uub3V0ZXJXaWR0aChNYXRoLm1heChlLndpZHRoKCIiKS5vdXRlcldpZHRoKCkrMSx0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpKSl9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcztlLmVhY2goaSxmdW5jdGlvbihlLGkpe3MuX3JlbmRlckl0ZW1EYXRhKHQsaSl9KX0sX3JlbmRlckl0ZW1EYXRhOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX3JlbmRlckl0ZW0oZSx0KS5kYXRhKCJ1aS1hdXRvY29tcGxldGUtaXRlbSIsdCl9LF9yZW5kZXJJdGVtOmZ1bmN0aW9uKHQsaSl7cmV0dXJuIGUoIjxsaT4iKS50ZXh0KGkubGFiZWwpLmFwcGVuZFRvKHQpfSxfbW92ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKT90aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSYmL15wcmV2aW91cy8udGVzdChlKXx8dGhpcy5tZW51LmlzTGFzdEl0ZW0oKSYmL15uZXh0Ly50ZXN0KGUpPyh0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLl92YWx1ZSh0aGlzLnRlcm0pLHRoaXMubWVudS5ibHVyKCksdm9pZCAwKToodGhpcy5tZW51W2VdKHQpLHZvaWQgMCk6KHRoaXMuc2VhcmNoKG51bGwsdCksdm9pZCAwKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWVudS5lbGVtZW50fSxfdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU1ldGhvZC5hcHBseSh0aGlzLmVsZW1lbnQsYXJndW1lbnRzKX0sX2tleUV2ZW50OmZ1bmN0aW9uKGUsdCl7KCF0aGlzLmlzTXVsdGlMaW5lfHx0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSkmJih0aGlzLl9tb3ZlKGUsdCksdC5wcmV2ZW50RGVmYXVsdCgpKX19KSxlLmV4dGVuZChlLnVpLmF1dG9jb21wbGV0ZSx7ZXNjYXBlUmVnZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvW1wtXFtcXXt9KCkqKz8uLFxcXF4kfCNcc10vZywiXFwkJiIpfSxmaWx0ZXI6ZnVuY3Rpb24odCxpKXt2YXIgcz1SZWdFeHAoZS51aS5hdXRvY29tcGxldGUuZXNjYXBlUmVnZXgoaSksImkiKTtyZXR1cm4gZS5ncmVwKHQsZnVuY3Rpb24oZSl7cmV0dXJuIHMudGVzdChlLmxhYmVsfHxlLnZhbHVlfHxlKX0pfX0pLGUud2lkZ2V0KCJ1aS5hdXRvY29tcGxldGUiLGUudWkuYXV0b2NvbXBsZXRlLHtvcHRpb25zOnttZXNzYWdlczp7bm9SZXN1bHRzOiJObyBzZWFyY2ggcmVzdWx0cy4iLHJlc3VsdHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUrKGU+MT8iIHJlc3VsdHMgYXJlIjoiIHJlc3VsdCBpcyIpKyIgYXZhaWxhYmxlLCB1c2UgdXAgYW5kIGRvd24gYXJyb3cga2V5cyB0byBuYXZpZ2F0ZS4ifX19LF9fcmVzcG9uc2U6ZnVuY3Rpb24odCl7dmFyIGk7dGhpcy5fc3VwZXJBcHBseShhcmd1bWVudHMpLHRoaXMub3B0aW9ucy5kaXNhYmxlZHx8dGhpcy5jYW5jZWxTZWFyY2h8fChpPXQmJnQubGVuZ3RoP3RoaXMub3B0aW9ucy5tZXNzYWdlcy5yZXN1bHRzKHQubGVuZ3RoKTp0aGlzLm9wdGlvbnMubWVzc2FnZXMubm9SZXN1bHRzLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxlKCI8ZGl2PiIpLnRleHQoaSkuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSl9fSksZS51aS5hdXRvY29tcGxldGU7dmFyIGMscD0idWktYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLGY9InVpLWJ1dHRvbi1pY29ucy1vbmx5IHVpLWJ1dHRvbi1pY29uLW9ubHkgdWktYnV0dG9uLXRleHQtaWNvbnMgdWktYnV0dG9uLXRleHQtaWNvbi1wcmltYXJ5IHVpLWJ1dHRvbi10ZXh0LWljb24tc2Vjb25kYXJ5IHVpLWJ1dHRvbi10ZXh0LW9ubHkiLG09ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmZpbmQoIjp1aS1idXR0b24iKS5idXR0b24oInJlZnJlc2giKX0sMSl9LGc9ZnVuY3Rpb24odCl7dmFyIGk9dC5uYW1lLHM9dC5mb3JtLG49ZShbXSk7cmV0dXJuIGkmJihpPWkucmVwbGFjZSgvJy9nLCJcXCciKSxuPXM/ZShzKS5maW5kKCJbbmFtZT0nIitpKyInXVt0eXBlPXJhZGlvXSIpOmUoIltuYW1lPSciK2krIiddW3R5cGU9cmFkaW9dIix0Lm93bmVyRG9jdW1lbnQpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiF0aGlzLmZvcm19KSksbn07ZS53aWRnZXQoInVpLmJ1dHRvbiIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxidXR0b24+IixvcHRpb25zOntkaXNhYmxlZDpudWxsLHRleHQ6ITAsbGFiZWw6bnVsbCxpY29uczp7cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5jbG9zZXN0KCJmb3JtIikudW5iaW5kKCJyZXNldCIrdGhpcy5ldmVudE5hbWVzcGFjZSkuYmluZCgicmVzZXQiK3RoaXMuZXZlbnROYW1lc3BhY2UsbSksImJvb2xlYW4iIT10eXBlb2YgdGhpcy5vcHRpb25zLmRpc2FibGVkP3RoaXMub3B0aW9ucy5kaXNhYmxlZD0hIXRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9kZXRlcm1pbmVCdXR0b25UeXBlKCksdGhpcy5oYXNUaXRsZT0hIXRoaXMuYnV0dG9uRWxlbWVudC5hdHRyKCJ0aXRsZSIpO3ZhciB0PXRoaXMsaT10aGlzLm9wdGlvbnMscz0iY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlLG49cz8iIjoidWktc3RhdGUtYWN0aXZlIjtudWxsPT09aS5sYWJlbCYmKGkubGFiZWw9ImlucHV0Ij09PXRoaXMudHlwZT90aGlzLmJ1dHRvbkVsZW1lbnQudmFsKCk6dGhpcy5idXR0b25FbGVtZW50Lmh0bWwoKSksdGhpcy5faG92ZXJhYmxlKHRoaXMuYnV0dG9uRWxlbWVudCksdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKHApLmF0dHIoInJvbGUiLCJidXR0b24iKS5iaW5kKCJtb3VzZWVudGVyIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7aS5kaXNhYmxlZHx8dGhpcz09PWMmJmUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSkuYmluZCgibW91c2VsZWF2ZSIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2kuZGlzYWJsZWR8fGUodGhpcykucmVtb3ZlQ2xhc3Mobil9KS5iaW5kKCJjbGljayIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbihlKXtpLmRpc2FibGVkJiYoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCkpfSksdGhpcy5fb24oe2ZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfSxibHVyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpfX0pLHMmJnRoaXMuZWxlbWVudC5iaW5kKCJjaGFuZ2UiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXt0LnJlZnJlc2goKX0pLCJjaGVja2JveCI9PT10aGlzLnR5cGU/dGhpcy5idXR0b25FbGVtZW50LmJpbmQoImNsaWNrIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGlzYWJsZWQ/ITE6dm9pZCAwfSk6InJhZGlvIj09PXRoaXMudHlwZT90aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgiY2xpY2siK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtpZihpLmRpc2FibGVkKXJldHVybiExO2UodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLHQuYnV0dG9uRWxlbWVudC5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik7dmFyIHM9dC5lbGVtZW50WzBdO2cocykubm90KHMpLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikuYXR0cigiYXJpYS1wcmVzc2VkIiwiZmFsc2UiKX0pOih0aGlzLmJ1dHRvbkVsZW1lbnQuYmluZCgibW91c2Vkb3duIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKCl7cmV0dXJuIGkuZGlzYWJsZWQ/ITE6KGUodGhpcykuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLGM9dGhpcyx0LmRvY3VtZW50Lm9uZSgibW91c2V1cCIsZnVuY3Rpb24oKXtjPW51bGx9KSx2b2lkIDApfSkuYmluZCgibW91c2V1cCIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe3JldHVybiBpLmRpc2FibGVkPyExOihlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx2b2lkIDApfSkuYmluZCgia2V5ZG93biIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbih0KXtyZXR1cm4gaS5kaXNhYmxlZD8hMTooKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5TUEFDRXx8dC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLkVOVEVSKSYmZSh0aGlzKS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdm9pZCAwKX0pLmJpbmQoImtleXVwIit0aGlzLmV2ZW50TmFtZXNwYWNlKyIgYmx1ciIrdGhpcy5ldmVudE5hbWVzcGFjZSxmdW5jdGlvbigpe2UodGhpcykucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpfSksdGhpcy5idXR0b25FbGVtZW50LmlzKCJhIikmJnRoaXMuYnV0dG9uRWxlbWVudC5rZXl1cChmdW5jdGlvbih0KXt0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuU1BBQ0UmJmUodGhpcykuY2xpY2soKX0pKSx0aGlzLl9zZXRPcHRpb24oImRpc2FibGVkIixpLmRpc2FibGVkKSx0aGlzLl9yZXNldEJ1dHRvbigpfSxfZGV0ZXJtaW5lQnV0dG9uVHlwZTpmdW5jdGlvbigpe3ZhciBlLHQsaTt0aGlzLnR5cGU9dGhpcy5lbGVtZW50LmlzKCJbdHlwZT1jaGVja2JveF0iKT8iY2hlY2tib3giOnRoaXMuZWxlbWVudC5pcygiW3R5cGU9cmFkaW9dIik/InJhZGlvIjp0aGlzLmVsZW1lbnQuaXMoImlucHV0Iik/ImlucHV0IjoiYnV0dG9uIiwiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlPyhlPXRoaXMuZWxlbWVudC5wYXJlbnRzKCkubGFzdCgpLHQ9ImxhYmVsW2Zvcj0nIit0aGlzLmVsZW1lbnQuYXR0cigiaWQiKSsiJ10iLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbmQodCksdGhpcy5idXR0b25FbGVtZW50Lmxlbmd0aHx8KGU9ZS5sZW5ndGg/ZS5zaWJsaW5ncygpOnRoaXMuZWxlbWVudC5zaWJsaW5ncygpLHRoaXMuYnV0dG9uRWxlbWVudD1lLmZpbHRlcih0KSx0aGlzLmJ1dHRvbkVsZW1lbnQubGVuZ3RofHwodGhpcy5idXR0b25FbGVtZW50PWUuZmluZCh0KSkpLHRoaXMuZWxlbWVudC5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIiksaT10aGlzLmVsZW1lbnQuaXMoIjpjaGVja2VkIiksaSYmdGhpcy5idXR0b25FbGVtZW50LmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSx0aGlzLmJ1dHRvbkVsZW1lbnQucHJvcCgiYXJpYS1wcmVzc2VkIixpKSk6dGhpcy5idXR0b25FbGVtZW50PXRoaXMuZWxlbWVudH0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnV0dG9uRWxlbWVudH0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLWhlbHBlci1oaWRkZW4tYWNjZXNzaWJsZSIpLHRoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcyhwKyIgdWktc3RhdGUtYWN0aXZlICIrZikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtcHJlc3NlZCIpLmh0bWwodGhpcy5idXR0b25FbGVtZW50LmZpbmQoIi51aS1idXR0b24tdGV4dCIpLmh0bWwoKSksdGhpcy5oYXNUaXRsZXx8dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUF0dHIoInRpdGxlIil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fc3VwZXIoZSx0KSwiZGlzYWJsZWQiPT09ZT8odGhpcy53aWRnZXQoKS50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLCEhdCksdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIiwhIXQpLHQmJigiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlP3RoaXMuYnV0dG9uRWxlbWVudC5yZW1vdmVDbGFzcygidWktc3RhdGUtZm9jdXMiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWZvY3VzIHVpLXN0YXRlLWFjdGl2ZSIpKSx2b2lkIDApOih0aGlzLl9yZXNldEJ1dHRvbigpLHZvaWQgMCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQuaXMoImlucHV0LCBidXR0b24iKT90aGlzLmVsZW1lbnQuaXMoIjpkaXNhYmxlZCIpOnRoaXMuZWxlbWVudC5oYXNDbGFzcygidWktYnV0dG9uLWRpc2FibGVkIik7dCE9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdCksInJhZGlvIj09PXRoaXMudHlwZT9nKHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe2UodGhpcykuaXMoIjpjaGVja2VkIik/ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJ0cnVlIik6ZSh0aGlzKS5idXR0b24oIndpZGdldCIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKCJhcmlhLXByZXNzZWQiLCJmYWxzZSIpfSk6ImNoZWNrYm94Ij09PXRoaXMudHlwZSYmKHRoaXMuZWxlbWVudC5pcygiOmNoZWNrZWQiKT90aGlzLmJ1dHRvbkVsZW1lbnQuYWRkQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsInRydWUiKTp0aGlzLmJ1dHRvbkVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWFjdGl2ZSIpLmF0dHIoImFyaWEtcHJlc3NlZCIsImZhbHNlIikpfSxfcmVzZXRCdXR0b246ZnVuY3Rpb24oKXtpZigiaW5wdXQiPT09dGhpcy50eXBlKXJldHVybiB0aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMuZWxlbWVudC52YWwodGhpcy5vcHRpb25zLmxhYmVsKSx2b2lkIDA7dmFyIHQ9dGhpcy5idXR0b25FbGVtZW50LnJlbW92ZUNsYXNzKGYpLGk9ZSgiPHNwYW4+PC9zcGFuPiIsdGhpcy5kb2N1bWVudFswXSkuYWRkQ2xhc3MoInVpLWJ1dHRvbi10ZXh0IikuaHRtbCh0aGlzLm9wdGlvbnMubGFiZWwpLmFwcGVuZFRvKHQuZW1wdHkoKSkudGV4dCgpLHM9dGhpcy5vcHRpb25zLmljb25zLG49cy5wcmltYXJ5JiZzLnNlY29uZGFyeSxhPVtdO3MucHJpbWFyeXx8cy5zZWNvbmRhcnk/KHRoaXMub3B0aW9ucy50ZXh0JiZhLnB1c2goInVpLWJ1dHRvbi10ZXh0LWljb24iKyhuPyJzIjpzLnByaW1hcnk/Ii1wcmltYXJ5IjoiLXNlY29uZGFyeSIpKSxzLnByaW1hcnkmJnQucHJlcGVuZCgiPHNwYW4gY2xhc3M9J3VpLWJ1dHRvbi1pY29uLXByaW1hcnkgdWktaWNvbiAiK3MucHJpbWFyeSsiJz48L3NwYW4+Iikscy5zZWNvbmRhcnkmJnQuYXBwZW5kKCI8c3BhbiBjbGFzcz0ndWktYnV0dG9uLWljb24tc2Vjb25kYXJ5IHVpLWljb24gIitzLnNlY29uZGFyeSsiJz48L3NwYW4+IiksdGhpcy5vcHRpb25zLnRleHR8fChhLnB1c2gobj8idWktYnV0dG9uLWljb25zLW9ubHkiOiJ1aS1idXR0b24taWNvbi1vbmx5IiksdGhpcy5oYXNUaXRsZXx8dC5hdHRyKCJ0aXRsZSIsZS50cmltKGkpKSkpOmEucHVzaCgidWktYnV0dG9uLXRleHQtb25seSIpLHQuYWRkQ2xhc3MoYS5qb2luKCIgIikpfX0pLGUud2lkZ2V0KCJ1aS5idXR0b25zZXQiLHt2ZXJzaW9uOiIxLjExLjQiLG9wdGlvbnM6e2l0ZW1zOiJidXR0b24sIGlucHV0W3R5cGU9YnV0dG9uXSwgaW5wdXRbdHlwZT1zdWJtaXRdLCBpbnB1dFt0eXBlPXJlc2V0XSwgaW5wdXRbdHlwZT1jaGVja2JveF0sIGlucHV0W3R5cGU9cmFkaW9dLCBhLCA6ZGF0YSh1aS1idXR0b24pIn0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktYnV0dG9uc2V0Iil9LF9pbml0OmZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoKCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXsiZGlzYWJsZWQiPT09ZSYmdGhpcy5idXR0b25zLmJ1dHRvbigib3B0aW9uIixlLHQpLHRoaXMuX3N1cGVyKGUsdCl9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD0icnRsIj09PXRoaXMuZWxlbWVudC5jc3MoImRpcmVjdGlvbiIpLGk9dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLml0ZW1zKSxzPWkuZmlsdGVyKCI6dWktYnV0dG9uIik7aS5ub3QoIjp1aS1idXR0b24iKS5idXR0b24oKSxzLmJ1dHRvbigicmVmcmVzaCIpLHRoaXMuYnV0dG9ucz1pLm1hcChmdW5jdGlvbigpe3JldHVybiBlKHRoaXMpLmJ1dHRvbigid2lkZ2V0IilbMF19KS5yZW1vdmVDbGFzcygidWktY29ybmVyLWFsbCB1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5maWx0ZXIoIjpmaXJzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1yaWdodCI6InVpLWNvcm5lci1sZWZ0IikuZW5kKCkuZmlsdGVyKCI6bGFzdCIpLmFkZENsYXNzKHQ/InVpLWNvcm5lci1sZWZ0IjoidWktY29ybmVyLXJpZ2h0IikuZW5kKCkuZW5kKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1idXR0b25zZXQiKSx0aGlzLmJ1dHRvbnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUodGhpcykuYnV0dG9uKCJ3aWRnZXQiKVswXX0pLnJlbW92ZUNsYXNzKCJ1aS1jb3JuZXItbGVmdCB1aS1jb3JuZXItcmlnaHQiKS5lbmQoKS5idXR0b24oImRlc3Ryb3kiKX19KSxlLnVpLmJ1dHRvbixlLmV4dGVuZChlLnVpLHtkYXRlcGlja2VyOnt2ZXJzaW9uOiIxLjExLjQifX0pO3ZhciB2O2UuZXh0ZW5kKG4ucHJvdG90eXBlLHttYXJrZXJDbGFzc05hbWU6Imhhc0RhdGVwaWNrZXIiLG1heFJvd3M6NCxfd2lkZ2V0RGF0ZXBpY2tlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRwRGl2fSxzZXREZWZhdWx0czpmdW5jdGlvbihlKXtyZXR1cm4gcih0aGlzLl9kZWZhdWx0cyxlfHx7fSksdGhpc30sX2F0dGFjaERhdGVwaWNrZXI6ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGE7cz10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj0iZGl2Ij09PXN8fCJzcGFuIj09PXMsdC5pZHx8KHRoaXMudXVpZCs9MSx0LmlkPSJkcCIrdGhpcy51dWlkKSxhPXRoaXMuX25ld0luc3QoZSh0KSxuKSxhLnNldHRpbmdzPWUuZXh0ZW5kKHt9LGl8fHt9KSwiaW5wdXQiPT09cz90aGlzLl9jb25uZWN0RGF0ZXBpY2tlcih0LGEpOm4mJnRoaXMuX2lubGluZURhdGVwaWNrZXIodCxhKX0sX25ld0luc3Q6ZnVuY3Rpb24odCxpKXt2YXIgcz10WzBdLmlkLnJlcGxhY2UoLyhbXkEtWmEtejAtOV9cLV0pL2csIlxcXFwkMSIpO3JldHVybntpZDpzLGlucHV0OnQsc2VsZWN0ZWREYXk6MCxzZWxlY3RlZE1vbnRoOjAsc2VsZWN0ZWRZZWFyOjAsZHJhd01vbnRoOjAsZHJhd1llYXI6MCxpbmxpbmU6aSxkcERpdjppP2EoZSgiPGRpdiBjbGFzcz0nIit0aGlzLl9pbmxpbmVDbGFzcysiIHVpLWRhdGVwaWNrZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWhlbHBlci1jbGVhcmZpeCB1aS1jb3JuZXItYWxsJz48L2Rpdj4iKSk6dGhpcy5kcERpdn19LF9jb25uZWN0RGF0ZXBpY2tlcjpmdW5jdGlvbih0LGkpe3ZhciBzPWUodCk7aS5hcHBlbmQ9ZShbXSksaS50cmlnZ2VyPWUoW10pLHMuaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpfHwodGhpcy5fYXR0YWNobWVudHMocyxpKSxzLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5rZXlkb3duKHRoaXMuX2RvS2V5RG93bikua2V5cHJlc3ModGhpcy5fZG9LZXlQcmVzcykua2V5dXAodGhpcy5fZG9LZXlVcCksdGhpcy5fYXV0b1NpemUoaSksZS5kYXRhKHQsImRhdGVwaWNrZXIiLGkpLGkuc2V0dGluZ3MuZGlzYWJsZWQmJnRoaXMuX2Rpc2FibGVEYXRlcGlja2VyKHQpKX0sX2F0dGFjaG1lbnRzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhLG89dGhpcy5fZ2V0KGksImFwcGVuZFRleHQiKSxyPXRoaXMuX2dldChpLCJpc1JUTCIpO2kuYXBwZW5kJiZpLmFwcGVuZC5yZW1vdmUoKSxvJiYoaS5hcHBlbmQ9ZSgiPHNwYW4gY2xhc3M9JyIrdGhpcy5fYXBwZW5kQ2xhc3MrIic+IitvKyI8L3NwYW4+IiksdFtyPyJiZWZvcmUiOiJhZnRlciJdKGkuYXBwZW5kKSksdC51bmJpbmQoImZvY3VzIix0aGlzLl9zaG93RGF0ZXBpY2tlciksaS50cmlnZ2VyJiZpLnRyaWdnZXIucmVtb3ZlKCkscz10aGlzLl9nZXQoaSwic2hvd09uIiksKCJmb2N1cyI9PT1zfHwiYm90aCI9PT1zKSYmdC5mb2N1cyh0aGlzLl9zaG93RGF0ZXBpY2tlciksKCJidXR0b24iPT09c3x8ImJvdGgiPT09cykmJihuPXRoaXMuX2dldChpLCJidXR0b25UZXh0IiksYT10aGlzLl9nZXQoaSwiYnV0dG9uSW1hZ2UiKSxpLnRyaWdnZXI9ZSh0aGlzLl9nZXQoaSwiYnV0dG9uSW1hZ2VPbmx5Iik/ZSgiPGltZy8+IikuYWRkQ2xhc3ModGhpcy5fdHJpZ2dlckNsYXNzKS5hdHRyKHtzcmM6YSxhbHQ6bix0aXRsZTpufSk6ZSgiPGJ1dHRvbiB0eXBlPSdidXR0b24nPjwvYnV0dG9uPiIpLmFkZENsYXNzKHRoaXMuX3RyaWdnZXJDbGFzcykuaHRtbChhP2UoIjxpbWcvPiIpLmF0dHIoe3NyYzphLGFsdDpuLHRpdGxlOm59KTpuKSksdFtyPyJiZWZvcmUiOiJhZnRlciJdKGkudHJpZ2dlciksaS50cmlnZ2VyLmNsaWNrKGZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmUuZGF0ZXBpY2tlci5fbGFzdElucHV0PT09dFswXT9lLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCk6ZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZyYmZS5kYXRlcGlja2VyLl9sYXN0SW5wdXQhPT10WzBdPyhlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCksZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0WzBdKSk6ZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0WzBdKSwhMX0pKX0sX2F1dG9TaXplOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldChlLCJhdXRvU2l6ZSIpJiYhZS5pbmxpbmUpe3ZhciB0LGkscyxuLGE9bmV3IERhdGUoMjAwOSwxMSwyMCksbz10aGlzLl9nZXQoZSwiZGF0ZUZvcm1hdCIpO28ubWF0Y2goL1tETV0vKSYmKHQ9ZnVuY3Rpb24oZSl7Zm9yKGk9MCxzPTAsbj0wO2UubGVuZ3RoPm47bisrKWVbbl0ubGVuZ3RoPmkmJihpPWVbbl0ubGVuZ3RoLHM9bik7cmV0dXJuIHN9LGEuc2V0TW9udGgodCh0aGlzLl9nZXQoZSxvLm1hdGNoKC9NTS8pPyJtb250aE5hbWVzIjoibW9udGhOYW1lc1Nob3J0IikpKSxhLnNldERhdGUodCh0aGlzLl9nZXQoZSxvLm1hdGNoKC9ERC8pPyJkYXlOYW1lcyI6ImRheU5hbWVzU2hvcnQiKSkrMjAtYS5nZXREYXkoKSkpLGUuaW5wdXQuYXR0cigic2l6ZSIsdGhpcy5fZm9ybWF0RGF0ZShlLGEpLmxlbmd0aCl9fSxfaW5saW5lRGF0ZXBpY2tlcjpmdW5jdGlvbih0LGkpe3ZhciBzPWUodCk7cy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSl8fChzLmFkZENsYXNzKHRoaXMubWFya2VyQ2xhc3NOYW1lKS5hcHBlbmQoaS5kcERpdiksZS5kYXRhKHQsImRhdGVwaWNrZXIiLGkpLHRoaXMuX3NldERhdGUoaSx0aGlzLl9nZXREZWZhdWx0RGF0ZShpKSwhMCksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihpKSx0aGlzLl91cGRhdGVBbHRlcm5hdGUoaSksaS5zZXR0aW5ncy5kaXNhYmxlZCYmdGhpcy5fZGlzYWJsZURhdGVwaWNrZXIodCksaS5kcERpdi5jc3MoImRpc3BsYXkiLCJibG9jayIpKX0sX2RpYWxvZ0RhdGVwaWNrZXI6ZnVuY3Rpb24odCxpLHMsbixhKXt2YXIgbyxoLGwsdSxkLGM9dGhpcy5fZGlhbG9nSW5zdDtyZXR1cm4gY3x8KHRoaXMudXVpZCs9MSxvPSJkcCIrdGhpcy51dWlkLHRoaXMuX2RpYWxvZ0lucHV0PWUoIjxpbnB1dCB0eXBlPSd0ZXh0JyBpZD0nIitvKyInIHN0eWxlPSdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLTEwMHB4OyB3aWR0aDogMHB4OycvPiIpLHRoaXMuX2RpYWxvZ0lucHV0LmtleWRvd24odGhpcy5fZG9LZXlEb3duKSxlKCJib2R5IikuYXBwZW5kKHRoaXMuX2RpYWxvZ0lucHV0KSxjPXRoaXMuX2RpYWxvZ0luc3Q9dGhpcy5fbmV3SW5zdCh0aGlzLl9kaWFsb2dJbnB1dCwhMSksYy5zZXR0aW5ncz17fSxlLmRhdGEodGhpcy5fZGlhbG9nSW5wdXRbMF0sImRhdGVwaWNrZXIiLGMpKSxyKGMuc2V0dGluZ3Msbnx8e30pLGk9aSYmaS5jb25zdHJ1Y3Rvcj09PURhdGU/dGhpcy5fZm9ybWF0RGF0ZShjLGkpOmksdGhpcy5fZGlhbG9nSW5wdXQudmFsKGkpLHRoaXMuX3Bvcz1hP2EubGVuZ3RoP2E6W2EucGFnZVgsYS5wYWdlWV06bnVsbCx0aGlzLl9wb3N8fChoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxsPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsdT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LGQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcHx8ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AsdGhpcy5fcG9zPVtoLzItMTAwK3UsbC8yLTE1MCtkXSksdGhpcy5fZGlhbG9nSW5wdXQuY3NzKCJsZWZ0Iix0aGlzLl9wb3NbMF0rMjArInB4IikuY3NzKCJ0b3AiLHRoaXMuX3Bvc1sxXSsicHgiKSxjLnNldHRpbmdzLm9uU2VsZWN0PXMsdGhpcy5faW5EaWFsb2c9ITAsdGhpcy5kcERpdi5hZGRDbGFzcyh0aGlzLl9kaWFsb2dDbGFzcyksdGhpcy5fc2hvd0RhdGVwaWNrZXIodGhpcy5fZGlhbG9nSW5wdXRbMF0pLGUuYmxvY2tVSSYmZS5ibG9ja1VJKHRoaXMuZHBEaXYpLGUuZGF0YSh0aGlzLl9kaWFsb2dJbnB1dFswXSwiZGF0ZXBpY2tlciIsYyksdGhpc30sX2Rlc3Ryb3lEYXRlcGlja2VyOmZ1bmN0aW9uKHQpe3ZhciBpLHM9ZSh0KSxuPWUuZGF0YSh0LCJkYXRlcGlja2VyIik7cy5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkmJihpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxlLnJlbW92ZURhdGEodCwiZGF0ZXBpY2tlciIpLCJpbnB1dCI9PT1pPyhuLmFwcGVuZC5yZW1vdmUoKSxuLnRyaWdnZXIucmVtb3ZlKCkscy5yZW1vdmVDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkudW5iaW5kKCJmb2N1cyIsdGhpcy5fc2hvd0RhdGVwaWNrZXIpLnVuYmluZCgia2V5ZG93biIsdGhpcy5fZG9LZXlEb3duKS51bmJpbmQoImtleXByZXNzIix0aGlzLl9kb0tleVByZXNzKS51bmJpbmQoImtleXVwIix0aGlzLl9kb0tleVVwKSk6KCJkaXYiPT09aXx8InNwYW4iPT09aSkmJnMucmVtb3ZlQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpLmVtcHR5KCksdj09PW4mJih2PW51bGwpKX0sX2VuYWJsZURhdGVwaWNrZXI6ZnVuY3Rpb24odCl7dmFyIGkscyxuPWUodCksYT1lLmRhdGEodCwiZGF0ZXBpY2tlciIpO24uaGFzQ2xhc3ModGhpcy5tYXJrZXJDbGFzc05hbWUpJiYoaT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksImlucHV0Ij09PWk/KHQuZGlzYWJsZWQ9ITEsYS50cmlnZ2VyLmZpbHRlcigiYnV0dG9uIikuZWFjaChmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWQ9ITF9KS5lbmQoKS5maWx0ZXIoImltZyIpLmNzcyh7b3BhY2l0eToiMS4wIixjdXJzb3I6IiJ9KSk6KCJkaXYiPT09aXx8InNwYW4iPT09aSkmJihzPW4uY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKSxzLmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikscy5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLnByb3AoImRpc2FibGVkIiwhMSkpLHRoaXMuX2Rpc2FibGVkSW5wdXRzPWUubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD9udWxsOmV9KSl9LF9kaXNhYmxlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt2YXIgaSxzLG49ZSh0KSxhPWUuZGF0YSh0LCJkYXRlcGlja2VyIik7bi5oYXNDbGFzcyh0aGlzLm1hcmtlckNsYXNzTmFtZSkmJihpPXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwiaW5wdXQiPT09aT8odC5kaXNhYmxlZD0hMCxhLnRyaWdnZXIuZmlsdGVyKCJidXR0b24iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD0hMH0pLmVuZCgpLmZpbHRlcigiaW1nIikuY3NzKHtvcGFjaXR5OiIwLjUiLGN1cnNvcjoiZGVmYXVsdCJ9KSk6KCJkaXYiPT09aXx8InNwYW4iPT09aSkmJihzPW4uY2hpbGRyZW4oIi4iK3RoaXMuX2lubGluZUNsYXNzKSxzLmNoaWxkcmVuKCkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikscy5maW5kKCJzZWxlY3QudWktZGF0ZXBpY2tlci1tb250aCwgc2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhciIpLnByb3AoImRpc2FibGVkIiwhMCkpLHRoaXMuX2Rpc2FibGVkSW5wdXRzPWUubWFwKHRoaXMuX2Rpc2FibGVkSW5wdXRzLGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dD9udWxsOmV9KSx0aGlzLl9kaXNhYmxlZElucHV0c1t0aGlzLl9kaXNhYmxlZElucHV0cy5sZW5ndGhdPXQpfSxfaXNEaXNhYmxlZERhdGVwaWNrZXI6ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuITE7Zm9yKHZhciB0PTA7dGhpcy5fZGlzYWJsZWRJbnB1dHMubGVuZ3RoPnQ7dCsrKWlmKHRoaXMuX2Rpc2FibGVkSW5wdXRzW3RdPT09ZSlyZXR1cm4hMDtyZXR1cm4hMX0sX2dldEluc3Q6ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBlLmRhdGEodCwiZGF0ZXBpY2tlciIpfWNhdGNoKGkpe3Rocm93Ik1pc3NpbmcgaW5zdGFuY2UgZGF0YSBmb3IgdGhpcyBkYXRlcGlja2VyIn19LF9vcHRpb25EYXRlcGlja2VyOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhLG8saCxsPXRoaXMuX2dldEluc3QodCk7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYic3RyaW5nIj09dHlwZW9mIGk/ImRlZmF1bHRzIj09PWk/ZS5leHRlbmQoe30sZS5kYXRlcGlja2VyLl9kZWZhdWx0cyk6bD8iYWxsIj09PWk/ZS5leHRlbmQoe30sbC5zZXR0aW5ncyk6dGhpcy5fZ2V0KGwsaSk6bnVsbDoobj1pfHx7fSwic3RyaW5nIj09dHlwZW9mIGkmJihuPXt9LG5baV09cyksbCYmKHRoaXMuX2N1ckluc3Q9PT1sJiZ0aGlzLl9oaWRlRGF0ZXBpY2tlcigpLGE9dGhpcy5fZ2V0RGF0ZURhdGVwaWNrZXIodCwhMCksbz10aGlzLl9nZXRNaW5NYXhEYXRlKGwsIm1pbiIpLGg9dGhpcy5fZ2V0TWluTWF4RGF0ZShsLCJtYXgiKSxyKGwuc2V0dGluZ3MsbiksbnVsbCE9PW8mJnZvaWQgMCE9PW4uZGF0ZUZvcm1hdCYmdm9pZCAwPT09bi5taW5EYXRlJiYobC5zZXR0aW5ncy5taW5EYXRlPXRoaXMuX2Zvcm1hdERhdGUobCxvKSksbnVsbCE9PWgmJnZvaWQgMCE9PW4uZGF0ZUZvcm1hdCYmdm9pZCAwPT09bi5tYXhEYXRlJiYobC5zZXR0aW5ncy5tYXhEYXRlPXRoaXMuX2Zvcm1hdERhdGUobCxoKSksImRpc2FibGVkImluIG4mJihuLmRpc2FibGVkP3RoaXMuX2Rpc2FibGVEYXRlcGlja2VyKHQpOnRoaXMuX2VuYWJsZURhdGVwaWNrZXIodCkpLHRoaXMuX2F0dGFjaG1lbnRzKGUodCksbCksdGhpcy5fYXV0b1NpemUobCksdGhpcy5fc2V0RGF0ZShsLGEpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShsKSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGwpKSx2b2lkIDApfSxfY2hhbmdlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQsaSl7dGhpcy5fb3B0aW9uRGF0ZXBpY2tlcihlLHQsaSl9LF9yZWZyZXNoRGF0ZXBpY2tlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRJbnN0KGUpO3QmJnRoaXMuX3VwZGF0ZURhdGVwaWNrZXIodCl9LF9zZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuX2dldEluc3QoZSk7aSYmKHRoaXMuX3NldERhdGUoaSx0KSx0aGlzLl91cGRhdGVEYXRlcGlja2VyKGkpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShpKSl9LF9nZXREYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuX2dldEluc3QoZSk7cmV0dXJuIGkmJiFpLmlubGluZSYmdGhpcy5fc2V0RGF0ZUZyb21GaWVsZChpLHQpLGk/dGhpcy5fZ2V0RGF0ZShpKTpudWxsfSxfZG9LZXlEb3duOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhPWUuZGF0ZXBpY2tlci5fZ2V0SW5zdCh0LnRhcmdldCksbz0hMCxyPWEuZHBEaXYuaXMoIi51aS1kYXRlcGlja2VyLXJ0bCIpO2lmKGEuX2tleUV2ZW50PSEwLGUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcpc3dpdGNoKHQua2V5Q29kZSl7Y2FzZSA5OmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoKSxvPSExO2JyZWFrO2Nhc2UgMTM6cmV0dXJuIG49ZSgidGQuIitlLmRhdGVwaWNrZXIuX2RheU92ZXJDbGFzcysiOm5vdCguIitlLmRhdGVwaWNrZXIuX2N1cnJlbnRDbGFzcysiKSIsYS5kcERpdiksblswXSYmZS5kYXRlcGlja2VyLl9zZWxlY3REYXkodC50YXJnZXQsYS5zZWxlY3RlZE1vbnRoLGEuc2VsZWN0ZWRZZWFyLG5bMF0pLGk9ZS5kYXRlcGlja2VyLl9nZXQoYSwib25TZWxlY3QiKSxpPyhzPWUuZGF0ZXBpY2tlci5fZm9ybWF0RGF0ZShhKSxpLmFwcGx5KGEuaW5wdXQ/YS5pbnB1dFswXTpudWxsLFtzLGFdKSk6ZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpLCExO2Nhc2UgMjc6ZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpO2JyZWFrO2Nhc2UgMzM6ZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHQuY3RybEtleT8tZS5kYXRlcGlja2VyLl9nZXQoYSwic3RlcEJpZ01vbnRocyIpOi1lLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM0OmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCx0LmN0cmxLZXk/K2UuZGF0ZXBpY2tlci5fZ2V0KGEsInN0ZXBCaWdNb250aHMiKTorZS5kYXRlcGlja2VyLl9nZXQoYSwic3RlcE1vbnRocyIpLCJNIik7YnJlYWs7Y2FzZSAzNToodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2NsZWFyRGF0ZSh0LnRhcmdldCksbz10LmN0cmxLZXl8fHQubWV0YUtleTticmVhaztjYXNlIDM2Oih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fZ290b1RvZGF5KHQudGFyZ2V0KSxvPXQuY3RybEtleXx8dC5tZXRhS2V5O2JyZWFrO2Nhc2UgMzc6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHI/MTotMSwiRCIpLG89dC5jdHJsS2V5fHx0Lm1ldGFLZXksdC5vcmlnaW5hbEV2ZW50LmFsdEtleSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LHQuY3RybEtleT8tZS5kYXRlcGlja2VyLl9nZXQoYSwic3RlcEJpZ01vbnRocyIpOi1lLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwTW9udGhzIiksIk0iKTticmVhaztjYXNlIDM4Oih0LmN0cmxLZXl8fHQubWV0YUtleSkmJmUuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZSh0LnRhcmdldCwtNywiRCIpLG89dC5jdHJsS2V5fHx0Lm1ldGFLZXk7YnJlYWs7Y2FzZSAzOToodC5jdHJsS2V5fHx0Lm1ldGFLZXkpJiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQscj8tMToxLCJEIiksbz10LmN0cmxLZXl8fHQubWV0YUtleSx0Lm9yaWdpbmFsRXZlbnQuYWx0S2V5JiZlLmRhdGVwaWNrZXIuX2FkanVzdERhdGUodC50YXJnZXQsdC5jdHJsS2V5PytlLmRhdGVwaWNrZXIuX2dldChhLCJzdGVwQmlnTW9udGhzIik6K2UuZGF0ZXBpY2tlci5fZ2V0KGEsInN0ZXBNb250aHMiKSwiTSIpO2JyZWFrO2Nhc2UgNDA6KHQuY3RybEtleXx8dC5tZXRhS2V5KSYmZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHQudGFyZ2V0LDcsIkQiKSxvPXQuY3RybEtleXx8dC5tZXRhS2V5O2JyZWFrO2RlZmF1bHQ6bz0hMX1lbHNlIDM2PT09dC5rZXlDb2RlJiZ0LmN0cmxLZXk/ZS5kYXRlcGlja2VyLl9zaG93RGF0ZXBpY2tlcih0aGlzKTpvPSExO28mJih0LnByZXZlbnREZWZhdWx0KCksdC5zdG9wUHJvcGFnYXRpb24oKSl9LF9kb0tleVByZXNzOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj1lLmRhdGVwaWNrZXIuX2dldEluc3QodC50YXJnZXQpOwpyZXR1cm4gZS5kYXRlcGlja2VyLl9nZXQobiwiY29uc3RyYWluSW5wdXQiKT8oaT1lLmRhdGVwaWNrZXIuX3Bvc3NpYmxlQ2hhcnMoZS5kYXRlcGlja2VyLl9nZXQobiwiZGF0ZUZvcm1hdCIpKSxzPVN0cmluZy5mcm9tQ2hhckNvZGUobnVsbD09dC5jaGFyQ29kZT90LmtleUNvZGU6dC5jaGFyQ29kZSksdC5jdHJsS2V5fHx0Lm1ldGFLZXl8fCIgIj5zfHwhaXx8aS5pbmRleE9mKHMpPi0xKTp2b2lkIDB9LF9kb0tleVVwOmZ1bmN0aW9uKHQpe3ZhciBpLHM9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KHQudGFyZ2V0KTtpZihzLmlucHV0LnZhbCgpIT09cy5sYXN0VmFsKXRyeXtpPWUuZGF0ZXBpY2tlci5wYXJzZURhdGUoZS5kYXRlcGlja2VyLl9nZXQocywiZGF0ZUZvcm1hdCIpLHMuaW5wdXQ/cy5pbnB1dC52YWwoKTpudWxsLGUuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKHMpKSxpJiYoZS5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKHMpLGUuZGF0ZXBpY2tlci5fdXBkYXRlQWx0ZXJuYXRlKHMpLGUuZGF0ZXBpY2tlci5fdXBkYXRlRGF0ZXBpY2tlcihzKSl9Y2F0Y2gobil7fXJldHVybiEwfSxfc2hvd0RhdGVwaWNrZXI6ZnVuY3Rpb24odCl7aWYodD10LnRhcmdldHx8dCwiaW5wdXQiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYodD1lKCJpbnB1dCIsdC5wYXJlbnROb2RlKVswXSksIWUuZGF0ZXBpY2tlci5faXNEaXNhYmxlZERhdGVwaWNrZXIodCkmJmUuZGF0ZXBpY2tlci5fbGFzdElucHV0IT09dCl7dmFyIGksbixhLG8saCxsLHU7aT1lLmRhdGVwaWNrZXIuX2dldEluc3QodCksZS5kYXRlcGlja2VyLl9jdXJJbnN0JiZlLmRhdGVwaWNrZXIuX2N1ckluc3QhPT1pJiYoZS5kYXRlcGlja2VyLl9jdXJJbnN0LmRwRGl2LnN0b3AoITAsITApLGkmJmUuZGF0ZXBpY2tlci5fZGF0ZXBpY2tlclNob3dpbmcmJmUuZGF0ZXBpY2tlci5faGlkZURhdGVwaWNrZXIoZS5kYXRlcGlja2VyLl9jdXJJbnN0LmlucHV0WzBdKSksbj1lLmRhdGVwaWNrZXIuX2dldChpLCJiZWZvcmVTaG93IiksYT1uP24uYXBwbHkodCxbdCxpXSk6e30sYSE9PSExJiYocihpLnNldHRpbmdzLGEpLGkubGFzdFZhbD1udWxsLGUuZGF0ZXBpY2tlci5fbGFzdElucHV0PXQsZS5kYXRlcGlja2VyLl9zZXREYXRlRnJvbUZpZWxkKGkpLGUuZGF0ZXBpY2tlci5faW5EaWFsb2cmJih0LnZhbHVlPSIiKSxlLmRhdGVwaWNrZXIuX3Bvc3x8KGUuZGF0ZXBpY2tlci5fcG9zPWUuZGF0ZXBpY2tlci5fZmluZFBvcyh0KSxlLmRhdGVwaWNrZXIuX3Bvc1sxXSs9dC5vZmZzZXRIZWlnaHQpLG89ITEsZSh0KS5wYXJlbnRzKCkuZWFjaChmdW5jdGlvbigpe3JldHVybiBvfD0iZml4ZWQiPT09ZSh0aGlzKS5jc3MoInBvc2l0aW9uIiksIW99KSxoPXtsZWZ0OmUuZGF0ZXBpY2tlci5fcG9zWzBdLHRvcDplLmRhdGVwaWNrZXIuX3Bvc1sxXX0sZS5kYXRlcGlja2VyLl9wb3M9bnVsbCxpLmRwRGl2LmVtcHR5KCksaS5kcERpdi5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsZGlzcGxheToiYmxvY2siLHRvcDoiLTEwMDBweCJ9KSxlLmRhdGVwaWNrZXIuX3VwZGF0ZURhdGVwaWNrZXIoaSksaD1lLmRhdGVwaWNrZXIuX2NoZWNrT2Zmc2V0KGksaCxvKSxpLmRwRGl2LmNzcyh7cG9zaXRpb246ZS5kYXRlcGlja2VyLl9pbkRpYWxvZyYmZS5ibG9ja1VJPyJzdGF0aWMiOm8/ImZpeGVkIjoiYWJzb2x1dGUiLGRpc3BsYXk6Im5vbmUiLGxlZnQ6aC5sZWZ0KyJweCIsdG9wOmgudG9wKyJweCJ9KSxpLmlubGluZXx8KGw9ZS5kYXRlcGlja2VyLl9nZXQoaSwic2hvd0FuaW0iKSx1PWUuZGF0ZXBpY2tlci5fZ2V0KGksImR1cmF0aW9uIiksaS5kcERpdi5jc3MoInotaW5kZXgiLHMoZSh0KSkrMSksZS5kYXRlcGlja2VyLl9kYXRlcGlja2VyU2hvd2luZz0hMCxlLmVmZmVjdHMmJmUuZWZmZWN0cy5lZmZlY3RbbF0/aS5kcERpdi5zaG93KGwsZS5kYXRlcGlja2VyLl9nZXQoaSwic2hvd09wdGlvbnMiKSx1KTppLmRwRGl2W2x8fCJzaG93Il0obD91Om51bGwpLGUuZGF0ZXBpY2tlci5fc2hvdWxkRm9jdXNJbnB1dChpKSYmaS5pbnB1dC5mb2N1cygpLGUuZGF0ZXBpY2tlci5fY3VySW5zdD1pKSl9fSxfdXBkYXRlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt0aGlzLm1heFJvd3M9NCx2PXQsdC5kcERpdi5lbXB0eSgpLmFwcGVuZCh0aGlzLl9nZW5lcmF0ZUhUTUwodCkpLHRoaXMuX2F0dGFjaEhhbmRsZXJzKHQpO3ZhciBpLHM9dGhpcy5fZ2V0TnVtYmVyT2ZNb250aHModCksbj1zWzFdLGE9MTcscj10LmRwRGl2LmZpbmQoIi4iK3RoaXMuX2RheU92ZXJDbGFzcysiIGEiKTtyLmxlbmd0aD4wJiZvLmFwcGx5KHIuZ2V0KDApKSx0LmRwRGl2LnJlbW92ZUNsYXNzKCJ1aS1kYXRlcGlja2VyLW11bHRpLTIgdWktZGF0ZXBpY2tlci1tdWx0aS0zIHVpLWRhdGVwaWNrZXItbXVsdGktNCIpLndpZHRoKCIiKSxuPjEmJnQuZHBEaXYuYWRkQ2xhc3MoInVpLWRhdGVwaWNrZXItbXVsdGktIituKS5jc3MoIndpZHRoIixhKm4rImVtIiksdC5kcERpdlsoMSE9PXNbMF18fDEhPT1zWzFdPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1tdWx0aSIpLHQuZHBEaXZbKHRoaXMuX2dldCh0LCJpc1JUTCIpPyJhZGQiOiJyZW1vdmUiKSsiQ2xhc3MiXSgidWktZGF0ZXBpY2tlci1ydGwiKSx0PT09ZS5kYXRlcGlja2VyLl9jdXJJbnN0JiZlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiZlLmRhdGVwaWNrZXIuX3Nob3VsZEZvY3VzSW5wdXQodCkmJnQuaW5wdXQuZm9jdXMoKSx0LnllYXJzaHRtbCYmKGk9dC55ZWFyc2h0bWwsc2V0VGltZW91dChmdW5jdGlvbigpe2k9PT10LnllYXJzaHRtbCYmdC55ZWFyc2h0bWwmJnQuZHBEaXYuZmluZCgic2VsZWN0LnVpLWRhdGVwaWNrZXIteWVhcjpmaXJzdCIpLnJlcGxhY2VXaXRoKHQueWVhcnNodG1sKSxpPXQueWVhcnNodG1sPW51bGx9LDApKX0sX3Nob3VsZEZvY3VzSW5wdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaW5wdXQmJmUuaW5wdXQuaXMoIjp2aXNpYmxlIikmJiFlLmlucHV0LmlzKCI6ZGlzYWJsZWQiKSYmIWUuaW5wdXQuaXMoIjpmb2N1cyIpfSxfY2hlY2tPZmZzZXQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXQuZHBEaXYub3V0ZXJXaWR0aCgpLGE9dC5kcERpdi5vdXRlckhlaWdodCgpLG89dC5pbnB1dD90LmlucHV0Lm91dGVyV2lkdGgoKTowLHI9dC5pbnB1dD90LmlucHV0Lm91dGVySGVpZ2h0KCk6MCxoPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCsocz8wOmUoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSksbD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KyhzPzA6ZShkb2N1bWVudCkuc2Nyb2xsVG9wKCkpO3JldHVybiBpLmxlZnQtPXRoaXMuX2dldCh0LCJpc1JUTCIpP24tbzowLGkubGVmdC09cyYmaS5sZWZ0PT09dC5pbnB1dC5vZmZzZXQoKS5sZWZ0P2UoZG9jdW1lbnQpLnNjcm9sbExlZnQoKTowLGkudG9wLT1zJiZpLnRvcD09PXQuaW5wdXQub2Zmc2V0KCkudG9wK3I/ZShkb2N1bWVudCkuc2Nyb2xsVG9wKCk6MCxpLmxlZnQtPU1hdGgubWluKGkubGVmdCxpLmxlZnQrbj5oJiZoPm4/TWF0aC5hYnMoaS5sZWZ0K24taCk6MCksaS50b3AtPU1hdGgubWluKGkudG9wLGkudG9wK2E+bCYmbD5hP01hdGguYWJzKGErcik6MCksaX0sX2ZpbmRQb3M6ZnVuY3Rpb24odCl7Zm9yKHZhciBpLHM9dGhpcy5fZ2V0SW5zdCh0KSxuPXRoaXMuX2dldChzLCJpc1JUTCIpO3QmJigiaGlkZGVuIj09PXQudHlwZXx8MSE9PXQubm9kZVR5cGV8fGUuZXhwci5maWx0ZXJzLmhpZGRlbih0KSk7KXQ9dFtuPyJwcmV2aW91c1NpYmxpbmciOiJuZXh0U2libGluZyJdO3JldHVybiBpPWUodCkub2Zmc2V0KCksW2kubGVmdCxpLnRvcF19LF9oaWRlRGF0ZXBpY2tlcjpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvPXRoaXMuX2N1ckluc3Q7IW98fHQmJm8hPT1lLmRhdGEodCwiZGF0ZXBpY2tlciIpfHx0aGlzLl9kYXRlcGlja2VyU2hvd2luZyYmKGk9dGhpcy5fZ2V0KG8sInNob3dBbmltIikscz10aGlzLl9nZXQobywiZHVyYXRpb24iKSxuPWZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl90aWR5RGlhbG9nKG8pfSxlLmVmZmVjdHMmJihlLmVmZmVjdHMuZWZmZWN0W2ldfHxlLmVmZmVjdHNbaV0pP28uZHBEaXYuaGlkZShpLGUuZGF0ZXBpY2tlci5fZ2V0KG8sInNob3dPcHRpb25zIikscyxuKTpvLmRwRGl2WyJzbGlkZURvd24iPT09aT8ic2xpZGVVcCI6ImZhZGVJbiI9PT1pPyJmYWRlT3V0IjoiaGlkZSJdKGk/czpudWxsLG4pLGl8fG4oKSx0aGlzLl9kYXRlcGlja2VyU2hvd2luZz0hMSxhPXRoaXMuX2dldChvLCJvbkNsb3NlIiksYSYmYS5hcHBseShvLmlucHV0P28uaW5wdXRbMF06bnVsbCxbby5pbnB1dD9vLmlucHV0LnZhbCgpOiIiLG9dKSx0aGlzLl9sYXN0SW5wdXQ9bnVsbCx0aGlzLl9pbkRpYWxvZyYmKHRoaXMuX2RpYWxvZ0lucHV0LmNzcyh7cG9zaXRpb246ImFic29sdXRlIixsZWZ0OiIwIix0b3A6Ii0xMDBweCJ9KSxlLmJsb2NrVUkmJihlLnVuYmxvY2tVSSgpLGUoImJvZHkiKS5hcHBlbmQodGhpcy5kcERpdikpKSx0aGlzLl9pbkRpYWxvZz0hMSl9LF90aWR5RGlhbG9nOmZ1bmN0aW9uKGUpe2UuZHBEaXYucmVtb3ZlQ2xhc3ModGhpcy5fZGlhbG9nQ2xhc3MpLnVuYmluZCgiLnVpLWRhdGVwaWNrZXItY2FsZW5kYXIiKX0sX2NoZWNrRXh0ZXJuYWxDbGljazpmdW5jdGlvbih0KXtpZihlLmRhdGVwaWNrZXIuX2N1ckluc3Qpe3ZhciBpPWUodC50YXJnZXQpLHM9ZS5kYXRlcGlja2VyLl9nZXRJbnN0KGlbMF0pOyhpWzBdLmlkIT09ZS5kYXRlcGlja2VyLl9tYWluRGl2SWQmJjA9PT1pLnBhcmVudHMoIiMiK2UuZGF0ZXBpY2tlci5fbWFpbkRpdklkKS5sZW5ndGgmJiFpLmhhc0NsYXNzKGUuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiYhaS5jbG9zZXN0KCIuIitlLmRhdGVwaWNrZXIuX3RyaWdnZXJDbGFzcykubGVuZ3RoJiZlLmRhdGVwaWNrZXIuX2RhdGVwaWNrZXJTaG93aW5nJiYoIWUuZGF0ZXBpY2tlci5faW5EaWFsb2d8fCFlLmJsb2NrVUkpfHxpLmhhc0NsYXNzKGUuZGF0ZXBpY2tlci5tYXJrZXJDbGFzc05hbWUpJiZlLmRhdGVwaWNrZXIuX2N1ckluc3QhPT1zKSYmZS5kYXRlcGlja2VyLl9oaWRlRGF0ZXBpY2tlcigpfX0sX2FkanVzdERhdGU6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUodCksYT10aGlzLl9nZXRJbnN0KG5bMF0pO3RoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKG5bMF0pfHwodGhpcy5fYWRqdXN0SW5zdERhdGUoYSxpKygiTSI9PT1zP3RoaXMuX2dldChhLCJzaG93Q3VycmVudEF0UG9zIik6MCkscyksdGhpcy5fdXBkYXRlRGF0ZXBpY2tlcihhKSl9LF9nb3RvVG9kYXk6ZnVuY3Rpb24odCl7dmFyIGkscz1lKHQpLG49dGhpcy5fZ2V0SW5zdChzWzBdKTt0aGlzLl9nZXQobiwiZ290b0N1cnJlbnQiKSYmbi5jdXJyZW50RGF5PyhuLnNlbGVjdGVkRGF5PW4uY3VycmVudERheSxuLmRyYXdNb250aD1uLnNlbGVjdGVkTW9udGg9bi5jdXJyZW50TW9udGgsbi5kcmF3WWVhcj1uLnNlbGVjdGVkWWVhcj1uLmN1cnJlbnRZZWFyKTooaT1uZXcgRGF0ZSxuLnNlbGVjdGVkRGF5PWkuZ2V0RGF0ZSgpLG4uZHJhd01vbnRoPW4uc2VsZWN0ZWRNb250aD1pLmdldE1vbnRoKCksbi5kcmF3WWVhcj1uLnNlbGVjdGVkWWVhcj1pLmdldEZ1bGxZZWFyKCkpLHRoaXMuX25vdGlmeUNoYW5nZShuKSx0aGlzLl9hZGp1c3REYXRlKHMpfSxfc2VsZWN0TW9udGhZZWFyOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKHQpLGE9dGhpcy5fZ2V0SW5zdChuWzBdKTthWyJzZWxlY3RlZCIrKCJNIj09PXM/Ik1vbnRoIjoiWWVhciIpXT1hWyJkcmF3IisoIk0iPT09cz8iTW9udGgiOiJZZWFyIildPXBhcnNlSW50KGkub3B0aW9uc1tpLnNlbGVjdGVkSW5kZXhdLnZhbHVlLDEwKSx0aGlzLl9ub3RpZnlDaGFuZ2UoYSksdGhpcy5fYWRqdXN0RGF0ZShuKX0sX3NlbGVjdERheTpmdW5jdGlvbih0LGkscyxuKXt2YXIgYSxvPWUodCk7ZShuKS5oYXNDbGFzcyh0aGlzLl91bnNlbGVjdGFibGVDbGFzcyl8fHRoaXMuX2lzRGlzYWJsZWREYXRlcGlja2VyKG9bMF0pfHwoYT10aGlzLl9nZXRJbnN0KG9bMF0pLGEuc2VsZWN0ZWREYXk9YS5jdXJyZW50RGF5PWUoImEiLG4pLmh0bWwoKSxhLnNlbGVjdGVkTW9udGg9YS5jdXJyZW50TW9udGg9aSxhLnNlbGVjdGVkWWVhcj1hLmN1cnJlbnRZZWFyPXMsdGhpcy5fc2VsZWN0RGF0ZSh0LHRoaXMuX2Zvcm1hdERhdGUoYSxhLmN1cnJlbnREYXksYS5jdXJyZW50TW9udGgsYS5jdXJyZW50WWVhcikpKX0sX2NsZWFyRGF0ZTpmdW5jdGlvbih0KXt2YXIgaT1lKHQpO3RoaXMuX3NlbGVjdERhdGUoaSwiIil9LF9zZWxlY3REYXRlOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHQpLGE9dGhpcy5fZ2V0SW5zdChuWzBdKTtpPW51bGwhPWk/aTp0aGlzLl9mb3JtYXREYXRlKGEpLGEuaW5wdXQmJmEuaW5wdXQudmFsKGkpLHRoaXMuX3VwZGF0ZUFsdGVybmF0ZShhKSxzPXRoaXMuX2dldChhLCJvblNlbGVjdCIpLHM/cy5hcHBseShhLmlucHV0P2EuaW5wdXRbMF06bnVsbCxbaSxhXSk6YS5pbnB1dCYmYS5pbnB1dC50cmlnZ2VyKCJjaGFuZ2UiKSxhLmlubGluZT90aGlzLl91cGRhdGVEYXRlcGlja2VyKGEpOih0aGlzLl9oaWRlRGF0ZXBpY2tlcigpLHRoaXMuX2xhc3RJbnB1dD1hLmlucHV0WzBdLCJvYmplY3QiIT10eXBlb2YgYS5pbnB1dFswXSYmYS5pbnB1dC5mb2N1cygpLHRoaXMuX2xhc3RJbnB1dD1udWxsKX0sX3VwZGF0ZUFsdGVybmF0ZTpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYT10aGlzLl9nZXQodCwiYWx0RmllbGQiKTthJiYoaT10aGlzLl9nZXQodCwiYWx0Rm9ybWF0Iil8fHRoaXMuX2dldCh0LCJkYXRlRm9ybWF0Iikscz10aGlzLl9nZXREYXRlKHQpLG49dGhpcy5mb3JtYXREYXRlKGkscyx0aGlzLl9nZXRGb3JtYXRDb25maWcodCkpLGUoYSkuZWFjaChmdW5jdGlvbigpe2UodGhpcykudmFsKG4pfSkpfSxub1dlZWtlbmRzOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RGF5KCk7cmV0dXJuW3Q+MCYmNj50LCIiXX0saXNvODYwMVdlZWs6ZnVuY3Rpb24oZSl7dmFyIHQsaT1uZXcgRGF0ZShlLmdldFRpbWUoKSk7cmV0dXJuIGkuc2V0RGF0ZShpLmdldERhdGUoKSs0LShpLmdldERheSgpfHw3KSksdD1pLmdldFRpbWUoKSxpLnNldE1vbnRoKDApLGkuc2V0RGF0ZSgxKSxNYXRoLmZsb29yKE1hdGgucm91bmQoKHQtaSkvODY0ZTUpLzcpKzF9LHBhcnNlRGF0ZTpmdW5jdGlvbih0LGkscyl7aWYobnVsbD09dHx8bnVsbD09aSl0aHJvdyJJbnZhbGlkIGFyZ3VtZW50cyI7aWYoaT0ib2JqZWN0Ij09dHlwZW9mIGk/IiIraTppKyIiLCIiPT09aSlyZXR1cm4gbnVsbDt2YXIgbixhLG8scixoPTAsbD0ocz9zLnNob3J0WWVhckN1dG9mZjpudWxsKXx8dGhpcy5fZGVmYXVsdHMuc2hvcnRZZWFyQ3V0b2ZmLHU9InN0cmluZyIhPXR5cGVvZiBsP2w6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCtwYXJzZUludChsLDEwKSxkPShzP3MuZGF5TmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXNTaG9ydCxjPShzP3MuZGF5TmFtZXM6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLmRheU5hbWVzLHA9KHM/cy5tb250aE5hbWVzU2hvcnQ6bnVsbCl8fHRoaXMuX2RlZmF1bHRzLm1vbnRoTmFtZXNTaG9ydCxmPShzP3MubW9udGhOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lcyxtPS0xLGc9LTEsdj0tMSx5PS0xLGI9ITEsXz1mdW5jdGlvbihlKXt2YXIgaT10Lmxlbmd0aD5uKzEmJnQuY2hhckF0KG4rMSk9PT1lO3JldHVybiBpJiZuKyssaX0seD1mdW5jdGlvbihlKXt2YXIgdD1fKGUpLHM9IkAiPT09ZT8xNDoiISI9PT1lPzIwOiJ5Ij09PWUmJnQ/NDoibyI9PT1lPzM6MixuPSJ5Ij09PWU/czoxLGE9UmVnRXhwKCJeXFxkeyIrbisiLCIrcysifSIpLG89aS5zdWJzdHJpbmcoaCkubWF0Y2goYSk7aWYoIW8pdGhyb3ciTWlzc2luZyBudW1iZXIgYXQgcG9zaXRpb24gIitoO3JldHVybiBoKz1vWzBdLmxlbmd0aCxwYXJzZUludChvWzBdLDEwKX0sdz1mdW5jdGlvbih0LHMsbil7dmFyIGE9LTEsbz1lLm1hcChfKHQpP246cyxmdW5jdGlvbihlLHQpe3JldHVybltbdCxlXV19KS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuLShlWzFdLmxlbmd0aC10WzFdLmxlbmd0aCl9KTtpZihlLmVhY2gobyxmdW5jdGlvbihlLHQpe3ZhciBzPXRbMV07cmV0dXJuIGkuc3Vic3RyKGgscy5sZW5ndGgpLnRvTG93ZXJDYXNlKCk9PT1zLnRvTG93ZXJDYXNlKCk/KGE9dFswXSxoKz1zLmxlbmd0aCwhMSk6dm9pZCAwfSksLTEhPT1hKXJldHVybiBhKzE7dGhyb3ciVW5rbm93biBuYW1lIGF0IHBvc2l0aW9uICIraH0saz1mdW5jdGlvbigpe2lmKGkuY2hhckF0KGgpIT09dC5jaGFyQXQobikpdGhyb3ciVW5leHBlY3RlZCBsaXRlcmFsIGF0IHBvc2l0aW9uICIraDtoKyt9O2ZvcihuPTA7dC5sZW5ndGg+bjtuKyspaWYoYikiJyIhPT10LmNoYXJBdChuKXx8XygiJyIpP2soKTpiPSExO2Vsc2Ugc3dpdGNoKHQuY2hhckF0KG4pKXtjYXNlImQiOnY9eCgiZCIpO2JyZWFrO2Nhc2UiRCI6dygiRCIsZCxjKTticmVhaztjYXNlIm8iOnk9eCgibyIpO2JyZWFrO2Nhc2UibSI6Zz14KCJtIik7YnJlYWs7Y2FzZSJNIjpnPXcoIk0iLHAsZik7YnJlYWs7Y2FzZSJ5IjptPXgoInkiKTticmVhaztjYXNlIkAiOnI9bmV3IERhdGUoeCgiQCIpKSxtPXIuZ2V0RnVsbFllYXIoKSxnPXIuZ2V0TW9udGgoKSsxLHY9ci5nZXREYXRlKCk7YnJlYWs7Y2FzZSIhIjpyPW5ldyBEYXRlKCh4KCIhIiktdGhpcy5fdGlja3NUbzE5NzApLzFlNCksbT1yLmdldEZ1bGxZZWFyKCksZz1yLmdldE1vbnRoKCkrMSx2PXIuZ2V0RGF0ZSgpO2JyZWFrO2Nhc2UiJyI6XygiJyIpP2soKTpiPSEwO2JyZWFrO2RlZmF1bHQ6aygpfWlmKGkubGVuZ3RoPmgmJihvPWkuc3Vic3RyKGgpLCEvXlxzKy8udGVzdChvKSkpdGhyb3ciRXh0cmEvdW5wYXJzZWQgY2hhcmFjdGVycyBmb3VuZCBpbiBkYXRlOiAiK287aWYoLTE9PT1tP209KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpOjEwMD5tJiYobSs9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSUxMDArKHU+PW0/MDotMTAwKSkseT4tMSlmb3IoZz0xLHY9eTs7KXtpZihhPXRoaXMuX2dldERheXNJbk1vbnRoKG0sZy0xKSxhPj12KWJyZWFrO2crKyx2LT1hfWlmKHI9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUobSxnLTEsdikpLHIuZ2V0RnVsbFllYXIoKSE9PW18fHIuZ2V0TW9udGgoKSsxIT09Z3x8ci5nZXREYXRlKCkhPT12KXRocm93IkludmFsaWQgZGF0ZSI7cmV0dXJuIHJ9LEFUT006Inl5LW1tLWRkIixDT09LSUU6IkQsIGRkIE0geXkiLElTT184NjAxOiJ5eS1tbS1kZCIsUkZDXzgyMjoiRCwgZCBNIHkiLFJGQ184NTA6IkRELCBkZC1NLXkiLFJGQ18xMDM2OiJELCBkIE0geSIsUkZDXzExMjM6IkQsIGQgTSB5eSIsUkZDXzI4MjI6IkQsIGQgTSB5eSIsUlNTOiJELCBkIE0geSIsVElDS1M6IiEiLFRJTUVTVEFNUDoiQCIsVzNDOiJ5eS1tbS1kZCIsX3RpY2tzVG8xOTcwOjFlNyo2MCo2MCoyNCooNzE4Njg1K01hdGguZmxvb3IoNDkyLjUpLU1hdGguZmxvb3IoMTkuNykrTWF0aC5mbG9vcig0LjkyNSkpLGZvcm1hdERhdGU6ZnVuY3Rpb24oZSx0LGkpe2lmKCF0KXJldHVybiIiO3ZhciBzLG49KGk/aS5kYXlOYW1lc1Nob3J0Om51bGwpfHx0aGlzLl9kZWZhdWx0cy5kYXlOYW1lc1Nob3J0LGE9KGk/aS5kYXlOYW1lczpudWxsKXx8dGhpcy5fZGVmYXVsdHMuZGF5TmFtZXMsbz0oaT9pLm1vbnRoTmFtZXNTaG9ydDpudWxsKXx8dGhpcy5fZGVmYXVsdHMubW9udGhOYW1lc1Nob3J0LHI9KGk/aS5tb250aE5hbWVzOm51bGwpfHx0aGlzLl9kZWZhdWx0cy5tb250aE5hbWVzLGg9ZnVuY3Rpb24odCl7dmFyIGk9ZS5sZW5ndGg+cysxJiZlLmNoYXJBdChzKzEpPT09dDtyZXR1cm4gaSYmcysrLGl9LGw9ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPSIiK3Q7aWYoaChlKSlmb3IoO2k+cy5sZW5ndGg7KXM9IjAiK3M7cmV0dXJuIHN9LHU9ZnVuY3Rpb24oZSx0LGkscyl7cmV0dXJuIGgoZSk/c1t0XTppW3RdfSxkPSIiLGM9ITE7aWYodClmb3Iocz0wO2UubGVuZ3RoPnM7cysrKWlmKGMpIiciIT09ZS5jaGFyQXQocyl8fGgoIiciKT9kKz1lLmNoYXJBdChzKTpjPSExO2Vsc2Ugc3dpdGNoKGUuY2hhckF0KHMpKXtjYXNlImQiOmQrPWwoImQiLHQuZ2V0RGF0ZSgpLDIpO2JyZWFrO2Nhc2UiRCI6ZCs9dSgiRCIsdC5nZXREYXkoKSxuLGEpO2JyZWFrO2Nhc2UibyI6ZCs9bCgibyIsTWF0aC5yb3VuZCgobmV3IERhdGUodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSkuZ2V0VGltZSgpLW5ldyBEYXRlKHQuZ2V0RnVsbFllYXIoKSwwLDApLmdldFRpbWUoKSkvODY0ZTUpLDMpO2JyZWFrO2Nhc2UibSI6ZCs9bCgibSIsdC5nZXRNb250aCgpKzEsMik7YnJlYWs7Y2FzZSJNIjpkKz11KCJNIix0LmdldE1vbnRoKCksbyxyKTticmVhaztjYXNlInkiOmQrPWgoInkiKT90LmdldEZ1bGxZZWFyKCk6KDEwPnQuZ2V0WWVhcigpJTEwMD8iMCI6IiIpK3QuZ2V0WWVhcigpJTEwMDticmVhaztjYXNlIkAiOmQrPXQuZ2V0VGltZSgpO2JyZWFrO2Nhc2UiISI6ZCs9MWU0KnQuZ2V0VGltZSgpK3RoaXMuX3RpY2tzVG8xOTcwO2JyZWFrO2Nhc2UiJyI6aCgiJyIpP2QrPSInIjpjPSEwO2JyZWFrO2RlZmF1bHQ6ZCs9ZS5jaGFyQXQocyl9cmV0dXJuIGR9LF9wb3NzaWJsZUNoYXJzOmZ1bmN0aW9uKGUpe3ZhciB0LGk9IiIscz0hMSxuPWZ1bmN0aW9uKGkpe3ZhciBzPWUubGVuZ3RoPnQrMSYmZS5jaGFyQXQodCsxKT09PWk7cmV0dXJuIHMmJnQrKyxzfTtmb3IodD0wO2UubGVuZ3RoPnQ7dCsrKWlmKHMpIiciIT09ZS5jaGFyQXQodCl8fG4oIiciKT9pKz1lLmNoYXJBdCh0KTpzPSExO2Vsc2Ugc3dpdGNoKGUuY2hhckF0KHQpKXtjYXNlImQiOmNhc2UibSI6Y2FzZSJ5IjpjYXNlIkAiOmkrPSIwMTIzNDU2Nzg5IjticmVhaztjYXNlIkQiOmNhc2UiTSI6cmV0dXJuIG51bGw7Y2FzZSInIjpuKCInIik/aSs9IiciOnM9ITA7YnJlYWs7ZGVmYXVsdDppKz1lLmNoYXJBdCh0KX1yZXR1cm4gaX0sX2dldDpmdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT1lLnNldHRpbmdzW3RdP2Uuc2V0dGluZ3NbdF06dGhpcy5fZGVmYXVsdHNbdF19LF9zZXREYXRlRnJvbUZpZWxkOmZ1bmN0aW9uKGUsdCl7aWYoZS5pbnB1dC52YWwoKSE9PWUubGFzdFZhbCl7dmFyIGk9dGhpcy5fZ2V0KGUsImRhdGVGb3JtYXQiKSxzPWUubGFzdFZhbD1lLmlucHV0P2UuaW5wdXQudmFsKCk6bnVsbCxuPXRoaXMuX2dldERlZmF1bHREYXRlKGUpLGE9bixvPXRoaXMuX2dldEZvcm1hdENvbmZpZyhlKTt0cnl7YT10aGlzLnBhcnNlRGF0ZShpLHMsbyl8fG59Y2F0Y2gocil7cz10PyIiOnN9ZS5zZWxlY3RlZERheT1hLmdldERhdGUoKSxlLmRyYXdNb250aD1lLnNlbGVjdGVkTW9udGg9YS5nZXRNb250aCgpLGUuZHJhd1llYXI9ZS5zZWxlY3RlZFllYXI9YS5nZXRGdWxsWWVhcigpLGUuY3VycmVudERheT1zP2EuZ2V0RGF0ZSgpOjAsZS5jdXJyZW50TW9udGg9cz9hLmdldE1vbnRoKCk6MCxlLmN1cnJlbnRZZWFyPXM/YS5nZXRGdWxsWWVhcigpOjAsdGhpcy5fYWRqdXN0SW5zdERhdGUoZSl9fSxfZ2V0RGVmYXVsdERhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3Jlc3RyaWN0TWluTWF4KGUsdGhpcy5fZGV0ZXJtaW5lRGF0ZShlLHRoaXMuX2dldChlLCJkZWZhdWx0RGF0ZSIpLG5ldyBEYXRlKSl9LF9kZXRlcm1pbmVEYXRlOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgRGF0ZTtyZXR1cm4gdC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpLHR9LGE9ZnVuY3Rpb24oaSl7dHJ5e3JldHVybiBlLmRhdGVwaWNrZXIucGFyc2VEYXRlKGUuZGF0ZXBpY2tlci5fZ2V0KHQsImRhdGVGb3JtYXQiKSxpLGUuZGF0ZXBpY2tlci5fZ2V0Rm9ybWF0Q29uZmlnKHQpKX1jYXRjaChzKXt9Zm9yKHZhciBuPShpLnRvTG93ZXJDYXNlKCkubWF0Y2goL15jLyk/ZS5kYXRlcGlja2VyLl9nZXREYXRlKHQpOm51bGwpfHxuZXcgRGF0ZSxhPW4uZ2V0RnVsbFllYXIoKSxvPW4uZ2V0TW9udGgoKSxyPW4uZ2V0RGF0ZSgpLGg9LyhbK1wtXT9bMC05XSspXHMqKGR8RHx3fFd8bXxNfHl8WSk/L2csbD1oLmV4ZWMoaSk7bDspe3N3aXRjaChsWzJdfHwiZCIpe2Nhc2UiZCI6Y2FzZSJEIjpyKz1wYXJzZUludChsWzFdLDEwKTticmVhaztjYXNlInciOmNhc2UiVyI6cis9NypwYXJzZUludChsWzFdLDEwKTticmVhaztjYXNlIm0iOmNhc2UiTSI6bys9cGFyc2VJbnQobFsxXSwxMCkscj1NYXRoLm1pbihyLGUuZGF0ZXBpY2tlci5fZ2V0RGF5c0luTW9udGgoYSxvKSk7YnJlYWs7Y2FzZSJ5IjpjYXNlIlkiOmErPXBhcnNlSW50KGxbMV0sMTApLHI9TWF0aC5taW4ocixlLmRhdGVwaWNrZXIuX2dldERheXNJbk1vbnRoKGEsbykpfWw9aC5leGVjKGkpfXJldHVybiBuZXcgRGF0ZShhLG8scil9LG89bnVsbD09aXx8IiI9PT1pP3M6InN0cmluZyI9PXR5cGVvZiBpP2EoaSk6Im51bWJlciI9PXR5cGVvZiBpP2lzTmFOKGkpP3M6bihpKTpuZXcgRGF0ZShpLmdldFRpbWUoKSk7cmV0dXJuIG89byYmIkludmFsaWQgRGF0ZSI9PSIiK28/czpvLG8mJihvLnNldEhvdXJzKDApLG8uc2V0TWludXRlcygwKSxvLnNldFNlY29uZHMoMCksby5zZXRNaWxsaXNlY29uZHMoMCkpLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG8pfSxfZGF5bGlnaHRTYXZpbmdBZGp1c3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/KGUuc2V0SG91cnMoZS5nZXRIb3VycygpPjEyP2UuZ2V0SG91cnMoKSsyOjApLGUpOm51bGx9LF9zZXREYXRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz0hdCxuPWUuc2VsZWN0ZWRNb250aCxhPWUuc2VsZWN0ZWRZZWFyLG89dGhpcy5fcmVzdHJpY3RNaW5NYXgoZSx0aGlzLl9kZXRlcm1pbmVEYXRlKGUsdCxuZXcgRGF0ZSkpO2Uuc2VsZWN0ZWREYXk9ZS5jdXJyZW50RGF5PW8uZ2V0RGF0ZSgpLGUuZHJhd01vbnRoPWUuc2VsZWN0ZWRNb250aD1lLmN1cnJlbnRNb250aD1vLmdldE1vbnRoKCksZS5kcmF3WWVhcj1lLnNlbGVjdGVkWWVhcj1lLmN1cnJlbnRZZWFyPW8uZ2V0RnVsbFllYXIoKSxuPT09ZS5zZWxlY3RlZE1vbnRoJiZhPT09ZS5zZWxlY3RlZFllYXJ8fGl8fHRoaXMuX25vdGlmeUNoYW5nZShlKSx0aGlzLl9hZGp1c3RJbnN0RGF0ZShlKSxlLmlucHV0JiZlLmlucHV0LnZhbChzPyIiOnRoaXMuX2Zvcm1hdERhdGUoZSkpfSxfZ2V0RGF0ZTpmdW5jdGlvbihlKXt2YXIgdD0hZS5jdXJyZW50WWVhcnx8ZS5pbnB1dCYmIiI9PT1lLmlucHV0LnZhbCgpP251bGw6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpKTtyZXR1cm4gdH0sX2F0dGFjaEhhbmRsZXJzOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMuX2dldCh0LCJzdGVwTW9udGhzIikscz0iIyIrdC5pZC5yZXBsYWNlKC9cXFxcL2csIlxcIik7dC5kcERpdi5maW5kKCJbZGF0YS1oYW5kbGVyXSIpLm1hcChmdW5jdGlvbigpe3ZhciB0PXtwcmV2OmZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl9hZGp1c3REYXRlKHMsLWksIk0iKX0sbmV4dDpmdW5jdGlvbigpe2UuZGF0ZXBpY2tlci5fYWRqdXN0RGF0ZShzLCtpLCJNIil9LGhpZGU6ZnVuY3Rpb24oKXtlLmRhdGVwaWNrZXIuX2hpZGVEYXRlcGlja2VyKCl9LHRvZGF5OmZ1bmN0aW9uKCl7ZS5kYXRlcGlja2VyLl9nb3RvVG9kYXkocyl9LHNlbGVjdERheTpmdW5jdGlvbigpe3JldHVybiBlLmRhdGVwaWNrZXIuX3NlbGVjdERheShzLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1tb250aCIpLCt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS15ZWFyIiksdGhpcyksITF9LHNlbGVjdE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKHMsdGhpcywiTSIpLCExfSxzZWxlY3RZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIGUuZGF0ZXBpY2tlci5fc2VsZWN0TW9udGhZZWFyKHMsdGhpcywiWSIpLCExfX07ZSh0aGlzKS5iaW5kKHRoaXMuZ2V0QXR0cmlidXRlKCJkYXRhLWV2ZW50IiksdFt0aGlzLmdldEF0dHJpYnV0ZSgiZGF0YS1oYW5kbGVyIildKX0pfSxfZ2VuZXJhdGVIVE1MOmZ1bmN0aW9uKGUpe3ZhciB0LGkscyxuLGEsbyxyLGgsbCx1LGQsYyxwLGYsbSxnLHYseSxiLF8seCx3LGssVCxELFMsTSxDLE4sQSxQLEksSCx6LEYsRSxPLGosVyxMPW5ldyBEYXRlLFI9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoTC5nZXRGdWxsWWVhcigpLEwuZ2V0TW9udGgoKSxMLmdldERhdGUoKSkpLFk9dGhpcy5fZ2V0KGUsImlzUlRMIiksQj10aGlzLl9nZXQoZSwic2hvd0J1dHRvblBhbmVsIiksSj10aGlzLl9nZXQoZSwiaGlkZUlmTm9QcmV2TmV4dCIpLHE9dGhpcy5fZ2V0KGUsIm5hdmlnYXRpb25Bc0RhdGVGb3JtYXQiKSxLPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGUpLFY9dGhpcy5fZ2V0KGUsInNob3dDdXJyZW50QXRQb3MiKSxVPXRoaXMuX2dldChlLCJzdGVwTW9udGhzIiksUT0xIT09S1swXXx8MSE9PUtbMV0sRz10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChlLmN1cnJlbnREYXk/bmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpOm5ldyBEYXRlKDk5OTksOSw5KSksWD10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1pbiIpLCQ9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtYXgiKSxaPWUuZHJhd01vbnRoLVYsZXQ9ZS5kcmF3WWVhcjtpZigwPlomJihaKz0xMixldC0tKSwkKWZvcih0PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKCQuZ2V0RnVsbFllYXIoKSwkLmdldE1vbnRoKCktS1swXSpLWzFdKzEsJC5nZXREYXRlKCkpKSx0PVgmJlg+dD9YOnQ7dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZXQsWiwxKSk+dDspWi0tLDA+WiYmKFo9MTEsZXQtLSk7Zm9yKGUuZHJhd01vbnRoPVosZS5kcmF3WWVhcj1ldCxpPXRoaXMuX2dldChlLCJwcmV2VGV4dCIpLGk9cT90aGlzLmZvcm1hdERhdGUoaSx0aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLVUsMSkpLHRoaXMuX2dldEZvcm1hdENvbmZpZyhlKSk6aSxzPXRoaXMuX2NhbkFkanVzdE1vbnRoKGUsLTEsZXQsWik/IjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSdwcmV2JyBkYXRhLWV2ZW50PSdjbGljaycgdGl0bGU9JyIraSsiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iKyhZPyJlIjoidyIpKyInPiIraSsiPC9zcGFuPjwvYT4iOko/IiI6IjxhIGNsYXNzPSd1aS1kYXRlcGlja2VyLXByZXYgdWktY29ybmVyLWFsbCB1aS1zdGF0ZS1kaXNhYmxlZCcgdGl0bGU9JyIraSsiJz48c3BhbiBjbGFzcz0ndWktaWNvbiB1aS1pY29uLWNpcmNsZS10cmlhbmdsZS0iKyhZPyJlIjoidyIpKyInPiIraSsiPC9zcGFuPjwvYT4iLG49dGhpcy5fZ2V0KGUsIm5leHRUZXh0Iiksbj1xP3RoaXMuZm9ybWF0RGF0ZShuLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKGV0LForVSwxKSksdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTpuLGE9dGhpcy5fY2FuQWRqdXN0TW9udGgoZSwxLGV0LFopPyI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwnIGRhdGEtaGFuZGxlcj0nbmV4dCcgZGF0YS1ldmVudD0nY2xpY2snIHRpdGxlPSciK24rIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIisoWT8idyI6ImUiKSsiJz4iK24rIjwvc3Bhbj48L2E+IjpKPyIiOiI8YSBjbGFzcz0ndWktZGF0ZXBpY2tlci1uZXh0IHVpLWNvcm5lci1hbGwgdWktc3RhdGUtZGlzYWJsZWQnIHRpdGxlPSciK24rIic+PHNwYW4gY2xhc3M9J3VpLWljb24gdWktaWNvbi1jaXJjbGUtdHJpYW5nbGUtIisoWT8idyI6ImUiKSsiJz4iK24rIjwvc3Bhbj48L2E+IixvPXRoaXMuX2dldChlLCJjdXJyZW50VGV4dCIpLHI9dGhpcy5fZ2V0KGUsImdvdG9DdXJyZW50IikmJmUuY3VycmVudERheT9HOlIsbz1xP3RoaXMuZm9ybWF0RGF0ZShvLHIsdGhpcy5fZ2V0Rm9ybWF0Q29uZmlnKGUpKTpvLGg9ZS5pbmxpbmU/IiI6IjxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0ndWktZGF0ZXBpY2tlci1jbG9zZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXByaW1hcnkgdWktY29ybmVyLWFsbCcgZGF0YS1oYW5kbGVyPSdoaWRlJyBkYXRhLWV2ZW50PSdjbGljayc+Iit0aGlzLl9nZXQoZSwiY2xvc2VUZXh0IikrIjwvYnV0dG9uPiIsbD1CPyI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQnPiIrKFk/aDoiIikrKHRoaXMuX2lzSW5SYW5nZShlLHIpPyI8YnV0dG9uIHR5cGU9J2J1dHRvbicgY2xhc3M9J3VpLWRhdGVwaWNrZXItY3VycmVudCB1aS1zdGF0ZS1kZWZhdWx0IHVpLXByaW9yaXR5LXNlY29uZGFyeSB1aS1jb3JuZXItYWxsJyBkYXRhLWhhbmRsZXI9J3RvZGF5JyBkYXRhLWV2ZW50PSdjbGljayc+IitvKyI8L2J1dHRvbj4iOiIiKSsoWT8iIjpoKSsiPC9kaXY+IjoiIix1PXBhcnNlSW50KHRoaXMuX2dldChlLCJmaXJzdERheSIpLDEwKSx1PWlzTmFOKHUpPzA6dSxkPXRoaXMuX2dldChlLCJzaG93V2VlayIpLGM9dGhpcy5fZ2V0KGUsImRheU5hbWVzIikscD10aGlzLl9nZXQoZSwiZGF5TmFtZXNNaW4iKSxmPXRoaXMuX2dldChlLCJtb250aE5hbWVzIiksbT10aGlzLl9nZXQoZSwibW9udGhOYW1lc1Nob3J0IiksZz10aGlzLl9nZXQoZSwiYmVmb3JlU2hvd0RheSIpLHY9dGhpcy5fZ2V0KGUsInNob3dPdGhlck1vbnRocyIpLHk9dGhpcy5fZ2V0KGUsInNlbGVjdE90aGVyTW9udGhzIiksYj10aGlzLl9nZXREZWZhdWx0RGF0ZShlKSxfPSIiLHc9MDtLWzBdPnc7dysrKXtmb3Ioaz0iIix0aGlzLm1heFJvd3M9NCxUPTA7S1sxXT5UO1QrKyl7aWYoRD10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLGUuc2VsZWN0ZWREYXkpKSxTPSIgdWktY29ybmVyLWFsbCIsTT0iIixRKXtpZihNKz0iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1ncm91cCIsS1sxXT4xKXN3aXRjaChUKXtjYXNlIDA6TSs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLWZpcnN0IixTPSIgdWktY29ybmVyLSIrKFk/InJpZ2h0IjoibGVmdCIpO2JyZWFrO2Nhc2UgS1sxXS0xOk0rPSIgdWktZGF0ZXBpY2tlci1ncm91cC1sYXN0IixTPSIgdWktY29ybmVyLSIrKFk/ImxlZnQiOiJyaWdodCIpO2JyZWFrO2RlZmF1bHQ6TSs9IiB1aS1kYXRlcGlja2VyLWdyb3VwLW1pZGRsZSIsUz0iIn1NKz0iJz4ifWZvcihNKz0iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1oZWFkZXIgdWktd2lkZ2V0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgiK1MrIic+IisoL2FsbHxsZWZ0Ly50ZXN0KFMpJiYwPT09dz9ZP2E6czoiIikrKC9hbGx8cmlnaHQvLnRlc3QoUykmJjA9PT13P1k/czphOiIiKSt0aGlzLl9nZW5lcmF0ZU1vbnRoWWVhckhlYWRlcihlLFosZXQsWCwkLHc+MHx8VD4wLGYsbSkrIjwvZGl2Pjx0YWJsZSBjbGFzcz0ndWktZGF0ZXBpY2tlci1jYWxlbmRhcic+PHRoZWFkPiIrIjx0cj4iLEM9ZD8iPHRoIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstY29sJz4iK3RoaXMuX2dldChlLCJ3ZWVrSGVhZGVyIikrIjwvdGg+IjoiIix4PTA7Nz54O3grKylOPSh4K3UpJTcsQys9Ijx0aCBzY29wZT0nY29sJyIrKCh4K3UrNiklNz49NT8iIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstZW5kJyI6IiIpKyI+IisiPHNwYW4gdGl0bGU9JyIrY1tOXSsiJz4iK3BbTl0rIjwvc3Bhbj48L3RoPiI7Zm9yKE0rPUMrIjwvdHI+PC90aGVhZD48dGJvZHk+IixBPXRoaXMuX2dldERheXNJbk1vbnRoKGV0LFopLGV0PT09ZS5zZWxlY3RlZFllYXImJlo9PT1lLnNlbGVjdGVkTW9udGgmJihlLnNlbGVjdGVkRGF5PU1hdGgubWluKGUuc2VsZWN0ZWREYXksQSkpLFA9KHRoaXMuX2dldEZpcnN0RGF5T2ZNb250aChldCxaKS11KzcpJTcsST1NYXRoLmNlaWwoKFArQSkvNyksSD1RP3RoaXMubWF4Um93cz5JP3RoaXMubWF4Um93czpJOkksdGhpcy5tYXhSb3dzPUgsej10aGlzLl9kYXlsaWdodFNhdmluZ0FkanVzdChuZXcgRGF0ZShldCxaLDEtUCkpLEY9MDtIPkY7RisrKXtmb3IoTSs9Ijx0cj4iLEU9ZD8iPHRkIGNsYXNzPSd1aS1kYXRlcGlja2VyLXdlZWstY29sJz4iK3RoaXMuX2dldChlLCJjYWxjdWxhdGVXZWVrIikoeikrIjwvdGQ+IjoiIix4PTA7Nz54O3grKylPPWc/Zy5hcHBseShlLmlucHV0P2UuaW5wdXRbMF06bnVsbCxbel0pOlshMCwiIl0saj16LmdldE1vbnRoKCkhPT1aLFc9aiYmIXl8fCFPWzBdfHxYJiZYPnp8fCQmJno+JCxFKz0iPHRkIGNsYXNzPSciKygoeCt1KzYpJTc+PTU/IiB1aS1kYXRlcGlja2VyLXdlZWstZW5kIjoiIikrKGo/IiB1aS1kYXRlcGlja2VyLW90aGVyLW1vbnRoIjoiIikrKHouZ2V0VGltZSgpPT09RC5nZXRUaW1lKCkmJlo9PT1lLnNlbGVjdGVkTW9udGgmJmUuX2tleUV2ZW50fHxiLmdldFRpbWUoKT09PXouZ2V0VGltZSgpJiZiLmdldFRpbWUoKT09PUQuZ2V0VGltZSgpPyIgIit0aGlzLl9kYXlPdmVyQ2xhc3M6IiIpKyhXPyIgIit0aGlzLl91bnNlbGVjdGFibGVDbGFzcysiIHVpLXN0YXRlLWRpc2FibGVkIjoiIikrKGomJiF2PyIiOiIgIitPWzFdKyh6LmdldFRpbWUoKT09PUcuZ2V0VGltZSgpPyIgIit0aGlzLl9jdXJyZW50Q2xhc3M6IiIpKyh6LmdldFRpbWUoKT09PVIuZ2V0VGltZSgpPyIgdWktZGF0ZXBpY2tlci10b2RheSI6IiIpKSsiJyIrKGomJiF2fHwhT1syXT8iIjoiIHRpdGxlPSciK09bMl0ucmVwbGFjZSgvJy9nLCImIzM5OyIpKyInIikrKFc/IiI6IiBkYXRhLWhhbmRsZXI9J3NlbGVjdERheScgZGF0YS1ldmVudD0nY2xpY2snIGRhdGEtbW9udGg9JyIrei5nZXRNb250aCgpKyInIGRhdGEteWVhcj0nIit6LmdldEZ1bGxZZWFyKCkrIiciKSsiPiIrKGomJiF2PyImI3hhMDsiOlc/IjxzcGFuIGNsYXNzPSd1aS1zdGF0ZS1kZWZhdWx0Jz4iK3ouZ2V0RGF0ZSgpKyI8L3NwYW4+IjoiPGEgY2xhc3M9J3VpLXN0YXRlLWRlZmF1bHQiKyh6LmdldFRpbWUoKT09PVIuZ2V0VGltZSgpPyIgdWktc3RhdGUtaGlnaGxpZ2h0IjoiIikrKHouZ2V0VGltZSgpPT09Ry5nZXRUaW1lKCk/IiB1aS1zdGF0ZS1hY3RpdmUiOiIiKSsoaj8iIHVpLXByaW9yaXR5LXNlY29uZGFyeSI6IiIpKyInIGhyZWY9JyMnPiIrei5nZXREYXRlKCkrIjwvYT4iKSsiPC90ZD4iLHouc2V0RGF0ZSh6LmdldERhdGUoKSsxKSx6PXRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KHopO00rPUUrIjwvdHI+In1aKyssWj4xMSYmKFo9MCxldCsrKSxNKz0iPC90Ym9keT48L3RhYmxlPiIrKFE/IjwvZGl2PiIrKEtbMF0+MCYmVD09PUtbMV0tMT8iPGRpdiBjbGFzcz0ndWktZGF0ZXBpY2tlci1yb3ctYnJlYWsnPjwvZGl2PiI6IiIpOiIiKSxrKz1NfV8rPWt9cmV0dXJuIF8rPWwsZS5fa2V5RXZlbnQ9ITEsX30sX2dlbmVyYXRlTW9udGhZZWFySGVhZGVyOmZ1bmN0aW9uKGUsdCxpLHMsbixhLG8scil7dmFyIGgsbCx1LGQsYyxwLGYsbSxnPXRoaXMuX2dldChlLCJjaGFuZ2VNb250aCIpLHY9dGhpcy5fZ2V0KGUsImNoYW5nZVllYXIiKSx5PXRoaXMuX2dldChlLCJzaG93TW9udGhBZnRlclllYXIiKSxiPSI8ZGl2IGNsYXNzPSd1aS1kYXRlcGlja2VyLXRpdGxlJz4iLF89IiI7aWYoYXx8IWcpXys9IjxzcGFuIGNsYXNzPSd1aS1kYXRlcGlja2VyLW1vbnRoJz4iK29bdF0rIjwvc3Bhbj4iO2Vsc2V7Zm9yKGg9cyYmcy5nZXRGdWxsWWVhcigpPT09aSxsPW4mJm4uZ2V0RnVsbFllYXIoKT09PWksXys9IjxzZWxlY3QgY2xhc3M9J3VpLWRhdGVwaWNrZXItbW9udGgnIGRhdGEtaGFuZGxlcj0nc2VsZWN0TW9udGgnIGRhdGEtZXZlbnQ9J2NoYW5nZSc+Iix1PTA7MTI+dTt1KyspKCFofHx1Pj1zLmdldE1vbnRoKCkpJiYoIWx8fG4uZ2V0TW9udGgoKT49dSkmJihfKz0iPG9wdGlvbiB2YWx1ZT0nIit1KyInIisodT09PXQ/IiBzZWxlY3RlZD0nc2VsZWN0ZWQnIjoiIikrIj4iK3JbdV0rIjwvb3B0aW9uPiIpO18rPSI8L3NlbGVjdD4ifWlmKHl8fChiKz1fKyghYSYmZyYmdj8iIjoiJiN4YTA7IikpLCFlLnllYXJzaHRtbClpZihlLnllYXJzaHRtbD0iIixhfHwhdiliKz0iPHNwYW4gY2xhc3M9J3VpLWRhdGVwaWNrZXIteWVhcic+IitpKyI8L3NwYW4+IjtlbHNle2ZvcihkPXRoaXMuX2dldChlLCJ5ZWFyUmFuZ2UiKS5zcGxpdCgiOiIpLGM9KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpLHA9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvY1srXC1dLiovKT9pK3BhcnNlSW50KGUuc3Vic3RyaW5nKDEpLDEwKTplLm1hdGNoKC9bK1wtXS4qLyk/YytwYXJzZUludChlLDEwKTpwYXJzZUludChlLDEwKTtyZXR1cm4gaXNOYU4odCk/Yzp0fSxmPXAoZFswXSksbT1NYXRoLm1heChmLHAoZFsxXXx8IiIpKSxmPXM/TWF0aC5tYXgoZixzLmdldEZ1bGxZZWFyKCkpOmYsbT1uP01hdGgubWluKG0sbi5nZXRGdWxsWWVhcigpKTptLGUueWVhcnNodG1sKz0iPHNlbGVjdCBjbGFzcz0ndWktZGF0ZXBpY2tlci15ZWFyJyBkYXRhLWhhbmRsZXI9J3NlbGVjdFllYXInIGRhdGEtZXZlbnQ9J2NoYW5nZSc+IjttPj1mO2YrKyllLnllYXJzaHRtbCs9IjxvcHRpb24gdmFsdWU9JyIrZisiJyIrKGY9PT1pPyIgc2VsZWN0ZWQ9J3NlbGVjdGVkJyI6IiIpKyI+IitmKyI8L29wdGlvbj4iO2UueWVhcnNodG1sKz0iPC9zZWxlY3Q+IixiKz1lLnllYXJzaHRtbCxlLnllYXJzaHRtbD1udWxsfXJldHVybiBiKz10aGlzLl9nZXQoZSwieWVhclN1ZmZpeCIpLHkmJihiKz0oIWEmJmcmJnY/IiI6IiYjeGEwOyIpK18pLGIrPSI8L2Rpdj4ifSxfYWRqdXN0SW5zdERhdGU6ZnVuY3Rpb24oZSx0LGkpe3ZhciBzPWUuZHJhd1llYXIrKCJZIj09PWk/dDowKSxuPWUuZHJhd01vbnRoKygiTSI9PT1pP3Q6MCksYT1NYXRoLm1pbihlLnNlbGVjdGVkRGF5LHRoaXMuX2dldERheXNJbk1vbnRoKHMsbikpKygiRCI9PT1pP3Q6MCksbz10aGlzLl9yZXN0cmljdE1pbk1heChlLHRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHMsbixhKSkpO2Uuc2VsZWN0ZWREYXk9by5nZXREYXRlKCksZS5kcmF3TW9udGg9ZS5zZWxlY3RlZE1vbnRoPW8uZ2V0TW9udGgoKSxlLmRyYXdZZWFyPWUuc2VsZWN0ZWRZZWFyPW8uZ2V0RnVsbFllYXIoKSwoIk0iPT09aXx8IlkiPT09aSkmJnRoaXMuX25vdGlmeUNoYW5nZShlKX0sX3Jlc3RyaWN0TWluTWF4OmZ1bmN0aW9uKGUsdCl7dmFyIGk9dGhpcy5fZ2V0TWluTWF4RGF0ZShlLCJtaW4iKSxzPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWF4Iiksbj1pJiZpPnQ/aTp0O3JldHVybiBzJiZuPnM/czpufSxfbm90aWZ5Q2hhbmdlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJvbkNoYW5nZU1vbnRoWWVhciIpO3QmJnQuYXBwbHkoZS5pbnB1dD9lLmlucHV0WzBdOm51bGwsW2Uuc2VsZWN0ZWRZZWFyLGUuc2VsZWN0ZWRNb250aCsxLGVdKX0sX2dldE51bWJlck9mTW9udGhzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2dldChlLCJudW1iZXJPZk1vbnRocyIpO3JldHVybiBudWxsPT10P1sxLDFdOiJudW1iZXIiPT10eXBlb2YgdD9bMSx0XTp0fSxfZ2V0TWluTWF4RGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLl9kZXRlcm1pbmVEYXRlKGUsdGhpcy5fZ2V0KGUsdCsiRGF0ZSIpLG51bGwpfSxfZ2V0RGF5c0luTW9udGg6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gMzItdGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZSx0LDMyKSkuZ2V0RGF0ZSgpfSxfZ2V0Rmlyc3REYXlPZk1vbnRoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBEYXRlKGUsdCwxKS5nZXREYXkoKX0sX2NhbkFkanVzdE1vbnRoOmZ1bmN0aW9uKGUsdCxpLHMpe3ZhciBuPXRoaXMuX2dldE51bWJlck9mTW9udGhzKGUpLGE9dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoaSxzKygwPnQ/dDpuWzBdKm5bMV0pLDEpKTtyZXR1cm4gMD50JiZhLnNldERhdGUodGhpcy5fZ2V0RGF5c0luTW9udGgoYS5nZXRGdWxsWWVhcigpLGEuZ2V0TW9udGgoKSkpLHRoaXMuX2lzSW5SYW5nZShlLGEpfSxfaXNJblJhbmdlOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuPXRoaXMuX2dldE1pbk1heERhdGUoZSwibWluIiksYT10aGlzLl9nZXRNaW5NYXhEYXRlKGUsIm1heCIpLG89bnVsbCxyPW51bGwsaD10aGlzLl9nZXQoZSwieWVhclJhbmdlIik7cmV0dXJuIGgmJihpPWguc3BsaXQoIjoiKSxzPShuZXcgRGF0ZSkuZ2V0RnVsbFllYXIoKSxvPXBhcnNlSW50KGlbMF0sMTApLHI9cGFyc2VJbnQoaVsxXSwxMCksaVswXS5tYXRjaCgvWytcLV0uKi8pJiYobys9cyksaVsxXS5tYXRjaCgvWytcLV0uKi8pJiYocis9cykpLCghbnx8dC5nZXRUaW1lKCk+PW4uZ2V0VGltZSgpKSYmKCFhfHx0LmdldFRpbWUoKTw9YS5nZXRUaW1lKCkpJiYoIW98fHQuZ2V0RnVsbFllYXIoKT49bykmJighcnx8cj49dC5nZXRGdWxsWWVhcigpKX0sX2dldEZvcm1hdENvbmZpZzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXQoZSwic2hvcnRZZWFyQ3V0b2ZmIik7cmV0dXJuIHQ9InN0cmluZyIhPXR5cGVvZiB0P3Q6KG5ldyBEYXRlKS5nZXRGdWxsWWVhcigpJTEwMCtwYXJzZUludCh0LDEwKSx7c2hvcnRZZWFyQ3V0b2ZmOnQsZGF5TmFtZXNTaG9ydDp0aGlzLl9nZXQoZSwiZGF5TmFtZXNTaG9ydCIpLGRheU5hbWVzOnRoaXMuX2dldChlLCJkYXlOYW1lcyIpLG1vbnRoTmFtZXNTaG9ydDp0aGlzLl9nZXQoZSwibW9udGhOYW1lc1Nob3J0IiksbW9udGhOYW1lczp0aGlzLl9nZXQoZSwibW9udGhOYW1lcyIpfX0sX2Zvcm1hdERhdGU6ZnVuY3Rpb24oZSx0LGkscyl7dHx8KGUuY3VycmVudERheT1lLnNlbGVjdGVkRGF5LGUuY3VycmVudE1vbnRoPWUuc2VsZWN0ZWRNb250aCxlLmN1cnJlbnRZZWFyPWUuc2VsZWN0ZWRZZWFyKTt2YXIgbj10PyJvYmplY3QiPT10eXBlb2YgdD90OnRoaXMuX2RheWxpZ2h0U2F2aW5nQWRqdXN0KG5ldyBEYXRlKHMsaSx0KSk6dGhpcy5fZGF5bGlnaHRTYXZpbmdBZGp1c3QobmV3IERhdGUoZS5jdXJyZW50WWVhcixlLmN1cnJlbnRNb250aCxlLmN1cnJlbnREYXkpKTtyZXR1cm4gdGhpcy5mb3JtYXREYXRlKHRoaXMuX2dldChlLCJkYXRlRm9ybWF0Iiksbix0aGlzLl9nZXRGb3JtYXRDb25maWcoZSkpfX0pLGUuZm4uZGF0ZXBpY2tlcj1mdW5jdGlvbih0KXtpZighdGhpcy5sZW5ndGgpcmV0dXJuIHRoaXM7ZS5kYXRlcGlja2VyLmluaXRpYWxpemVkfHwoZShkb2N1bWVudCkubW91c2Vkb3duKGUuZGF0ZXBpY2tlci5fY2hlY2tFeHRlcm5hbENsaWNrKSxlLmRhdGVwaWNrZXIuaW5pdGlhbGl6ZWQ9ITApLDA9PT1lKCIjIitlLmRhdGVwaWNrZXIuX21haW5EaXZJZCkubGVuZ3RoJiZlKCJib2R5IikuYXBwZW5kKGUuZGF0ZXBpY2tlci5kcERpdik7dmFyIGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiJzdHJpbmciIT10eXBlb2YgdHx8ImlzRGlzYWJsZWQiIT09dCYmImdldERhdGUiIT09dCYmIndpZGdldCIhPT10PyJvcHRpb24iPT09dCYmMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgYXJndW1lbnRzWzFdP2UuZGF0ZXBpY2tlclsiXyIrdCsiRGF0ZXBpY2tlciJdLmFwcGx5KGUuZGF0ZXBpY2tlcixbdGhpc1swXV0uY29uY2F0KGkpKTp0aGlzLmVhY2goZnVuY3Rpb24oKXsic3RyaW5nIj09dHlwZW9mIHQ/ZS5kYXRlcGlja2VyWyJfIit0KyJEYXRlcGlja2VyIl0uYXBwbHkoZS5kYXRlcGlja2VyLFt0aGlzXS5jb25jYXQoaSkpOmUuZGF0ZXBpY2tlci5fYXR0YWNoRGF0ZXBpY2tlcih0aGlzLHQpfSk6ZS5kYXRlcGlja2VyWyJfIit0KyJEYXRlcGlja2VyIl0uYXBwbHkoZS5kYXRlcGlja2VyLFt0aGlzWzBdXS5jb25jYXQoaSkpfSxlLmRhdGVwaWNrZXI9bmV3IG4sZS5kYXRlcGlja2VyLmluaXRpYWxpemVkPSExLGUuZGF0ZXBpY2tlci51dWlkPShuZXcgRGF0ZSkuZ2V0VGltZSgpLGUuZGF0ZXBpY2tlci52ZXJzaW9uPSIxLjExLjQiLGUuZGF0ZXBpY2tlcixlLndpZGdldCgidWkuZHJhZ2dhYmxlIixlLnVpLm1vdXNlLHt2ZXJzaW9uOiIxLjExLjQiLHdpZGdldEV2ZW50UHJlZml4OiJkcmFnIixvcHRpb25zOnthZGRDbGFzc2VzOiEwLGFwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFRvU29ydGFibGU6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxncmlkOiExLGhhbmRsZTohMSxoZWxwZXI6Im9yaWdpbmFsIixpZnJhbWVGaXg6ITEsb3BhY2l0eTohMSxyZWZyZXNoUG9zaXRpb25zOiExLHJldmVydDohMSxyZXZlcnREdXJhdGlvbjo1MDAsc2NvcGU6ImRlZmF1bHQiLHNjcm9sbDohMCxzY3JvbGxTZW5zaXRpdml0eToyMCxzY3JvbGxTcGVlZDoyMCxzbmFwOiExLHNuYXBNb2RlOiJib3RoIixzbmFwVG9sZXJhbmNlOjIwLHN0YWNrOiExLHpJbmRleDohMSxkcmFnOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9jcmVhdGU6ZnVuY3Rpb24oKXsib3JpZ2luYWwiPT09dGhpcy5vcHRpb25zLmhlbHBlciYmdGhpcy5fc2V0UG9zaXRpb25SZWxhdGl2ZSgpLHRoaXMub3B0aW9ucy5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyYWdnYWJsZSIpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSx0aGlzLl9zZXRIYW5kbGVDbGFzc05hbWUoKSx0aGlzLl9tb3VzZUluaXQoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe3RoaXMuX3N1cGVyKGUsdCksImhhbmRsZSI9PT1lJiYodGhpcy5fcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lKCksdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCkpfSxfZGVzdHJveTpmdW5jdGlvbigpe3JldHVybih0aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50KS5pcygiLnVpLWRyYWdnYWJsZS1kcmFnZ2luZyIpPyh0aGlzLmRlc3Ryb3lPbkNsZWFyPSEwLHZvaWQgMCk6KHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktZHJhZ2dhYmxlIHVpLWRyYWdnYWJsZS1kcmFnZ2luZyB1aS1kcmFnZ2FibGUtZGlzYWJsZWQiKSx0aGlzLl9yZW1vdmVIYW5kbGVDbGFzc05hbWUoKSx0aGlzLl9tb3VzZURlc3Ryb3koKSx2b2lkIDApfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5fYmx1ckFjdGl2ZUVsZW1lbnQodCksdGhpcy5oZWxwZXJ8fGkuZGlzYWJsZWR8fGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1yZXNpemFibGUtaGFuZGxlIikubGVuZ3RoPjA/ITE6KHRoaXMuaGFuZGxlPXRoaXMuX2dldEhhbmRsZSh0KSx0aGlzLmhhbmRsZT8odGhpcy5fYmxvY2tGcmFtZXMoaS5pZnJhbWVGaXg9PT0hMD8iaWZyYW1lIjppLmlmcmFtZUZpeCksITApOiExKX0sX2Jsb2NrRnJhbWVzOmZ1bmN0aW9uKHQpe3RoaXMuaWZyYW1lQmxvY2tzPXRoaXMuZG9jdW1lbnQuZmluZCh0KS5tYXAoZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3JldHVybiBlKCI8ZGl2PiIpLmNzcygicG9zaXRpb24iLCJhYnNvbHV0ZSIpLmFwcGVuZFRvKHQucGFyZW50KCkpLm91dGVyV2lkdGgodC5vdXRlcldpZHRoKCkpLm91dGVySGVpZ2h0KHQub3V0ZXJIZWlnaHQoKSkub2Zmc2V0KHQub2Zmc2V0KCkpWzBdfSl9LF91bmJsb2NrRnJhbWVzOmZ1bmN0aW9uKCl7dGhpcy5pZnJhbWVCbG9ja3MmJih0aGlzLmlmcmFtZUJsb2Nrcy5yZW1vdmUoKSxkZWxldGUgdGhpcy5pZnJhbWVCbG9ja3MpfSxfYmx1ckFjdGl2ZUVsZW1lbnQ6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5kb2N1bWVudFswXTtpZih0aGlzLmhhbmRsZUVsZW1lbnQuaXModC50YXJnZXQpKXRyeXtpLmFjdGl2ZUVsZW1lbnQmJiJib2R5IiE9PWkuYWN0aXZlRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiZlKGkuYWN0aXZlRWxlbWVudCkuYmx1cigpfWNhdGNoKHMpe319LF9tb3VzZVN0YXJ0OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucztyZXR1cm4gdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKHQpLHRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksZS51aS5kZG1hbmFnZXImJihlLnVpLmRkbWFuYWdlci5jdXJyZW50PXRoaXMpLHRoaXMuX2NhY2hlTWFyZ2lucygpLHRoaXMuY3NzUG9zaXRpb249dGhpcy5oZWxwZXIuY3NzKCJwb3NpdGlvbiIpLHRoaXMuc2Nyb2xsUGFyZW50PXRoaXMuaGVscGVyLnNjcm9sbFBhcmVudCghMCksdGhpcy5vZmZzZXRQYXJlbnQ9dGhpcy5oZWxwZXIub2Zmc2V0UGFyZW50KCksdGhpcy5oYXNGaXhlZEFuY2VzdG9yPXRoaXMuaGVscGVyLnBhcmVudHMoKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4iZml4ZWQiPT09ZSh0aGlzKS5jc3MoInBvc2l0aW9uIil9KS5sZW5ndGg+MCx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuZWxlbWVudC5vZmZzZXQoKSx0aGlzLl9yZWZyZXNoT2Zmc2V0cyh0KSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQsITEpLHRoaXMub3JpZ2luYWxQYWdlWD10LnBhZ2VYLHRoaXMub3JpZ2luYWxQYWdlWT10LnBhZ2VZLGkuY3Vyc29yQXQmJnRoaXMuX2FkanVzdE9mZnNldEZyb21IZWxwZXIoaS5jdXJzb3JBdCksdGhpcy5fc2V0Q29udGFpbm1lbnQoKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsdCk9PT0hMT8odGhpcy5fY2xlYXIoKSwhMSk6KHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSxlLnVpLmRkbWFuYWdlciYmIWkuZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyx0KSx0aGlzLl9ub3JtYWxpemVSaWdodEJvdHRvbSgpLHRoaXMuX21vdXNlRHJhZyh0LCEwKSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZ1N0YXJ0KHRoaXMsdCksITApfSxfcmVmcmVzaE9mZnNldHM6ZnVuY3Rpb24oZSl7dGhpcy5vZmZzZXQ9e3RvcDp0aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLm1hcmdpbnMudG9wLGxlZnQ6dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0LHNjcm9sbDohMSxwYXJlbnQ6dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkscmVsYXRpdmU6dGhpcy5fZ2V0UmVsYXRpdmVPZmZzZXQoKX0sdGhpcy5vZmZzZXQuY2xpY2s9e2xlZnQ6ZS5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDplLnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH19LF9tb3VzZURyYWc6ZnVuY3Rpb24odCxpKXtpZih0aGlzLmhhc0ZpeGVkQW5jZXN0b3ImJih0aGlzLm9mZnNldC5wYXJlbnQ9dGhpcy5fZ2V0UGFyZW50T2Zmc2V0KCkpLHRoaXMucG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0LCEwKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLCFpKXt2YXIgcz10aGlzLl91aUhhc2goKTtpZih0aGlzLl90cmlnZ2VyKCJkcmFnIix0LHMpPT09ITEpcmV0dXJuIHRoaXMuX21vdXNlVXAoe30pLCExO3RoaXMucG9zaXRpb249cy5wb3NpdGlvbn1yZXR1cm4gdGhpcy5oZWxwZXJbMF0uc3R5bGUubGVmdD10aGlzLnBvc2l0aW9uLmxlZnQrInB4Iix0aGlzLmhlbHBlclswXS5zdHlsZS50b3A9dGhpcy5wb3NpdGlvbi50b3ArInB4IixlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLHQpLCExfSxfbW91c2VTdG9wOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz0hMTtyZXR1cm4gZS51aS5kZG1hbmFnZXImJiF0aGlzLm9wdGlvbnMuZHJvcEJlaGF2aW91ciYmKHM9ZS51aS5kZG1hbmFnZXIuZHJvcCh0aGlzLHQpKSx0aGlzLmRyb3BwZWQmJihzPXRoaXMuZHJvcHBlZCx0aGlzLmRyb3BwZWQ9ITEpLCJpbnZhbGlkIj09PXRoaXMub3B0aW9ucy5yZXZlcnQmJiFzfHwidmFsaWQiPT09dGhpcy5vcHRpb25zLnJldmVydCYmc3x8dGhpcy5vcHRpb25zLnJldmVydD09PSEwfHxlLmlzRnVuY3Rpb24odGhpcy5vcHRpb25zLnJldmVydCkmJnRoaXMub3B0aW9ucy5yZXZlcnQuY2FsbCh0aGlzLmVsZW1lbnQscyk/ZSh0aGlzLmhlbHBlcikuYW5pbWF0ZSh0aGlzLm9yaWdpbmFsUG9zaXRpb24scGFyc2VJbnQodGhpcy5vcHRpb25zLnJldmVydER1cmF0aW9uLDEwKSxmdW5jdGlvbigpe2kuX3RyaWdnZXIoInN0b3AiLHQpIT09ITEmJmkuX2NsZWFyKCl9KTp0aGlzLl90cmlnZ2VyKCJzdG9wIix0KSE9PSExJiZ0aGlzLl9jbGVhcigpLCExfSxfbW91c2VVcDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdW5ibG9ja0ZyYW1lcygpLGUudWkuZGRtYW5hZ2VyJiZlLnVpLmRkbWFuYWdlci5kcmFnU3RvcCh0aGlzLHQpLHRoaXMuaGFuZGxlRWxlbWVudC5pcyh0LnRhcmdldCkmJnRoaXMuZWxlbWVudC5mb2N1cygpLGUudWkubW91c2UucHJvdG90eXBlLl9tb3VzZVVwLmNhbGwodGhpcyx0KX0sY2FuY2VsOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaGVscGVyLmlzKCIudWktZHJhZ2dhYmxlLWRyYWdnaW5nIik/dGhpcy5fbW91c2VVcCh7fSk6dGhpcy5fY2xlYXIoKSx0aGlzfSxfZ2V0SGFuZGxlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm9wdGlvbnMuaGFuZGxlPyEhZSh0LnRhcmdldCkuY2xvc2VzdCh0aGlzLmVsZW1lbnQuZmluZCh0aGlzLm9wdGlvbnMuaGFuZGxlKSkubGVuZ3RoOiEwfSxfc2V0SGFuZGxlQ2xhc3NOYW1lOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVFbGVtZW50PXRoaXMub3B0aW9ucy5oYW5kbGU/dGhpcy5lbGVtZW50LmZpbmQodGhpcy5vcHRpb25zLmhhbmRsZSk6dGhpcy5lbGVtZW50LHRoaXMuaGFuZGxlRWxlbWVudC5hZGRDbGFzcygidWktZHJhZ2dhYmxlLWhhbmRsZSIpfSxfcmVtb3ZlSGFuZGxlQ2xhc3NOYW1lOmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVFbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtaGFuZGxlIil9LF9jcmVhdGVIZWxwZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9ZS5pc0Z1bmN0aW9uKGkuaGVscGVyKSxuPXM/ZShpLmhlbHBlci5hcHBseSh0aGlzLmVsZW1lbnRbMF0sW3RdKSk6ImNsb25lIj09PWkuaGVscGVyP3RoaXMuZWxlbWVudC5jbG9uZSgpLnJlbW92ZUF0dHIoImlkIik6dGhpcy5lbGVtZW50O3JldHVybiBuLnBhcmVudHMoImJvZHkiKS5sZW5ndGh8fG4uYXBwZW5kVG8oInBhcmVudCI9PT1pLmFwcGVuZFRvP3RoaXMuZWxlbWVudFswXS5wYXJlbnROb2RlOmkuYXBwZW5kVG8pLHMmJm5bMF09PT10aGlzLmVsZW1lbnRbMF0mJnRoaXMuX3NldFBvc2l0aW9uUmVsYXRpdmUoKSxuWzBdPT09dGhpcy5lbGVtZW50WzBdfHwvKGZpeGVkfGFic29sdXRlKS8udGVzdChuLmNzcygicG9zaXRpb24iKSl8fG4uY3NzKCJwb3NpdGlvbiIsImFic29sdXRlIiksbn0sX3NldFBvc2l0aW9uUmVsYXRpdmU6ZnVuY3Rpb24oKXsvXig/OnJ8YXxmKS8udGVzdCh0aGlzLmVsZW1lbnQuY3NzKCJwb3NpdGlvbiIpKXx8KHRoaXMuZWxlbWVudFswXS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKX0sX2FkanVzdE9mZnNldEZyb21IZWxwZXI6ZnVuY3Rpb24odCl7InN0cmluZyI9PXR5cGVvZiB0JiYodD10LnNwbGl0KCIgIikpLGUuaXNBcnJheSh0KSYmKHQ9e2xlZnQ6K3RbMF0sdG9wOit0WzFdfHwwfSksImxlZnQiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dC5sZWZ0K3RoaXMubWFyZ2lucy5sZWZ0KSwicmlnaHQiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10LnJpZ2h0K3RoaXMubWFyZ2lucy5sZWZ0KSwidG9wImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dC50b3ArdGhpcy5tYXJnaW5zLnRvcCksImJvdHRvbSJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2sudG9wPXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXQuYm90dG9tK3RoaXMubWFyZ2lucy50b3ApfSxfaXNSb290Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4vKGh0bWx8Ym9keSkvaS50ZXN0KGUudGFnTmFtZSl8fGU9PT10aGlzLmRvY3VtZW50WzBdfSxfZ2V0UGFyZW50T2Zmc2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCksaT10aGlzLmRvY3VtZW50WzBdO3JldHVybiJhYnNvbHV0ZSI9PT10aGlzLmNzc1Bvc2l0aW9uJiZ0aGlzLnNjcm9sbFBhcmVudFswXSE9PWkmJmUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pJiYodC5sZWZ0Kz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxMZWZ0KCksdC50b3ArPXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSx0aGlzLl9pc1Jvb3ROb2RlKHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHQ9e3RvcDowLGxlZnQ6MH0pLHt0b3A6dC50b3ArKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApLGxlZnQ6dC5sZWZ0KyhwYXJzZUludCh0aGlzLm9mZnNldFBhcmVudC5jc3MoImJvcmRlckxlZnRXaWR0aCIpLDEwKXx8MCl9fSxfZ2V0UmVsYXRpdmVPZmZzZXQ6ZnVuY3Rpb24oKXtpZigicmVsYXRpdmUiIT09dGhpcy5jc3NQb3NpdGlvbilyZXR1cm57dG9wOjAsbGVmdDowfTt2YXIgZT10aGlzLmVsZW1lbnQucG9zaXRpb24oKSx0PXRoaXMuX2lzUm9vdE5vZGUodGhpcy5zY3JvbGxQYXJlbnRbMF0pO3JldHVybnt0b3A6ZS50b3AtKHBhcnNlSW50KHRoaXMuaGVscGVyLmNzcygidG9wIiksMTApfHwwKSsodD8wOnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpKSxsZWZ0OmUubGVmdC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJsZWZ0IiksMTApfHwwKSsodD8wOnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKSl9fSxfY2FjaGVNYXJnaW5zOmZ1bmN0aW9uKCl7dGhpcy5tYXJnaW5zPXtsZWZ0OnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuZWxlbWVudC5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCxyaWdodDpwYXJzZUludCh0aGlzLmVsZW1lbnQuY3NzKCJtYXJnaW5SaWdodCIpLDEwKXx8MCxib3R0b206cGFyc2VJbnQodGhpcy5lbGVtZW50LmNzcygibWFyZ2luQm90dG9tIiksMTApfHwwfX0sX2NhY2hlSGVscGVyUHJvcG9ydGlvbnM6ZnVuY3Rpb24oKXt0aGlzLmhlbHBlclByb3BvcnRpb25zPXt3aWR0aDp0aGlzLmhlbHBlci5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuaGVscGVyLm91dGVySGVpZ2h0KCl9fSxfc2V0Q29udGFpbm1lbnQ6ZnVuY3Rpb24oKXt2YXIgdCxpLHMsbj10aGlzLm9wdGlvbnMsYT10aGlzLmRvY3VtZW50WzBdO3JldHVybiB0aGlzLnJlbGF0aXZlQ29udGFpbmVyPW51bGwsbi5jb250YWlubWVudD8id2luZG93Ij09PW4uY29udGFpbm1lbnQ/KHRoaXMuY29udGFpbm1lbnQ9W2Uod2luZG93KS5zY3JvbGxMZWZ0KCktdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCxlKHdpbmRvdykuc2Nyb2xsVG9wKCktdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3AsZSh3aW5kb3cpLnNjcm9sbExlZnQoKStlKHdpbmRvdykud2lkdGgoKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGUod2luZG93KS5zY3JvbGxUb3AoKSsoZSh3aW5kb3cpLmhlaWdodCgpfHxhLmJvZHkucGFyZW50Tm9kZS5zY3JvbGxIZWlnaHQpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LXRoaXMubWFyZ2lucy50b3BdLHZvaWQgMCk6ImRvY3VtZW50Ij09PW4uY29udGFpbm1lbnQ/KHRoaXMuY29udGFpbm1lbnQ9WzAsMCxlKGEpLndpZHRoKCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC10aGlzLm1hcmdpbnMubGVmdCwoZShhKS5oZWlnaHQoKXx8YS5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSx2b2lkIDApOm4uY29udGFpbm1lbnQuY29uc3RydWN0b3I9PT1BcnJheT8odGhpcy5jb250YWlubWVudD1uLmNvbnRhaW5tZW50LHZvaWQgMCk6KCJwYXJlbnQiPT09bi5jb250YWlubWVudCYmKG4uY29udGFpbm1lbnQ9dGhpcy5oZWxwZXJbMF0ucGFyZW50Tm9kZSksaT1lKG4uY29udGFpbm1lbnQpLHM9aVswXSxzJiYodD0vKHNjcm9sbHxhdXRvKS8udGVzdChpLmNzcygib3ZlcmZsb3ciKSksdGhpcy5jb250YWlubWVudD1bKHBhcnNlSW50KGkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChpLmNzcygicGFkZGluZ0xlZnQiKSwxMCl8fDApLChwYXJzZUludChpLmNzcygiYm9yZGVyVG9wV2lkdGgiKSwxMCl8fDApKyhwYXJzZUludChpLmNzcygicGFkZGluZ1RvcCIpLDEwKXx8MCksKHQ/TWF0aC5tYXgocy5zY3JvbGxXaWR0aCxzLm9mZnNldFdpZHRoKTpzLm9mZnNldFdpZHRoKS0ocGFyc2VJbnQoaS5jc3MoImJvcmRlclJpZ2h0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LXRoaXMubWFyZ2lucy5yaWdodCwodD9NYXRoLm1heChzLnNjcm9sbEhlaWdodCxzLm9mZnNldEhlaWdodCk6cy5vZmZzZXRIZWlnaHQpLShwYXJzZUludChpLmNzcygiYm9yZGVyQm90dG9tV2lkdGgiKSwxMCl8fDApLShwYXJzZUludChpLmNzcygicGFkZGluZ0JvdHRvbSIpLDEwKXx8MCktdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdGhpcy5tYXJnaW5zLnRvcC10aGlzLm1hcmdpbnMuYm90dG9tXSx0aGlzLnJlbGF0aXZlQ29udGFpbmVyPWkpLHZvaWQgMCk6KHRoaXMuY29udGFpbm1lbnQ9bnVsbCx2b2lkIDApCn0sX2NvbnZlcnRQb3NpdGlvblRvOmZ1bmN0aW9uKGUsdCl7dHx8KHQ9dGhpcy5wb3NpdGlvbik7dmFyIGk9ImFic29sdXRlIj09PWU/MTotMSxzPXRoaXMuX2lzUm9vdE5vZGUodGhpcy5zY3JvbGxQYXJlbnRbMF0pO3JldHVybnt0b3A6dC50b3ArdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wKmkrdGhpcy5vZmZzZXQucGFyZW50LnRvcCppLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLnRvcDpzPzA6dGhpcy5vZmZzZXQuc2Nyb2xsLnRvcCkqaSxsZWZ0OnQubGVmdCt0aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0KmkrdGhpcy5vZmZzZXQucGFyZW50LmxlZnQqaS0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0OnM/MDp0aGlzLm9mZnNldC5zY3JvbGwubGVmdCkqaX19LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuLGEsbz10aGlzLm9wdGlvbnMscj10aGlzLl9pc1Jvb3ROb2RlKHRoaXMuc2Nyb2xsUGFyZW50WzBdKSxoPWUucGFnZVgsbD1lLnBhZ2VZO3JldHVybiByJiZ0aGlzLm9mZnNldC5zY3JvbGx8fCh0aGlzLm9mZnNldC5zY3JvbGw9e3RvcDp0aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSxsZWZ0OnRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX0pLHQmJih0aGlzLmNvbnRhaW5tZW50JiYodGhpcy5yZWxhdGl2ZUNvbnRhaW5lcj8ocz10aGlzLnJlbGF0aXZlQ29udGFpbmVyLm9mZnNldCgpLGk9W3RoaXMuY29udGFpbm1lbnRbMF0rcy5sZWZ0LHRoaXMuY29udGFpbm1lbnRbMV0rcy50b3AsdGhpcy5jb250YWlubWVudFsyXStzLmxlZnQsdGhpcy5jb250YWlubWVudFszXStzLnRvcF0pOmk9dGhpcy5jb250YWlubWVudCxlLnBhZ2VYLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8aVswXSYmKGg9aVswXSt0aGlzLm9mZnNldC5jbGljay5sZWZ0KSxlLnBhZ2VZLXRoaXMub2Zmc2V0LmNsaWNrLnRvcDxpWzFdJiYobD1pWzFdK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCksZS5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PmlbMl0mJihoPWlbMl0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksZS5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A+aVszXSYmKGw9aVszXSt0aGlzLm9mZnNldC5jbGljay50b3ApKSxvLmdyaWQmJihuPW8uZ3JpZFsxXT90aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgobC10aGlzLm9yaWdpbmFsUGFnZVkpL28uZ3JpZFsxXSkqby5ncmlkWzFdOnRoaXMub3JpZ2luYWxQYWdlWSxsPWk/bi10aGlzLm9mZnNldC5jbGljay50b3A+PWlbMV18fG4tdGhpcy5vZmZzZXQuY2xpY2sudG9wPmlbM10/bjpuLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49aVsxXT9uLW8uZ3JpZFsxXTpuK28uZ3JpZFsxXTpuLGE9by5ncmlkWzBdP3RoaXMub3JpZ2luYWxQYWdlWCtNYXRoLnJvdW5kKChoLXRoaXMub3JpZ2luYWxQYWdlWCkvby5ncmlkWzBdKSpvLmdyaWRbMF06dGhpcy5vcmlnaW5hbFBhZ2VYLGg9aT9hLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PWlbMF18fGEtdGhpcy5vZmZzZXQuY2xpY2subGVmdD5pWzJdP2E6YS10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj1pWzBdP2Etby5ncmlkWzBdOmErby5ncmlkWzBdOmEpLCJ5Ij09PW8uYXhpcyYmKGg9dGhpcy5vcmlnaW5hbFBhZ2VYKSwieCI9PT1vLmF4aXMmJihsPXRoaXMub3JpZ2luYWxQYWdlWSkpLHt0b3A6bC10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLm9mZnNldC5zY3JvbGwudG9wOnI/MDp0aGlzLm9mZnNldC5zY3JvbGwudG9wKSxsZWZ0OmgtdGhpcy5vZmZzZXQuY2xpY2subGVmdC10aGlzLm9mZnNldC5yZWxhdGl2ZS5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0KygiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5vZmZzZXQuc2Nyb2xsLmxlZnQ6cj8wOnRoaXMub2Zmc2V0LnNjcm9sbC5sZWZ0KX19LF9jbGVhcjpmdW5jdGlvbigpe3RoaXMuaGVscGVyLnJlbW92ZUNsYXNzKCJ1aS1kcmFnZ2FibGUtZHJhZ2dpbmciKSx0aGlzLmhlbHBlclswXT09PXRoaXMuZWxlbWVudFswXXx8dGhpcy5jYW5jZWxIZWxwZXJSZW1vdmFsfHx0aGlzLmhlbHBlci5yZW1vdmUoKSx0aGlzLmhlbHBlcj1udWxsLHRoaXMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSx0aGlzLmRlc3Ryb3lPbkNsZWFyJiZ0aGlzLmRlc3Ryb3koKX0sX25vcm1hbGl6ZVJpZ2h0Qm90dG9tOmZ1bmN0aW9uKCl7InkiIT09dGhpcy5vcHRpb25zLmF4aXMmJiJhdXRvIiE9PXRoaXMuaGVscGVyLmNzcygicmlnaHQiKSYmKHRoaXMuaGVscGVyLndpZHRoKHRoaXMuaGVscGVyLndpZHRoKCkpLHRoaXMuaGVscGVyLmNzcygicmlnaHQiLCJhdXRvIikpLCJ4IiE9PXRoaXMub3B0aW9ucy5heGlzJiYiYXV0byIhPT10aGlzLmhlbHBlci5jc3MoImJvdHRvbSIpJiYodGhpcy5oZWxwZXIuaGVpZ2h0KHRoaXMuaGVscGVyLmhlaWdodCgpKSx0aGlzLmhlbHBlci5jc3MoImJvdHRvbSIsImF1dG8iKSl9LF90cmlnZ2VyOmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gcz1zfHx0aGlzLl91aUhhc2goKSxlLnVpLnBsdWdpbi5jYWxsKHRoaXMsdCxbaSxzLHRoaXNdLCEwKSwvXihkcmFnfHN0YXJ0fHN0b3ApLy50ZXN0KHQpJiYodGhpcy5wb3NpdGlvbkFicz10aGlzLl9jb252ZXJ0UG9zaXRpb25UbygiYWJzb2x1dGUiKSxzLm9mZnNldD10aGlzLnBvc2l0aW9uQWJzKSxlLldpZGdldC5wcm90b3R5cGUuX3RyaWdnZXIuY2FsbCh0aGlzLHQsaSxzKX0scGx1Z2luczp7fSxfdWlIYXNoOmZ1bmN0aW9uKCl7cmV0dXJue2hlbHBlcjp0aGlzLmhlbHBlcixwb3NpdGlvbjp0aGlzLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246dGhpcy5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDp0aGlzLnBvc2l0aW9uQWJzfX19KSxlLnVpLnBsdWdpbi5hZGQoImRyYWdnYWJsZSIsImNvbm5lY3RUb1NvcnRhYmxlIix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUuZXh0ZW5kKHt9LGkse2l0ZW06cy5lbGVtZW50fSk7cy5zb3J0YWJsZXM9W10sZShzLm9wdGlvbnMuY29ubmVjdFRvU29ydGFibGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lKHRoaXMpLnNvcnRhYmxlKCJpbnN0YW5jZSIpO2kmJiFpLm9wdGlvbnMuZGlzYWJsZWQmJihzLnNvcnRhYmxlcy5wdXNoKGkpLGkucmVmcmVzaFBvc2l0aW9ucygpLGkuX3RyaWdnZXIoImFjdGl2YXRlIix0LG4pKX0pfSxzdG9wOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lLmV4dGVuZCh7fSxpLHtpdGVtOnMuZWxlbWVudH0pO3MuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMSxlLmVhY2gocy5zb3J0YWJsZXMsZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuaXNPdmVyPyhlLmlzT3Zlcj0wLHMuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxlLmNhbmNlbEhlbHBlclJlbW92YWw9ITEsZS5fc3RvcmVkQ1NTPXtwb3NpdGlvbjplLnBsYWNlaG9sZGVyLmNzcygicG9zaXRpb24iKSx0b3A6ZS5wbGFjZWhvbGRlci5jc3MoInRvcCIpLGxlZnQ6ZS5wbGFjZWhvbGRlci5jc3MoImxlZnQiKX0sZS5fbW91c2VTdG9wKHQpLGUub3B0aW9ucy5oZWxwZXI9ZS5vcHRpb25zLl9oZWxwZXIpOihlLmNhbmNlbEhlbHBlclJlbW92YWw9ITAsZS5fdHJpZ2dlcigiZGVhY3RpdmF0ZSIsdCxuKSl9KX0sZHJhZzpmdW5jdGlvbih0LGkscyl7ZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dmFyIG49ITEsYT10aGlzO2EucG9zaXRpb25BYnM9cy5wb3NpdGlvbkFicyxhLmhlbHBlclByb3BvcnRpb25zPXMuaGVscGVyUHJvcG9ydGlvbnMsYS5vZmZzZXQuY2xpY2s9cy5vZmZzZXQuY2xpY2ssYS5faW50ZXJzZWN0c1dpdGgoYS5jb250YWluZXJDYWNoZSkmJihuPSEwLGUuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3JldHVybiB0aGlzLnBvc2l0aW9uQWJzPXMucG9zaXRpb25BYnMsdGhpcy5oZWxwZXJQcm9wb3J0aW9ucz1zLmhlbHBlclByb3BvcnRpb25zLHRoaXMub2Zmc2V0LmNsaWNrPXMub2Zmc2V0LmNsaWNrLHRoaXMhPT1hJiZ0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lckNhY2hlKSYmZS5jb250YWlucyhhLmVsZW1lbnRbMF0sdGhpcy5lbGVtZW50WzBdKSYmKG49ITEpLG59KSksbj8oYS5pc092ZXJ8fChhLmlzT3Zlcj0xLHMuX3BhcmVudD1pLmhlbHBlci5wYXJlbnQoKSxhLmN1cnJlbnRJdGVtPWkuaGVscGVyLmFwcGVuZFRvKGEuZWxlbWVudCkuZGF0YSgidWktc29ydGFibGUtaXRlbSIsITApLGEub3B0aW9ucy5faGVscGVyPWEub3B0aW9ucy5oZWxwZXIsYS5vcHRpb25zLmhlbHBlcj1mdW5jdGlvbigpe3JldHVybiBpLmhlbHBlclswXX0sdC50YXJnZXQ9YS5jdXJyZW50SXRlbVswXSxhLl9tb3VzZUNhcHR1cmUodCwhMCksYS5fbW91c2VTdGFydCh0LCEwLCEwKSxhLm9mZnNldC5jbGljay50b3A9cy5vZmZzZXQuY2xpY2sudG9wLGEub2Zmc2V0LmNsaWNrLmxlZnQ9cy5vZmZzZXQuY2xpY2subGVmdCxhLm9mZnNldC5wYXJlbnQubGVmdC09cy5vZmZzZXQucGFyZW50LmxlZnQtYS5vZmZzZXQucGFyZW50LmxlZnQsYS5vZmZzZXQucGFyZW50LnRvcC09cy5vZmZzZXQucGFyZW50LnRvcC1hLm9mZnNldC5wYXJlbnQudG9wLHMuX3RyaWdnZXIoInRvU29ydGFibGUiLHQpLHMuZHJvcHBlZD1hLmVsZW1lbnQsZS5lYWNoKHMuc29ydGFibGVzLGZ1bmN0aW9uKCl7dGhpcy5yZWZyZXNoUG9zaXRpb25zKCl9KSxzLmN1cnJlbnRJdGVtPXMuZWxlbWVudCxhLmZyb21PdXRzaWRlPXMpLGEuY3VycmVudEl0ZW0mJihhLl9tb3VzZURyYWcodCksaS5wb3NpdGlvbj1hLnBvc2l0aW9uKSk6YS5pc092ZXImJihhLmlzT3Zlcj0wLGEuY2FuY2VsSGVscGVyUmVtb3ZhbD0hMCxhLm9wdGlvbnMuX3JldmVydD1hLm9wdGlvbnMucmV2ZXJ0LGEub3B0aW9ucy5yZXZlcnQ9ITEsYS5fdHJpZ2dlcigib3V0Iix0LGEuX3VpSGFzaChhKSksYS5fbW91c2VTdG9wKHQsITApLGEub3B0aW9ucy5yZXZlcnQ9YS5vcHRpb25zLl9yZXZlcnQsYS5vcHRpb25zLmhlbHBlcj1hLm9wdGlvbnMuX2hlbHBlcixhLnBsYWNlaG9sZGVyJiZhLnBsYWNlaG9sZGVyLnJlbW92ZSgpLGkuaGVscGVyLmFwcGVuZFRvKHMuX3BhcmVudCkscy5fcmVmcmVzaE9mZnNldHModCksaS5wb3NpdGlvbj1zLl9nZW5lcmF0ZVBvc2l0aW9uKHQsITApLHMuX3RyaWdnZXIoImZyb21Tb3J0YWJsZSIsdCkscy5kcm9wcGVkPSExLGUuZWFjaChzLnNvcnRhYmxlcyxmdW5jdGlvbigpe3RoaXMucmVmcmVzaFBvc2l0aW9ucygpfSkpfSl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJjdXJzb3IiLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG49ZSgiYm9keSIpLGE9cy5vcHRpb25zO24uY3NzKCJjdXJzb3IiKSYmKGEuX2N1cnNvcj1uLmNzcygiY3Vyc29yIikpLG4uY3NzKCJjdXJzb3IiLGEuY3Vyc29yKX0sc3RvcDpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zO24uX2N1cnNvciYmZSgiYm9keSIpLmNzcygiY3Vyc29yIixuLl9jdXJzb3IpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwib3BhY2l0eSIse3N0YXJ0OmZ1bmN0aW9uKHQsaSxzKXt2YXIgbj1lKGkuaGVscGVyKSxhPXMub3B0aW9ucztuLmNzcygib3BhY2l0eSIpJiYoYS5fb3BhY2l0eT1uLmNzcygib3BhY2l0eSIpKSxuLmNzcygib3BhY2l0eSIsYS5vcGFjaXR5KX0sc3RvcDpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zO24uX29wYWNpdHkmJmUoaS5oZWxwZXIpLmNzcygib3BhY2l0eSIsbi5fb3BhY2l0eSl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzY3JvbGwiLHtzdGFydDpmdW5jdGlvbihlLHQsaSl7aS5zY3JvbGxQYXJlbnROb3RIaWRkZW58fChpLnNjcm9sbFBhcmVudE5vdEhpZGRlbj1pLmhlbHBlci5zY3JvbGxQYXJlbnQoITEpKSxpLnNjcm9sbFBhcmVudE5vdEhpZGRlblswXSE9PWkuZG9jdW1lbnRbMF0mJiJIVE1MIiE9PWkuc2Nyb2xsUGFyZW50Tm90SGlkZGVuWzBdLnRhZ05hbWUmJihpLm92ZXJmbG93T2Zmc2V0PWkuc2Nyb2xsUGFyZW50Tm90SGlkZGVuLm9mZnNldCgpKX0sZHJhZzpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zLGE9ITEsbz1zLnNjcm9sbFBhcmVudE5vdEhpZGRlblswXSxyPXMuZG9jdW1lbnRbMF07byE9PXImJiJIVE1MIiE9PW8udGFnTmFtZT8obi5heGlzJiYieCI9PT1uLmF4aXN8fChzLm92ZXJmbG93T2Zmc2V0LnRvcCtvLm9mZnNldEhlaWdodC10LnBhZ2VZPG4uc2Nyb2xsU2Vuc2l0aXZpdHk/by5zY3JvbGxUb3A9YT1vLnNjcm9sbFRvcCtuLnNjcm9sbFNwZWVkOnQucGFnZVktcy5vdmVyZmxvd09mZnNldC50b3A8bi5zY3JvbGxTZW5zaXRpdml0eSYmKG8uc2Nyb2xsVG9wPWE9by5zY3JvbGxUb3Atbi5zY3JvbGxTcGVlZCkpLG4uYXhpcyYmInkiPT09bi5heGlzfHwocy5vdmVyZmxvd09mZnNldC5sZWZ0K28ub2Zmc2V0V2lkdGgtdC5wYWdlWDxuLnNjcm9sbFNlbnNpdGl2aXR5P28uc2Nyb2xsTGVmdD1hPW8uc2Nyb2xsTGVmdCtuLnNjcm9sbFNwZWVkOnQucGFnZVgtcy5vdmVyZmxvd09mZnNldC5sZWZ0PG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihvLnNjcm9sbExlZnQ9YT1vLnNjcm9sbExlZnQtbi5zY3JvbGxTcGVlZCkpKToobi5heGlzJiYieCI9PT1uLmF4aXN8fCh0LnBhZ2VZLWUocikuc2Nyb2xsVG9wKCk8bi5zY3JvbGxTZW5zaXRpdml0eT9hPWUocikuc2Nyb2xsVG9wKGUocikuc2Nyb2xsVG9wKCktbi5zY3JvbGxTcGVlZCk6ZSh3aW5kb3cpLmhlaWdodCgpLSh0LnBhZ2VZLWUocikuc2Nyb2xsVG9wKCkpPG4uc2Nyb2xsU2Vuc2l0aXZpdHkmJihhPWUocikuc2Nyb2xsVG9wKGUocikuc2Nyb2xsVG9wKCkrbi5zY3JvbGxTcGVlZCkpKSxuLmF4aXMmJiJ5Ij09PW4uYXhpc3x8KHQucGFnZVgtZShyKS5zY3JvbGxMZWZ0KCk8bi5zY3JvbGxTZW5zaXRpdml0eT9hPWUocikuc2Nyb2xsTGVmdChlKHIpLnNjcm9sbExlZnQoKS1uLnNjcm9sbFNwZWVkKTplKHdpbmRvdykud2lkdGgoKS0odC5wYWdlWC1lKHIpLnNjcm9sbExlZnQoKSk8bi5zY3JvbGxTZW5zaXRpdml0eSYmKGE9ZShyKS5zY3JvbGxMZWZ0KGUocikuc2Nyb2xsTGVmdCgpK24uc2Nyb2xsU3BlZWQpKSkpLGEhPT0hMSYmZS51aS5kZG1hbmFnZXImJiFuLmRyb3BCZWhhdmlvdXImJmUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHMsdCl9fSksZS51aS5wbHVnaW4uYWRkKCJkcmFnZ2FibGUiLCJzbmFwIix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPXMub3B0aW9ucztzLnNuYXBFbGVtZW50cz1bXSxlKG4uc25hcC5jb25zdHJ1Y3RvciE9PVN0cmluZz9uLnNuYXAuaXRlbXN8fCI6ZGF0YSh1aS1kcmFnZ2FibGUpIjpuLnNuYXApLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLGk9dC5vZmZzZXQoKTt0aGlzIT09cy5lbGVtZW50WzBdJiZzLnNuYXBFbGVtZW50cy5wdXNoKHtpdGVtOnRoaXMsd2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKSx0b3A6aS50b3AsbGVmdDppLmxlZnR9KX0pfSxkcmFnOmZ1bmN0aW9uKHQsaSxzKXt2YXIgbixhLG8scixoLGwsdSxkLGMscCxmPXMub3B0aW9ucyxtPWYuc25hcFRvbGVyYW5jZSxnPWkub2Zmc2V0LmxlZnQsdj1nK3MuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgseT1pLm9mZnNldC50b3AsYj15K3MuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0O2ZvcihjPXMuc25hcEVsZW1lbnRzLmxlbmd0aC0xO2M+PTA7Yy0tKWg9cy5zbmFwRWxlbWVudHNbY10ubGVmdC1zLm1hcmdpbnMubGVmdCxsPWgrcy5zbmFwRWxlbWVudHNbY10ud2lkdGgsdT1zLnNuYXBFbGVtZW50c1tjXS50b3Atcy5tYXJnaW5zLnRvcCxkPXUrcy5zbmFwRWxlbWVudHNbY10uaGVpZ2h0LGgtbT52fHxnPmwrbXx8dS1tPmJ8fHk+ZCttfHwhZS5jb250YWlucyhzLnNuYXBFbGVtZW50c1tjXS5pdGVtLm93bmVyRG9jdW1lbnQscy5zbmFwRWxlbWVudHNbY10uaXRlbSk/KHMuc25hcEVsZW1lbnRzW2NdLnNuYXBwaW5nJiZzLm9wdGlvbnMuc25hcC5yZWxlYXNlJiZzLm9wdGlvbnMuc25hcC5yZWxlYXNlLmNhbGwocy5lbGVtZW50LHQsZS5leHRlbmQocy5fdWlIYXNoKCkse3NuYXBJdGVtOnMuc25hcEVsZW1lbnRzW2NdLml0ZW19KSkscy5zbmFwRWxlbWVudHNbY10uc25hcHBpbmc9ITEpOigiaW5uZXIiIT09Zi5zbmFwTW9kZSYmKG49bT49TWF0aC5hYnModS1iKSxhPW0+PU1hdGguYWJzKGQteSksbz1tPj1NYXRoLmFicyhoLXYpLHI9bT49TWF0aC5hYnMobC1nKSxuJiYoaS5wb3NpdGlvbi50b3A9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOnUtcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQsbGVmdDowfSkudG9wKSxhJiYoaS5wb3NpdGlvbi50b3A9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOmQsbGVmdDowfSkudG9wKSxvJiYoaS5wb3NpdGlvbi5sZWZ0PXMuX2NvbnZlcnRQb3NpdGlvblRvKCJyZWxhdGl2ZSIse3RvcDowLGxlZnQ6aC1zLmhlbHBlclByb3BvcnRpb25zLndpZHRofSkubGVmdCksciYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omx9KS5sZWZ0KSkscD1ufHxhfHxvfHxyLCJvdXRlciIhPT1mLnNuYXBNb2RlJiYobj1tPj1NYXRoLmFicyh1LXkpLGE9bT49TWF0aC5hYnMoZC1iKSxvPW0+PU1hdGguYWJzKGgtZykscj1tPj1NYXRoLmFicyhsLXYpLG4mJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6dSxsZWZ0OjB9KS50b3ApLGEmJihpLnBvc2l0aW9uLnRvcD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6ZC1zLmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsZWZ0OjB9KS50b3ApLG8mJihpLnBvc2l0aW9uLmxlZnQ9cy5fY29udmVydFBvc2l0aW9uVG8oInJlbGF0aXZlIix7dG9wOjAsbGVmdDpofSkubGVmdCksciYmKGkucG9zaXRpb24ubGVmdD1zLl9jb252ZXJ0UG9zaXRpb25UbygicmVsYXRpdmUiLHt0b3A6MCxsZWZ0Omwtcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aH0pLmxlZnQpKSwhcy5zbmFwRWxlbWVudHNbY10uc25hcHBpbmcmJihufHxhfHxvfHxyfHxwKSYmcy5vcHRpb25zLnNuYXAuc25hcCYmcy5vcHRpb25zLnNuYXAuc25hcC5jYWxsKHMuZWxlbWVudCx0LGUuZXh0ZW5kKHMuX3VpSGFzaCgpLHtzbmFwSXRlbTpzLnNuYXBFbGVtZW50c1tjXS5pdGVtfSkpLHMuc25hcEVsZW1lbnRzW2NdLnNuYXBwaW5nPW58fGF8fG98fHJ8fHApfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwic3RhY2siLHtzdGFydDpmdW5jdGlvbih0LGkscyl7dmFyIG4sYT1zLm9wdGlvbnMsbz1lLm1ha2VBcnJheShlKGEuc3RhY2spKS5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuKHBhcnNlSW50KGUodCkuY3NzKCJ6SW5kZXgiKSwxMCl8fDApLShwYXJzZUludChlKGkpLmNzcygiekluZGV4IiksMTApfHwwKX0pO28ubGVuZ3RoJiYobj1wYXJzZUludChlKG9bMF0pLmNzcygiekluZGV4IiksMTApfHwwLGUobykuZWFjaChmdW5jdGlvbih0KXtlKHRoaXMpLmNzcygiekluZGV4IixuK3QpfSksdGhpcy5jc3MoInpJbmRleCIsbitvLmxlbmd0aCkpfX0pLGUudWkucGx1Z2luLmFkZCgiZHJhZ2dhYmxlIiwiekluZGV4Iix7c3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuPWUoaS5oZWxwZXIpLGE9cy5vcHRpb25zO24uY3NzKCJ6SW5kZXgiKSYmKGEuX3pJbmRleD1uLmNzcygiekluZGV4IikpLG4uY3NzKCJ6SW5kZXgiLGEuekluZGV4KX0sc3RvcDpmdW5jdGlvbih0LGkscyl7dmFyIG49cy5vcHRpb25zO24uX3pJbmRleCYmZShpLmhlbHBlcikuY3NzKCJ6SW5kZXgiLG4uX3pJbmRleCl9fSksZS51aS5kcmFnZ2FibGUsZS53aWRnZXQoInVpLnJlc2l6YWJsZSIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoicmVzaXplIixvcHRpb25zOnthbHNvUmVzaXplOiExLGFuaW1hdGU6ITEsYW5pbWF0ZUR1cmF0aW9uOiJzbG93IixhbmltYXRlRWFzaW5nOiJzd2luZyIsYXNwZWN0UmF0aW86ITEsYXV0b0hpZGU6ITEsY29udGFpbm1lbnQ6ITEsZ2hvc3Q6ITEsZ3JpZDohMSxoYW5kbGVzOiJlLHMsc2UiLGhlbHBlcjohMSxtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxMCxtaW5XaWR0aDoxMCx6SW5kZXg6OTAscmVzaXplOm51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGx9LF9udW06ZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGUsMTApfHwwfSxfaXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIWlzTmFOKHBhcnNlSW50KGUsMTApKX0sX2hhc1Njcm9sbDpmdW5jdGlvbih0LGkpe2lmKCJoaWRkZW4iPT09ZSh0KS5jc3MoIm92ZXJmbG93IikpcmV0dXJuITE7dmFyIHM9aSYmImxlZnQiPT09aT8ic2Nyb2xsTGVmdCI6InNjcm9sbFRvcCIsbj0hMTtyZXR1cm4gdFtzXT4wPyEwOih0W3NdPTEsbj10W3NdPjAsdFtzXT0wLG4pfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQsaSxzLG4sYSxvPXRoaXMscj10aGlzLm9wdGlvbnM7aWYodGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1yZXNpemFibGUiKSxlLmV4dGVuZCh0aGlzLHtfYXNwZWN0UmF0aW86ISFyLmFzcGVjdFJhdGlvLGFzcGVjdFJhdGlvOnIuYXNwZWN0UmF0aW8sb3JpZ2luYWxFbGVtZW50OnRoaXMuZWxlbWVudCxfcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50czpbXSxfaGVscGVyOnIuaGVscGVyfHxyLmdob3N0fHxyLmFuaW1hdGU/ci5oZWxwZXJ8fCJ1aS1yZXNpemFibGUtaGVscGVyIjpudWxsfSksdGhpcy5lbGVtZW50WzBdLm5vZGVOYW1lLm1hdGNoKC9eKGNhbnZhc3x0ZXh0YXJlYXxpbnB1dHxzZWxlY3R8YnV0dG9ufGltZykkL2kpJiYodGhpcy5lbGVtZW50LndyYXAoZSgiPGRpdiBjbGFzcz0ndWktd3JhcHBlcicgc3R5bGU9J292ZXJmbG93OiBoaWRkZW47Jz48L2Rpdj4iKS5jc3Moe3Bvc2l0aW9uOnRoaXMuZWxlbWVudC5jc3MoInBvc2l0aW9uIiksd2lkdGg6dGhpcy5lbGVtZW50Lm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5lbGVtZW50Lm91dGVySGVpZ2h0KCksdG9wOnRoaXMuZWxlbWVudC5jc3MoInRvcCIpLGxlZnQ6dGhpcy5lbGVtZW50LmNzcygibGVmdCIpfSkpLHRoaXMuZWxlbWVudD10aGlzLmVsZW1lbnQucGFyZW50KCkuZGF0YSgidWktcmVzaXphYmxlIix0aGlzLmVsZW1lbnQucmVzaXphYmxlKCJpbnN0YW5jZSIpKSx0aGlzLmVsZW1lbnRJc1dyYXBwZXI9ITAsdGhpcy5lbGVtZW50LmNzcyh7bWFyZ2luTGVmdDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbkxlZnQiKSxtYXJnaW5Ub3A6dGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJtYXJnaW5Ub3AiKSxtYXJnaW5SaWdodDp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpblJpZ2h0IiksbWFyZ2luQm90dG9tOnRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygibWFyZ2luQm90dG9tIil9KSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbkxlZnQ6MCxtYXJnaW5Ub3A6MCxtYXJnaW5SaWdodDowLG1hcmdpbkJvdHRvbTowfSksdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlPXRoaXMub3JpZ2luYWxFbGVtZW50LmNzcygicmVzaXplIiksdGhpcy5vcmlnaW5hbEVsZW1lbnQuY3NzKCJyZXNpemUiLCJub25lIiksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50cy5wdXNoKHRoaXMub3JpZ2luYWxFbGVtZW50LmNzcyh7cG9zaXRpb246InN0YXRpYyIsem9vbToxLGRpc3BsYXk6ImJsb2NrIn0pKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe21hcmdpbjp0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoIm1hcmdpbiIpfSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5oYW5kbGVzPXIuaGFuZGxlc3x8KGUoIi51aS1yZXNpemFibGUtaGFuZGxlIix0aGlzLmVsZW1lbnQpLmxlbmd0aD97bjoiLnVpLXJlc2l6YWJsZS1uIixlOiIudWktcmVzaXphYmxlLWUiLHM6Ii51aS1yZXNpemFibGUtcyIsdzoiLnVpLXJlc2l6YWJsZS13IixzZToiLnVpLXJlc2l6YWJsZS1zZSIsc3c6Ii51aS1yZXNpemFibGUtc3ciLG5lOiIudWktcmVzaXphYmxlLW5lIixudzoiLnVpLXJlc2l6YWJsZS1udyJ9OiJlLHMsc2UiKSx0aGlzLl9oYW5kbGVzPWUoKSx0aGlzLmhhbmRsZXMuY29uc3RydWN0b3I9PT1TdHJpbmcpZm9yKCJhbGwiPT09dGhpcy5oYW5kbGVzJiYodGhpcy5oYW5kbGVzPSJuLGUscyx3LHNlLHN3LG5lLG53IiksdD10aGlzLmhhbmRsZXMuc3BsaXQoIiwiKSx0aGlzLmhhbmRsZXM9e30saT0wO3QubGVuZ3RoPmk7aSsrKXM9ZS50cmltKHRbaV0pLGE9InVpLXJlc2l6YWJsZS0iK3Msbj1lKCI8ZGl2IGNsYXNzPSd1aS1yZXNpemFibGUtaGFuZGxlICIrYSsiJz48L2Rpdj4iKSxuLmNzcyh7ekluZGV4OnIuekluZGV4fSksInNlIj09PXMmJm4uYWRkQ2xhc3MoInVpLWljb24gdWktaWNvbi1ncmlwc21hbGwtZGlhZ29uYWwtc2UiKSx0aGlzLmhhbmRsZXNbc109Ii51aS1yZXNpemFibGUtIitzLHRoaXMuZWxlbWVudC5hcHBlbmQobik7dGhpcy5fcmVuZGVyQXhpcz1mdW5jdGlvbih0KXt2YXIgaSxzLG4sYTt0PXR8fHRoaXMuZWxlbWVudDtmb3IoaSBpbiB0aGlzLmhhbmRsZXMpdGhpcy5oYW5kbGVzW2ldLmNvbnN0cnVjdG9yPT09U3RyaW5nP3RoaXMuaGFuZGxlc1tpXT10aGlzLmVsZW1lbnQuY2hpbGRyZW4odGhpcy5oYW5kbGVzW2ldKS5maXJzdCgpLnNob3coKToodGhpcy5oYW5kbGVzW2ldLmpxdWVyeXx8dGhpcy5oYW5kbGVzW2ldLm5vZGVUeXBlKSYmKHRoaXMuaGFuZGxlc1tpXT1lKHRoaXMuaGFuZGxlc1tpXSksdGhpcy5fb24odGhpcy5oYW5kbGVzW2ldLHttb3VzZWRvd246by5fbW91c2VEb3dufSkpLHRoaXMuZWxlbWVudElzV3JhcHBlciYmdGhpcy5vcmlnaW5hbEVsZW1lbnRbMF0ubm9kZU5hbWUubWF0Y2goL14odGV4dGFyZWF8aW5wdXR8c2VsZWN0fGJ1dHRvbikkL2kpJiYocz1lKHRoaXMuaGFuZGxlc1tpXSx0aGlzLmVsZW1lbnQpLGE9L3N3fG5lfG53fHNlfG58cy8udGVzdChpKT9zLm91dGVySGVpZ2h0KCk6cy5vdXRlcldpZHRoKCksbj1bInBhZGRpbmciLC9uZXxud3xuLy50ZXN0KGkpPyJUb3AiOi9zZXxzd3xzLy50ZXN0KGkpPyJCb3R0b20iOi9eZSQvLnRlc3QoaSk/IlJpZ2h0IjoiTGVmdCJdLmpvaW4oIiIpLHQuY3NzKG4sYSksdGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemUoKSksdGhpcy5faGFuZGxlcz10aGlzLl9oYW5kbGVzLmFkZCh0aGlzLmhhbmRsZXNbaV0pfSx0aGlzLl9yZW5kZXJBeGlzKHRoaXMuZWxlbWVudCksdGhpcy5faGFuZGxlcz10aGlzLl9oYW5kbGVzLmFkZCh0aGlzLmVsZW1lbnQuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKSksdGhpcy5faGFuZGxlcy5kaXNhYmxlU2VsZWN0aW9uKCksdGhpcy5faGFuZGxlcy5tb3VzZW92ZXIoZnVuY3Rpb24oKXtvLnJlc2l6aW5nfHwodGhpcy5jbGFzc05hbWUmJihuPXRoaXMuY2xhc3NOYW1lLm1hdGNoKC91aS1yZXNpemFibGUtKHNlfHN3fG5lfG53fG58ZXxzfHcpL2kpKSxvLmF4aXM9biYmblsxXT9uWzFdOiJzZSIpfSksci5hdXRvSGlkZSYmKHRoaXMuX2hhbmRsZXMuaGlkZSgpLGUodGhpcy5lbGVtZW50KS5hZGRDbGFzcygidWktcmVzaXphYmxlLWF1dG9oaWRlIikubW91c2VlbnRlcihmdW5jdGlvbigpe3IuZGlzYWJsZWR8fChlKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1yZXNpemFibGUtYXV0b2hpZGUiKSxvLl9oYW5kbGVzLnNob3coKSl9KS5tb3VzZWxlYXZlKGZ1bmN0aW9uKCl7ci5kaXNhYmxlZHx8by5yZXNpemluZ3x8KGUodGhpcykuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1hdXRvaGlkZSIpLG8uX2hhbmRsZXMuaGlkZSgpKX0pKSx0aGlzLl9tb3VzZUluaXQoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLl9tb3VzZURlc3Ryb3koKTt2YXIgdCxpPWZ1bmN0aW9uKHQpe2UodCkucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZSB1aS1yZXNpemFibGUtZGlzYWJsZWQgdWktcmVzaXphYmxlLXJlc2l6aW5nIikucmVtb3ZlRGF0YSgicmVzaXphYmxlIikucmVtb3ZlRGF0YSgidWktcmVzaXphYmxlIikudW5iaW5kKCIucmVzaXphYmxlIikuZmluZCgiLnVpLXJlc2l6YWJsZS1oYW5kbGUiKS5yZW1vdmUoKX07cmV0dXJuIHRoaXMuZWxlbWVudElzV3JhcHBlciYmKGkodGhpcy5lbGVtZW50KSx0PXRoaXMuZWxlbWVudCx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3Moe3Bvc2l0aW9uOnQuY3NzKCJwb3NpdGlvbiIpLHdpZHRoOnQub3V0ZXJXaWR0aCgpLGhlaWdodDp0Lm91dGVySGVpZ2h0KCksdG9wOnQuY3NzKCJ0b3AiKSxsZWZ0OnQuY3NzKCJsZWZ0Iil9KS5pbnNlcnRBZnRlcih0KSx0LnJlbW92ZSgpKSx0aGlzLm9yaWdpbmFsRWxlbWVudC5jc3MoInJlc2l6ZSIsdGhpcy5vcmlnaW5hbFJlc2l6ZVN0eWxlKSxpKHRoaXMub3JpZ2luYWxFbGVtZW50KSx0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj0hMTtmb3IoaSBpbiB0aGlzLmhhbmRsZXMpcz1lKHRoaXMuaGFuZGxlc1tpXSlbMF0sKHM9PT10LnRhcmdldHx8ZS5jb250YWlucyhzLHQudGFyZ2V0KSkmJihuPSEwKTtyZXR1cm4hdGhpcy5vcHRpb25zLmRpc2FibGVkJiZufSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYT10aGlzLm9wdGlvbnMsbz10aGlzLmVsZW1lbnQ7cmV0dXJuIHRoaXMucmVzaXppbmc9ITAsdGhpcy5fcmVuZGVyUHJveHkoKSxpPXRoaXMuX251bSh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSkscz10aGlzLl9udW0odGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSksYS5jb250YWlubWVudCYmKGkrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsTGVmdCgpfHwwLHMrPWUoYS5jb250YWlubWVudCkuc2Nyb2xsVG9wKCl8fDApLHRoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMucG9zaXRpb249e2xlZnQ6aSx0b3A6c30sdGhpcy5zaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6dGhpcy5oZWxwZXIud2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIuaGVpZ2h0KCl9Ont3aWR0aDpvLndpZHRoKCksaGVpZ2h0Om8uaGVpZ2h0KCl9LHRoaXMub3JpZ2luYWxTaXplPXRoaXMuX2hlbHBlcj97d2lkdGg6by5vdXRlcldpZHRoKCksaGVpZ2h0Om8ub3V0ZXJIZWlnaHQoKX06e3dpZHRoOm8ud2lkdGgoKSxoZWlnaHQ6by5oZWlnaHQoKX0sdGhpcy5zaXplRGlmZj17d2lkdGg6by5vdXRlcldpZHRoKCktby53aWR0aCgpLGhlaWdodDpvLm91dGVySGVpZ2h0KCktby5oZWlnaHQoKX0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtsZWZ0OmksdG9wOnN9LHRoaXMub3JpZ2luYWxNb3VzZVBvc2l0aW9uPXtsZWZ0OnQucGFnZVgsdG9wOnQucGFnZVl9LHRoaXMuYXNwZWN0UmF0aW89Im51bWJlciI9PXR5cGVvZiBhLmFzcGVjdFJhdGlvP2EuYXNwZWN0UmF0aW86dGhpcy5vcmlnaW5hbFNpemUud2lkdGgvdGhpcy5vcmlnaW5hbFNpemUuaGVpZ2h0fHwxLG49ZSgiLnVpLXJlc2l6YWJsZS0iK3RoaXMuYXhpcykuY3NzKCJjdXJzb3IiKSxlKCJib2R5IikuY3NzKCJjdXJzb3IiLCJhdXRvIj09PW4/dGhpcy5heGlzKyItcmVzaXplIjpuKSxvLmFkZENsYXNzKCJ1aS1yZXNpemFibGUtcmVzaXppbmciKSx0aGlzLl9wcm9wYWdhdGUoInN0YXJ0Iix0KSwhMH0sX21vdXNlRHJhZzpmdW5jdGlvbih0KXt2YXIgaSxzLG49dGhpcy5vcmlnaW5hbE1vdXNlUG9zaXRpb24sYT10aGlzLmF4aXMsbz10LnBhZ2VYLW4ubGVmdHx8MCxyPXQucGFnZVktbi50b3B8fDAsaD10aGlzLl9jaGFuZ2VbYV07cmV0dXJuIHRoaXMuX3VwZGF0ZVByZXZQcm9wZXJ0aWVzKCksaD8oaT1oLmFwcGx5KHRoaXMsW3QsbyxyXSksdGhpcy5fdXBkYXRlVmlydHVhbEJvdW5kYXJpZXModC5zaGlmdEtleSksKHRoaXMuX2FzcGVjdFJhdGlvfHx0LnNoaWZ0S2V5KSYmKGk9dGhpcy5fdXBkYXRlUmF0aW8oaSx0KSksaT10aGlzLl9yZXNwZWN0U2l6ZShpLHQpLHRoaXMuX3VwZGF0ZUNhY2hlKGkpLHRoaXMuX3Byb3BhZ2F0ZSgicmVzaXplIix0KSxzPXRoaXMuX2FwcGx5Q2hhbmdlcygpLCF0aGlzLl9oZWxwZXImJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZSgpLGUuaXNFbXB0eU9iamVjdChzKXx8KHRoaXMuX3VwZGF0ZVByZXZQcm9wZXJ0aWVzKCksdGhpcy5fdHJpZ2dlcigicmVzaXplIix0LHRoaXMudWkoKSksdGhpcy5fYXBwbHlDaGFuZ2VzKCkpLCExKTohMX0sX21vdXNlU3RvcDpmdW5jdGlvbih0KXt0aGlzLnJlc2l6aW5nPSExO3ZhciBpLHMsbixhLG8scixoLGw9dGhpcy5vcHRpb25zLHU9dGhpcztyZXR1cm4gdGhpcy5faGVscGVyJiYoaT10aGlzLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLHM9aS5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoaVswXS5ub2RlTmFtZSksbj1zJiZ0aGlzLl9oYXNTY3JvbGwoaVswXSwibGVmdCIpPzA6dS5zaXplRGlmZi5oZWlnaHQsYT1zPzA6dS5zaXplRGlmZi53aWR0aCxvPXt3aWR0aDp1LmhlbHBlci53aWR0aCgpLWEsaGVpZ2h0OnUuaGVscGVyLmhlaWdodCgpLW59LHI9cGFyc2VJbnQodS5lbGVtZW50LmNzcygibGVmdCIpLDEwKSsodS5wb3NpdGlvbi5sZWZ0LXUub3JpZ2luYWxQb3NpdGlvbi5sZWZ0KXx8bnVsbCxoPXBhcnNlSW50KHUuZWxlbWVudC5jc3MoInRvcCIpLDEwKSsodS5wb3NpdGlvbi50b3AtdS5vcmlnaW5hbFBvc2l0aW9uLnRvcCl8fG51bGwsbC5hbmltYXRlfHx0aGlzLmVsZW1lbnQuY3NzKGUuZXh0ZW5kKG8se3RvcDpoLGxlZnQ6cn0pKSx1LmhlbHBlci5oZWlnaHQodS5zaXplLmhlaWdodCksdS5oZWxwZXIud2lkdGgodS5zaXplLndpZHRoKSx0aGlzLl9oZWxwZXImJiFsLmFuaW1hdGUmJnRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplKCkpLGUoImJvZHkiKS5jc3MoImN1cnNvciIsImF1dG8iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXJlc2l6YWJsZS1yZXNpemluZyIpLHRoaXMuX3Byb3BhZ2F0ZSgic3RvcCIsdCksdGhpcy5faGVscGVyJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSwhMX0sX3VwZGF0ZVByZXZQcm9wZXJ0aWVzOmZ1bmN0aW9uKCl7dGhpcy5wcmV2UG9zaXRpb249e3RvcDp0aGlzLnBvc2l0aW9uLnRvcCxsZWZ0OnRoaXMucG9zaXRpb24ubGVmdH0sdGhpcy5wcmV2U2l6ZT17d2lkdGg6dGhpcy5zaXplLndpZHRoLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0fX0sX2FwcGx5Q2hhbmdlczpmdW5jdGlvbigpe3ZhciBlPXt9O3JldHVybiB0aGlzLnBvc2l0aW9uLnRvcCE9PXRoaXMucHJldlBvc2l0aW9uLnRvcCYmKGUudG9wPXRoaXMucG9zaXRpb24udG9wKyJweCIpLHRoaXMucG9zaXRpb24ubGVmdCE9PXRoaXMucHJldlBvc2l0aW9uLmxlZnQmJihlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIpLHRoaXMuc2l6ZS53aWR0aCE9PXRoaXMucHJldlNpemUud2lkdGgmJihlLndpZHRoPXRoaXMuc2l6ZS53aWR0aCsicHgiKSx0aGlzLnNpemUuaGVpZ2h0IT09dGhpcy5wcmV2U2l6ZS5oZWlnaHQmJihlLmhlaWdodD10aGlzLnNpemUuaGVpZ2h0KyJweCIpLHRoaXMuaGVscGVyLmNzcyhlKSxlfSxfdXBkYXRlVmlydHVhbEJvdW5kYXJpZXM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzLG4sYSxvPXRoaXMub3B0aW9uczthPXttaW5XaWR0aDp0aGlzLl9pc051bWJlcihvLm1pbldpZHRoKT9vLm1pbldpZHRoOjAsbWF4V2lkdGg6dGhpcy5faXNOdW1iZXIoby5tYXhXaWR0aCk/by5tYXhXaWR0aDoxLzAsbWluSGVpZ2h0OnRoaXMuX2lzTnVtYmVyKG8ubWluSGVpZ2h0KT9vLm1pbkhlaWdodDowLG1heEhlaWdodDp0aGlzLl9pc051bWJlcihvLm1heEhlaWdodCk/by5tYXhIZWlnaHQ6MS8wfSwodGhpcy5fYXNwZWN0UmF0aW98fGUpJiYodD1hLm1pbkhlaWdodCp0aGlzLmFzcGVjdFJhdGlvLHM9YS5taW5XaWR0aC90aGlzLmFzcGVjdFJhdGlvLGk9YS5tYXhIZWlnaHQqdGhpcy5hc3BlY3RSYXRpbyxuPWEubWF4V2lkdGgvdGhpcy5hc3BlY3RSYXRpbyx0PmEubWluV2lkdGgmJihhLm1pbldpZHRoPXQpLHM+YS5taW5IZWlnaHQmJihhLm1pbkhlaWdodD1zKSxhLm1heFdpZHRoPmkmJihhLm1heFdpZHRoPWkpLGEubWF4SGVpZ2h0Pm4mJihhLm1heEhlaWdodD1uKSksdGhpcy5fdkJvdW5kYXJpZXM9YX0sX3VwZGF0ZUNhY2hlOmZ1bmN0aW9uKGUpe3RoaXMub2Zmc2V0PXRoaXMuaGVscGVyLm9mZnNldCgpLHRoaXMuX2lzTnVtYmVyKGUubGVmdCkmJih0aGlzLnBvc2l0aW9uLmxlZnQ9ZS5sZWZ0KSx0aGlzLl9pc051bWJlcihlLnRvcCkmJih0aGlzLnBvc2l0aW9uLnRvcD1lLnRvcCksdGhpcy5faXNOdW1iZXIoZS5oZWlnaHQpJiYodGhpcy5zaXplLmhlaWdodD1lLmhlaWdodCksdGhpcy5faXNOdW1iZXIoZS53aWR0aCkmJih0aGlzLnNpemUud2lkdGg9ZS53aWR0aCl9LF91cGRhdGVSYXRpbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvc2l0aW9uLGk9dGhpcy5zaXplLHM9dGhpcy5heGlzO3JldHVybiB0aGlzLl9pc051bWJlcihlLmhlaWdodCk/ZS53aWR0aD1lLmhlaWdodCp0aGlzLmFzcGVjdFJhdGlvOnRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiYoZS5oZWlnaHQ9ZS53aWR0aC90aGlzLmFzcGVjdFJhdGlvKSwic3ciPT09cyYmKGUubGVmdD10LmxlZnQrKGkud2lkdGgtZS53aWR0aCksZS50b3A9bnVsbCksIm53Ij09PXMmJihlLnRvcD10LnRvcCsoaS5oZWlnaHQtZS5oZWlnaHQpLGUubGVmdD10LmxlZnQrKGkud2lkdGgtZS53aWR0aCkpLGV9LF9yZXNwZWN0U2l6ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl92Qm91bmRhcmllcyxpPXRoaXMuYXhpcyxzPXRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiZ0Lm1heFdpZHRoJiZ0Lm1heFdpZHRoPGUud2lkdGgsbj10aGlzLl9pc051bWJlcihlLmhlaWdodCkmJnQubWF4SGVpZ2h0JiZ0Lm1heEhlaWdodDxlLmhlaWdodCxhPXRoaXMuX2lzTnVtYmVyKGUud2lkdGgpJiZ0Lm1pbldpZHRoJiZ0Lm1pbldpZHRoPmUud2lkdGgsbz10aGlzLl9pc051bWJlcihlLmhlaWdodCkmJnQubWluSGVpZ2h0JiZ0Lm1pbkhlaWdodD5lLmhlaWdodCxyPXRoaXMub3JpZ2luYWxQb3NpdGlvbi5sZWZ0K3RoaXMub3JpZ2luYWxTaXplLndpZHRoLGg9dGhpcy5wb3NpdGlvbi50b3ArdGhpcy5zaXplLmhlaWdodCxsPS9zd3xud3x3Ly50ZXN0KGkpLHU9L253fG5lfG4vLnRlc3QoaSk7cmV0dXJuIGEmJihlLndpZHRoPXQubWluV2lkdGgpLG8mJihlLmhlaWdodD10Lm1pbkhlaWdodCkscyYmKGUud2lkdGg9dC5tYXhXaWR0aCksbiYmKGUuaGVpZ2h0PXQubWF4SGVpZ2h0KSxhJiZsJiYoZS5sZWZ0PXItdC5taW5XaWR0aCkscyYmbCYmKGUubGVmdD1yLXQubWF4V2lkdGgpLG8mJnUmJihlLnRvcD1oLXQubWluSGVpZ2h0KSxuJiZ1JiYoZS50b3A9aC10Lm1heEhlaWdodCksZS53aWR0aHx8ZS5oZWlnaHR8fGUubGVmdHx8IWUudG9wP2Uud2lkdGh8fGUuaGVpZ2h0fHxlLnRvcHx8IWUubGVmdHx8KGUubGVmdD1udWxsKTplLnRvcD1udWxsLGV9LF9nZXRQYWRkaW5nUGx1c0JvcmRlckRpbWVuc2lvbnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsaT1bXSxzPVtlLmNzcygiYm9yZGVyVG9wV2lkdGgiKSxlLmNzcygiYm9yZGVyUmlnaHRXaWR0aCIpLGUuY3NzKCJib3JkZXJCb3R0b21XaWR0aCIpLGUuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKV0sbj1bZS5jc3MoInBhZGRpbmdUb3AiKSxlLmNzcygicGFkZGluZ1JpZ2h0IiksZS5jc3MoInBhZGRpbmdCb3R0b20iKSxlLmNzcygicGFkZGluZ0xlZnQiKV07ND50O3QrKylpW3RdPXBhcnNlSW50KHNbdF0sMTApfHwwLGlbdF0rPXBhcnNlSW50KG5bdF0sMTApfHwwO3JldHVybntoZWlnaHQ6aVswXStpWzJdLHdpZHRoOmlbMV0raVszXX19LF9wcm9wb3J0aW9uYWxseVJlc2l6ZTpmdW5jdGlvbigpe2lmKHRoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoKWZvcih2YXIgZSx0PTAsaT10aGlzLmhlbHBlcnx8dGhpcy5lbGVtZW50O3RoaXMuX3Byb3BvcnRpb25hbGx5UmVzaXplRWxlbWVudHMubGVuZ3RoPnQ7dCsrKWU9dGhpcy5fcHJvcG9ydGlvbmFsbHlSZXNpemVFbGVtZW50c1t0XSx0aGlzLm91dGVyRGltZW5zaW9uc3x8KHRoaXMub3V0ZXJEaW1lbnNpb25zPXRoaXMuX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9ucyhlKSksZS5jc3Moe2hlaWdodDppLmhlaWdodCgpLXRoaXMub3V0ZXJEaW1lbnNpb25zLmhlaWdodHx8MCx3aWR0aDppLndpZHRoKCktdGhpcy5vdXRlckRpbWVuc2lvbnMud2lkdGh8fDB9KX0sX3JlbmRlclByb3h5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50LGk9dGhpcy5vcHRpb25zO3RoaXMuZWxlbWVudE9mZnNldD10Lm9mZnNldCgpLHRoaXMuX2hlbHBlcj8odGhpcy5oZWxwZXI9dGhpcy5oZWxwZXJ8fGUoIjxkaXYgc3R5bGU9J292ZXJmbG93OmhpZGRlbjsnPjwvZGl2PiIpLHRoaXMuaGVscGVyLmFkZENsYXNzKHRoaXMuX2hlbHBlcikuY3NzKHt3aWR0aDp0aGlzLmVsZW1lbnQub3V0ZXJXaWR0aCgpLTEsaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpLTEscG9zaXRpb246ImFic29sdXRlIixsZWZ0OnRoaXMuZWxlbWVudE9mZnNldC5sZWZ0KyJweCIsdG9wOnRoaXMuZWxlbWVudE9mZnNldC50b3ArInB4Iix6SW5kZXg6KytpLnpJbmRleH0pLHRoaXMuaGVscGVyLmFwcGVuZFRvKCJib2R5IikuZGlzYWJsZVNlbGVjdGlvbigpKTp0aGlzLmhlbHBlcj10aGlzLmVsZW1lbnR9LF9jaGFuZ2U6e2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm57d2lkdGg6dGhpcy5vcmlnaW5hbFNpemUud2lkdGgrdH19LHc6ZnVuY3Rpb24oZSx0KXt2YXIgaT10aGlzLm9yaWdpbmFsU2l6ZSxzPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57bGVmdDpzLmxlZnQrdCx3aWR0aDppLndpZHRoLXR9fSxuOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcz10aGlzLm9yaWdpbmFsU2l6ZSxuPXRoaXMub3JpZ2luYWxQb3NpdGlvbjtyZXR1cm57dG9wOm4udG9wK2ksaGVpZ2h0OnMuaGVpZ2h0LWl9fSxzOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm57aGVpZ2h0OnRoaXMub3JpZ2luYWxTaXplLmhlaWdodCtpfX0sc2U6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uucy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLmUuYXBwbHkodGhpcyxbdCxpLHNdKSl9LHN3OmZ1bmN0aW9uKHQsaSxzKXtyZXR1cm4gZS5leHRlbmQodGhpcy5fY2hhbmdlLnMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2NoYW5nZS53LmFwcGx5KHRoaXMsW3QsaSxzXSkpfSxuZTpmdW5jdGlvbih0LGkscyl7cmV0dXJuIGUuZXh0ZW5kKHRoaXMuX2NoYW5nZS5uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl9jaGFuZ2UuZS5hcHBseSh0aGlzLFt0LGksc10pKX0sbnc6ZnVuY3Rpb24odCxpLHMpe3JldHVybiBlLmV4dGVuZCh0aGlzLl9jaGFuZ2Uubi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5fY2hhbmdlLncuYXBwbHkodGhpcyxbdCxpLHNdKSl9fSxfcHJvcGFnYXRlOmZ1bmN0aW9uKHQsaSl7ZS51aS5wbHVnaW4uY2FsbCh0aGlzLHQsW2ksdGhpcy51aSgpXSksInJlc2l6ZSIhPT10JiZ0aGlzLl90cmlnZ2VyKHQsaSx0aGlzLnVpKCkpfSxwbHVnaW5zOnt9LHVpOmZ1bmN0aW9uKCl7cmV0dXJue29yaWdpbmFsRWxlbWVudDp0aGlzLm9yaWdpbmFsRWxlbWVudCxlbGVtZW50OnRoaXMuZWxlbWVudCxoZWxwZXI6dGhpcy5oZWxwZXIscG9zaXRpb246dGhpcy5wb3NpdGlvbixzaXplOnRoaXMuc2l6ZSxvcmlnaW5hbFNpemU6dGhpcy5vcmlnaW5hbFNpemUsb3JpZ2luYWxQb3NpdGlvbjp0aGlzLm9yaWdpbmFsUG9zaXRpb259fX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiYW5pbWF0ZSIse3N0b3A6ZnVuY3Rpb24odCl7dmFyIGk9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIikscz1pLm9wdGlvbnMsbj1pLl9wcm9wb3J0aW9uYWxseVJlc2l6ZUVsZW1lbnRzLGE9bi5sZW5ndGgmJi90ZXh0YXJlYS9pLnRlc3QoblswXS5ub2RlTmFtZSksbz1hJiZpLl9oYXNTY3JvbGwoblswXSwibGVmdCIpPzA6aS5zaXplRGlmZi5oZWlnaHQscj1hPzA6aS5zaXplRGlmZi53aWR0aCxoPXt3aWR0aDppLnNpemUud2lkdGgtcixoZWlnaHQ6aS5zaXplLmhlaWdodC1vfSxsPXBhcnNlSW50KGkuZWxlbWVudC5jc3MoImxlZnQiKSwxMCkrKGkucG9zaXRpb24ubGVmdC1pLm9yaWdpbmFsUG9zaXRpb24ubGVmdCl8fG51bGwsdT1wYXJzZUludChpLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCkrKGkucG9zaXRpb24udG9wLWkub3JpZ2luYWxQb3NpdGlvbi50b3ApfHxudWxsO2kuZWxlbWVudC5hbmltYXRlKGUuZXh0ZW5kKGgsdSYmbD97dG9wOnUsbGVmdDpsfTp7fSkse2R1cmF0aW9uOnMuYW5pbWF0ZUR1cmF0aW9uLGVhc2luZzpzLmFuaW1hdGVFYXNpbmcsc3RlcDpmdW5jdGlvbigpe3ZhciBzPXt3aWR0aDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJ3aWR0aCIpLDEwKSxoZWlnaHQ6cGFyc2VJbnQoaS5lbGVtZW50LmNzcygiaGVpZ2h0IiksMTApLHRvcDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJ0b3AiKSwxMCksbGVmdDpwYXJzZUludChpLmVsZW1lbnQuY3NzKCJsZWZ0IiksMTApfTtuJiZuLmxlbmd0aCYmZShuWzBdKS5jc3Moe3dpZHRoOnMud2lkdGgsaGVpZ2h0OnMuaGVpZ2h0fSksaS5fdXBkYXRlQ2FjaGUocyksaS5fcHJvcGFnYXRlKCJyZXNpemUiLHQpfX0pfX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiY29udGFpbm1lbnQiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0LGkscyxuLGEsbyxyLGg9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIiksbD1oLm9wdGlvbnMsdT1oLmVsZW1lbnQsZD1sLmNvbnRhaW5tZW50LGM9ZCBpbnN0YW5jZW9mIGU/ZC5nZXQoMCk6L3BhcmVudC8udGVzdChkKT91LnBhcmVudCgpLmdldCgwKTpkO2MmJihoLmNvbnRhaW5lckVsZW1lbnQ9ZShjKSwvZG9jdW1lbnQvLnRlc3QoZCl8fGQ9PT1kb2N1bWVudD8oaC5jb250YWluZXJPZmZzZXQ9e2xlZnQ6MCx0b3A6MH0saC5jb250YWluZXJQb3NpdGlvbj17bGVmdDowLHRvcDowfSxoLnBhcmVudERhdGE9e2VsZW1lbnQ6ZShkb2N1bWVudCksbGVmdDowLHRvcDowLHdpZHRoOmUoZG9jdW1lbnQpLndpZHRoKCksaGVpZ2h0OmUoZG9jdW1lbnQpLmhlaWdodCgpfHxkb2N1bWVudC5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0fSk6KHQ9ZShjKSxpPVtdLGUoWyJUb3AiLCJSaWdodCIsIkxlZnQiLCJCb3R0b20iXSkuZWFjaChmdW5jdGlvbihlLHMpe2lbZV09aC5fbnVtKHQuY3NzKCJwYWRkaW5nIitzKSl9KSxoLmNvbnRhaW5lck9mZnNldD10Lm9mZnNldCgpLGguY29udGFpbmVyUG9zaXRpb249dC5wb3NpdGlvbigpLGguY29udGFpbmVyU2l6ZT17aGVpZ2h0OnQuaW5uZXJIZWlnaHQoKS1pWzNdLHdpZHRoOnQuaW5uZXJXaWR0aCgpLWlbMV19LHM9aC5jb250YWluZXJPZmZzZXQsbj1oLmNvbnRhaW5lclNpemUuaGVpZ2h0LGE9aC5jb250YWluZXJTaXplLndpZHRoLG89aC5faGFzU2Nyb2xsKGMsImxlZnQiKT9jLnNjcm9sbFdpZHRoOmEscj1oLl9oYXNTY3JvbGwoYyk/Yy5zY3JvbGxIZWlnaHQ6bixoLnBhcmVudERhdGE9e2VsZW1lbnQ6YyxsZWZ0OnMubGVmdCx0b3A6cy50b3Asd2lkdGg6byxoZWlnaHQ6cn0pKX0scmVzaXplOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG89ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIikscj1vLm9wdGlvbnMsaD1vLmNvbnRhaW5lck9mZnNldCxsPW8ucG9zaXRpb24sdT1vLl9hc3BlY3RSYXRpb3x8dC5zaGlmdEtleSxkPXt0b3A6MCxsZWZ0OjB9LGM9by5jb250YWluZXJFbGVtZW50LHA9ITA7Y1swXSE9PWRvY3VtZW50JiYvc3RhdGljLy50ZXN0KGMuY3NzKCJwb3NpdGlvbiIpKSYmKGQ9aCksbC5sZWZ0PChvLl9oZWxwZXI/aC5sZWZ0OjApJiYoby5zaXplLndpZHRoPW8uc2l6ZS53aWR0aCsoby5faGVscGVyP28ucG9zaXRpb24ubGVmdC1oLmxlZnQ6by5wb3NpdGlvbi5sZWZ0LWQubGVmdCksdSYmKG8uc2l6ZS5oZWlnaHQ9by5zaXplLndpZHRoL28uYXNwZWN0UmF0aW8scD0hMSksby5wb3NpdGlvbi5sZWZ0PXIuaGVscGVyP2gubGVmdDowKSxsLnRvcDwoby5faGVscGVyP2gudG9wOjApJiYoby5zaXplLmhlaWdodD1vLnNpemUuaGVpZ2h0KyhvLl9oZWxwZXI/by5wb3NpdGlvbi50b3AtaC50b3A6by5wb3NpdGlvbi50b3ApLHUmJihvLnNpemUud2lkdGg9by5zaXplLmhlaWdodCpvLmFzcGVjdFJhdGlvLHA9ITEpLG8ucG9zaXRpb24udG9wPW8uX2hlbHBlcj9oLnRvcDowKSxuPW8uY29udGFpbmVyRWxlbWVudC5nZXQoMCk9PT1vLmVsZW1lbnQucGFyZW50KCkuZ2V0KDApLGE9L3JlbGF0aXZlfGFic29sdXRlLy50ZXN0KG8uY29udGFpbmVyRWxlbWVudC5jc3MoInBvc2l0aW9uIikpLG4mJmE/KG8ub2Zmc2V0LmxlZnQ9by5wYXJlbnREYXRhLmxlZnQrby5wb3NpdGlvbi5sZWZ0LG8ub2Zmc2V0LnRvcD1vLnBhcmVudERhdGEudG9wK28ucG9zaXRpb24udG9wKTooby5vZmZzZXQubGVmdD1vLmVsZW1lbnQub2Zmc2V0KCkubGVmdCxvLm9mZnNldC50b3A9by5lbGVtZW50Lm9mZnNldCgpLnRvcCksaT1NYXRoLmFicyhvLnNpemVEaWZmLndpZHRoKyhvLl9oZWxwZXI/by5vZmZzZXQubGVmdC1kLmxlZnQ6by5vZmZzZXQubGVmdC1oLmxlZnQpKSxzPU1hdGguYWJzKG8uc2l6ZURpZmYuaGVpZ2h0KyhvLl9oZWxwZXI/by5vZmZzZXQudG9wLWQudG9wOm8ub2Zmc2V0LnRvcC1oLnRvcCkpLGkrby5zaXplLndpZHRoPj1vLnBhcmVudERhdGEud2lkdGgmJihvLnNpemUud2lkdGg9by5wYXJlbnREYXRhLndpZHRoLWksdSYmKG8uc2l6ZS5oZWlnaHQ9by5zaXplLndpZHRoL28uYXNwZWN0UmF0aW8scD0hMSkpLHMrby5zaXplLmhlaWdodD49by5wYXJlbnREYXRhLmhlaWdodCYmKG8uc2l6ZS5oZWlnaHQ9by5wYXJlbnREYXRhLmhlaWdodC1zLHUmJihvLnNpemUud2lkdGg9by5zaXplLmhlaWdodCpvLmFzcGVjdFJhdGlvLHA9ITEpKSxwfHwoby5wb3NpdGlvbi5sZWZ0PW8ucHJldlBvc2l0aW9uLmxlZnQsby5wb3NpdGlvbi50b3A9by5wcmV2UG9zaXRpb24udG9wLG8uc2l6ZS53aWR0aD1vLnByZXZTaXplLndpZHRoLG8uc2l6ZS5oZWlnaHQ9by5wcmV2U2l6ZS5oZWlnaHQpfSxzdG9wOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIiksaT10Lm9wdGlvbnMscz10LmNvbnRhaW5lck9mZnNldCxuPXQuY29udGFpbmVyUG9zaXRpb24sYT10LmNvbnRhaW5lckVsZW1lbnQsbz1lKHQuaGVscGVyKSxyPW8ub2Zmc2V0KCksaD1vLm91dGVyV2lkdGgoKS10LnNpemVEaWZmLndpZHRoLGw9by5vdXRlckhlaWdodCgpLXQuc2l6ZURpZmYuaGVpZ2h0O3QuX2hlbHBlciYmIWkuYW5pbWF0ZSYmL3JlbGF0aXZlLy50ZXN0KGEuY3NzKCJwb3NpdGlvbiIpKSYmZSh0aGlzKS5jc3Moe2xlZnQ6ci5sZWZ0LW4ubGVmdC1zLmxlZnQsd2lkdGg6aCxoZWlnaHQ6bH0pLHQuX2hlbHBlciYmIWkuYW5pbWF0ZSYmL3N0YXRpYy8udGVzdChhLmNzcygicG9zaXRpb24iKSkmJmUodGhpcykuY3NzKHtsZWZ0OnIubGVmdC1uLmxlZnQtcy5sZWZ0LHdpZHRoOmgsaGVpZ2h0Omx9KX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImFsc29SZXNpemUiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLGk9dC5vcHRpb25zO2UoaS5hbHNvUmVzaXplKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTt0LmRhdGEoInVpLXJlc2l6YWJsZS1hbHNvcmVzaXplIix7d2lkdGg6cGFyc2VJbnQodC53aWR0aCgpLDEwKSxoZWlnaHQ6cGFyc2VJbnQodC5oZWlnaHQoKSwxMCksbGVmdDpwYXJzZUludCh0LmNzcygibGVmdCIpLDEwKSx0b3A6cGFyc2VJbnQodC5jc3MoInRvcCIpLDEwKX0pfSl9LHJlc2l6ZTpmdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLG49cy5vcHRpb25zLGE9cy5vcmlnaW5hbFNpemUsbz1zLm9yaWdpbmFsUG9zaXRpb24scj17aGVpZ2h0OnMuc2l6ZS5oZWlnaHQtYS5oZWlnaHR8fDAsd2lkdGg6cy5zaXplLndpZHRoLWEud2lkdGh8fDAsdG9wOnMucG9zaXRpb24udG9wLW8udG9wfHwwLGxlZnQ6cy5wb3NpdGlvbi5sZWZ0LW8ubGVmdHx8MH07ZShuLmFsc29SZXNpemUpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLHM9ZSh0aGlzKS5kYXRhKCJ1aS1yZXNpemFibGUtYWxzb3Jlc2l6ZSIpLG49e30sYT10LnBhcmVudHMoaS5vcmlnaW5hbEVsZW1lbnRbMF0pLmxlbmd0aD9bIndpZHRoIiwiaGVpZ2h0Il06WyJ3aWR0aCIsImhlaWdodCIsInRvcCIsImxlZnQiXTtlLmVhY2goYSxmdW5jdGlvbihlLHQpe3ZhciBpPShzW3RdfHwwKSsoclt0XXx8MCk7aSYmaT49MCYmKG5bdF09aXx8bnVsbCl9KSx0LmNzcyhuKX0pfSxzdG9wOmZ1bmN0aW9uKCl7ZSh0aGlzKS5yZW1vdmVEYXRhKCJyZXNpemFibGUtYWxzb3Jlc2l6ZSIpfX0pLGUudWkucGx1Z2luLmFkZCgicmVzaXphYmxlIiwiZ2hvc3QiLHtzdGFydDpmdW5jdGlvbigpe3ZhciB0PWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLGk9dC5vcHRpb25zLHM9dC5zaXplO3QuZ2hvc3Q9dC5vcmlnaW5hbEVsZW1lbnQuY2xvbmUoKSx0Lmdob3N0LmNzcyh7b3BhY2l0eTouMjUsZGlzcGxheToiYmxvY2siLHBvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OnMuaGVpZ2h0LHdpZHRoOnMud2lkdGgsbWFyZ2luOjAsbGVmdDowLHRvcDowfSkuYWRkQ2xhc3MoInVpLXJlc2l6YWJsZS1naG9zdCIpLmFkZENsYXNzKCJzdHJpbmciPT10eXBlb2YgaS5naG9zdD9pLmdob3N0OiIiKSx0Lmdob3N0LmFwcGVuZFRvKHQuaGVscGVyKX0scmVzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5yZXNpemFibGUoImluc3RhbmNlIik7dC5naG9zdCYmdC5naG9zdC5jc3Moe3Bvc2l0aW9uOiJyZWxhdGl2ZSIsaGVpZ2h0OnQuc2l6ZS5oZWlnaHQsd2lkdGg6dC5zaXplLndpZHRofSl9LHN0b3A6ZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLnJlc2l6YWJsZSgiaW5zdGFuY2UiKTt0Lmdob3N0JiZ0LmhlbHBlciYmdC5oZWxwZXIuZ2V0KDApLnJlbW92ZUNoaWxkKHQuZ2hvc3QuZ2V0KDApKX19KSxlLnVpLnBsdWdpbi5hZGQoInJlc2l6YWJsZSIsImdyaWQiLHtyZXNpemU6ZnVuY3Rpb24oKXt2YXIgdCxpPWUodGhpcykucmVzaXphYmxlKCJpbnN0YW5jZSIpLHM9aS5vcHRpb25zLG49aS5zaXplLGE9aS5vcmlnaW5hbFNpemUsbz1pLm9yaWdpbmFsUG9zaXRpb24scj1pLmF4aXMsaD0ibnVtYmVyIj09dHlwZW9mIHMuZ3JpZD9bcy5ncmlkLHMuZ3JpZF06cy5ncmlkLGw9aFswXXx8MSx1PWhbMV18fDEsZD1NYXRoLnJvdW5kKChuLndpZHRoLWEud2lkdGgpL2wpKmwsYz1NYXRoLnJvdW5kKChuLmhlaWdodC1hLmhlaWdodCkvdSkqdSxwPWEud2lkdGgrZCxmPWEuaGVpZ2h0K2MsbT1zLm1heFdpZHRoJiZwPnMubWF4V2lkdGgsZz1zLm1heEhlaWdodCYmZj5zLm1heEhlaWdodCx2PXMubWluV2lkdGgmJnMubWluV2lkdGg+cCx5PXMubWluSGVpZ2h0JiZzLm1pbkhlaWdodD5mO3MuZ3JpZD1oLHYmJihwKz1sKSx5JiYoZis9dSksbSYmKHAtPWwpLGcmJihmLT11KSwvXihzZXxzfGUpJC8udGVzdChyKT8oaS5zaXplLndpZHRoPXAsaS5zaXplLmhlaWdodD1mKTovXihuZSkkLy50ZXN0KHIpPyhpLnNpemUud2lkdGg9cCxpLnNpemUuaGVpZ2h0PWYsaS5wb3NpdGlvbi50b3A9by50b3AtYyk6L14oc3cpJC8udGVzdChyKT8oaS5zaXplLndpZHRoPXAsaS5zaXplLmhlaWdodD1mLGkucG9zaXRpb24ubGVmdD1vLmxlZnQtZCk6KCgwPj1mLXV8fDA+PXAtbCkmJih0PWkuX2dldFBhZGRpbmdQbHVzQm9yZGVyRGltZW5zaW9ucyh0aGlzKSksZi11PjA/KGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLnRvcD1vLnRvcC1jKTooZj11LXQuaGVpZ2h0LGkuc2l6ZS5oZWlnaHQ9ZixpLnBvc2l0aW9uLnRvcD1vLnRvcCthLmhlaWdodC1mKSxwLWw+MD8oaS5zaXplLndpZHRoPXAsaS5wb3NpdGlvbi5sZWZ0PW8ubGVmdC1kKToocD1sLXQud2lkdGgsaS5zaXplLndpZHRoPXAsaS5wb3NpdGlvbi5sZWZ0PW8ubGVmdCthLndpZHRoLXApKX19KSxlLnVpLnJlc2l6YWJsZSxlLndpZGdldCgidWkuZGlhbG9nIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnthcHBlbmRUbzoiYm9keSIsYXV0b09wZW46ITAsYnV0dG9uczpbXSxjbG9zZU9uRXNjYXBlOiEwLGNsb3NlVGV4dDoiQ2xvc2UiLGRpYWxvZ0NsYXNzOiIiLGRyYWdnYWJsZTohMCxoaWRlOm51bGwsaGVpZ2h0OiJhdXRvIixtYXhIZWlnaHQ6bnVsbCxtYXhXaWR0aDpudWxsLG1pbkhlaWdodDoxNTAsbWluV2lkdGg6MTUwLG1vZGFsOiExLHBvc2l0aW9uOntteToiY2VudGVyIixhdDoiY2VudGVyIixvZjp3aW5kb3csY29sbGlzaW9uOiJmaXQiLHVzaW5nOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcykuY3NzKHQpLm9mZnNldCgpLnRvcDswPmkmJmUodGhpcykuY3NzKCJ0b3AiLHQudG9wLWkpfX0scmVzaXphYmxlOiEwLHNob3c6bnVsbCx0aXRsZTpudWxsLHdpZHRoOjMwMCxiZWZvcmVDbG9zZTpudWxsLGNsb3NlOm51bGwsZHJhZzpudWxsLGRyYWdTdGFydDpudWxsLGRyYWdTdG9wOm51bGwsZm9jdXM6bnVsbCxvcGVuOm51bGwscmVzaXplOm51bGwscmVzaXplU3RhcnQ6bnVsbCxyZXNpemVTdG9wOm51bGx9LHNpemVSZWxhdGVkT3B0aW9uczp7YnV0dG9uczohMCxoZWlnaHQ6ITAsbWF4SGVpZ2h0OiEwLG1heFdpZHRoOiEwLG1pbkhlaWdodDohMCxtaW5XaWR0aDohMCx3aWR0aDohMH0scmVzaXphYmxlUmVsYXRlZE9wdGlvbnM6e21heEhlaWdodDohMCxtYXhXaWR0aDohMCxtaW5IZWlnaHQ6ITAsbWluV2lkdGg6ITB9LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLm9yaWdpbmFsQ3NzPXtkaXNwbGF5OnRoaXMuZWxlbWVudFswXS5zdHlsZS5kaXNwbGF5LHdpZHRoOnRoaXMuZWxlbWVudFswXS5zdHlsZS53aWR0aCxtaW5IZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLm1pbkhlaWdodCxtYXhIZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLm1heEhlaWdodCxoZWlnaHQ6dGhpcy5lbGVtZW50WzBdLnN0eWxlLmhlaWdodH0sdGhpcy5vcmlnaW5hbFBvc2l0aW9uPXtwYXJlbnQ6dGhpcy5lbGVtZW50LnBhcmVudCgpLGluZGV4OnRoaXMuZWxlbWVudC5wYXJlbnQoKS5jaGlsZHJlbigpLmluZGV4KHRoaXMuZWxlbWVudCl9LHRoaXMub3JpZ2luYWxUaXRsZT10aGlzLmVsZW1lbnQuYXR0cigidGl0bGUiKSx0aGlzLm9wdGlvbnMudGl0bGU9dGhpcy5vcHRpb25zLnRpdGxlfHx0aGlzLm9yaWdpbmFsVGl0bGUsdGhpcy5fY3JlYXRlV3JhcHBlcigpLHRoaXMuZWxlbWVudC5zaG93KCkucmVtb3ZlQXR0cigidGl0bGUiKS5hZGRDbGFzcygidWktZGlhbG9nLWNvbnRlbnQgdWktd2lkZ2V0LWNvbnRlbnQiKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nKSx0aGlzLl9jcmVhdGVUaXRsZWJhcigpLHRoaXMuX2NyZWF0ZUJ1dHRvblBhbmUoKSx0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlJiZlLmZuLmRyYWdnYWJsZSYmdGhpcy5fbWFrZURyYWdnYWJsZSgpLHRoaXMub3B0aW9ucy5yZXNpemFibGUmJmUuZm4ucmVzaXphYmxlJiZ0aGlzLl9tYWtlUmVzaXphYmxlKCksdGhpcy5faXNPcGVuPSExLHRoaXMuX3RyYWNrRm9jdXMoKX0sX2luaXQ6ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuYXV0b09wZW4mJnRoaXMub3BlbigpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIHQmJih0LmpxdWVyeXx8dC5ub2RlVHlwZSk/ZSh0KTp0aGlzLmRvY3VtZW50LmZpbmQodHx8ImJvZHkiKS5lcSgwKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMub3JpZ2luYWxQb3NpdGlvbjt0aGlzLl91bnRyYWNrSW5zdGFuY2UoKSx0aGlzLl9kZXN0cm95T3ZlcmxheSgpLHRoaXMuZWxlbWVudC5yZW1vdmVVbmlxdWVJZCgpLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctY29udGVudCB1aS13aWRnZXQtY29udGVudCIpLmNzcyh0aGlzLm9yaWdpbmFsQ3NzKS5kZXRhY2goKSx0aGlzLnVpRGlhbG9nLnN0b3AoITAsITApLnJlbW92ZSgpLHRoaXMub3JpZ2luYWxUaXRsZSYmdGhpcy5lbGVtZW50LmF0dHIoInRpdGxlIix0aGlzLm9yaWdpbmFsVGl0bGUpLGU9dC5wYXJlbnQuY2hpbGRyZW4oKS5lcSh0LmluZGV4KSxlLmxlbmd0aCYmZVswXSE9PXRoaXMuZWxlbWVudFswXT9lLmJlZm9yZSh0aGlzLmVsZW1lbnQpOnQucGFyZW50LmFwcGVuZCh0aGlzLmVsZW1lbnQpfSx3aWRnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51aURpYWxvZ30sZGlzYWJsZTplLm5vb3AsZW5hYmxlOmUubm9vcCxjbG9zZTpmdW5jdGlvbih0KXt2YXIgaSxzPXRoaXM7aWYodGhpcy5faXNPcGVuJiZ0aGlzLl90cmlnZ2VyKCJiZWZvcmVDbG9zZSIsdCkhPT0hMSl7aWYodGhpcy5faXNPcGVuPSExLHRoaXMuX2ZvY3VzZWRFbGVtZW50PW51bGwsdGhpcy5fZGVzdHJveU92ZXJsYXkoKSx0aGlzLl91bnRyYWNrSW5zdGFuY2UoKSwhdGhpcy5vcGVuZXIuZmlsdGVyKCI6Zm9jdXNhYmxlIikuZm9jdXMoKS5sZW5ndGgpdHJ5e2k9dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50LGkmJiJib2R5IiE9PWkubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmZShpKS5ibHVyKCl9Y2F0Y2gobil7fXRoaXMuX2hpZGUodGhpcy51aURpYWxvZyx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe3MuX3RyaWdnZXIoImNsb3NlIix0KX0pfX0saXNPcGVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzT3Blbn0sbW92ZVRvVG9wOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZVRvVG9wKCl9LF9tb3ZlVG9Ub3A6ZnVuY3Rpb24odCxpKXt2YXIgcz0hMSxuPXRoaXMudWlEaWFsb2cuc2libGluZ3MoIi51aS1mcm9udDp2aXNpYmxlIikubWFwKGZ1bmN0aW9uKCl7cmV0dXJuK2UodGhpcykuY3NzKCJ6LWluZGV4Iil9KS5nZXQoKSxhPU1hdGgubWF4LmFwcGx5KG51bGwsbik7cmV0dXJuIGE+PSt0aGlzLnVpRGlhbG9nLmNzcygiei1pbmRleCIpJiYodGhpcy51aURpYWxvZy5jc3MoInotaW5kZXgiLGErMSkscz0hMCkscyYmIWkmJnRoaXMuX3RyaWdnZXIoImZvY3VzIix0KSxzfSxvcGVuOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5faXNPcGVuPyh0aGlzLl9tb3ZlVG9Ub3AoKSYmdGhpcy5fZm9jdXNUYWJiYWJsZSgpLHZvaWQgMCk6KHRoaXMuX2lzT3Blbj0hMCx0aGlzLm9wZW5lcj1lKHRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudCksdGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKCksdGhpcy5fY3JlYXRlT3ZlcmxheSgpLHRoaXMuX21vdmVUb1RvcChudWxsLCEwKSx0aGlzLm92ZXJsYXkmJnRoaXMub3ZlcmxheS5jc3MoInotaW5kZXgiLHRoaXMudWlEaWFsb2cuY3NzKCJ6LWluZGV4IiktMSksdGhpcy5fc2hvdyh0aGlzLnVpRGlhbG9nLHRoaXMub3B0aW9ucy5zaG93LGZ1bmN0aW9uKCl7dC5fZm9jdXNUYWJiYWJsZSgpLHQuX3RyaWdnZXIoImZvY3VzIil9KSx0aGlzLl9tYWtlRm9jdXNUYXJnZXQoKSx0aGlzLl90cmlnZ2VyKCJvcGVuIiksdm9pZCAwKX0sX2ZvY3VzVGFiYmFibGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9mb2N1c2VkRWxlbWVudDtlfHwoZT10aGlzLmVsZW1lbnQuZmluZCgiW2F1dG9mb2N1c10iKSksZS5sZW5ndGh8fChlPXRoaXMuZWxlbWVudC5maW5kKCI6dGFiYmFibGUiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2dCdXR0b25QYW5lLmZpbmQoIjp0YWJiYWJsZSIpKSxlLmxlbmd0aHx8KGU9dGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2UuZmlsdGVyKCI6dGFiYmFibGUiKSksZS5sZW5ndGh8fChlPXRoaXMudWlEaWFsb2cpLGUuZXEoMCkuZm9jdXMoKX0sX2tlZXBGb2N1czpmdW5jdGlvbih0KXtmdW5jdGlvbiBpKCl7dmFyIHQ9dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50LGk9dGhpcy51aURpYWxvZ1swXT09PXR8fGUuY29udGFpbnModGhpcy51aURpYWxvZ1swXSx0KTtpfHx0aGlzLl9mb2N1c1RhYmJhYmxlKCl9dC5wcmV2ZW50RGVmYXVsdCgpLGkuY2FsbCh0aGlzKSx0aGlzLl9kZWxheShpKX0sX2NyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24oKXt0aGlzLnVpRGlhbG9nPWUoIjxkaXY+IikuYWRkQ2xhc3MoInVpLWRpYWxvZyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS1mcm9udCAiK3RoaXMub3B0aW9ucy5kaWFsb2dDbGFzcykuaGlkZSgpLmF0dHIoe3RhYkluZGV4Oi0xLHJvbGU6ImRpYWxvZyJ9KS5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSx0aGlzLl9vbih0aGlzLnVpRGlhbG9nLHtrZXlkb3duOmZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5jbG9zZU9uRXNjYXBlJiYhdC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmdC5rZXlDb2RlJiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuRVNDQVBFKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksdGhpcy5jbG9zZSh0KSx2b2lkIDA7CmlmKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5UQUImJiF0LmlzRGVmYXVsdFByZXZlbnRlZCgpKXt2YXIgaT10aGlzLnVpRGlhbG9nLmZpbmQoIjp0YWJiYWJsZSIpLHM9aS5maWx0ZXIoIjpmaXJzdCIpLG49aS5maWx0ZXIoIjpsYXN0Iik7dC50YXJnZXQhPT1uWzBdJiZ0LnRhcmdldCE9PXRoaXMudWlEaWFsb2dbMF18fHQuc2hpZnRLZXk/dC50YXJnZXQhPT1zWzBdJiZ0LnRhcmdldCE9PXRoaXMudWlEaWFsb2dbMF18fCF0LnNoaWZ0S2V5fHwodGhpcy5fZGVsYXkoZnVuY3Rpb24oKXtuLmZvY3VzKCl9KSx0LnByZXZlbnREZWZhdWx0KCkpOih0aGlzLl9kZWxheShmdW5jdGlvbigpe3MuZm9jdXMoKX0pLHQucHJldmVudERlZmF1bHQoKSl9fSxtb3VzZWRvd246ZnVuY3Rpb24oZSl7dGhpcy5fbW92ZVRvVG9wKGUpJiZ0aGlzLl9mb2N1c1RhYmJhYmxlKCl9fSksdGhpcy5lbGVtZW50LmZpbmQoIlthcmlhLWRlc2NyaWJlZGJ5XSIpLmxlbmd0aHx8dGhpcy51aURpYWxvZy5hdHRyKHsiYXJpYS1kZXNjcmliZWRieSI6dGhpcy5lbGVtZW50LnVuaXF1ZUlkKCkuYXR0cigiaWQiKX0pfSxfY3JlYXRlVGl0bGViYXI6ZnVuY3Rpb24oKXt2YXIgdDt0aGlzLnVpRGlhbG9nVGl0bGViYXI9ZSgiPGRpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLXRpdGxlYmFyIHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCB1aS1oZWxwZXItY2xlYXJmaXgiKS5wcmVwZW5kVG8odGhpcy51aURpYWxvZyksdGhpcy5fb24odGhpcy51aURpYWxvZ1RpdGxlYmFyLHttb3VzZWRvd246ZnVuY3Rpb24odCl7ZSh0LnRhcmdldCkuY2xvc2VzdCgiLnVpLWRpYWxvZy10aXRsZWJhci1jbG9zZSIpfHx0aGlzLnVpRGlhbG9nLmZvY3VzKCl9fSksdGhpcy51aURpYWxvZ1RpdGxlYmFyQ2xvc2U9ZSgiPGJ1dHRvbiB0eXBlPSdidXR0b24nPjwvYnV0dG9uPiIpLmJ1dHRvbih7bGFiZWw6dGhpcy5vcHRpb25zLmNsb3NlVGV4dCxpY29uczp7cHJpbWFyeToidWktaWNvbi1jbG9zZXRoaWNrIn0sdGV4dDohMX0pLmFkZENsYXNzKCJ1aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiKS5hcHBlbmRUbyh0aGlzLnVpRGlhbG9nVGl0bGViYXIpLHRoaXMuX29uKHRoaXMudWlEaWFsb2dUaXRsZWJhckNsb3NlLHtjbGljazpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksdGhpcy5jbG9zZShlKX19KSx0PWUoIjxzcGFuPiIpLnVuaXF1ZUlkKCkuYWRkQ2xhc3MoInVpLWRpYWxvZy10aXRsZSIpLnByZXBlbmRUbyh0aGlzLnVpRGlhbG9nVGl0bGViYXIpLHRoaXMuX3RpdGxlKHQpLHRoaXMudWlEaWFsb2cuYXR0cih7ImFyaWEtbGFiZWxsZWRieSI6dC5hdHRyKCJpZCIpfSl9LF90aXRsZTpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMudGl0bGV8fGUuaHRtbCgiJiMxNjA7IiksZS50ZXh0KHRoaXMub3B0aW9ucy50aXRsZSl9LF9jcmVhdGVCdXR0b25QYW5lOmZ1bmN0aW9uKCl7dGhpcy51aURpYWxvZ0J1dHRvblBhbmU9ZSgiPGRpdj4iKS5hZGRDbGFzcygidWktZGlhbG9nLWJ1dHRvbnBhbmUgdWktd2lkZ2V0LWNvbnRlbnQgdWktaGVscGVyLWNsZWFyZml4IiksdGhpcy51aUJ1dHRvblNldD1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS1kaWFsb2ctYnV0dG9uc2V0IikuYXBwZW5kVG8odGhpcy51aURpYWxvZ0J1dHRvblBhbmUpLHRoaXMuX2NyZWF0ZUJ1dHRvbnMoKX0sX2NyZWF0ZUJ1dHRvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5vcHRpb25zLmJ1dHRvbnM7cmV0dXJuIHRoaXMudWlEaWFsb2dCdXR0b25QYW5lLnJlbW92ZSgpLHRoaXMudWlCdXR0b25TZXQuZW1wdHkoKSxlLmlzRW1wdHlPYmplY3QoaSl8fGUuaXNBcnJheShpKSYmIWkubGVuZ3RoPyh0aGlzLnVpRGlhbG9nLnJlbW92ZUNsYXNzKCJ1aS1kaWFsb2ctYnV0dG9ucyIpLHZvaWQgMCk6KGUuZWFjaChpLGZ1bmN0aW9uKGkscyl7dmFyIG4sYTtzPWUuaXNGdW5jdGlvbihzKT97Y2xpY2s6cyx0ZXh0Oml9OnMscz1lLmV4dGVuZCh7dHlwZToiYnV0dG9uIn0scyksbj1zLmNsaWNrLHMuY2xpY2s9ZnVuY3Rpb24oKXtuLmFwcGx5KHQuZWxlbWVudFswXSxhcmd1bWVudHMpfSxhPXtpY29uczpzLmljb25zLHRleHQ6cy5zaG93VGV4dH0sZGVsZXRlIHMuaWNvbnMsZGVsZXRlIHMuc2hvd1RleHQsZSgiPGJ1dHRvbj48L2J1dHRvbj4iLHMpLmJ1dHRvbihhKS5hcHBlbmRUbyh0LnVpQnV0dG9uU2V0KX0pLHRoaXMudWlEaWFsb2cuYWRkQ2xhc3MoInVpLWRpYWxvZy1idXR0b25zIiksdGhpcy51aURpYWxvZ0J1dHRvblBhbmUuYXBwZW5kVG8odGhpcy51aURpYWxvZyksdm9pZCAwKX0sX21ha2VEcmFnZ2FibGU6ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUpe3JldHVybntwb3NpdGlvbjplLnBvc2l0aW9uLG9mZnNldDplLm9mZnNldH19dmFyIGk9dGhpcyxzPXRoaXMub3B0aW9uczt0aGlzLnVpRGlhbG9nLmRyYWdnYWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQsIC51aS1kaWFsb2ctdGl0bGViYXItY2xvc2UiLGhhbmRsZToiLnVpLWRpYWxvZy10aXRsZWJhciIsY29udGFpbm1lbnQ6ImRvY3VtZW50IixzdGFydDpmdW5jdGlvbihzLG4pe2UodGhpcykuYWRkQ2xhc3MoInVpLWRpYWxvZy1kcmFnZ2luZyIpLGkuX2Jsb2NrRnJhbWVzKCksaS5fdHJpZ2dlcigiZHJhZ1N0YXJ0IixzLHQobikpfSxkcmFnOmZ1bmN0aW9uKGUscyl7aS5fdHJpZ2dlcigiZHJhZyIsZSx0KHMpKX0sc3RvcDpmdW5jdGlvbihuLGEpe3ZhciBvPWEub2Zmc2V0LmxlZnQtaS5kb2N1bWVudC5zY3JvbGxMZWZ0KCkscj1hLm9mZnNldC50b3AtaS5kb2N1bWVudC5zY3JvbGxUb3AoKTtzLnBvc2l0aW9uPXtteToibGVmdCB0b3AiLGF0OiJsZWZ0Iisobz49MD8iKyI6IiIpK28rIiAiKyJ0b3AiKyhyPj0wPyIrIjoiIikrcixvZjppLndpbmRvd30sZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLWRyYWdnaW5nIiksaS5fdW5ibG9ja0ZyYW1lcygpLGkuX3RyaWdnZXIoImRyYWdTdG9wIixuLHQoYSkpfX0pfSxfbWFrZVJlc2l6YWJsZTpmdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7cmV0dXJue29yaWdpbmFsUG9zaXRpb246ZS5vcmlnaW5hbFBvc2l0aW9uLG9yaWdpbmFsU2l6ZTplLm9yaWdpbmFsU2l6ZSxwb3NpdGlvbjplLnBvc2l0aW9uLHNpemU6ZS5zaXplfX12YXIgaT10aGlzLHM9dGhpcy5vcHRpb25zLG49cy5yZXNpemFibGUsYT10aGlzLnVpRGlhbG9nLmNzcygicG9zaXRpb24iKSxvPSJzdHJpbmciPT10eXBlb2Ygbj9uOiJuLGUscyx3LHNlLHN3LG5lLG53Ijt0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSh7Y2FuY2VsOiIudWktZGlhbG9nLWNvbnRlbnQiLGNvbnRhaW5tZW50OiJkb2N1bWVudCIsYWxzb1Jlc2l6ZTp0aGlzLmVsZW1lbnQsbWF4V2lkdGg6cy5tYXhXaWR0aCxtYXhIZWlnaHQ6cy5tYXhIZWlnaHQsbWluV2lkdGg6cy5taW5XaWR0aCxtaW5IZWlnaHQ6dGhpcy5fbWluSGVpZ2h0KCksaGFuZGxlczpvLHN0YXJ0OmZ1bmN0aW9uKHMsbil7ZSh0aGlzKS5hZGRDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksaS5fYmxvY2tGcmFtZXMoKSxpLl90cmlnZ2VyKCJyZXNpemVTdGFydCIscyx0KG4pKX0scmVzaXplOmZ1bmN0aW9uKGUscyl7aS5fdHJpZ2dlcigicmVzaXplIixlLHQocykpfSxzdG9wOmZ1bmN0aW9uKG4sYSl7dmFyIG89aS51aURpYWxvZy5vZmZzZXQoKSxyPW8ubGVmdC1pLmRvY3VtZW50LnNjcm9sbExlZnQoKSxoPW8udG9wLWkuZG9jdW1lbnQuc2Nyb2xsVG9wKCk7cy5oZWlnaHQ9aS51aURpYWxvZy5oZWlnaHQoKSxzLndpZHRoPWkudWlEaWFsb2cud2lkdGgoKSxzLnBvc2l0aW9uPXtteToibGVmdCB0b3AiLGF0OiJsZWZ0Iisocj49MD8iKyI6IiIpK3IrIiAiKyJ0b3AiKyhoPj0wPyIrIjoiIikraCxvZjppLndpbmRvd30sZSh0aGlzKS5yZW1vdmVDbGFzcygidWktZGlhbG9nLXJlc2l6aW5nIiksaS5fdW5ibG9ja0ZyYW1lcygpLGkuX3RyaWdnZXIoInJlc2l6ZVN0b3AiLG4sdChhKSl9fSkuY3NzKCJwb3NpdGlvbiIsYSl9LF90cmFja0ZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fb24odGhpcy53aWRnZXQoKSx7Zm9jdXNpbjpmdW5jdGlvbih0KXt0aGlzLl9tYWtlRm9jdXNUYXJnZXQoKSx0aGlzLl9mb2N1c2VkRWxlbWVudD1lKHQudGFyZ2V0KX19KX0sX21ha2VGb2N1c1RhcmdldDpmdW5jdGlvbigpe3RoaXMuX3VudHJhY2tJbnN0YW5jZSgpLHRoaXMuX3RyYWNraW5nSW5zdGFuY2VzKCkudW5zaGlmdCh0aGlzKX0sX3VudHJhY2tJbnN0YW5jZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RyYWNraW5nSW5zdGFuY2VzKCksaT1lLmluQXJyYXkodGhpcyx0KTstMSE9PWkmJnQuc3BsaWNlKGksMSl9LF90cmFja2luZ0luc3RhbmNlczpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLWluc3RhbmNlcyIpO3JldHVybiBlfHwoZT1bXSx0aGlzLmRvY3VtZW50LmRhdGEoInVpLWRpYWxvZy1pbnN0YW5jZXMiLGUpKSxlfSxfbWluSGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zO3JldHVybiJhdXRvIj09PWUuaGVpZ2h0P2UubWluSGVpZ2h0Ok1hdGgubWluKGUubWluSGVpZ2h0LGUuaGVpZ2h0KX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aURpYWxvZy5pcygiOnZpc2libGUiKTtlfHx0aGlzLnVpRGlhbG9nLnNob3coKSx0aGlzLnVpRGlhbG9nLnBvc2l0aW9uKHRoaXMub3B0aW9ucy5wb3NpdGlvbiksZXx8dGhpcy51aURpYWxvZy5oaWRlKCl9LF9zZXRPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMscz0hMSxuPXt9O2UuZWFjaCh0LGZ1bmN0aW9uKGUsdCl7aS5fc2V0T3B0aW9uKGUsdCksZSBpbiBpLnNpemVSZWxhdGVkT3B0aW9ucyYmKHM9ITApLGUgaW4gaS5yZXNpemFibGVSZWxhdGVkT3B0aW9ucyYmKG5bZV09dCl9KSxzJiYodGhpcy5fc2l6ZSgpLHRoaXMuX3Bvc2l0aW9uKCkpLHRoaXMudWlEaWFsb2cuaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSYmdGhpcy51aURpYWxvZy5yZXNpemFibGUoIm9wdGlvbiIsbil9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt2YXIgaSxzLG49dGhpcy51aURpYWxvZzsiZGlhbG9nQ2xhc3MiPT09ZSYmbi5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZGlhbG9nQ2xhc3MpLmFkZENsYXNzKHQpLCJkaXNhYmxlZCIhPT1lJiYodGhpcy5fc3VwZXIoZSx0KSwiYXBwZW5kVG8iPT09ZSYmdGhpcy51aURpYWxvZy5hcHBlbmRUbyh0aGlzLl9hcHBlbmRUbygpKSwiYnV0dG9ucyI9PT1lJiZ0aGlzLl9jcmVhdGVCdXR0b25zKCksImNsb3NlVGV4dCI9PT1lJiZ0aGlzLnVpRGlhbG9nVGl0bGViYXJDbG9zZS5idXR0b24oe2xhYmVsOiIiK3R9KSwiZHJhZ2dhYmxlIj09PWUmJihpPW4uaXMoIjpkYXRhKHVpLWRyYWdnYWJsZSkiKSxpJiYhdCYmbi5kcmFnZ2FibGUoImRlc3Ryb3kiKSwhaSYmdCYmdGhpcy5fbWFrZURyYWdnYWJsZSgpKSwicG9zaXRpb24iPT09ZSYmdGhpcy5fcG9zaXRpb24oKSwicmVzaXphYmxlIj09PWUmJihzPW4uaXMoIjpkYXRhKHVpLXJlc2l6YWJsZSkiKSxzJiYhdCYmbi5yZXNpemFibGUoImRlc3Ryb3kiKSxzJiYic3RyaW5nIj09dHlwZW9mIHQmJm4ucmVzaXphYmxlKCJvcHRpb24iLCJoYW5kbGVzIix0KSxzfHx0PT09ITF8fHRoaXMuX21ha2VSZXNpemFibGUoKSksInRpdGxlIj09PWUmJnRoaXMuX3RpdGxlKHRoaXMudWlEaWFsb2dUaXRsZWJhci5maW5kKCIudWktZGlhbG9nLXRpdGxlIikpKX0sX3NpemU6ZnVuY3Rpb24oKXt2YXIgZSx0LGkscz10aGlzLm9wdGlvbnM7dGhpcy5lbGVtZW50LnNob3coKS5jc3Moe3dpZHRoOiJhdXRvIixtaW5IZWlnaHQ6MCxtYXhIZWlnaHQ6Im5vbmUiLGhlaWdodDowfSkscy5taW5XaWR0aD5zLndpZHRoJiYocy53aWR0aD1zLm1pbldpZHRoKSxlPXRoaXMudWlEaWFsb2cuY3NzKHtoZWlnaHQ6ImF1dG8iLHdpZHRoOnMud2lkdGh9KS5vdXRlckhlaWdodCgpLHQ9TWF0aC5tYXgoMCxzLm1pbkhlaWdodC1lKSxpPSJudW1iZXIiPT10eXBlb2Ygcy5tYXhIZWlnaHQ/TWF0aC5tYXgoMCxzLm1heEhlaWdodC1lKToibm9uZSIsImF1dG8iPT09cy5oZWlnaHQ/dGhpcy5lbGVtZW50LmNzcyh7bWluSGVpZ2h0OnQsbWF4SGVpZ2h0OmksaGVpZ2h0OiJhdXRvIn0pOnRoaXMuZWxlbWVudC5oZWlnaHQoTWF0aC5tYXgoMCxzLmhlaWdodC1lKSksdGhpcy51aURpYWxvZy5pcygiOmRhdGEodWktcmVzaXphYmxlKSIpJiZ0aGlzLnVpRGlhbG9nLnJlc2l6YWJsZSgib3B0aW9uIiwibWluSGVpZ2h0Iix0aGlzLl9taW5IZWlnaHQoKSl9LF9ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzPXRoaXMuZG9jdW1lbnQuZmluZCgiaWZyYW1lIikubWFwKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKTtyZXR1cm4gZSgiPGRpdj4iKS5jc3Moe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsd2lkdGg6dC5vdXRlcldpZHRoKCksaGVpZ2h0OnQub3V0ZXJIZWlnaHQoKX0pLmFwcGVuZFRvKHQucGFyZW50KCkpLm9mZnNldCh0Lm9mZnNldCgpKVswXX0pfSxfdW5ibG9ja0ZyYW1lczpmdW5jdGlvbigpe3RoaXMuaWZyYW1lQmxvY2tzJiYodGhpcy5pZnJhbWVCbG9ja3MucmVtb3ZlKCksZGVsZXRlIHRoaXMuaWZyYW1lQmxvY2tzKX0sX2FsbG93SW50ZXJhY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuIGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1kaWFsb2ciKS5sZW5ndGg/ITA6ISFlKHQudGFyZ2V0KS5jbG9zZXN0KCIudWktZGF0ZXBpY2tlciIpLmxlbmd0aH0sX2NyZWF0ZU92ZXJsYXk6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubW9kYWwpe3ZhciB0PSEwO3RoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dD0hMX0pLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIil8fHRoaXMuX29uKHRoaXMuZG9jdW1lbnQse2ZvY3VzaW46ZnVuY3Rpb24oZSl7dHx8dGhpcy5fYWxsb3dJbnRlcmFjdGlvbihlKXx8KGUucHJldmVudERlZmF1bHQoKSx0aGlzLl90cmFja2luZ0luc3RhbmNlcygpWzBdLl9mb2N1c1RhYmJhYmxlKCkpfX0pLHRoaXMub3ZlcmxheT1lKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS13aWRnZXQtb3ZlcmxheSB1aS1mcm9udCIpLmFwcGVuZFRvKHRoaXMuX2FwcGVuZFRvKCkpLHRoaXMuX29uKHRoaXMub3ZlcmxheSx7bW91c2Vkb3duOiJfa2VlcEZvY3VzIn0pLHRoaXMuZG9jdW1lbnQuZGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIiwodGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKXx8MCkrMSl9fSxfZGVzdHJveU92ZXJsYXk6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMubW9kYWwmJnRoaXMub3ZlcmxheSl7dmFyIGU9dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiKS0xO2U/dGhpcy5kb2N1bWVudC5kYXRhKCJ1aS1kaWFsb2ctb3ZlcmxheXMiLGUpOnRoaXMuZG9jdW1lbnQudW5iaW5kKCJmb2N1c2luIikucmVtb3ZlRGF0YSgidWktZGlhbG9nLW92ZXJsYXlzIiksdGhpcy5vdmVybGF5LnJlbW92ZSgpLHRoaXMub3ZlcmxheT1udWxsfX19KSxlLndpZGdldCgidWkuZHJvcHBhYmxlIix7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoiZHJvcCIsb3B0aW9uczp7YWNjZXB0OiIqIixhY3RpdmVDbGFzczohMSxhZGRDbGFzc2VzOiEwLGdyZWVkeTohMSxob3ZlckNsYXNzOiExLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsYWN0aXZhdGU6bnVsbCxkZWFjdGl2YXRlOm51bGwsZHJvcDpudWxsLG91dDpudWxsLG92ZXI6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciB0LGk9dGhpcy5vcHRpb25zLHM9aS5hY2NlcHQ7dGhpcy5pc292ZXI9ITEsdGhpcy5pc291dD0hMCx0aGlzLmFjY2VwdD1lLmlzRnVuY3Rpb24ocyk/czpmdW5jdGlvbihlKXtyZXR1cm4gZS5pcyhzKX0sdGhpcy5wcm9wb3J0aW9ucz1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFyZ3VtZW50c1swXSx2b2lkIDApOnQ/dDp0PXt3aWR0aDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OnRoaXMuZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9fSx0aGlzLl9hZGRUb01hbmFnZXIoaS5zY29wZSksaS5hZGRDbGFzc2VzJiZ0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLWRyb3BwYWJsZSIpfSxfYWRkVG9NYW5hZ2VyOmZ1bmN0aW9uKHQpe2UudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdF09ZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XXx8W10sZS51aS5kZG1hbmFnZXIuZHJvcHBhYmxlc1t0XS5wdXNoKHRoaXMpfSxfc3BsaWNlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO2UubGVuZ3RoPnQ7dCsrKWVbdF09PT10aGlzJiZlLnNwbGljZSh0LDEpfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTt0aGlzLl9zcGxpY2UodCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1kcm9wcGFibGUgdWktZHJvcHBhYmxlLWRpc2FibGVkIil9LF9zZXRPcHRpb246ZnVuY3Rpb24odCxpKXtpZigiYWNjZXB0Ij09PXQpdGhpcy5hY2NlcHQ9ZS5pc0Z1bmN0aW9uKGkpP2k6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuaXMoaSl9O2Vsc2UgaWYoInNjb3BlIj09PXQpe3ZhciBzPWUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdGhpcy5vcHRpb25zLnNjb3BlXTt0aGlzLl9zcGxpY2UocyksdGhpcy5fYWRkVG9NYW5hZ2VyKGkpfXRoaXMuX3N1cGVyKHQsaSl9LF9hY3RpdmF0ZTpmdW5jdGlvbih0KXt2YXIgaT1lLnVpLmRkbWFuYWdlci5jdXJyZW50O3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyYmdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyksaSYmdGhpcy5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsdGhpcy51aShpKSl9LF9kZWFjdGl2YXRlOmZ1bmN0aW9uKHQpe3ZhciBpPWUudWkuZGRtYW5hZ2VyLmN1cnJlbnQ7dGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSxpJiZ0aGlzLl90cmlnZ2VyKCJkZWFjdGl2YXRlIix0LHRoaXMudWkoaSkpfSxfb3ZlcjpmdW5jdGlvbih0KXt2YXIgaT1lLnVpLmRkbWFuYWdlci5jdXJyZW50O2kmJihpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpWzBdIT09dGhpcy5lbGVtZW50WzBdJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxpLmN1cnJlbnRJdGVtfHxpLmVsZW1lbnQpJiYodGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MmJnRoaXMuZWxlbWVudC5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuaG92ZXJDbGFzcyksdGhpcy5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLnVpKGkpKSl9LF9vdXQ6ZnVuY3Rpb24odCl7dmFyIGk9ZS51aS5kZG1hbmFnZXIuY3VycmVudDtpJiYoaS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5hY2NlcHQuY2FsbCh0aGlzLmVsZW1lbnRbMF0saS5jdXJyZW50SXRlbXx8aS5lbGVtZW50KSYmKHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoIm91dCIsdCx0aGlzLnVpKGkpKSl9LF9kcm9wOmZ1bmN0aW9uKHQsaSl7dmFyIHM9aXx8ZS51aS5kZG1hbmFnZXIuY3VycmVudCxuPSExO3JldHVybiBzJiYocy5jdXJyZW50SXRlbXx8cy5lbGVtZW50KVswXSE9PXRoaXMuZWxlbWVudFswXT8odGhpcy5lbGVtZW50LmZpbmQoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5ub3QoIi51aS1kcmFnZ2FibGUtZHJhZ2dpbmciKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGk9ZSh0aGlzKS5kcm9wcGFibGUoImluc3RhbmNlIik7cmV0dXJuIGkub3B0aW9ucy5ncmVlZHkmJiFpLm9wdGlvbnMuZGlzYWJsZWQmJmkub3B0aW9ucy5zY29wZT09PXMub3B0aW9ucy5zY29wZSYmaS5hY2NlcHQuY2FsbChpLmVsZW1lbnRbMF0scy5jdXJyZW50SXRlbXx8cy5lbGVtZW50KSYmZS51aS5pbnRlcnNlY3QocyxlLmV4dGVuZChpLHtvZmZzZXQ6aS5lbGVtZW50Lm9mZnNldCgpfSksaS5vcHRpb25zLnRvbGVyYW5jZSx0KT8obj0hMCwhMSk6dm9pZCAwfSksbj8hMTp0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSxzLmN1cnJlbnRJdGVtfHxzLmVsZW1lbnQpPyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MmJnRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLHRoaXMub3B0aW9ucy5ob3ZlckNsYXNzJiZ0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmhvdmVyQ2xhc3MpLHRoaXMuX3RyaWdnZXIoImRyb3AiLHQsdGhpcy51aShzKSksdGhpcy5lbGVtZW50KTohMSk6ITF9LHVpOmZ1bmN0aW9uKGUpe3JldHVybntkcmFnZ2FibGU6ZS5jdXJyZW50SXRlbXx8ZS5lbGVtZW50LGhlbHBlcjplLmhlbHBlcixwb3NpdGlvbjplLnBvc2l0aW9uLG9mZnNldDplLnBvc2l0aW9uQWJzfX19KSxlLnVpLmludGVyc2VjdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LGkpe3JldHVybiBlPj10JiZ0K2k+ZX1yZXR1cm4gZnVuY3Rpb24odCxpLHMsbil7aWYoIWkub2Zmc2V0KXJldHVybiExO3ZhciBhPSh0LnBvc2l0aW9uQWJzfHx0LnBvc2l0aW9uLmFic29sdXRlKS5sZWZ0K3QubWFyZ2lucy5sZWZ0LG89KHQucG9zaXRpb25BYnN8fHQucG9zaXRpb24uYWJzb2x1dGUpLnRvcCt0Lm1hcmdpbnMudG9wLHI9YSt0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLGg9byt0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodCxsPWkub2Zmc2V0LmxlZnQsdT1pLm9mZnNldC50b3AsZD1sK2kucHJvcG9ydGlvbnMoKS53aWR0aCxjPXUraS5wcm9wb3J0aW9ucygpLmhlaWdodDtzd2l0Y2gocyl7Y2FzZSJmaXQiOnJldHVybiBhPj1sJiZkPj1yJiZvPj11JiZjPj1oO2Nhc2UiaW50ZXJzZWN0IjpyZXR1cm4gYSt0LmhlbHBlclByb3BvcnRpb25zLndpZHRoLzI+bCYmZD5yLXQuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgvMiYmbyt0LmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yPnUmJmM+aC10LmhlbHBlclByb3BvcnRpb25zLmhlaWdodC8yO2Nhc2UicG9pbnRlciI6cmV0dXJuIGUobi5wYWdlWSx1LGkucHJvcG9ydGlvbnMoKS5oZWlnaHQpJiZlKG4ucGFnZVgsbCxpLnByb3BvcnRpb25zKCkud2lkdGgpO2Nhc2UidG91Y2giOnJldHVybihvPj11JiZjPj1vfHxoPj11JiZjPj1ofHx1Pm8mJmg+YykmJihhPj1sJiZkPj1hfHxyPj1sJiZkPj1yfHxsPmEmJnI+ZCk7ZGVmYXVsdDpyZXR1cm4hMX19fSgpLGUudWkuZGRtYW5hZ2VyPXtjdXJyZW50Om51bGwsZHJvcHBhYmxlczp7ImRlZmF1bHQiOltdfSxwcmVwYXJlT2Zmc2V0czpmdW5jdGlvbih0LGkpe3ZhciBzLG4sYT1lLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV18fFtdLG89aT9pLnR5cGU6bnVsbCxyPSh0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpLmZpbmQoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5hZGRCYWNrKCk7ZTpmb3Iocz0wO2EubGVuZ3RoPnM7cysrKWlmKCEoYVtzXS5vcHRpb25zLmRpc2FibGVkfHx0JiYhYVtzXS5hY2NlcHQuY2FsbChhW3NdLmVsZW1lbnRbMF0sdC5jdXJyZW50SXRlbXx8dC5lbGVtZW50KSkpe2ZvcihuPTA7ci5sZW5ndGg+bjtuKyspaWYocltuXT09PWFbc10uZWxlbWVudFswXSl7YVtzXS5wcm9wb3J0aW9ucygpLmhlaWdodD0wO2NvbnRpbnVlIGV9YVtzXS52aXNpYmxlPSJub25lIiE9PWFbc10uZWxlbWVudC5jc3MoImRpc3BsYXkiKSxhW3NdLnZpc2libGUmJigibW91c2Vkb3duIj09PW8mJmFbc10uX2FjdGl2YXRlLmNhbGwoYVtzXSxpKSxhW3NdLm9mZnNldD1hW3NdLmVsZW1lbnQub2Zmc2V0KCksYVtzXS5wcm9wb3J0aW9ucyh7d2lkdGg6YVtzXS5lbGVtZW50WzBdLm9mZnNldFdpZHRoLGhlaWdodDphW3NdLmVsZW1lbnRbMF0ub2Zmc2V0SGVpZ2h0fSkpfX0sZHJvcDpmdW5jdGlvbih0LGkpe3ZhciBzPSExO3JldHVybiBlLmVhY2goKGUudWkuZGRtYW5hZ2VyLmRyb3BwYWJsZXNbdC5vcHRpb25zLnNjb3BlXXx8W10pLnNsaWNlKCksZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMmJighdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLnZpc2libGUmJmUudWkuaW50ZXJzZWN0KHQsdGhpcyx0aGlzLm9wdGlvbnMudG9sZXJhbmNlLGkpJiYocz10aGlzLl9kcm9wLmNhbGwodGhpcyxpKXx8cyksIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy52aXNpYmxlJiZ0aGlzLmFjY2VwdC5jYWxsKHRoaXMuZWxlbWVudFswXSx0LmN1cnJlbnRJdGVtfHx0LmVsZW1lbnQpJiYodGhpcy5pc291dD0hMCx0aGlzLmlzb3Zlcj0hMSx0aGlzLl9kZWFjdGl2YXRlLmNhbGwodGhpcyxpKSkpfSksc30sZHJhZ1N0YXJ0OmZ1bmN0aW9uKHQsaSl7dC5lbGVtZW50LnBhcmVudHNVbnRpbCgiYm9keSIpLmJpbmQoInNjcm9sbC5kcm9wcGFibGUiLGZ1bmN0aW9uKCl7dC5vcHRpb25zLnJlZnJlc2hQb3NpdGlvbnN8fGUudWkuZGRtYW5hZ2VyLnByZXBhcmVPZmZzZXRzKHQsaSl9KX0sZHJhZzpmdW5jdGlvbih0LGkpe3Qub3B0aW9ucy5yZWZyZXNoUG9zaXRpb25zJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0LGkpLGUuZWFjaChlLnVpLmRkbWFuYWdlci5kcm9wcGFibGVzW3Qub3B0aW9ucy5zY29wZV18fFtdLGZ1bmN0aW9uKCl7aWYoIXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmIXRoaXMuZ3JlZWR5Q2hpbGQmJnRoaXMudmlzaWJsZSl7dmFyIHMsbixhLG89ZS51aS5pbnRlcnNlY3QodCx0aGlzLHRoaXMub3B0aW9ucy50b2xlcmFuY2UsaSkscj0hbyYmdGhpcy5pc292ZXI/Imlzb3V0IjpvJiYhdGhpcy5pc292ZXI/Imlzb3ZlciI6bnVsbDtyJiYodGhpcy5vcHRpb25zLmdyZWVkeSYmKG49dGhpcy5vcHRpb25zLnNjb3BlLGE9dGhpcy5lbGVtZW50LnBhcmVudHMoIjpkYXRhKHVpLWRyb3BwYWJsZSkiKS5maWx0ZXIoZnVuY3Rpb24oKXtyZXR1cm4gZSh0aGlzKS5kcm9wcGFibGUoImluc3RhbmNlIikub3B0aW9ucy5zY29wZT09PW59KSxhLmxlbmd0aCYmKHM9ZShhWzBdKS5kcm9wcGFibGUoImluc3RhbmNlIikscy5ncmVlZHlDaGlsZD0iaXNvdmVyIj09PXIpKSxzJiYiaXNvdmVyIj09PXImJihzLmlzb3Zlcj0hMSxzLmlzb3V0PSEwLHMuX291dC5jYWxsKHMsaSkpLHRoaXNbcl09ITAsdGhpc1siaXNvdXQiPT09cj8iaXNvdmVyIjoiaXNvdXQiXT0hMSx0aGlzWyJpc292ZXIiPT09cj8iX292ZXIiOiJfb3V0Il0uY2FsbCh0aGlzLGkpLHMmJiJpc291dCI9PT1yJiYocy5pc291dD0hMSxzLmlzb3Zlcj0hMCxzLl9vdmVyLmNhbGwocyxpKSkpfX0pfSxkcmFnU3RvcDpmdW5jdGlvbih0LGkpe3QuZWxlbWVudC5wYXJlbnRzVW50aWwoImJvZHkiKS51bmJpbmQoInNjcm9sbC5kcm9wcGFibGUiKSx0Lm9wdGlvbnMucmVmcmVzaFBvc2l0aW9uc3x8ZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModCxpKX19LGUudWkuZHJvcHBhYmxlO3ZhciB5PSJ1aS1lZmZlY3RzLSIsYj1lO2UuZWZmZWN0cz17ZWZmZWN0Ont9fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0LGkpe3ZhciBzPWRbdC50eXBlXXx8e307cmV0dXJuIG51bGw9PWU/aXx8IXQuZGVmP251bGw6dC5kZWY6KGU9cy5mbG9vcj9+fmU6cGFyc2VGbG9hdChlKSxpc05hTihlKT90LmRlZjpzLm1vZD8oZStzLm1vZCklcy5tb2Q6MD5lPzA6ZT5zLm1heD9zLm1heDplKX1mdW5jdGlvbiBzKGkpe3ZhciBzPWwoKSxuPXMuX3JnYmE9W107cmV0dXJuIGk9aS50b0xvd2VyQ2FzZSgpLGYoaCxmdW5jdGlvbihlLGEpe3ZhciBvLHI9YS5yZS5leGVjKGkpLGg9ciYmYS5wYXJzZShyKSxsPWEuc3BhY2V8fCJyZ2JhIjtyZXR1cm4gaD8obz1zW2xdKGgpLHNbdVtsXS5jYWNoZV09b1t1W2xdLmNhY2hlXSxuPXMuX3JnYmE9by5fcmdiYSwhMSk6dH0pLG4ubGVuZ3RoPygiMCwwLDAsMCI9PT1uLmpvaW4oKSYmZS5leHRlbmQobixhLnRyYW5zcGFyZW50KSxzKTphW2ldfWZ1bmN0aW9uIG4oZSx0LGkpe3JldHVybiBpPShpKzEpJTEsMT42Kmk/ZSs2Kih0LWUpKmk6MT4yKmk/dDoyPjMqaT9lKzYqKHQtZSkqKDIvMy1pKTplfXZhciBhLG89ImJhY2tncm91bmRDb2xvciBib3JkZXJCb3R0b21Db2xvciBib3JkZXJMZWZ0Q29sb3IgYm9yZGVyUmlnaHRDb2xvciBib3JkZXJUb3BDb2xvciBjb2xvciBjb2x1bW5SdWxlQ29sb3Igb3V0bGluZUNvbG9yIHRleHREZWNvcmF0aW9uQ29sb3IgdGV4dEVtcGhhc2lzQ29sb3IiLHI9L14oW1wtK10pPVxzKihcZCtcLj9cZCopLyxoPVt7cmU6L3JnYmE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bZVsxXSxlWzJdLGVbM10sZVs0XV19fSx7cmU6L3JnYmE/XChccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKixccyooXGQrKD86XC5cZCspPylcJVxzKig/OixccyooXGQ/KD86XC5cZCspPylccyopP1wpLyxwYXJzZTpmdW5jdGlvbihlKXtyZXR1cm5bMi41NSplWzFdLDIuNTUqZVsyXSwyLjU1KmVbM10sZVs0XV19fSx7cmU6LyMoW2EtZjAtOV17Mn0pKFthLWYwLTldezJ9KShbYS1mMC05XXsyfSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdLDE2KSxwYXJzZUludChlWzJdLDE2KSxwYXJzZUludChlWzNdLDE2KV19fSx7cmU6LyMoW2EtZjAtOV0pKFthLWYwLTldKShbYS1mMC05XSkvLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltwYXJzZUludChlWzFdK2VbMV0sMTYpLHBhcnNlSW50KGVbMl0rZVsyXSwxNikscGFyc2VJbnQoZVszXStlWzNdLDE2KV19fSx7cmU6L2hzbGE/XChccyooXGQrKD86XC5cZCspPylccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyosXHMqKFxkKyg/OlwuXGQrKT8pXCVccyooPzosXHMqKFxkPyg/OlwuXGQrKT8pXHMqKT9cKS8sc3BhY2U6ImhzbGEiLHBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybltlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF1dfX1dLGw9ZS5Db2xvcj1mdW5jdGlvbih0LGkscyxuKXtyZXR1cm4gbmV3IGUuQ29sb3IuZm4ucGFyc2UodCxpLHMsbil9LHU9e3JnYmE6e3Byb3BzOntyZWQ6e2lkeDowLHR5cGU6ImJ5dGUifSxncmVlbjp7aWR4OjEsdHlwZToiYnl0ZSJ9LGJsdWU6e2lkeDoyLHR5cGU6ImJ5dGUifX19LGhzbGE6e3Byb3BzOntodWU6e2lkeDowLHR5cGU6ImRlZ3JlZXMifSxzYXR1cmF0aW9uOntpZHg6MSx0eXBlOiJwZXJjZW50In0sbGlnaHRuZXNzOntpZHg6Mix0eXBlOiJwZXJjZW50In19fX0sZD17ImJ5dGUiOntmbG9vcjohMCxtYXg6MjU1fSxwZXJjZW50OnttYXg6MX0sZGVncmVlczp7bW9kOjM2MCxmbG9vcjohMH19LGM9bC5zdXBwb3J0PXt9LHA9ZSgiPHA+IilbMF0sZj1lLmVhY2g7cC5zdHlsZS5jc3NUZXh0PSJiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMSwxLDEsLjUpIixjLnJnYmE9cC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IuaW5kZXhPZigicmdiYSIpPi0xLGYodSxmdW5jdGlvbihlLHQpe3QuY2FjaGU9Il8iK2UsdC5wcm9wcy5hbHBoYT17aWR4OjMsdHlwZToicGVyY2VudCIsZGVmOjF9fSksbC5mbj1lLmV4dGVuZChsLnByb3RvdHlwZSx7cGFyc2U6ZnVuY3Rpb24obixvLHIsaCl7aWYobj09PXQpcmV0dXJuIHRoaXMuX3JnYmE9W251bGwsbnVsbCxudWxsLG51bGxdLHRoaXM7KG4uanF1ZXJ5fHxuLm5vZGVUeXBlKSYmKG49ZShuKS5jc3Mobyksbz10KTt2YXIgZD10aGlzLGM9ZS50eXBlKG4pLHA9dGhpcy5fcmdiYT1bXTtyZXR1cm4gbyE9PXQmJihuPVtuLG8scixoXSxjPSJhcnJheSIpLCJzdHJpbmciPT09Yz90aGlzLnBhcnNlKHMobil8fGEuX2RlZmF1bHQpOiJhcnJheSI9PT1jPyhmKHUucmdiYS5wcm9wcyxmdW5jdGlvbihlLHQpe3BbdC5pZHhdPWkoblt0LmlkeF0sdCl9KSx0aGlzKToib2JqZWN0Ij09PWM/KG4gaW5zdGFuY2VvZiBsP2YodSxmdW5jdGlvbihlLHQpe25bdC5jYWNoZV0mJihkW3QuY2FjaGVdPW5bdC5jYWNoZV0uc2xpY2UoKSl9KTpmKHUsZnVuY3Rpb24odCxzKXt2YXIgYT1zLmNhY2hlO2Yocy5wcm9wcyxmdW5jdGlvbihlLHQpe2lmKCFkW2FdJiZzLnRvKXtpZigiYWxwaGEiPT09ZXx8bnVsbD09bltlXSlyZXR1cm47ZFthXT1zLnRvKGQuX3JnYmEpfWRbYV1bdC5pZHhdPWkobltlXSx0LCEwKX0pLGRbYV0mJjA+ZS5pbkFycmF5KG51bGwsZFthXS5zbGljZSgwLDMpKSYmKGRbYV1bM109MSxzLmZyb20mJihkLl9yZ2JhPXMuZnJvbShkW2FdKSkpfSksdGhpcyk6dH0saXM6ZnVuY3Rpb24oZSl7dmFyIGk9bChlKSxzPSEwLG49dGhpcztyZXR1cm4gZih1LGZ1bmN0aW9uKGUsYSl7dmFyIG8scj1pW2EuY2FjaGVdO3JldHVybiByJiYobz1uW2EuY2FjaGVdfHxhLnRvJiZhLnRvKG4uX3JnYmEpfHxbXSxmKGEucHJvcHMsZnVuY3Rpb24oZSxpKXtyZXR1cm4gbnVsbCE9cltpLmlkeF0/cz1yW2kuaWR4XT09PW9baS5pZHhdOnR9KSksc30pLHN9LF9zcGFjZTpmdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcztyZXR1cm4gZih1LGZ1bmN0aW9uKGkscyl7dFtzLmNhY2hlXSYmZS5wdXNoKGkpfSksZS5wb3AoKX0sdHJhbnNpdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBzPWwoZSksbj1zLl9zcGFjZSgpLGE9dVtuXSxvPTA9PT10aGlzLmFscGhhKCk/bCgidHJhbnNwYXJlbnQiKTp0aGlzLHI9b1thLmNhY2hlXXx8YS50byhvLl9yZ2JhKSxoPXIuc2xpY2UoKTtyZXR1cm4gcz1zW2EuY2FjaGVdLGYoYS5wcm9wcyxmdW5jdGlvbihlLG4pe3ZhciBhPW4uaWR4LG89clthXSxsPXNbYV0sdT1kW24udHlwZV18fHt9O251bGwhPT1sJiYobnVsbD09PW8/aFthXT1sOih1Lm1vZCYmKGwtbz51Lm1vZC8yP28rPXUubW9kOm8tbD51Lm1vZC8yJiYoby09dS5tb2QpKSxoW2FdPWkoKGwtbykqdCtvLG4pKSl9KSx0aGlzW25dKGgpfSxibGVuZDpmdW5jdGlvbih0KXtpZigxPT09dGhpcy5fcmdiYVszXSlyZXR1cm4gdGhpczt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpLG49bCh0KS5fcmdiYTtyZXR1cm4gbChlLm1hcChpLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKDEtcykqblt0XStzKmV9KSl9LHRvUmdiYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PSJyZ2JhKCIsaT1lLm1hcCh0aGlzLl9yZ2JhLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWU/dD4yPzE6MDplfSk7cmV0dXJuIDE9PT1pWzNdJiYoaS5wb3AoKSx0PSJyZ2IoIiksdCtpLmpvaW4oKSsiKSJ9LHRvSHNsYVN0cmluZzpmdW5jdGlvbigpe3ZhciB0PSJoc2xhKCIsaT1lLm1hcCh0aGlzLmhzbGEoKSxmdW5jdGlvbihlLHQpe3JldHVybiBudWxsPT1lJiYoZT10PjI/MTowKSx0JiYzPnQmJihlPU1hdGgucm91bmQoMTAwKmUpKyIlIiksZX0pO3JldHVybiAxPT09aVszXSYmKGkucG9wKCksdD0iaHNsKCIpLHQraS5qb2luKCkrIikifSx0b0hleFN0cmluZzpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9yZ2JhLnNsaWNlKCkscz1pLnBvcCgpO3JldHVybiB0JiZpLnB1c2gofn4oMjU1KnMpKSwiIyIrZS5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8MCkudG9TdHJpbmcoMTYpLDE9PT1lLmxlbmd0aD8iMCIrZTplfSkuam9pbigiIil9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLl9yZ2JhWzNdPyJ0cmFuc3BhcmVudCI6dGhpcy50b1JnYmFTdHJpbmcoKX19KSxsLmZuLnBhcnNlLnByb3RvdHlwZT1sLmZuLHUuaHNsYS50bz1mdW5jdGlvbihlKXtpZihudWxsPT1lWzBdfHxudWxsPT1lWzFdfHxudWxsPT1lWzJdKXJldHVybltudWxsLG51bGwsbnVsbCxlWzNdXTt2YXIgdCxpLHM9ZVswXS8yNTUsbj1lWzFdLzI1NSxhPWVbMl0vMjU1LG89ZVszXSxyPU1hdGgubWF4KHMsbixhKSxoPU1hdGgubWluKHMsbixhKSxsPXItaCx1PXIraCxkPS41KnU7cmV0dXJuIHQ9aD09PXI/MDpzPT09cj82MCoobi1hKS9sKzM2MDpuPT09cj82MCooYS1zKS9sKzEyMDo2MCoocy1uKS9sKzI0MCxpPTA9PT1sPzA6LjU+PWQ/bC91OmwvKDItdSksW01hdGgucm91bmQodCklMzYwLGksZCxudWxsPT1vPzE6b119LHUuaHNsYS5mcm9tPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWVbMF18fG51bGw9PWVbMV18fG51bGw9PWVbMl0pcmV0dXJuW251bGwsbnVsbCxudWxsLGVbM11dO3ZhciB0PWVbMF0vMzYwLGk9ZVsxXSxzPWVbMl0sYT1lWzNdLG89LjU+PXM/cyooMStpKTpzK2ktcyppLHI9MipzLW87cmV0dXJuW01hdGgucm91bmQoMjU1Km4ocixvLHQrMS8zKSksTWF0aC5yb3VuZCgyNTUqbihyLG8sdCkpLE1hdGgucm91bmQoMjU1Km4ocixvLHQtMS8zKSksYV19LGYodSxmdW5jdGlvbihzLG4pe3ZhciBhPW4ucHJvcHMsbz1uLmNhY2hlLGg9bi50byx1PW4uZnJvbTtsLmZuW3NdPWZ1bmN0aW9uKHMpe2lmKGgmJiF0aGlzW29dJiYodGhpc1tvXT1oKHRoaXMuX3JnYmEpKSxzPT09dClyZXR1cm4gdGhpc1tvXS5zbGljZSgpO3ZhciBuLHI9ZS50eXBlKHMpLGQ9ImFycmF5Ij09PXJ8fCJvYmplY3QiPT09cj9zOmFyZ3VtZW50cyxjPXRoaXNbb10uc2xpY2UoKTtyZXR1cm4gZihhLGZ1bmN0aW9uKGUsdCl7dmFyIHM9ZFsib2JqZWN0Ij09PXI/ZTp0LmlkeF07bnVsbD09cyYmKHM9Y1t0LmlkeF0pLGNbdC5pZHhdPWkocyx0KX0pLHU/KG49bCh1KGMpKSxuW29dPWMsbik6bChjKX0sZihhLGZ1bmN0aW9uKHQsaSl7bC5mblt0XXx8KGwuZm5bdF09ZnVuY3Rpb24obil7dmFyIGEsbz1lLnR5cGUobiksaD0iYWxwaGEiPT09dD90aGlzLl9oc2xhPyJoc2xhIjoicmdiYSI6cyxsPXRoaXNbaF0oKSx1PWxbaS5pZHhdO3JldHVybiJ1bmRlZmluZWQiPT09bz91OigiZnVuY3Rpb24iPT09byYmKG49bi5jYWxsKHRoaXMsdSksbz1lLnR5cGUobikpLG51bGw9PW4mJmkuZW1wdHk/dGhpczooInN0cmluZyI9PT1vJiYoYT1yLmV4ZWMobiksYSYmKG49dStwYXJzZUZsb2F0KGFbMl0pKigiKyI9PT1hWzFdPzE6LTEpKSksbFtpLmlkeF09bix0aGlzW2hdKGwpKSl9KX0pfSksbC5ob29rPWZ1bmN0aW9uKHQpe3ZhciBpPXQuc3BsaXQoIiAiKTtmKGksZnVuY3Rpb24odCxpKXtlLmNzc0hvb2tzW2ldPXtzZXQ6ZnVuY3Rpb24odCxuKXt2YXIgYSxvLHI9IiI7aWYoInRyYW5zcGFyZW50IiE9PW4mJigic3RyaW5nIiE9PWUudHlwZShuKXx8KGE9cyhuKSkpKXtpZihuPWwoYXx8biksIWMucmdiYSYmMSE9PW4uX3JnYmFbM10pe2ZvcihvPSJiYWNrZ3JvdW5kQ29sb3IiPT09aT90LnBhcmVudE5vZGU6dDsoIiI9PT1yfHwidHJhbnNwYXJlbnQiPT09cikmJm8mJm8uc3R5bGU7KXRyeXtyPWUuY3NzKG8sImJhY2tncm91bmRDb2xvciIpLG89by5wYXJlbnROb2RlfWNhdGNoKGgpe31uPW4uYmxlbmQociYmInRyYW5zcGFyZW50IiE9PXI/cjoiX2RlZmF1bHQiKX1uPW4udG9SZ2JhU3RyaW5nKCl9dHJ5e3Quc3R5bGVbaV09bn1jYXRjaChoKXt9fX0sZS5meC5zdGVwW2ldPWZ1bmN0aW9uKHQpe3QuY29sb3JJbml0fHwodC5zdGFydD1sKHQuZWxlbSxpKSx0LmVuZD1sKHQuZW5kKSx0LmNvbG9ySW5pdD0hMCksZS5jc3NIb29rc1tpXS5zZXQodC5lbGVtLHQuc3RhcnQudHJhbnNpdGlvbih0LmVuZCx0LnBvcykpfX0pfSxsLmhvb2sobyksZS5jc3NIb29rcy5ib3JkZXJDb2xvcj17ZXhwYW5kOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBmKFsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sZnVuY3Rpb24oaSxzKXt0WyJib3JkZXIiK3MrIkNvbG9yIl09ZX0pLHR9fSxhPWUuQ29sb3IubmFtZXM9e2FxdWE6IiMwMGZmZmYiLGJsYWNrOiIjMDAwMDAwIixibHVlOiIjMDAwMGZmIixmdWNoc2lhOiIjZmYwMGZmIixncmF5OiIjODA4MDgwIixncmVlbjoiIzAwODAwMCIsbGltZToiIzAwZmYwMCIsbWFyb29uOiIjODAwMDAwIixuYXZ5OiIjMDAwMDgwIixvbGl2ZToiIzgwODAwMCIscHVycGxlOiIjODAwMDgwIixyZWQ6IiNmZjAwMDAiLHNpbHZlcjoiI2MwYzBjMCIsdGVhbDoiIzAwODA4MCIsd2hpdGU6IiNmZmZmZmYiLHllbGxvdzoiI2ZmZmYwMCIsdHJhbnNwYXJlbnQ6W251bGwsbnVsbCxudWxsLDBdLF9kZWZhdWx0OiIjZmZmZmZmIn19KGIpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxzLG49dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3P3Qub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCk6dC5jdXJyZW50U3R5bGUsYT17fTtpZihuJiZuLmxlbmd0aCYmblswXSYmbltuWzBdXSlmb3Iocz1uLmxlbmd0aDtzLS07KWk9bltzXSwic3RyaW5nIj09dHlwZW9mIG5baV0mJihhW2UuY2FtZWxDYXNlKGkpXT1uW2ldKTtlbHNlIGZvcihpIGluIG4pInN0cmluZyI9PXR5cGVvZiBuW2ldJiYoYVtpXT1uW2ldKTtyZXR1cm4gYX1mdW5jdGlvbiBpKHQsaSl7dmFyIHMsYSxvPXt9O2ZvcihzIGluIGkpYT1pW3NdLHRbc10hPT1hJiYobltzXXx8KGUuZnguc3RlcFtzXXx8IWlzTmFOKHBhcnNlRmxvYXQoYSkpKSYmKG9bc109YSkpO3JldHVybiBvfXZhciBzPVsiYWRkIiwicmVtb3ZlIiwidG9nZ2xlIl0sbj17Ym9yZGVyOjEsYm9yZGVyQm90dG9tOjEsYm9yZGVyQ29sb3I6MSxib3JkZXJMZWZ0OjEsYm9yZGVyUmlnaHQ6MSxib3JkZXJUb3A6MSxib3JkZXJXaWR0aDoxLG1hcmdpbjoxLHBhZGRpbmc6MX07ZS5lYWNoKFsiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyVG9wU3R5bGUiXSxmdW5jdGlvbih0LGkpe2UuZnguc3RlcFtpXT1mdW5jdGlvbihlKXsoIm5vbmUiIT09ZS5lbmQmJiFlLnNldEF0dHJ8fDE9PT1lLnBvcyYmIWUuc2V0QXR0cikmJihiLnN0eWxlKGUuZWxlbSxpLGUuZW5kKSxlLnNldEF0dHI9ITApfX0pLGUuZm4uYWRkQmFja3x8KGUuZm4uYWRkQmFjaz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9KSxlLmVmZmVjdHMuYW5pbWF0ZUNsYXNzPWZ1bmN0aW9uKG4sYSxvLHIpe3ZhciBoPWUuc3BlZWQoYSxvLHIpO3JldHVybiB0aGlzLnF1ZXVlKGZ1bmN0aW9uKCl7dmFyIGEsbz1lKHRoaXMpLHI9by5hdHRyKCJjbGFzcyIpfHwiIixsPWguY2hpbGRyZW4/by5maW5kKCIqIikuYWRkQmFjaygpOm87bD1sLm1hcChmdW5jdGlvbigpe3ZhciBpPWUodGhpcyk7cmV0dXJue2VsOmksc3RhcnQ6dCh0aGlzKX19KSxhPWZ1bmN0aW9uKCl7ZS5lYWNoKHMsZnVuY3Rpb24oZSx0KXtuW3RdJiZvW3QrIkNsYXNzIl0oblt0XSl9KX0sYSgpLGw9bC5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmQ9dCh0aGlzLmVsWzBdKSx0aGlzLmRpZmY9aSh0aGlzLnN0YXJ0LHRoaXMuZW5kKSx0aGlzfSksby5hdHRyKCJjbGFzcyIsciksbD1sLm1hcChmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT1lLkRlZmVycmVkKCkscz1lLmV4dGVuZCh7fSxoLHtxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpe2kucmVzb2x2ZSh0KX19KTtyZXR1cm4gdGhpcy5lbC5hbmltYXRlKHRoaXMuZGlmZixzKSxpLnByb21pc2UoKX0pLGUud2hlbi5hcHBseShlLGwuZ2V0KCkpLmRvbmUoZnVuY3Rpb24oKXthKCksZS5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWw7ZS5lYWNoKHRoaXMuZGlmZixmdW5jdGlvbihlKXt0LmNzcyhlLCIiKX0pfSksaC5jb21wbGV0ZS5jYWxsKG9bMF0pfSl9KX0sZS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMsbixhKXtyZXR1cm4gcz9lLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7YWRkOml9LHMsbixhKTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19KGUuZm4uYWRkQ2xhc3MpLHJlbW92ZUNsYXNzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihpLHMsbixhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHtyZW1vdmU6aX0scyxuLGEpOnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oZS5mbi5yZW1vdmVDbGFzcyksdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGkscyxuLGEsbyl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2Ygc3x8dm9pZCAwPT09cz9uP2UuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHM/e2FkZDppfTp7cmVtb3ZlOml9LG4sYSxvKTp0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLmVmZmVjdHMuYW5pbWF0ZUNsYXNzLmNhbGwodGhpcyx7dG9nZ2xlOml9LHMsbixhKX19KGUuZm4udG9nZ2xlQ2xhc3MpLHN3aXRjaENsYXNzOmZ1bmN0aW9uKHQsaSxzLG4sYSl7cmV0dXJuIGUuZWZmZWN0cy5hbmltYXRlQ2xhc3MuY2FsbCh0aGlzLHthZGQ6aSxyZW1vdmU6dH0scyxuLGEpfX0pfSgpLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGkscyxuKXtyZXR1cm4gZS5pc1BsYWluT2JqZWN0KHQpJiYoaT10LHQ9dC5lZmZlY3QpLHQ9e2VmZmVjdDp0fSxudWxsPT1pJiYoaT17fSksZS5pc0Z1bmN0aW9uKGkpJiYobj1pLHM9bnVsbCxpPXt9KSwoIm51bWJlciI9PXR5cGVvZiBpfHxlLmZ4LnNwZWVkc1tpXSkmJihuPXMscz1pLGk9e30pLGUuaXNGdW5jdGlvbihzKSYmKG49cyxzPW51bGwpLGkmJmUuZXh0ZW5kKHQsaSkscz1zfHxpLmR1cmF0aW9uLHQuZHVyYXRpb249ZS5meC5vZmY/MDoibnVtYmVyIj09dHlwZW9mIHM/czpzIGluIGUuZnguc3BlZWRzP2UuZnguc3BlZWRzW3NdOmUuZnguc3BlZWRzLl9kZWZhdWx0LHQuY29tcGxldGU9bnx8aS5jb21wbGV0ZSx0fWZ1bmN0aW9uIGkodCl7cmV0dXJuIXR8fCJudW1iZXIiPT10eXBlb2YgdHx8ZS5meC5zcGVlZHNbdF0/ITA6InN0cmluZyIhPXR5cGVvZiB0fHxlLmVmZmVjdHMuZWZmZWN0W3RdP2UuaXNGdW5jdGlvbih0KT8hMDoib2JqZWN0IiE9dHlwZW9mIHR8fHQuZWZmZWN0PyExOiEwOiEwfWUuZXh0ZW5kKGUuZWZmZWN0cyx7dmVyc2lvbjoiMS4xMS40IixzYXZlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBpPTA7dC5sZW5ndGg+aTtpKyspbnVsbCE9PXRbaV0mJmUuZGF0YSh5K3RbaV0sZVswXS5zdHlsZVt0W2ldXSl9LHJlc3RvcmU6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzO2ZvcihzPTA7dC5sZW5ndGg+cztzKyspbnVsbCE9PXRbc10mJihpPWUuZGF0YSh5K3Rbc10pLHZvaWQgMD09PWkmJihpPSIiKSxlLmNzcyh0W3NdLGkpKX0sc2V0TW9kZTpmdW5jdGlvbihlLHQpe3JldHVybiJ0b2dnbGUiPT09dCYmKHQ9ZS5pcygiOmhpZGRlbiIpPyJzaG93IjoiaGlkZSIpLHR9LGdldEJhc2VsaW5lOmZ1bmN0aW9uKGUsdCl7dmFyIGkscztzd2l0Y2goZVswXSl7Y2FzZSJ0b3AiOmk9MDticmVhaztjYXNlIm1pZGRsZSI6aT0uNTticmVhaztjYXNlImJvdHRvbSI6aT0xO2JyZWFrO2RlZmF1bHQ6aT1lWzBdL3QuaGVpZ2h0fXN3aXRjaChlWzFdKXtjYXNlImxlZnQiOnM9MDticmVhaztjYXNlImNlbnRlciI6cz0uNTticmVhaztjYXNlInJpZ2h0IjpzPTE7YnJlYWs7ZGVmYXVsdDpzPWVbMV0vdC53aWR0aH1yZXR1cm57eDpzLHk6aX19LGNyZWF0ZVdyYXBwZXI6ZnVuY3Rpb24odCl7aWYodC5wYXJlbnQoKS5pcygiLnVpLWVmZmVjdHMtd3JhcHBlciIpKXJldHVybiB0LnBhcmVudCgpO3ZhciBpPXt3aWR0aDp0Lm91dGVyV2lkdGgoITApLGhlaWdodDp0Lm91dGVySGVpZ2h0KCEwKSwiZmxvYXQiOnQuY3NzKCJmbG9hdCIpfSxzPWUoIjxkaXY+PC9kaXY+IikuYWRkQ2xhc3MoInVpLWVmZmVjdHMtd3JhcHBlciIpLmNzcyh7Zm9udFNpemU6IjEwMCUiLGJhY2tncm91bmQ6InRyYW5zcGFyZW50Iixib3JkZXI6Im5vbmUiLG1hcmdpbjowLHBhZGRpbmc6MH0pLG49e3dpZHRoOnQud2lkdGgoKSxoZWlnaHQ6dC5oZWlnaHQoKX0sYT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O3RyeXthLmlkfWNhdGNoKG8pe2E9ZG9jdW1lbnQuYm9keX1yZXR1cm4gdC53cmFwKHMpLCh0WzBdPT09YXx8ZS5jb250YWlucyh0WzBdLGEpKSYmZShhKS5mb2N1cygpLHM9dC5wYXJlbnQoKSwic3RhdGljIj09PXQuY3NzKCJwb3NpdGlvbiIpPyhzLmNzcyh7cG9zaXRpb246InJlbGF0aXZlIn0pLHQuY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUifSkpOihlLmV4dGVuZChpLHtwb3NpdGlvbjp0LmNzcygicG9zaXRpb24iKSx6SW5kZXg6dC5jc3MoInotaW5kZXgiKX0pLGUuZWFjaChbInRvcCIsImxlZnQiLCJib3R0b20iLCJyaWdodCJdLGZ1bmN0aW9uKGUscyl7aVtzXT10LmNzcyhzKSxpc05hTihwYXJzZUludChpW3NdLDEwKSkmJihpW3NdPSJhdXRvIil9KSx0LmNzcyh7cG9zaXRpb246InJlbGF0aXZlIix0b3A6MCxsZWZ0OjAscmlnaHQ6ImF1dG8iLGJvdHRvbToiYXV0byJ9KSksdC5jc3Mobikscy5jc3MoaSkuc2hvdygpfSxyZW1vdmVXcmFwcGVyOmZ1bmN0aW9uKHQpe3ZhciBpPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIHQucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKSYmKHQucGFyZW50KCkucmVwbGFjZVdpdGgodCksKHRbMF09PT1pfHxlLmNvbnRhaW5zKHRbMF0saSkpJiZlKGkpLmZvY3VzKCkpLHR9LHNldFRyYW5zaXRpb246ZnVuY3Rpb24odCxpLHMsbil7cmV0dXJuIG49bnx8e30sZS5lYWNoKGksZnVuY3Rpb24oZSxpKXt2YXIgYT10LmNzc1VuaXQoaSk7YVswXT4wJiYobltpXT1hWzBdKnMrYVsxXSl9KSxufX0pLGUuZm4uZXh0ZW5kKHtlZmZlY3Q6ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHQpe2Z1bmN0aW9uIGkoKXtlLmlzRnVuY3Rpb24oYSkmJmEuY2FsbChuWzBdKSxlLmlzRnVuY3Rpb24odCkmJnQoKX12YXIgbj1lKHRoaXMpLGE9cy5jb21wbGV0ZSxyPXMubW9kZTsobi5pcygiOmhpZGRlbiIpPyJoaWRlIj09PXI6InNob3ciPT09cik/KG5bcl0oKSxpKCkpOm8uY2FsbChuWzBdLHMsaSl9dmFyIHM9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj1zLm1vZGUsYT1zLnF1ZXVlLG89ZS5lZmZlY3RzLmVmZmVjdFtzLmVmZmVjdF07cmV0dXJuIGUuZngub2ZmfHwhbz9uP3RoaXNbbl0ocy5kdXJhdGlvbixzLmNvbXBsZXRlKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtzLmNvbXBsZXRlJiZzLmNvbXBsZXRlLmNhbGwodGhpcyl9KTphPT09ITE/dGhpcy5lYWNoKGkpOnRoaXMucXVldWUoYXx8ImZ4IixpKX0sc2hvdzpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKSlyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT0ic2hvdyIsdGhpcy5lZmZlY3QuY2FsbCh0aGlzLG4pfX0oZS5mbi5zaG93KSxoaWRlOmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihzKXtpZihpKHMpKXJldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbi5tb2RlPSJoaWRlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fShlLmZuLmhpZGUpLHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24ocyl7aWYoaShzKXx8ImJvb2xlYW4iPT10eXBlb2YgcylyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4ubW9kZT0idG9nZ2xlIix0aGlzLmVmZmVjdC5jYWxsKHRoaXMsbil9fShlLmZuLnRvZ2dsZSksY3NzVW5pdDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLmNzcyh0KSxzPVtdO3JldHVybiBlLmVhY2goWyJlbSIsInB4IiwiJSIsInB0Il0sZnVuY3Rpb24oZSx0KXtpLmluZGV4T2YodCk+MCYmKHM9W3BhcnNlRmxvYXQoaSksdF0pfSksc319KX0oKSxmdW5jdGlvbigpe3ZhciB0PXt9O2UuZWFjaChbIlF1YWQiLCJDdWJpYyIsIlF1YXJ0IiwiUXVpbnQiLCJFeHBvIl0sZnVuY3Rpb24oZSxpKXt0W2ldPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LGUrMil9fSksZS5leHRlbmQodCx7U2luZTpmdW5jdGlvbihlKXtyZXR1cm4gMS1NYXRoLmNvcyhlKk1hdGguUEkvMil9LENpcmM6ZnVuY3Rpb24oZSl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtZSplKX0sRWxhc3RpYzpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWV8fDE9PT1lP2U6LU1hdGgucG93KDIsOCooZS0xKSkqTWF0aC5zaW4oKDgwKihlLTEpLTcuNSkqTWF0aC5QSS8xNSl9LEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIGUqZSooMyplLTIpfSxCb3VuY2U6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LGk9NDsoKHQ9TWF0aC5wb3coMiwtLWkpKS0xKS8xMT5lOyk7cmV0dXJuIDEvTWF0aC5wb3coNCwzLWkpLTcuNTYyNSpNYXRoLnBvdygoMyp0LTIpLzIyLWUsMil9fSksZS5lYWNoKHQsZnVuY3Rpb24odCxpKXtlLmVhc2luZ1siZWFzZUluIit0XT1pLGUuZWFzaW5nWyJlYXNlT3V0Iit0XT1mdW5jdGlvbihlKXtyZXR1cm4gMS1pKDEtZSl9LGUuZWFzaW5nWyJlYXNlSW5PdXQiK3RdPWZ1bmN0aW9uKGUpe3JldHVybi41PmU/aSgyKmUpLzI6MS1pKC0yKmUrMikvMn19KX0oKSxlLmVmZmVjdHMsZS5lZmZlY3RzLmVmZmVjdC5ibGluZD1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYSxvPWUodGhpcykscj0vdXB8ZG93bnx2ZXJ0aWNhbC8saD0vdXB8bGVmdHx2ZXJ0aWNhbHxob3Jpem9udGFsLyxsPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJoZWlnaHQiLCJ3aWR0aCJdLHU9ZS5lZmZlY3RzLnNldE1vZGUobyx0Lm1vZGV8fCJoaWRlIiksZD10LmRpcmVjdGlvbnx8InVwIixjPXIudGVzdChkKSxwPWM/ImhlaWdodCI6IndpZHRoIixmPWM/InRvcCI6ImxlZnQiLG09aC50ZXN0KGQpLGc9e30sdj0ic2hvdyI9PT11O28ucGFyZW50KCkuaXMoIi51aS1lZmZlY3RzLXdyYXBwZXIiKT9lLmVmZmVjdHMuc2F2ZShvLnBhcmVudCgpLGwpOmUuZWZmZWN0cy5zYXZlKG8sbCksby5zaG93KCkscz1lLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihvKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksbj1zW3BdKCksYT1wYXJzZUZsb2F0KHMuY3NzKGYpKXx8MCxnW3BdPXY/bjowLG18fChvLmNzcyhjPyJib3R0b20iOiJyaWdodCIsMCkuY3NzKGM/InRvcCI6ImxlZnQiLCJhdXRvIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUifSksZ1tmXT12P2E6bithKSx2JiYocy5jc3MocCwwKSxtfHxzLmNzcyhmLGErbikpLHMuYW5pbWF0ZShnLHtkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxxdWV1ZTohMSxjb21wbGV0ZTpmdW5jdGlvbigpeyJoaWRlIj09PXUmJm8uaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKG8sbCksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LmJvdW5jZT1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYSxvPWUodGhpcykscj1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwiaGVpZ2h0Iiwid2lkdGgiXSxoPWUuZWZmZWN0cy5zZXRNb2RlKG8sdC5tb2RlfHwiZWZmZWN0IiksbD0iaGlkZSI9PT1oLHU9InNob3ciPT09aCxkPXQuZGlyZWN0aW9ufHwidXAiLGM9dC5kaXN0YW5jZSxwPXQudGltZXN8fDUsZj0yKnArKHV8fGw/MTowKSxtPXQuZHVyYXRpb24vZixnPXQuZWFzaW5nLHY9InVwIj09PWR8fCJkb3duIj09PWQ/InRvcCI6ImxlZnQiLHk9InVwIj09PWR8fCJsZWZ0Ij09PWQsYj1vLnF1ZXVlKCksXz1iLmxlbmd0aDtmb3IoKHV8fGwpJiZyLnB1c2goIm9wYWNpdHkiKSxlLmVmZmVjdHMuc2F2ZShvLHIpLG8uc2hvdygpLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG8pLGN8fChjPW9bInRvcCI9PT12PyJvdXRlckhlaWdodCI6Im91dGVyV2lkdGgiXSgpLzMpLHUmJihhPXtvcGFjaXR5OjF9LGFbdl09MCxvLmNzcygib3BhY2l0eSIsMCkuY3NzKHYseT8yKi1jOjIqYykuYW5pbWF0ZShhLG0sZykpLGwmJihjLz1NYXRoLnBvdygyLHAtMSkpLGE9e30sYVt2XT0wLHM9MDtwPnM7cysrKW49e30sblt2XT0oeT8iLT0iOiIrPSIpK2Msby5hbmltYXRlKG4sbSxnKS5hbmltYXRlKGEsbSxnKSxjPWw/MipjOmMvMjtsJiYobj17b3BhY2l0eTowfSxuW3ZdPSh5PyItPSI6Iis9IikrYyxvLmFuaW1hdGUobixtLGcpKSxvLnF1ZXVlKGZ1bmN0aW9uKCl7bCYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyxyKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihvKSxpKCl9KSxfPjEmJmIuc3BsaWNlLmFwcGx5KGIsWzEsMF0uY29uY2F0KGIuc3BsaWNlKF8sZisxKSkpLG8uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LmNsaXA9ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz1lKHRoaXMpLHI9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0saD1lLmVmZmVjdHMuc2V0TW9kZShvLHQubW9kZXx8ImhpZGUiKSxsPSJzaG93Ij09PWgsdT10LmRpcmVjdGlvbnx8InZlcnRpY2FsIixkPSJ2ZXJ0aWNhbCI9PT11LGM9ZD8iaGVpZ2h0Ijoid2lkdGgiLHA9ZD8idG9wIjoibGVmdCIsZj17fTtlLmVmZmVjdHMuc2F2ZShvLHIpLG8uc2hvdygpLHM9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobykuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pLG49IklNRyI9PT1vWzBdLnRhZ05hbWU/czpvLGE9bltjXSgpLGwmJihuLmNzcyhjLDApLG4uY3NzKHAsYS8yKSksZltjXT1sP2E6MCxmW3BdPWw/MDphLzIsbi5hbmltYXRlKGYse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7bHx8by5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyxyKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihvKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QuZHJvcD1mdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0aGlzKSxhPVsicG9zaXRpb24iLCJ0b3AiLCJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJvcGFjaXR5IiwiaGVpZ2h0Iiwid2lkdGgiXSxvPWUuZWZmZWN0cy5zZXRNb2RlKG4sdC5tb2RlfHwiaGlkZSIpLHI9InNob3ciPT09byxoPXQuZGlyZWN0aW9ufHwibGVmdCIsbD0idXAiPT09aHx8ImRvd24iPT09aD8idG9wIjoibGVmdCIsdT0idXAiPT09aHx8ImxlZnQiPT09aD8icG9zIjoibmVnIixkPXtvcGFjaXR5OnI/MTowfTtlLmVmZmVjdHMuc2F2ZShuLGEpLG4uc2hvdygpLGUuZWZmZWN0cy5jcmVhdGVXcmFwcGVyKG4pLHM9dC5kaXN0YW5jZXx8blsidG9wIj09PWw/Im91dGVySGVpZ2h0Ijoib3V0ZXJXaWR0aCJdKCEwKS8yLHImJm4uY3NzKCJvcGFjaXR5IiwwKS5jc3MobCwicG9zIj09PXU/LXM6cyksZFtsXT0ocj8icG9zIj09PXU/Iis9IjoiLT0iOiJwb3MiPT09dT8iLT0iOiIrPSIpK3Msbi5hbmltYXRlKGQse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ImhpZGUiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QuZXhwbG9kZT1mdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXtiLnB1c2godGhpcyksYi5sZW5ndGg9PT1kKmMmJm4oKX1mdW5jdGlvbiBuKCl7cC5jc3Moe3Zpc2liaWxpdHk6InZpc2libGUifSksZShiKS5yZW1vdmUoKSxtfHxwLmhpZGUoKSxpKCl9dmFyIGEsbyxyLGgsbCx1LGQ9dC5waWVjZXM/TWF0aC5yb3VuZChNYXRoLnNxcnQodC5waWVjZXMpKTozLGM9ZCxwPWUodGhpcyksZj1lLmVmZmVjdHMuc2V0TW9kZShwLHQubW9kZXx8ImhpZGUiKSxtPSJzaG93Ij09PWYsZz1wLnNob3coKS5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5vZmZzZXQoKSx2PU1hdGguY2VpbChwLm91dGVyV2lkdGgoKS9jKSx5PU1hdGguY2VpbChwLm91dGVySGVpZ2h0KCkvZCksYj1bXTtmb3IoYT0wO2Q+YTthKyspZm9yKGg9Zy50b3ArYSp5LHU9YS0oZC0xKS8yLG89MDtjPm87bysrKXI9Zy5sZWZ0K28qdixsPW8tKGMtMSkvMixwLmNsb25lKCkuYXBwZW5kVG8oImJvZHkiKS53cmFwKCI8ZGl2PjwvZGl2PiIpLmNzcyh7cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJ2aXNpYmxlIixsZWZ0Oi1vKnYsdG9wOi1hKnl9KS5wYXJlbnQoKS5hZGRDbGFzcygidWktZWZmZWN0cy1leHBsb2RlIikuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLG92ZXJmbG93OiJoaWRkZW4iLHdpZHRoOnYsaGVpZ2h0OnksbGVmdDpyKyhtP2wqdjowKSx0b3A6aCsobT91Knk6MCksb3BhY2l0eTptPzA6MX0pLmFuaW1hdGUoe2xlZnQ6cisobT8wOmwqdiksdG9wOmgrKG0/MDp1KnkpLG9wYWNpdHk6bT8xOjB9LHQuZHVyYXRpb258fDUwMCx0LmVhc2luZyxzKX0sZS5lZmZlY3RzLmVmZmVjdC5mYWRlPWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPWUuZWZmZWN0cy5zZXRNb2RlKHMsdC5tb2RlfHwidG9nZ2xlIik7cy5hbmltYXRlKHtvcGFjaXR5Om59LHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTppfSl9LGUuZWZmZWN0cy5lZmZlY3QuZm9sZD1mdW5jdGlvbih0LGkpe3ZhciBzLG4sYT1lKHRoaXMpLG89WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0scj1lLmVmZmVjdHMuc2V0TW9kZShhLHQubW9kZXx8ImhpZGUiKSxoPSJzaG93Ij09PXIsbD0iaGlkZSI9PT1yLHU9dC5zaXplfHwxNSxkPS8oWzAtOV0rKSUvLmV4ZWModSksYz0hIXQuaG9yaXpGaXJzdCxwPWghPT1jLGY9cD9bIndpZHRoIiwiaGVpZ2h0Il06WyJoZWlnaHQiLCJ3aWR0aCJdLG09dC5kdXJhdGlvbi8yLGc9e30sdj17fTtlLmVmZmVjdHMuc2F2ZShhLG8pLGEuc2hvdygpLHM9ZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIoYSkuY3NzKHtvdmVyZmxvdzoiaGlkZGVuIn0pLG49cD9bcy53aWR0aCgpLHMuaGVpZ2h0KCldOltzLmhlaWdodCgpLHMud2lkdGgoKV0sZCYmKHU9cGFyc2VJbnQoZFsxXSwxMCkvMTAwKm5bbD8wOjFdKSxoJiZzLmNzcyhjP3toZWlnaHQ6MCx3aWR0aDp1fTp7aGVpZ2h0OnUsd2lkdGg6MH0pLGdbZlswXV09aD9uWzBdOnUsdltmWzFdXT1oP25bMV06MCxzLmFuaW1hdGUoZyxtLHQuZWFzaW5nKS5hbmltYXRlKHYsbSx0LmVhc2luZyxmdW5jdGlvbigpe2wmJmEuaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKGEsbyksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIoYSksaSgpfSl9LGUuZWZmZWN0cy5lZmZlY3QuaGlnaGxpZ2h0PWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPVsiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZENvbG9yIiwib3BhY2l0eSJdLGE9ZS5lZmZlY3RzLnNldE1vZGUocyx0Lm1vZGV8fCJzaG93Iiksbz17YmFja2dyb3VuZENvbG9yOnMuY3NzKCJiYWNrZ3JvdW5kQ29sb3IiKX07ImhpZGUiPT09YSYmKG8ub3BhY2l0eT0wKSxlLmVmZmVjdHMuc2F2ZShzLG4pLHMuc2hvdygpLmNzcyh7YmFja2dyb3VuZEltYWdlOiJub25lIixiYWNrZ3JvdW5kQ29sb3I6dC5jb2xvcnx8IiNmZmZmOTkifSkuYW5pbWF0ZShvLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpeyJoaWRlIj09PWEmJnMuaGlkZSgpLGUuZWZmZWN0cy5yZXN0b3JlKHMsbiksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LnNpemU9ZnVuY3Rpb24odCxpKXt2YXIgcyxuLGEsbz1lKHRoaXMpLHI9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0saD1bInBvc2l0aW9uIiwidG9wIiwiYm90dG9tIiwibGVmdCIsInJpZ2h0Iiwib3ZlcmZsb3ciLCJvcGFjaXR5Il0sbD1bIndpZHRoIiwiaGVpZ2h0Iiwib3ZlcmZsb3ciXSx1PVsiZm9udFNpemUiXSxkPVsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsInBhZGRpbmdUb3AiLCJwYWRkaW5nQm90dG9tIl0sYz1bImJvcmRlckxlZnRXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJwYWRkaW5nTGVmdCIsInBhZGRpbmdSaWdodCJdLHA9ZS5lZmZlY3RzLnNldE1vZGUobyx0Lm1vZGV8fCJlZmZlY3QiKSxmPXQucmVzdG9yZXx8ImVmZmVjdCIhPT1wLG09dC5zY2FsZXx8ImJvdGgiLGc9dC5vcmlnaW58fFsibWlkZGxlIiwiY2VudGVyIl0sdj1vLmNzcygicG9zaXRpb24iKSx5PWY/cjpoLGI9e2hlaWdodDowLHdpZHRoOjAsb3V0ZXJIZWlnaHQ6MCxvdXRlcldpZHRoOjB9OyJzaG93Ij09PXAmJm8uc2hvdygpLHM9e2hlaWdodDpvLmhlaWdodCgpLHdpZHRoOm8ud2lkdGgoKSxvdXRlckhlaWdodDpvLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDpvLm91dGVyV2lkdGgoKX0sInRvZ2dsZSI9PT10Lm1vZGUmJiJzaG93Ij09PXA/KG8uZnJvbT10LnRvfHxiLG8udG89dC5mcm9tfHxzKTooby5mcm9tPXQuZnJvbXx8KCJzaG93Ij09PXA/YjpzKSxvLnRvPXQudG98fCgiaGlkZSI9PT1wP2I6cykpLGE9e2Zyb206e3k6by5mcm9tLmhlaWdodC9zLmhlaWdodCx4Om8uZnJvbS53aWR0aC9zLndpZHRofSx0bzp7eTpvLnRvLmhlaWdodC9zLmhlaWdodCx4Om8udG8ud2lkdGgvcy53aWR0aH19LCgiYm94Ij09PW18fCJib3RoIj09PW0pJiYoYS5mcm9tLnkhPT1hLnRvLnkmJih5PXkuY29uY2F0KGQpLG8uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGQsYS5mcm9tLnksby5mcm9tKSxvLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sZCxhLnRvLnksby50bykpLGEuZnJvbS54IT09YS50by54JiYoeT15LmNvbmNhdChjKSxvLmZyb209ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24obyxjLGEuZnJvbS54LG8uZnJvbSksby50bz1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLGMsYS50by54LG8udG8pKSksKCJjb250ZW50Ij09PW18fCJib3RoIj09PW0pJiZhLmZyb20ueSE9PWEudG8ueSYmKHk9eS5jb25jYXQodSkuY29uY2F0KGwpLG8uZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihvLHUsYS5mcm9tLnksby5mcm9tKSxvLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKG8sdSxhLnRvLnksby50bykpLGUuZWZmZWN0cy5zYXZlKG8seSksby5zaG93KCksZS5lZmZlY3RzLmNyZWF0ZVdyYXBwZXIobyksby5jc3MoIm92ZXJmbG93IiwiaGlkZGVuIikuY3NzKG8uZnJvbSksZyYmKG49ZS5lZmZlY3RzLmdldEJhc2VsaW5lKGcscyksby5mcm9tLnRvcD0ocy5vdXRlckhlaWdodC1vLm91dGVySGVpZ2h0KCkpKm4ueSxvLmZyb20ubGVmdD0ocy5vdXRlcldpZHRoLW8ub3V0ZXJXaWR0aCgpKSpuLngsby50by50b3A9KHMub3V0ZXJIZWlnaHQtby50by5vdXRlckhlaWdodCkqbi55LG8udG8ubGVmdD0ocy5vdXRlcldpZHRoLW8udG8ub3V0ZXJXaWR0aCkqbi54KSxvLmNzcyhvLmZyb20pLCgiY29udGVudCI9PT1tfHwiYm90aCI9PT1tKSYmKGQ9ZC5jb25jYXQoWyJtYXJnaW5Ub3AiLCJtYXJnaW5Cb3R0b20iXSkuY29uY2F0KHUpLGM9Yy5jb25jYXQoWyJtYXJnaW5MZWZ0IiwibWFyZ2luUmlnaHQiXSksbD1yLmNvbmNhdChkKS5jb25jYXQoYyksby5maW5kKCIqW3dpZHRoXSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lKHRoaXMpLHM9e2hlaWdodDppLmhlaWdodCgpLHdpZHRoOmkud2lkdGgoKSxvdXRlckhlaWdodDppLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDppLm91dGVyV2lkdGgoKX07CmYmJmUuZWZmZWN0cy5zYXZlKGksbCksaS5mcm9tPXtoZWlnaHQ6cy5oZWlnaHQqYS5mcm9tLnksd2lkdGg6cy53aWR0aCphLmZyb20ueCxvdXRlckhlaWdodDpzLm91dGVySGVpZ2h0KmEuZnJvbS55LG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKmEuZnJvbS54fSxpLnRvPXtoZWlnaHQ6cy5oZWlnaHQqYS50by55LHdpZHRoOnMud2lkdGgqYS50by54LG91dGVySGVpZ2h0OnMuaGVpZ2h0KmEudG8ueSxvdXRlcldpZHRoOnMud2lkdGgqYS50by54fSxhLmZyb20ueSE9PWEudG8ueSYmKGkuZnJvbT1lLmVmZmVjdHMuc2V0VHJhbnNpdGlvbihpLGQsYS5mcm9tLnksaS5mcm9tKSxpLnRvPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksZCxhLnRvLnksaS50bykpLGEuZnJvbS54IT09YS50by54JiYoaS5mcm9tPWUuZWZmZWN0cy5zZXRUcmFuc2l0aW9uKGksYyxhLmZyb20ueCxpLmZyb20pLGkudG89ZS5lZmZlY3RzLnNldFRyYW5zaXRpb24oaSxjLGEudG8ueCxpLnRvKSksaS5jc3MoaS5mcm9tKSxpLmFuaW1hdGUoaS50byx0LmR1cmF0aW9uLHQuZWFzaW5nLGZ1bmN0aW9uKCl7ZiYmZS5lZmZlY3RzLnJlc3RvcmUoaSxsKX0pfSkpLG8uYW5pbWF0ZShvLnRvLHtxdWV1ZTohMSxkdXJhdGlvbjp0LmR1cmF0aW9uLGVhc2luZzp0LmVhc2luZyxjb21wbGV0ZTpmdW5jdGlvbigpezA9PT1vLnRvLm9wYWNpdHkmJm8uY3NzKCJvcGFjaXR5IixvLmZyb20ub3BhY2l0eSksImhpZGUiPT09cCYmby5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobyx5KSxmfHwoInN0YXRpYyI9PT12P28uY3NzKHtwb3NpdGlvbjoicmVsYXRpdmUiLHRvcDpvLnRvLnRvcCxsZWZ0Om8udG8ubGVmdH0pOmUuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLHQpe28uY3NzKHQsZnVuY3Rpb24odCxpKXt2YXIgcz1wYXJzZUludChpLDEwKSxuPWU/by50by5sZWZ0Om8udG8udG9wO3JldHVybiJhdXRvIj09PWk/bisicHgiOnMrbisicHgifSl9KSksZS5lZmZlY3RzLnJlbW92ZVdyYXBwZXIobyksaSgpfX0pfSxlLmVmZmVjdHMuZWZmZWN0LnNjYWxlPWZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSh0aGlzKSxuPWUuZXh0ZW5kKCEwLHt9LHQpLGE9ZS5lZmZlY3RzLnNldE1vZGUocyx0Lm1vZGV8fCJlZmZlY3QiKSxvPXBhcnNlSW50KHQucGVyY2VudCwxMCl8fCgwPT09cGFyc2VJbnQodC5wZXJjZW50LDEwKT8wOiJoaWRlIj09PWE/MDoxMDApLHI9dC5kaXJlY3Rpb258fCJib3RoIixoPXQub3JpZ2luLGw9e2hlaWdodDpzLmhlaWdodCgpLHdpZHRoOnMud2lkdGgoKSxvdXRlckhlaWdodDpzLm91dGVySGVpZ2h0KCksb3V0ZXJXaWR0aDpzLm91dGVyV2lkdGgoKX0sdT17eToiaG9yaXpvbnRhbCIhPT1yP28vMTAwOjEseDoidmVydGljYWwiIT09cj9vLzEwMDoxfTtuLmVmZmVjdD0ic2l6ZSIsbi5xdWV1ZT0hMSxuLmNvbXBsZXRlPWksImVmZmVjdCIhPT1hJiYobi5vcmlnaW49aHx8WyJtaWRkbGUiLCJjZW50ZXIiXSxuLnJlc3RvcmU9ITApLG4uZnJvbT10LmZyb218fCgic2hvdyI9PT1hP3toZWlnaHQ6MCx3aWR0aDowLG91dGVySGVpZ2h0OjAsb3V0ZXJXaWR0aDowfTpsKSxuLnRvPXtoZWlnaHQ6bC5oZWlnaHQqdS55LHdpZHRoOmwud2lkdGgqdS54LG91dGVySGVpZ2h0Omwub3V0ZXJIZWlnaHQqdS55LG91dGVyV2lkdGg6bC5vdXRlcldpZHRoKnUueH0sbi5mYWRlJiYoInNob3ciPT09YSYmKG4uZnJvbS5vcGFjaXR5PTAsbi50by5vcGFjaXR5PTEpLCJoaWRlIj09PWEmJihuLmZyb20ub3BhY2l0eT0xLG4udG8ub3BhY2l0eT0wKSkscy5lZmZlY3Qobil9LGUuZWZmZWN0cy5lZmZlY3QucHVmZj1mdW5jdGlvbih0LGkpe3ZhciBzPWUodGhpcyksbj1lLmVmZmVjdHMuc2V0TW9kZShzLHQubW9kZXx8ImhpZGUiKSxhPSJoaWRlIj09PW4sbz1wYXJzZUludCh0LnBlcmNlbnQsMTApfHwxNTAscj1vLzEwMCxoPXtoZWlnaHQ6cy5oZWlnaHQoKSx3aWR0aDpzLndpZHRoKCksb3V0ZXJIZWlnaHQ6cy5vdXRlckhlaWdodCgpLG91dGVyV2lkdGg6cy5vdXRlcldpZHRoKCl9O2UuZXh0ZW5kKHQse2VmZmVjdDoic2NhbGUiLHF1ZXVlOiExLGZhZGU6ITAsbW9kZTpuLGNvbXBsZXRlOmkscGVyY2VudDphP286MTAwLGZyb206YT9oOntoZWlnaHQ6aC5oZWlnaHQqcix3aWR0aDpoLndpZHRoKnIsb3V0ZXJIZWlnaHQ6aC5vdXRlckhlaWdodCpyLG91dGVyV2lkdGg6aC5vdXRlcldpZHRoKnJ9fSkscy5lZmZlY3QodCl9LGUuZWZmZWN0cy5lZmZlY3QucHVsc2F0ZT1mdW5jdGlvbih0LGkpe3ZhciBzLG49ZSh0aGlzKSxhPWUuZWZmZWN0cy5zZXRNb2RlKG4sdC5tb2RlfHwic2hvdyIpLG89InNob3ciPT09YSxyPSJoaWRlIj09PWEsaD1vfHwiaGlkZSI9PT1hLGw9MioodC50aW1lc3x8NSkrKGg/MTowKSx1PXQuZHVyYXRpb24vbCxkPTAsYz1uLnF1ZXVlKCkscD1jLmxlbmd0aDtmb3IoKG98fCFuLmlzKCI6dmlzaWJsZSIpKSYmKG4uY3NzKCJvcGFjaXR5IiwwKS5zaG93KCksZD0xKSxzPTE7bD5zO3MrKyluLmFuaW1hdGUoe29wYWNpdHk6ZH0sdSx0LmVhc2luZyksZD0xLWQ7bi5hbmltYXRlKHtvcGFjaXR5OmR9LHUsdC5lYXNpbmcpLG4ucXVldWUoZnVuY3Rpb24oKXtyJiZuLmhpZGUoKSxpKCl9KSxwPjEmJmMuc3BsaWNlLmFwcGx5KGMsWzEsMF0uY29uY2F0KGMuc3BsaWNlKHAsbCsxKSkpLG4uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LnNoYWtlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHRoaXMpLGE9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsImhlaWdodCIsIndpZHRoIl0sbz1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8ImVmZmVjdCIpLHI9dC5kaXJlY3Rpb258fCJsZWZ0IixoPXQuZGlzdGFuY2V8fDIwLGw9dC50aW1lc3x8Myx1PTIqbCsxLGQ9TWF0aC5yb3VuZCh0LmR1cmF0aW9uL3UpLGM9InVwIj09PXJ8fCJkb3duIj09PXI/InRvcCI6ImxlZnQiLHA9InVwIj09PXJ8fCJsZWZ0Ij09PXIsZj17fSxtPXt9LGc9e30sdj1uLnF1ZXVlKCkseT12Lmxlbmd0aDtmb3IoZS5lZmZlY3RzLnNhdmUobixhKSxuLnNob3coKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihuKSxmW2NdPShwPyItPSI6Iis9IikraCxtW2NdPShwPyIrPSI6Ii09IikrMipoLGdbY109KHA/Ii09IjoiKz0iKSsyKmgsbi5hbmltYXRlKGYsZCx0LmVhc2luZykscz0xO2w+cztzKyspbi5hbmltYXRlKG0sZCx0LmVhc2luZykuYW5pbWF0ZShnLGQsdC5lYXNpbmcpO24uYW5pbWF0ZShtLGQsdC5lYXNpbmcpLmFuaW1hdGUoZixkLzIsdC5lYXNpbmcpLnF1ZXVlKGZ1bmN0aW9uKCl7ImhpZGUiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9KSx5PjEmJnYuc3BsaWNlLmFwcGx5KHYsWzEsMF0uY29uY2F0KHYuc3BsaWNlKHksdSsxKSkpLG4uZGVxdWV1ZSgpfSxlLmVmZmVjdHMuZWZmZWN0LnNsaWRlPWZ1bmN0aW9uKHQsaSl7dmFyIHMsbj1lKHRoaXMpLGE9WyJwb3NpdGlvbiIsInRvcCIsImJvdHRvbSIsImxlZnQiLCJyaWdodCIsIndpZHRoIiwiaGVpZ2h0Il0sbz1lLmVmZmVjdHMuc2V0TW9kZShuLHQubW9kZXx8InNob3ciKSxyPSJzaG93Ij09PW8saD10LmRpcmVjdGlvbnx8ImxlZnQiLGw9InVwIj09PWh8fCJkb3duIj09PWg/InRvcCI6ImxlZnQiLHU9InVwIj09PWh8fCJsZWZ0Ij09PWgsZD17fTtlLmVmZmVjdHMuc2F2ZShuLGEpLG4uc2hvdygpLHM9dC5kaXN0YW5jZXx8blsidG9wIj09PWw/Im91dGVySGVpZ2h0Ijoib3V0ZXJXaWR0aCJdKCEwKSxlLmVmZmVjdHMuY3JlYXRlV3JhcHBlcihuKS5jc3Moe292ZXJmbG93OiJoaWRkZW4ifSksciYmbi5jc3MobCx1P2lzTmFOKHMpPyItIitzOi1zOnMpLGRbbF09KHI/dT8iKz0iOiItPSI6dT8iLT0iOiIrPSIpK3Msbi5hbmltYXRlKGQse3F1ZXVlOiExLGR1cmF0aW9uOnQuZHVyYXRpb24sZWFzaW5nOnQuZWFzaW5nLGNvbXBsZXRlOmZ1bmN0aW9uKCl7ImhpZGUiPT09byYmbi5oaWRlKCksZS5lZmZlY3RzLnJlc3RvcmUobixhKSxlLmVmZmVjdHMucmVtb3ZlV3JhcHBlcihuKSxpKCl9fSl9LGUuZWZmZWN0cy5lZmZlY3QudHJhbnNmZXI9ZnVuY3Rpb24odCxpKXt2YXIgcz1lKHRoaXMpLG49ZSh0LnRvKSxhPSJmaXhlZCI9PT1uLmNzcygicG9zaXRpb24iKSxvPWUoImJvZHkiKSxyPWE/by5zY3JvbGxUb3AoKTowLGg9YT9vLnNjcm9sbExlZnQoKTowLGw9bi5vZmZzZXQoKSx1PXt0b3A6bC50b3AtcixsZWZ0OmwubGVmdC1oLGhlaWdodDpuLmlubmVySGVpZ2h0KCksd2lkdGg6bi5pbm5lcldpZHRoKCl9LGQ9cy5vZmZzZXQoKSxjPWUoIjxkaXYgY2xhc3M9J3VpLWVmZmVjdHMtdHJhbnNmZXInPjwvZGl2PiIpLmFwcGVuZFRvKGRvY3VtZW50LmJvZHkpLmFkZENsYXNzKHQuY2xhc3NOYW1lKS5jc3Moe3RvcDpkLnRvcC1yLGxlZnQ6ZC5sZWZ0LWgsaGVpZ2h0OnMuaW5uZXJIZWlnaHQoKSx3aWR0aDpzLmlubmVyV2lkdGgoKSxwb3NpdGlvbjphPyJmaXhlZCI6ImFic29sdXRlIn0pLmFuaW1hdGUodSx0LmR1cmF0aW9uLHQuZWFzaW5nLGZ1bmN0aW9uKCl7Yy5yZW1vdmUoKSxpKCl9KX0sZS53aWRnZXQoInVpLnByb2dyZXNzYmFyIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOnttYXg6MTAwLHZhbHVlOjAsY2hhbmdlOm51bGwsY29tcGxldGU6bnVsbH0sbWluOjAsX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMub2xkVmFsdWU9dGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikuYXR0cih7cm9sZToicHJvZ3Jlc3NiYXIiLCJhcmlhLXZhbHVlbWluIjp0aGlzLm1pbn0pLHRoaXMudmFsdWVEaXY9ZSgiPGRpdiBjbGFzcz0ndWktcHJvZ3Jlc3NiYXItdmFsdWUgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItbGVmdCc+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXByb2dyZXNzYmFyIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtaW4iKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbWF4IikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW5vdyIpLHRoaXMudmFsdWVEaXYucmVtb3ZlKCl9LHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP3RoaXMub3B0aW9ucy52YWx1ZToodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX2NvbnN0cmFpbmVkVmFsdWUoZSksdGhpcy5fcmVmcmVzaFZhbHVlKCksdm9pZCAwKX0sX2NvbnN0cmFpbmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPXRoaXMub3B0aW9ucy52YWx1ZSksdGhpcy5pbmRldGVybWluYXRlPWU9PT0hMSwibnVtYmVyIiE9dHlwZW9mIGUmJihlPTApLHRoaXMuaW5kZXRlcm1pbmF0ZT8hMTpNYXRoLm1pbih0aGlzLm9wdGlvbnMubWF4LE1hdGgubWF4KHRoaXMubWluLGUpKX0sX3NldE9wdGlvbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS52YWx1ZTtkZWxldGUgZS52YWx1ZSx0aGlzLl9zdXBlcihlKSx0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fY29uc3RyYWluZWRWYWx1ZSh0KSx0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpeyJtYXgiPT09ZSYmKHQ9TWF0aC5tYXgodGhpcy5taW4sdCkpLCJkaXNhYmxlZCI9PT1lJiZ0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIiwhIXQpLmF0dHIoImFyaWEtZGlzYWJsZWQiLHQpLHRoaXMuX3N1cGVyKGUsdCl9LF9wZXJjZW50YWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXRlcm1pbmF0ZT8xMDA6MTAwKih0aGlzLm9wdGlvbnMudmFsdWUtdGhpcy5taW4pLyh0aGlzLm9wdGlvbnMubWF4LXRoaXMubWluKX0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy52YWx1ZSxpPXRoaXMuX3BlcmNlbnRhZ2UoKTt0aGlzLnZhbHVlRGl2LnRvZ2dsZSh0aGlzLmluZGV0ZXJtaW5hdGV8fHQ+dGhpcy5taW4pLnRvZ2dsZUNsYXNzKCJ1aS1jb3JuZXItcmlnaHQiLHQ9PT10aGlzLm9wdGlvbnMubWF4KS53aWR0aChpLnRvRml4ZWQoMCkrIiUiKSx0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoInVpLXByb2dyZXNzYmFyLWluZGV0ZXJtaW5hdGUiLHRoaXMuaW5kZXRlcm1pbmF0ZSksdGhpcy5pbmRldGVybWluYXRlPyh0aGlzLmVsZW1lbnQucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW5vdyIpLHRoaXMub3ZlcmxheURpdnx8KHRoaXMub3ZlcmxheURpdj1lKCI8ZGl2IGNsYXNzPSd1aS1wcm9ncmVzc2Jhci1vdmVybGF5Jz48L2Rpdj4iKS5hcHBlbmRUbyh0aGlzLnZhbHVlRGl2KSkpOih0aGlzLmVsZW1lbnQuYXR0cih7ImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnR9KSx0aGlzLm92ZXJsYXlEaXYmJih0aGlzLm92ZXJsYXlEaXYucmVtb3ZlKCksdGhpcy5vdmVybGF5RGl2PW51bGwpKSx0aGlzLm9sZFZhbHVlIT09dCYmKHRoaXMub2xkVmFsdWU9dCx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiKSksdD09PXRoaXMub3B0aW9ucy5tYXgmJnRoaXMuX3RyaWdnZXIoImNvbXBsZXRlIil9fSksZS53aWRnZXQoInVpLnNlbGVjdGFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuMTEuNCIsb3B0aW9uczp7YXBwZW5kVG86ImJvZHkiLGF1dG9SZWZyZXNoOiEwLGRpc3RhbmNlOjAsZmlsdGVyOiIqIix0b2xlcmFuY2U6InRvdWNoIixzZWxlY3RlZDpudWxsLHNlbGVjdGluZzpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsLHVuc2VsZWN0ZWQ6bnVsbCx1bnNlbGVjdGluZzpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dmFyIHQsaT10aGlzO3RoaXMuZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0YWJsZSIpLHRoaXMuZHJhZ2dlZD0hMSx0aGlzLnJlZnJlc2g9ZnVuY3Rpb24oKXt0PWUoaS5vcHRpb25zLmZpbHRlcixpLmVsZW1lbnRbMF0pLHQuYWRkQ2xhc3MoInVpLXNlbGVjdGVlIiksdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxpPXQub2Zmc2V0KCk7ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIse2VsZW1lbnQ6dGhpcywkZWxlbWVudDp0LGxlZnQ6aS5sZWZ0LHRvcDppLnRvcCxyaWdodDppLmxlZnQrdC5vdXRlcldpZHRoKCksYm90dG9tOmkudG9wK3Qub3V0ZXJIZWlnaHQoKSxzdGFydHNlbGVjdGVkOiExLHNlbGVjdGVkOnQuaGFzQ2xhc3MoInVpLXNlbGVjdGVkIiksc2VsZWN0aW5nOnQuaGFzQ2xhc3MoInVpLXNlbGVjdGluZyIpLHVuc2VsZWN0aW5nOnQuaGFzQ2xhc3MoInVpLXVuc2VsZWN0aW5nIil9KX0pfSx0aGlzLnJlZnJlc2goKSx0aGlzLnNlbGVjdGVlcz10LmFkZENsYXNzKCJ1aS1zZWxlY3RlZSIpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuaGVscGVyPWUoIjxkaXYgY2xhc3M9J3VpLXNlbGVjdGFibGUtaGVscGVyJz48L2Rpdj4iKX0sX2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVlcy5yZW1vdmVDbGFzcygidWktc2VsZWN0ZWUiKS5yZW1vdmVEYXRhKCJzZWxlY3RhYmxlLWl0ZW0iKSx0aGlzLmVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGFibGUgdWktc2VsZWN0YWJsZS1kaXNhYmxlZCIpLHRoaXMuX21vdXNlRGVzdHJveSgpfSxfbW91c2VTdGFydDpmdW5jdGlvbih0KXt2YXIgaT10aGlzLHM9dGhpcy5vcHRpb25zO3RoaXMub3Bvcz1bdC5wYWdlWCx0LnBhZ2VZXSx0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCh0aGlzLnNlbGVjdGVlcz1lKHMuZmlsdGVyLHRoaXMuZWxlbWVudFswXSksdGhpcy5fdHJpZ2dlcigic3RhcnQiLHQpLGUocy5hcHBlbmRUbykuYXBwZW5kKHRoaXMuaGVscGVyKSx0aGlzLmhlbHBlci5jc3Moe2xlZnQ6dC5wYWdlWCx0b3A6dC5wYWdlWSx3aWR0aDowLGhlaWdodDowfSkscy5hdXRvUmVmcmVzaCYmdGhpcy5yZWZyZXNoKCksdGhpcy5zZWxlY3RlZXMuZmlsdGVyKCIudWktc2VsZWN0ZWQiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3Muc3RhcnRzZWxlY3RlZD0hMCx0Lm1ldGFLZXl8fHQuY3RybEtleXx8KHMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGVkIikscy5zZWxlY3RlZD0hMSxzLiRlbGVtZW50LmFkZENsYXNzKCJ1aS11bnNlbGVjdGluZyIpLHMudW5zZWxlY3Rpbmc9ITAsaS5fdHJpZ2dlcigidW5zZWxlY3RpbmciLHQse3Vuc2VsZWN0aW5nOnMuZWxlbWVudH0pKX0pLGUodC50YXJnZXQpLnBhcmVudHMoKS5hZGRCYWNrKCkuZWFjaChmdW5jdGlvbigpe3ZhciBzLG49ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3JldHVybiBuPyhzPSF0Lm1ldGFLZXkmJiF0LmN0cmxLZXl8fCFuLiRlbGVtZW50Lmhhc0NsYXNzKCJ1aS1zZWxlY3RlZCIpLG4uJGVsZW1lbnQucmVtb3ZlQ2xhc3Mocz8idWktdW5zZWxlY3RpbmciOiJ1aS1zZWxlY3RlZCIpLmFkZENsYXNzKHM/InVpLXNlbGVjdGluZyI6InVpLXVuc2VsZWN0aW5nIiksbi51bnNlbGVjdGluZz0hcyxuLnNlbGVjdGluZz1zLG4uc2VsZWN0ZWQ9cyxzP2kuX3RyaWdnZXIoInNlbGVjdGluZyIsdCx7c2VsZWN0aW5nOm4uZWxlbWVudH0pOmkuX3RyaWdnZXIoInVuc2VsZWN0aW5nIix0LHt1bnNlbGVjdGluZzpuLmVsZW1lbnR9KSwhMSk6dm9pZCAwfSkpfSxfbW91c2VEcmFnOmZ1bmN0aW9uKHQpe2lmKHRoaXMuZHJhZ2dlZD0hMCwhdGhpcy5vcHRpb25zLmRpc2FibGVkKXt2YXIgaSxzPXRoaXMsbj10aGlzLm9wdGlvbnMsYT10aGlzLm9wb3NbMF0sbz10aGlzLm9wb3NbMV0scj10LnBhZ2VYLGg9dC5wYWdlWTtyZXR1cm4gYT5yJiYoaT1yLHI9YSxhPWkpLG8+aCYmKGk9aCxoPW8sbz1pKSx0aGlzLmhlbHBlci5jc3Moe2xlZnQ6YSx0b3A6byx3aWR0aDpyLWEsaGVpZ2h0Omgtb30pLHRoaXMuc2VsZWN0ZWVzLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1lLmRhdGEodGhpcywic2VsZWN0YWJsZS1pdGVtIiksbD0hMTtpJiZpLmVsZW1lbnQhPT1zLmVsZW1lbnRbMF0mJigidG91Y2giPT09bi50b2xlcmFuY2U/bD0hKGkubGVmdD5yfHxhPmkucmlnaHR8fGkudG9wPmh8fG8+aS5ib3R0b20pOiJmaXQiPT09bi50b2xlcmFuY2UmJihsPWkubGVmdD5hJiZyPmkucmlnaHQmJmkudG9wPm8mJmg+aS5ib3R0b20pLGw/KGkuc2VsZWN0ZWQmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEpLGkudW5zZWxlY3RpbmcmJihpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS11bnNlbGVjdGluZyIpLGkudW5zZWxlY3Rpbmc9ITEpLGkuc2VsZWN0aW5nfHwoaS4kZWxlbWVudC5hZGRDbGFzcygidWktc2VsZWN0aW5nIiksaS5zZWxlY3Rpbmc9ITAscy5fdHJpZ2dlcigic2VsZWN0aW5nIix0LHtzZWxlY3Rpbmc6aS5lbGVtZW50fSkpKTooaS5zZWxlY3RpbmcmJigodC5tZXRhS2V5fHx0LmN0cmxLZXkpJiZpLnN0YXJ0c2VsZWN0ZWQ/KGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSExLGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXNlbGVjdGVkIiksaS5zZWxlY3RlZD0hMCk6KGkuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXNlbGVjdGluZyIpLGkuc2VsZWN0aW5nPSExLGkuc3RhcnRzZWxlY3RlZCYmKGkuJGVsZW1lbnQuYWRkQ2xhc3MoInVpLXVuc2VsZWN0aW5nIiksaS51bnNlbGVjdGluZz0hMCkscy5fdHJpZ2dlcigidW5zZWxlY3RpbmciLHQse3Vuc2VsZWN0aW5nOmkuZWxlbWVudH0pKSksaS5zZWxlY3RlZCYmKHQubWV0YUtleXx8dC5jdHJsS2V5fHxpLnN0YXJ0c2VsZWN0ZWR8fChpLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RlZCIpLGkuc2VsZWN0ZWQ9ITEsaS4kZWxlbWVudC5hZGRDbGFzcygidWktdW5zZWxlY3RpbmciKSxpLnVuc2VsZWN0aW5nPSEwLHMuX3RyaWdnZXIoInVuc2VsZWN0aW5nIix0LHt1bnNlbGVjdGluZzppLmVsZW1lbnR9KSkpKSl9KSwhMX19LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcztyZXR1cm4gdGhpcy5kcmFnZ2VkPSExLGUoIi51aS11bnNlbGVjdGluZyIsdGhpcy5lbGVtZW50WzBdKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9ZS5kYXRhKHRoaXMsInNlbGVjdGFibGUtaXRlbSIpO3MuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoInVpLXVuc2VsZWN0aW5nIikscy51bnNlbGVjdGluZz0hMSxzLnN0YXJ0c2VsZWN0ZWQ9ITEsaS5fdHJpZ2dlcigidW5zZWxlY3RlZCIsdCx7dW5zZWxlY3RlZDpzLmVsZW1lbnR9KX0pLGUoIi51aS1zZWxlY3RpbmciLHRoaXMuZWxlbWVudFswXSkuZWFjaChmdW5jdGlvbigpe3ZhciBzPWUuZGF0YSh0aGlzLCJzZWxlY3RhYmxlLWl0ZW0iKTtzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zZWxlY3RpbmciKS5hZGRDbGFzcygidWktc2VsZWN0ZWQiKSxzLnNlbGVjdGluZz0hMSxzLnNlbGVjdGVkPSEwLHMuc3RhcnRzZWxlY3RlZD0hMCxpLl90cmlnZ2VyKCJzZWxlY3RlZCIsdCx7c2VsZWN0ZWQ6cy5lbGVtZW50fSl9KSx0aGlzLl90cmlnZ2VyKCJzdG9wIix0KSx0aGlzLmhlbHBlci5yZW1vdmUoKSwhMX19KSxlLndpZGdldCgidWkuc2VsZWN0bWVudSIse3ZlcnNpb246IjEuMTEuNCIsZGVmYXVsdEVsZW1lbnQ6IjxzZWxlY3Q+IixvcHRpb25zOnthcHBlbmRUbzpudWxsLGRpc2FibGVkOm51bGwsaWNvbnM6e2J1dHRvbjoidWktaWNvbi10cmlhbmdsZS0xLXMifSxwb3NpdGlvbjp7bXk6ImxlZnQgdG9wIixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoibm9uZSJ9LHdpZHRoOm51bGwsY2hhbmdlOm51bGwsY2xvc2U6bnVsbCxmb2N1czpudWxsLG9wZW46bnVsbCxzZWxlY3Q6bnVsbH0sX2NyZWF0ZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuZWxlbWVudC51bmlxdWVJZCgpLmF0dHIoImlkIik7dGhpcy5pZHM9e2VsZW1lbnQ6ZSxidXR0b246ZSsiLWJ1dHRvbiIsbWVudTplKyItbWVudSJ9LHRoaXMuX2RyYXdCdXR0b24oKSx0aGlzLl9kcmF3TWVudSgpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5kaXNhYmxlKCl9LF9kcmF3QnV0dG9uOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmxhYmVsPWUoImxhYmVsW2Zvcj0nIit0aGlzLmlkcy5lbGVtZW50KyInXSIpLmF0dHIoImZvciIsdGhpcy5pZHMuYnV0dG9uKSx0aGlzLl9vbih0aGlzLmxhYmVsLHtjbGljazpmdW5jdGlvbihlKXt0aGlzLmJ1dHRvbi5mb2N1cygpLGUucHJldmVudERlZmF1bHQoKX19KSx0aGlzLmVsZW1lbnQuaGlkZSgpLHRoaXMuYnV0dG9uPWUoIjxzcGFuPiIseyJjbGFzcyI6InVpLXNlbGVjdG1lbnUtYnV0dG9uIHVpLXdpZGdldCB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiLHRhYmluZGV4OnRoaXMub3B0aW9ucy5kaXNhYmxlZD8tMTowLGlkOnRoaXMuaWRzLmJ1dHRvbixyb2xlOiJjb21ib2JveCIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsImFyaWEtYXV0b2NvbXBsZXRlIjoibGlzdCIsImFyaWEtb3ducyI6dGhpcy5pZHMubWVudSwiYXJpYS1oYXNwb3B1cCI6InRydWUifSkuaW5zZXJ0QWZ0ZXIodGhpcy5lbGVtZW50KSxlKCI8c3Bhbj4iLHsiY2xhc3MiOiJ1aS1pY29uICIrdGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbn0pLnByZXBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5idXR0b25UZXh0PWUoIjxzcGFuPiIseyJjbGFzcyI6InVpLXNlbGVjdG1lbnUtdGV4dCJ9KS5hcHBlbmRUbyh0aGlzLmJ1dHRvbiksdGhpcy5fc2V0VGV4dCh0aGlzLmJ1dHRvblRleHQsdGhpcy5lbGVtZW50LmZpbmQoIm9wdGlvbjpzZWxlY3RlZCIpLnRleHQoKSksdGhpcy5fcmVzaXplQnV0dG9uKCksdGhpcy5fb24odGhpcy5idXR0b24sdGhpcy5fYnV0dG9uRXZlbnRzKSx0aGlzLmJ1dHRvbi5vbmUoImZvY3VzaW4iLGZ1bmN0aW9uKCl7dC5tZW51SXRlbXN8fHQuX3JlZnJlc2hNZW51KCl9KSx0aGlzLl9ob3ZlcmFibGUodGhpcy5idXR0b24pLHRoaXMuX2ZvY3VzYWJsZSh0aGlzLmJ1dHRvbil9LF9kcmF3TWVudTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5tZW51PWUoIjx1bD4iLHsiYXJpYS1oaWRkZW4iOiJ0cnVlIiwiYXJpYS1sYWJlbGxlZGJ5Ijp0aGlzLmlkcy5idXR0b24saWQ6dGhpcy5pZHMubWVudX0pLHRoaXMubWVudVdyYXA9ZSgiPGRpdj4iLHsiY2xhc3MiOiJ1aS1zZWxlY3RtZW51LW1lbnUgdWktZnJvbnQifSkuYXBwZW5kKHRoaXMubWVudSkuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksdGhpcy5tZW51SW5zdGFuY2U9dGhpcy5tZW51Lm1lbnUoe3JvbGU6Imxpc3Rib3giLHNlbGVjdDpmdW5jdGlvbihlLGkpe2UucHJldmVudERlZmF1bHQoKSx0Ll9zZXRTZWxlY3Rpb24oKSx0Ll9zZWxlY3QoaS5pdGVtLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIpLGUpfSxmb2N1czpmdW5jdGlvbihlLGkpe3ZhciBzPWkuaXRlbS5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKTtudWxsIT10LmZvY3VzSW5kZXgmJnMuaW5kZXghPT10LmZvY3VzSW5kZXgmJih0Ll90cmlnZ2VyKCJmb2N1cyIsZSx7aXRlbTpzfSksdC5pc09wZW58fHQuX3NlbGVjdChzLGUpKSx0LmZvY3VzSW5kZXg9cy5pbmRleCx0LmJ1dHRvbi5hdHRyKCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnQiLHQubWVudUl0ZW1zLmVxKHMuaW5kZXgpLmF0dHIoImlkIikpfX0pLm1lbnUoImluc3RhbmNlIiksdGhpcy5tZW51LmFkZENsYXNzKCJ1aS1jb3JuZXItYm90dG9tIikucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0aGlzLm1lbnVJbnN0YW5jZS5fb2ZmKHRoaXMubWVudSwibW91c2VsZWF2ZSIpLHRoaXMubWVudUluc3RhbmNlLl9jbG9zZU9uRG9jdW1lbnRDbGljaz1mdW5jdGlvbigpe3JldHVybiExfSx0aGlzLm1lbnVJbnN0YW5jZS5faXNEaXZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuITF9fSxyZWZyZXNoOmZ1bmN0aW9uKCl7dGhpcy5fcmVmcmVzaE1lbnUoKSx0aGlzLl9zZXRUZXh0KHRoaXMuYnV0dG9uVGV4dCx0aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKS50ZXh0KCkpLHRoaXMub3B0aW9ucy53aWR0aHx8dGhpcy5fcmVzaXplQnV0dG9uKCl9LF9yZWZyZXNoTWVudTpmdW5jdGlvbigpe3RoaXMubWVudS5lbXB0eSgpO3ZhciBlLHQ9dGhpcy5lbGVtZW50LmZpbmQoIm9wdGlvbiIpO3QubGVuZ3RoJiYodGhpcy5fcGFyc2VPcHRpb25zKHQpLHRoaXMuX3JlbmRlck1lbnUodGhpcy5tZW51LHRoaXMuaXRlbXMpLHRoaXMubWVudUluc3RhbmNlLnJlZnJlc2goKSx0aGlzLm1lbnVJdGVtcz10aGlzLm1lbnUuZmluZCgibGkiKS5ub3QoIi51aS1zZWxlY3RtZW51LW9wdGdyb3VwIiksZT10aGlzLl9nZXRTZWxlY3RlZEl0ZW0oKSx0aGlzLm1lbnVJbnN0YW5jZS5mb2N1cyhudWxsLGUpLHRoaXMuX3NldEFyaWEoZS5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKSksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIikpKX0sb3BlbjpmdW5jdGlvbihlKXt0aGlzLm9wdGlvbnMuZGlzYWJsZWR8fCh0aGlzLm1lbnVJdGVtcz8odGhpcy5tZW51LmZpbmQoIi51aS1zdGF0ZS1mb2N1cyIpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1mb2N1cyIpLHRoaXMubWVudUluc3RhbmNlLmZvY3VzKG51bGwsdGhpcy5fZ2V0U2VsZWN0ZWRJdGVtKCkpKTp0aGlzLl9yZWZyZXNoTWVudSgpLHRoaXMuaXNPcGVuPSEwLHRoaXMuX3RvZ2dsZUF0dHIoKSx0aGlzLl9yZXNpemVNZW51KCksdGhpcy5fcG9zaXRpb24oKSx0aGlzLl9vbih0aGlzLmRvY3VtZW50LHRoaXMuX2RvY3VtZW50Q2xpY2spLHRoaXMuX3RyaWdnZXIoIm9wZW4iLGUpKX0sX3Bvc2l0aW9uOmZ1bmN0aW9uKCl7dGhpcy5tZW51V3JhcC5wb3NpdGlvbihlLmV4dGVuZCh7b2Y6dGhpcy5idXR0b259LHRoaXMub3B0aW9ucy5wb3NpdGlvbikpfSxjbG9zZTpmdW5jdGlvbihlKXt0aGlzLmlzT3BlbiYmKHRoaXMuaXNPcGVuPSExLHRoaXMuX3RvZ2dsZUF0dHIoKSx0aGlzLnJhbmdlPW51bGwsdGhpcy5fb2ZmKHRoaXMuZG9jdW1lbnQpLHRoaXMuX3RyaWdnZXIoImNsb3NlIixlKSl9LHdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1dHRvbn0sbWVudVdpZGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1lbnV9LF9yZW5kZXJNZW51OmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpcyxuPSIiO2UuZWFjaChpLGZ1bmN0aW9uKGksYSl7YS5vcHRncm91cCE9PW4mJihlKCI8bGk+Iix7ImNsYXNzIjoidWktc2VsZWN0bWVudS1vcHRncm91cCB1aS1tZW51LWRpdmlkZXIiKyhhLmVsZW1lbnQucGFyZW50KCJvcHRncm91cCIpLnByb3AoImRpc2FibGVkIik/IiB1aS1zdGF0ZS1kaXNhYmxlZCI6IiIpLHRleHQ6YS5vcHRncm91cH0pLmFwcGVuZFRvKHQpLG49YS5vcHRncm91cCkscy5fcmVuZGVySXRlbURhdGEodCxhKX0pfSxfcmVuZGVySXRlbURhdGE6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fcmVuZGVySXRlbShlLHQpLmRhdGEoInVpLXNlbGVjdG1lbnUtaXRlbSIsdCl9LF9yZW5kZXJJdGVtOmZ1bmN0aW9uKHQsaSl7dmFyIHM9ZSgiPGxpPiIpO3JldHVybiBpLmRpc2FibGVkJiZzLmFkZENsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLHRoaXMuX3NldFRleHQocyxpLmxhYmVsKSxzLmFwcGVuZFRvKHQpfSxfc2V0VGV4dDpmdW5jdGlvbihlLHQpe3Q/ZS50ZXh0KHQpOmUuaHRtbCgiJiMxNjA7Iil9LF9tb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIGkscyxuPSIudWktbWVudS1pdGVtIjt0aGlzLmlzT3Blbj9pPXRoaXMubWVudUl0ZW1zLmVxKHRoaXMuZm9jdXNJbmRleCk6KGk9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpLG4rPSI6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCkiKSxzPSJmaXJzdCI9PT1lfHwibGFzdCI9PT1lP2lbImZpcnN0Ij09PWU/InByZXZBbGwiOiJuZXh0QWxsIl0obikuZXEoLTEpOmlbZSsiQWxsIl0obikuZXEoMCkscy5sZW5ndGgmJnRoaXMubWVudUluc3RhbmNlLmZvY3VzKHQscyl9LF9nZXRTZWxlY3RlZEl0ZW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZW51SXRlbXMuZXEodGhpcy5lbGVtZW50WzBdLnNlbGVjdGVkSW5kZXgpfSxfdG9nZ2xlOmZ1bmN0aW9uKGUpe3RoaXNbdGhpcy5pc09wZW4/ImNsb3NlIjoib3BlbiJdKGUpfSxfc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU7dGhpcy5yYW5nZSYmKHdpbmRvdy5nZXRTZWxlY3Rpb24/KGU9d2luZG93LmdldFNlbGVjdGlvbigpLGUucmVtb3ZlQWxsUmFuZ2VzKCksZS5hZGRSYW5nZSh0aGlzLnJhbmdlKSk6dGhpcy5yYW5nZS5zZWxlY3QoKSx0aGlzLmJ1dHRvbi5mb2N1cygpKX0sX2RvY3VtZW50Q2xpY2s6e21vdXNlZG93bjpmdW5jdGlvbih0KXt0aGlzLmlzT3BlbiYmKGUodC50YXJnZXQpLmNsb3Nlc3QoIi51aS1zZWxlY3RtZW51LW1lbnUsICMiK3RoaXMuaWRzLmJ1dHRvbikubGVuZ3RofHx0aGlzLmNsb3NlKHQpKX19LF9idXR0b25FdmVudHM6e21vdXNlZG93bjpmdW5jdGlvbigpe3ZhciBlO3dpbmRvdy5nZXRTZWxlY3Rpb24/KGU9d2luZG93LmdldFNlbGVjdGlvbigpLGUucmFuZ2VDb3VudCYmKHRoaXMucmFuZ2U9ZS5nZXRSYW5nZUF0KDApKSk6dGhpcy5yYW5nZT1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKX0sY2xpY2s6ZnVuY3Rpb24oZSl7dGhpcy5fc2V0U2VsZWN0aW9uKCksdGhpcy5fdG9nZ2xlKGUpfSxrZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPSEwO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlRBQjpjYXNlIGUudWkua2V5Q29kZS5FU0NBUEU6dGhpcy5jbG9zZSh0KSxpPSExO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnRoaXMuaXNPcGVuJiZ0aGlzLl9zZWxlY3RGb2N1c2VkSXRlbSh0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDp0LmFsdEtleT90aGlzLl90b2dnbGUodCk6dGhpcy5fbW92ZSgicHJldiIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRE9XTjp0LmFsdEtleT90aGlzLl90b2dnbGUodCk6dGhpcy5fbW92ZSgibmV4dCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuU1BBQ0U6dGhpcy5pc09wZW4/dGhpcy5fc2VsZWN0Rm9jdXNlZEl0ZW0odCk6dGhpcy5fdG9nZ2xlKHQpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkxFRlQ6dGhpcy5fbW92ZSgicHJldiIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUklHSFQ6dGhpcy5fbW92ZSgibmV4dCIsdCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuSE9NRTpjYXNlIGUudWkua2V5Q29kZS5QQUdFX1VQOnRoaXMuX21vdmUoImZpcnN0Iix0KTticmVhaztjYXNlIGUudWkua2V5Q29kZS5FTkQ6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOnRoaXMuX21vdmUoImxhc3QiLHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5tZW51LnRyaWdnZXIodCksaT0hMX1pJiZ0LnByZXZlbnREZWZhdWx0KCl9fSxfc2VsZWN0Rm9jdXNlZEl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tZW51SXRlbXMuZXEodGhpcy5mb2N1c0luZGV4KTt0Lmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHx0aGlzLl9zZWxlY3QodC5kYXRhKCJ1aS1zZWxlY3RtZW51LWl0ZW0iKSxlKX0sX3NlbGVjdDpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4O3RoaXMuZWxlbWVudFswXS5zZWxlY3RlZEluZGV4PWUuaW5kZXgsdGhpcy5fc2V0VGV4dCh0aGlzLmJ1dHRvblRleHQsZS5sYWJlbCksdGhpcy5fc2V0QXJpYShlKSx0aGlzLl90cmlnZ2VyKCJzZWxlY3QiLHQse2l0ZW06ZX0pLGUuaW5kZXghPT1pJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQse2l0ZW06ZX0pLHRoaXMuY2xvc2UodCl9LF9zZXRBcmlhOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubWVudUl0ZW1zLmVxKGUuaW5kZXgpLmF0dHIoImlkIik7dGhpcy5idXR0b24uYXR0cih7ImFyaWEtbGFiZWxsZWRieSI6dCwiYXJpYS1hY3RpdmVkZXNjZW5kYW50Ijp0fSksdGhpcy5tZW51LmF0dHIoImFyaWEtYWN0aXZlZGVzY2VuZGFudCIsdCl9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXsiaWNvbnMiPT09ZSYmdGhpcy5idXR0b24uZmluZCgic3Bhbi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLmJ1dHRvbikuYWRkQ2xhc3ModC5idXR0b24pLHRoaXMuX3N1cGVyKGUsdCksImFwcGVuZFRvIj09PWUmJnRoaXMubWVudVdyYXAuYXBwZW5kVG8odGhpcy5fYXBwZW5kVG8oKSksImRpc2FibGVkIj09PWUmJih0aGlzLm1lbnVJbnN0YW5jZS5vcHRpb24oImRpc2FibGVkIix0KSx0aGlzLmJ1dHRvbi50b2dnbGVDbGFzcygidWktc3RhdGUtZGlzYWJsZWQiLHQpLmF0dHIoImFyaWEtZGlzYWJsZWQiLHQpLHRoaXMuZWxlbWVudC5wcm9wKCJkaXNhYmxlZCIsdCksdD8odGhpcy5idXR0b24uYXR0cigidGFiaW5kZXgiLC0xKSx0aGlzLmNsb3NlKCkpOnRoaXMuYnV0dG9uLmF0dHIoInRhYmluZGV4IiwwKSksIndpZHRoIj09PWUmJnRoaXMuX3Jlc2l6ZUJ1dHRvbigpfSxfYXBwZW5kVG86ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYXBwZW5kVG87cmV0dXJuIHQmJih0PXQuanF1ZXJ5fHx0Lm5vZGVUeXBlP2UodCk6dGhpcy5kb2N1bWVudC5maW5kKHQpLmVxKDApKSx0JiZ0WzBdfHwodD10aGlzLmVsZW1lbnQuY2xvc2VzdCgiLnVpLWZyb250IikpLHQubGVuZ3RofHwodD10aGlzLmRvY3VtZW50WzBdLmJvZHkpLHR9LF90b2dnbGVBdHRyOmZ1bmN0aW9uKCl7dGhpcy5idXR0b24udG9nZ2xlQ2xhc3MoInVpLWNvcm5lci10b3AiLHRoaXMuaXNPcGVuKS50b2dnbGVDbGFzcygidWktY29ybmVyLWFsbCIsIXRoaXMuaXNPcGVuKS5hdHRyKCJhcmlhLWV4cGFuZGVkIix0aGlzLmlzT3BlbiksdGhpcy5tZW51V3JhcC50b2dnbGVDbGFzcygidWktc2VsZWN0bWVudS1vcGVuIix0aGlzLmlzT3BlbiksdGhpcy5tZW51LmF0dHIoImFyaWEtaGlkZGVuIiwhdGhpcy5pc09wZW4pfSxfcmVzaXplQnV0dG9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLndpZHRoO2V8fChlPXRoaXMuZWxlbWVudC5zaG93KCkub3V0ZXJXaWR0aCgpLHRoaXMuZWxlbWVudC5oaWRlKCkpLHRoaXMuYnV0dG9uLm91dGVyV2lkdGgoZSl9LF9yZXNpemVNZW51OmZ1bmN0aW9uKCl7dGhpcy5tZW51Lm91dGVyV2lkdGgoTWF0aC5tYXgodGhpcy5idXR0b24ub3V0ZXJXaWR0aCgpLHRoaXMubWVudS53aWR0aCgiIikub3V0ZXJXaWR0aCgpKzEpKX0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm57ZGlzYWJsZWQ6dGhpcy5lbGVtZW50LnByb3AoImRpc2FibGVkIil9fSxfcGFyc2VPcHRpb25zOmZ1bmN0aW9uKHQpe3ZhciBpPVtdO3QuZWFjaChmdW5jdGlvbih0LHMpe3ZhciBuPWUocyksYT1uLnBhcmVudCgib3B0Z3JvdXAiKTtpLnB1c2goe2VsZW1lbnQ6bixpbmRleDp0LHZhbHVlOm4udmFsKCksbGFiZWw6bi50ZXh0KCksb3B0Z3JvdXA6YS5hdHRyKCJsYWJlbCIpfHwiIixkaXNhYmxlZDphLnByb3AoImRpc2FibGVkIil8fG4ucHJvcCgiZGlzYWJsZWQiKX0pfSksdGhpcy5pdGVtcz1pfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMubWVudVdyYXAucmVtb3ZlKCksdGhpcy5idXR0b24ucmVtb3ZlKCksdGhpcy5lbGVtZW50LnNob3coKSx0aGlzLmVsZW1lbnQucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLmxhYmVsLmF0dHIoImZvciIsdGhpcy5pZHMuZWxlbWVudCl9fSksZS53aWRnZXQoInVpLnNsaWRlciIsZS51aS5tb3VzZSx7dmVyc2lvbjoiMS4xMS40Iix3aWRnZXRFdmVudFByZWZpeDoic2xpZGUiLG9wdGlvbnM6e2FuaW1hdGU6ITEsZGlzdGFuY2U6MCxtYXg6MTAwLG1pbjowLG9yaWVudGF0aW9uOiJob3Jpem9udGFsIixyYW5nZTohMSxzdGVwOjEsdmFsdWU6MCx2YWx1ZXM6bnVsbCxjaGFuZ2U6bnVsbCxzbGlkZTpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxudW1QYWdlczo1LF9jcmVhdGU6ZnVuY3Rpb24oKXt0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX21vdXNlU2xpZGluZz0hMSx0aGlzLl9hbmltYXRlT2ZmPSEwLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fZGV0ZWN0T3JpZW50YXRpb24oKSx0aGlzLl9tb3VzZUluaXQoKSx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNsaWRlciB1aS1zbGlkZXItIit0aGlzLm9yaWVudGF0aW9uKyIgdWktd2lkZ2V0IisiIHVpLXdpZGdldC1jb250ZW50IisiIHVpLWNvcm5lci1hbGwiKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5fc2V0T3B0aW9uKCJkaXNhYmxlZCIsdGhpcy5vcHRpb25zLmRpc2FibGVkKSx0aGlzLl9hbmltYXRlT2ZmPSExfSxfcmVmcmVzaDpmdW5jdGlvbigpe3RoaXMuX2NyZWF0ZVJhbmdlKCksdGhpcy5fY3JlYXRlSGFuZGxlcygpLHRoaXMuX3NldHVwRXZlbnRzKCksdGhpcy5fcmVmcmVzaFZhbHVlKCl9LF9jcmVhdGVIYW5kbGVzOmZ1bmN0aW9uKCl7dmFyIHQsaSxzPXRoaXMub3B0aW9ucyxuPXRoaXMuZWxlbWVudC5maW5kKCIudWktc2xpZGVyLWhhbmRsZSIpLmFkZENsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwiKSxhPSI8c3BhbiBjbGFzcz0ndWktc2xpZGVyLWhhbmRsZSB1aS1zdGF0ZS1kZWZhdWx0IHVpLWNvcm5lci1hbGwnIHRhYmluZGV4PScwJz48L3NwYW4+IixvPVtdO2ZvcihpPXMudmFsdWVzJiZzLnZhbHVlcy5sZW5ndGh8fDEsbi5sZW5ndGg+aSYmKG4uc2xpY2UoaSkucmVtb3ZlKCksbj1uLnNsaWNlKDAsaSkpLHQ9bi5sZW5ndGg7aT50O3QrKylvLnB1c2goYSk7dGhpcy5oYW5kbGVzPW4uYWRkKGUoby5qb2luKCIiKSkuYXBwZW5kVG8odGhpcy5lbGVtZW50KSksdGhpcy5oYW5kbGU9dGhpcy5oYW5kbGVzLmVxKDApLHRoaXMuaGFuZGxlcy5lYWNoKGZ1bmN0aW9uKHQpe2UodGhpcykuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIsdCl9KX0sX2NyZWF0ZVJhbmdlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcHRpb25zLGk9IiI7dC5yYW5nZT8odC5yYW5nZT09PSEwJiYodC52YWx1ZXM/dC52YWx1ZXMubGVuZ3RoJiYyIT09dC52YWx1ZXMubGVuZ3RoP3QudmFsdWVzPVt0LnZhbHVlc1swXSx0LnZhbHVlc1swXV06ZS5pc0FycmF5KHQudmFsdWVzKSYmKHQudmFsdWVzPXQudmFsdWVzLnNsaWNlKDApKTp0LnZhbHVlcz1bdGhpcy5fdmFsdWVNaW4oKSx0aGlzLl92YWx1ZU1pbigpXSksdGhpcy5yYW5nZSYmdGhpcy5yYW5nZS5sZW5ndGg/dGhpcy5yYW5nZS5yZW1vdmVDbGFzcygidWktc2xpZGVyLXJhbmdlLW1pbiB1aS1zbGlkZXItcmFuZ2UtbWF4IikuY3NzKHtsZWZ0OiIiLGJvdHRvbToiIn0pOih0aGlzLnJhbmdlPWUoIjxkaXY+PC9kaXY+IikuYXBwZW5kVG8odGhpcy5lbGVtZW50KSxpPSJ1aS1zbGlkZXItcmFuZ2UgdWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIiksdGhpcy5yYW5nZS5hZGRDbGFzcyhpKygibWluIj09PXQucmFuZ2V8fCJtYXgiPT09dC5yYW5nZT8iIHVpLXNsaWRlci1yYW5nZS0iK3QucmFuZ2U6IiIpKSk6KHRoaXMucmFuZ2UmJnRoaXMucmFuZ2UucmVtb3ZlKCksdGhpcy5yYW5nZT1udWxsKX0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKCl7dGhpcy5fb2ZmKHRoaXMuaGFuZGxlcyksdGhpcy5fb24odGhpcy5oYW5kbGVzLHRoaXMuX2hhbmRsZUV2ZW50cyksdGhpcy5faG92ZXJhYmxlKHRoaXMuaGFuZGxlcyksdGhpcy5fZm9jdXNhYmxlKHRoaXMuaGFuZGxlcyl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5oYW5kbGVzLnJlbW92ZSgpLHRoaXMucmFuZ2UmJnRoaXMucmFuZ2UucmVtb3ZlKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXIgdWktc2xpZGVyLWhvcml6b250YWwgdWktc2xpZGVyLXZlcnRpY2FsIHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsIiksdGhpcy5fbW91c2VEZXN0cm95KCl9LF9tb3VzZUNhcHR1cmU6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbyxyLGgsbCx1PXRoaXMsZD10aGlzLm9wdGlvbnM7cmV0dXJuIGQuZGlzYWJsZWQ/ITE6KHRoaXMuZWxlbWVudFNpemU9e3dpZHRoOnRoaXMuZWxlbWVudC5vdXRlcldpZHRoKCksaGVpZ2h0OnRoaXMuZWxlbWVudC5vdXRlckhlaWdodCgpfSx0aGlzLmVsZW1lbnRPZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLGk9e3g6dC5wYWdlWCx5OnQucGFnZVl9LHM9dGhpcy5fbm9ybVZhbHVlRnJvbU1vdXNlKGkpLG49dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKzEsdGhpcy5oYW5kbGVzLmVhY2goZnVuY3Rpb24odCl7dmFyIGk9TWF0aC5hYnMocy11LnZhbHVlcyh0KSk7KG4+aXx8bj09PWkmJih0PT09dS5fbGFzdENoYW5nZWRWYWx1ZXx8dS52YWx1ZXModCk9PT1kLm1pbikpJiYobj1pLGE9ZSh0aGlzKSxvPXQpfSkscj10aGlzLl9zdGFydCh0LG8pLHI9PT0hMT8hMToodGhpcy5fbW91c2VTbGlkaW5nPSEwLHRoaXMuX2hhbmRsZUluZGV4PW8sYS5hZGRDbGFzcygidWktc3RhdGUtYWN0aXZlIikuZm9jdXMoKSxoPWEub2Zmc2V0KCksbD0hZSh0LnRhcmdldCkucGFyZW50cygpLmFkZEJhY2soKS5pcygiLnVpLXNsaWRlci1oYW5kbGUiKSx0aGlzLl9jbGlja09mZnNldD1sP3tsZWZ0OjAsdG9wOjB9OntsZWZ0OnQucGFnZVgtaC5sZWZ0LWEud2lkdGgoKS8yLHRvcDp0LnBhZ2VZLWgudG9wLWEuaGVpZ2h0KCkvMi0ocGFyc2VJbnQoYS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKS0ocGFyc2VJbnQoYS5jc3MoImJvcmRlckJvdHRvbVdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoYS5jc3MoIm1hcmdpblRvcCIpLDEwKXx8MCl9LHRoaXMuaGFuZGxlcy5oYXNDbGFzcygidWktc3RhdGUtaG92ZXIiKXx8dGhpcy5fc2xpZGUodCxvLHMpLHRoaXMuX2FuaW1hdGVPZmY9ITAsITApKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sX21vdXNlRHJhZzpmdW5jdGlvbihlKXt2YXIgdD17eDplLnBhZ2VYLHk6ZS5wYWdlWX0saT10aGlzLl9ub3JtVmFsdWVGcm9tTW91c2UodCk7cmV0dXJuIHRoaXMuX3NsaWRlKGUsdGhpcy5faGFuZGxlSW5kZXgsaSksITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuaGFuZGxlcy5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIiksdGhpcy5fbW91c2VTbGlkaW5nPSExLHRoaXMuX3N0b3AoZSx0aGlzLl9oYW5kbGVJbmRleCksdGhpcy5fY2hhbmdlKGUsdGhpcy5faGFuZGxlSW5kZXgpLHRoaXMuX2hhbmRsZUluZGV4PW51bGwsdGhpcy5fY2xpY2tPZmZzZXQ9bnVsbCx0aGlzLl9hbmltYXRlT2ZmPSExLCExfSxfZGV0ZWN0T3JpZW50YXRpb246ZnVuY3Rpb24oKXt0aGlzLm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LF9ub3JtVmFsdWVGcm9tTW91c2U6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzLG4sYTtyZXR1cm4iaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyh0PXRoaXMuZWxlbWVudFNpemUud2lkdGgsaT1lLngtdGhpcy5lbGVtZW50T2Zmc2V0LmxlZnQtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LmxlZnQ6MCkpOih0PXRoaXMuZWxlbWVudFNpemUuaGVpZ2h0LGk9ZS55LXRoaXMuZWxlbWVudE9mZnNldC50b3AtKHRoaXMuX2NsaWNrT2Zmc2V0P3RoaXMuX2NsaWNrT2Zmc2V0LnRvcDowKSkscz1pL3Qscz4xJiYocz0xKSwwPnMmJihzPTApLCJ2ZXJ0aWNhbCI9PT10aGlzLm9yaWVudGF0aW9uJiYocz0xLXMpLG49dGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpLGE9dGhpcy5fdmFsdWVNaW4oKStzKm4sdGhpcy5fdHJpbUFsaWduVmFsdWUoYSl9LF9zdGFydDpmdW5jdGlvbihlLHQpe3ZhciBpPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07cmV0dXJuIHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoaS52YWx1ZT10aGlzLnZhbHVlcyh0KSxpLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdGFydCIsZSxpKX0sX3NsaWRlOmZ1bmN0aW9uKGUsdCxpKXt2YXIgcyxuLGE7dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/KHM9dGhpcy52YWx1ZXModD8wOjEpLDI9PT10aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aCYmdGhpcy5vcHRpb25zLnJhbmdlPT09ITAmJigwPT09dCYmaT5zfHwxPT09dCYmcz5pKSYmKGk9cyksaSE9PXRoaXMudmFsdWVzKHQpJiYobj10aGlzLnZhbHVlcygpLG5bdF09aSxhPXRoaXMuX3RyaWdnZXIoInNsaWRlIixlLHtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOmksdmFsdWVzOm59KSxzPXRoaXMudmFsdWVzKHQ/MDoxKSxhIT09ITEmJnRoaXMudmFsdWVzKHQsaSkpKTppIT09dGhpcy52YWx1ZSgpJiYoYT10aGlzLl90cmlnZ2VyKCJzbGlkZSIsZSx7aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTppfSksYSE9PSExJiZ0aGlzLnZhbHVlKGkpKX0sX3N0b3A6ZnVuY3Rpb24oZSx0KXt2YXIgaT17aGFuZGxlOnRoaXMuaGFuZGxlc1t0XSx2YWx1ZTp0aGlzLnZhbHVlKCl9O3RoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoJiYoaS52YWx1ZT10aGlzLnZhbHVlcyh0KSxpLnZhbHVlcz10aGlzLnZhbHVlcygpKSx0aGlzLl90cmlnZ2VyKCJzdG9wIixlLGkpfSxfY2hhbmdlOmZ1bmN0aW9uKGUsdCl7aWYoIXRoaXMuX2tleVNsaWRpbmcmJiF0aGlzLl9tb3VzZVNsaWRpbmcpe3ZhciBpPXtoYW5kbGU6dGhpcy5oYW5kbGVzW3RdLHZhbHVlOnRoaXMudmFsdWUoKX07dGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGgmJihpLnZhbHVlPXRoaXMudmFsdWVzKHQpLGkudmFsdWVzPXRoaXMudmFsdWVzKCkpLHRoaXMuX2xhc3RDaGFuZ2VkVmFsdWU9dCx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGUsaSl9fSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3RyaW1BbGlnblZhbHVlKGUpLHRoaXMuX3JlZnJlc2hWYWx1ZSgpLHRoaXMuX2NoYW5nZShudWxsLDApLHZvaWQgMCk6dGhpcy5fdmFsdWUoKX0sdmFsdWVzOmZ1bmN0aW9uKHQsaSl7dmFyIHMsbixhO2lmKGFyZ3VtZW50cy5sZW5ndGg+MSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlc1t0XT10aGlzLl90cmltQWxpZ25WYWx1ZShpKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCx0KSx2b2lkIDA7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3ZhbHVlcygpO2lmKCFlLmlzQXJyYXkoYXJndW1lbnRzWzBdKSlyZXR1cm4gdGhpcy5vcHRpb25zLnZhbHVlcyYmdGhpcy5vcHRpb25zLnZhbHVlcy5sZW5ndGg/dGhpcy5fdmFsdWVzKHQpOnRoaXMudmFsdWUoKTtmb3Iocz10aGlzLm9wdGlvbnMudmFsdWVzLG49YXJndW1lbnRzWzBdLGE9MDtzLmxlbmd0aD5hO2ErPTEpc1thXT10aGlzLl90cmltQWxpZ25WYWx1ZShuW2FdKSx0aGlzLl9jaGFuZ2UobnVsbCxhKTt0aGlzLl9yZWZyZXNoVmFsdWUoKX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGkpe3ZhciBzLG49MDtzd2l0Y2goInJhbmdlIj09PXQmJnRoaXMub3B0aW9ucy5yYW5nZT09PSEwJiYoIm1pbiI9PT1pPyh0aGlzLm9wdGlvbnMudmFsdWU9dGhpcy5fdmFsdWVzKDApLHRoaXMub3B0aW9ucy52YWx1ZXM9bnVsbCk6Im1heCI9PT1pJiYodGhpcy5vcHRpb25zLnZhbHVlPXRoaXMuX3ZhbHVlcyh0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aC0xKSx0aGlzLm9wdGlvbnMudmFsdWVzPW51bGwpKSxlLmlzQXJyYXkodGhpcy5vcHRpb25zLnZhbHVlcykmJihuPXRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKSwiZGlzYWJsZWQiPT09dCYmdGhpcy5lbGVtZW50LnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISFpKSx0aGlzLl9zdXBlcih0LGkpLHQpe2Nhc2Uib3JpZW50YXRpb24iOnRoaXMuX2RldGVjdE9yaWVudGF0aW9uKCksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zbGlkZXItaG9yaXpvbnRhbCB1aS1zbGlkZXItdmVydGljYWwiKS5hZGRDbGFzcygidWktc2xpZGVyLSIrdGhpcy5vcmllbnRhdGlvbiksdGhpcy5fcmVmcmVzaFZhbHVlKCksdGhpcy5oYW5kbGVzLmNzcygiaG9yaXpvbnRhbCI9PT1pPyJib3R0b20iOiJsZWZ0IiwiIik7YnJlYWs7Y2FzZSJ2YWx1ZSI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9jaGFuZ2UobnVsbCwwKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UidmFsdWVzIjpmb3IodGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9yZWZyZXNoVmFsdWUoKSxzPTA7bj5zO3MrPTEpdGhpcy5fY2hhbmdlKG51bGwscyk7dGhpcy5fYW5pbWF0ZU9mZj0hMTticmVhaztjYXNlInN0ZXAiOmNhc2UibWluIjpjYXNlIm1heCI6dGhpcy5fYW5pbWF0ZU9mZj0hMCx0aGlzLl9jYWxjdWxhdGVOZXdNYXgoKSx0aGlzLl9yZWZyZXNoVmFsdWUoKSx0aGlzLl9hbmltYXRlT2ZmPSExO2JyZWFrO2Nhc2UicmFuZ2UiOnRoaXMuX2FuaW1hdGVPZmY9ITAsdGhpcy5fcmVmcmVzaCgpLHRoaXMuX2FuaW1hdGVPZmY9ITF9fSxfdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm9wdGlvbnMudmFsdWU7cmV0dXJuIGU9dGhpcy5fdHJpbUFsaWduVmFsdWUoZSl9LF92YWx1ZXM6ZnVuY3Rpb24oZSl7dmFyIHQsaSxzO2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQ9dGhpcy5vcHRpb25zLnZhbHVlc1tlXSx0PXRoaXMuX3RyaW1BbGlnblZhbHVlKHQpO2lmKHRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoKXtmb3IoaT10aGlzLm9wdGlvbnMudmFsdWVzLnNsaWNlKCkscz0wO2kubGVuZ3RoPnM7cys9MSlpW3NdPXRoaXMuX3RyaW1BbGlnblZhbHVlKGlbc10pO3JldHVybiBpfXJldHVybltdfSxfdHJpbUFsaWduVmFsdWU6ZnVuY3Rpb24oZSl7aWYodGhpcy5fdmFsdWVNaW4oKT49ZSlyZXR1cm4gdGhpcy5fdmFsdWVNaW4oKTtpZihlPj10aGlzLl92YWx1ZU1heCgpKXJldHVybiB0aGlzLl92YWx1ZU1heCgpO3ZhciB0PXRoaXMub3B0aW9ucy5zdGVwPjA/dGhpcy5vcHRpb25zLnN0ZXA6MSxpPShlLXRoaXMuX3ZhbHVlTWluKCkpJXQscz1lLWk7cmV0dXJuIDIqTWF0aC5hYnMoaSk+PXQmJihzKz1pPjA/dDotdCkscGFyc2VGbG9hdChzLnRvRml4ZWQoNSkpfSxfY2FsY3VsYXRlTmV3TWF4OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcHRpb25zLm1heCx0PXRoaXMuX3ZhbHVlTWluKCksaT10aGlzLm9wdGlvbnMuc3RlcCxzPU1hdGguZmxvb3IoKyhlLXQpLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpL2kpKmk7ZT1zK3QsdGhpcy5tYXg9cGFyc2VGbG9hdChlLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpKX0sX3ByZWNpc2lvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5zdGVwKTtyZXR1cm4gbnVsbCE9PXRoaXMub3B0aW9ucy5taW4mJihlPU1hdGgubWF4KGUsdGhpcy5fcHJlY2lzaW9uT2YodGhpcy5vcHRpb25zLm1pbikpKSxlfSxfcHJlY2lzaW9uT2Y6ZnVuY3Rpb24oZSl7dmFyIHQ9IiIrZSxpPXQuaW5kZXhPZigiLiIpO3JldHVybi0xPT09aT8wOnQubGVuZ3RoLWktMX0sX3ZhbHVlTWluOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3B0aW9ucy5taW59LF92YWx1ZU1heDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heH0sX3JlZnJlc2hWYWx1ZTpmdW5jdGlvbigpe3ZhciB0LGkscyxuLGEsbz10aGlzLm9wdGlvbnMucmFuZ2Uscj10aGlzLm9wdGlvbnMsaD10aGlzLGw9dGhpcy5fYW5pbWF0ZU9mZj8hMTpyLmFuaW1hdGUsdT17fTt0aGlzLm9wdGlvbnMudmFsdWVzJiZ0aGlzLm9wdGlvbnMudmFsdWVzLmxlbmd0aD90aGlzLmhhbmRsZXMuZWFjaChmdW5jdGlvbihzKXtpPTEwMCooKGgudmFsdWVzKHMpLWguX3ZhbHVlTWluKCkpLyhoLl92YWx1ZU1heCgpLWguX3ZhbHVlTWluKCkpKSx1WyJob3Jpem9udGFsIj09PWgub3JpZW50YXRpb24/ImxlZnQiOiJib3R0b20iXT1pKyIlIixlKHRoaXMpLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0odSxyLmFuaW1hdGUpLGgub3B0aW9ucy5yYW5nZT09PSEwJiYoImhvcml6b250YWwiPT09aC5vcmllbnRhdGlvbj8oMD09PXMmJmgucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7bGVmdDppKyIlIn0sci5hbmltYXRlKSwxPT09cyYmaC5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmktdCsiJSJ9LHtxdWV1ZTohMSxkdXJhdGlvbjpyLmFuaW1hdGV9KSk6KDA9PT1zJiZoLnJhbmdlLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oe2JvdHRvbTppKyIlIn0sci5hbmltYXRlKSwxPT09cyYmaC5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe2hlaWdodDppLXQrIiUifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSkpKSx0PWl9KToocz10aGlzLnZhbHVlKCksbj10aGlzLl92YWx1ZU1pbigpLGE9dGhpcy5fdmFsdWVNYXgoKSxpPWEhPT1uPzEwMCooKHMtbikvKGEtbikpOjAsdVsiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uPyJsZWZ0IjoiYm90dG9tIl09aSsiJSIsdGhpcy5oYW5kbGUuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh1LHIuYW5pbWF0ZSksIm1pbiI9PT1vJiYiaG9yaXpvbnRhbCI9PT10aGlzLm9yaWVudGF0aW9uJiZ0aGlzLnJhbmdlLnN0b3AoMSwxKVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOmkrIiUifSxyLmFuaW1hdGUpLCJtYXgiPT09byYmImhvcml6b250YWwiPT09dGhpcy5vcmllbnRhdGlvbiYmdGhpcy5yYW5nZVtsPyJhbmltYXRlIjoiY3NzIl0oe3dpZHRoOjEwMC1pKyIlIn0se3F1ZXVlOiExLGR1cmF0aW9uOnIuYW5pbWF0ZX0pLCJtaW4iPT09byYmInZlcnRpY2FsIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2Uuc3RvcCgxLDEpW2w/ImFuaW1hdGUiOiJjc3MiXSh7aGVpZ2h0OmkrIiUifSxyLmFuaW1hdGUpLCJtYXgiPT09byYmInZlcnRpY2FsIj09PXRoaXMub3JpZW50YXRpb24mJnRoaXMucmFuZ2VbbD8iYW5pbWF0ZSI6ImNzcyJdKHtoZWlnaHQ6MTAwLWkrIiUifSx7cXVldWU6ITEsZHVyYXRpb246ci5hbmltYXRlfSkpfSxfaGFuZGxlRXZlbnRzOntrZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbixhLG89ZSh0LnRhcmdldCkuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIpO3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6Y2FzZSBlLnVpLmtleUNvZGUuRU5EOmNhc2UgZS51aS5rZXlDb2RlLlBBR0VfVVA6Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOmNhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgZS51aS5rZXlDb2RlLkRPV046Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDppZih0LnByZXZlbnREZWZhdWx0KCksIXRoaXMuX2tleVNsaWRpbmcmJih0aGlzLl9rZXlTbGlkaW5nPSEwLGUodC50YXJnZXQpLmFkZENsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKSxpPXRoaXMuX3N0YXJ0KHQsbyksaT09PSExKSlyZXR1cm59c3dpdGNoKGE9dGhpcy5vcHRpb25zLnN0ZXAscz1uPXRoaXMub3B0aW9ucy52YWx1ZXMmJnRoaXMub3B0aW9ucy52YWx1ZXMubGVuZ3RoP3RoaXMudmFsdWVzKG8pOnRoaXMudmFsdWUoKSx0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6bj10aGlzLl92YWx1ZU1pbigpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkVORDpuPXRoaXMuX3ZhbHVlTWF4KCk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9VUDpuPXRoaXMuX3RyaW1BbGlnblZhbHVlKHMrKHRoaXMuX3ZhbHVlTWF4KCktdGhpcy5fdmFsdWVNaW4oKSkvdGhpcy5udW1QYWdlcyk7YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuUEFHRV9ET1dOOm49dGhpcy5fdHJpbUFsaWduVmFsdWUocy0odGhpcy5fdmFsdWVNYXgoKS10aGlzLl92YWx1ZU1pbigpKS90aGlzLm51bVBhZ2VzKTticmVhaztjYXNlIGUudWkua2V5Q29kZS5VUDpjYXNlIGUudWkua2V5Q29kZS5SSUdIVDppZihzPT09dGhpcy5fdmFsdWVNYXgoKSlyZXR1cm47bj10aGlzLl90cmltQWxpZ25WYWx1ZShzK2EpO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkRPV046Y2FzZSBlLnVpLmtleUNvZGUuTEVGVDppZihzPT09dGhpcy5fdmFsdWVNaW4oKSlyZXR1cm47bj10aGlzLl90cmltQWxpZ25WYWx1ZShzLWEpfXRoaXMuX3NsaWRlKHQsbyxuKX0sa2V5dXA6ZnVuY3Rpb24odCl7dmFyIGk9ZSh0LnRhcmdldCkuZGF0YSgidWktc2xpZGVyLWhhbmRsZS1pbmRleCIpO3RoaXMuX2tleVNsaWRpbmcmJih0aGlzLl9rZXlTbGlkaW5nPSExLHRoaXMuX3N0b3AodCxpKSx0aGlzLl9jaGFuZ2UodCxpKSxlKHQudGFyZ2V0KS5yZW1vdmVDbGFzcygidWktc3RhdGUtYWN0aXZlIikpfX19KSxlLndpZGdldCgidWkuc29ydGFibGUiLGUudWkubW91c2Use3ZlcnNpb246IjEuMTEuNCIsd2lkZ2V0RXZlbnRQcmVmaXg6InNvcnQiLHJlYWR5OiExLG9wdGlvbnM6e2FwcGVuZFRvOiJwYXJlbnQiLGF4aXM6ITEsY29ubmVjdFdpdGg6ITEsY29udGFpbm1lbnQ6ITEsY3Vyc29yOiJhdXRvIixjdXJzb3JBdDohMSxkcm9wT25FbXB0eTohMCxmb3JjZVBsYWNlaG9sZGVyU2l6ZTohMSxmb3JjZUhlbHBlclNpemU6ITEsZ3JpZDohMSxoYW5kbGU6ITEsaGVscGVyOiJvcmlnaW5hbCIsaXRlbXM6Ij4gKiIsb3BhY2l0eTohMSxwbGFjZWhvbGRlcjohMSxyZXZlcnQ6ITEsc2Nyb2xsOiEwLHNjcm9sbFNlbnNpdGl2aXR5OjIwLHNjcm9sbFNwZWVkOjIwLHNjb3BlOiJkZWZhdWx0Iix0b2xlcmFuY2U6ImludGVyc2VjdCIsekluZGV4OjFlMyxhY3RpdmF0ZTpudWxsLGJlZm9yZVN0b3A6bnVsbCxjaGFuZ2U6bnVsbCxkZWFjdGl2YXRlOm51bGwsb3V0Om51bGwsb3ZlcjpudWxsLHJlY2VpdmU6bnVsbCxyZW1vdmU6bnVsbCxzb3J0Om51bGwsc3RhcnQ6bnVsbCxzdG9wOm51bGwsdXBkYXRlOm51bGx9LF9pc092ZXJBeGlzOmZ1bmN0aW9uKGUsdCxpKXtyZXR1cm4gZT49dCYmdCtpPmV9LF9pc0Zsb2F0aW5nOmZ1bmN0aW9uKGUpe3JldHVybi9sZWZ0fHJpZ2h0Ly50ZXN0KGUuY3NzKCJmbG9hdCIpKXx8L2lubGluZXx0YWJsZS1jZWxsLy50ZXN0KGUuY3NzKCJkaXNwbGF5IikpfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb250YWluZXJDYWNoZT17fSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXNvcnRhYmxlIiksdGhpcy5yZWZyZXNoKCksdGhpcy5vZmZzZXQ9dGhpcy5lbGVtZW50Lm9mZnNldCgpLHRoaXMuX21vdXNlSW5pdCgpLHRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpLHRoaXMucmVhZHk9ITB9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLl9zdXBlcihlLHQpLCJoYW5kbGUiPT09ZSYmdGhpcy5fc2V0SGFuZGxlQ2xhc3NOYW1lKCl9LF9zZXRIYW5kbGVDbGFzc05hbWU6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuZmluZCgiLnVpLXNvcnRhYmxlLWhhbmRsZSIpLnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZS1oYW5kbGUiKSxlLmVhY2godGhpcy5pdGVtcyxmdW5jdGlvbigpeyh0aGlzLmluc3RhbmNlLm9wdGlvbnMuaGFuZGxlP3RoaXMuaXRlbS5maW5kKHRoaXMuaW5zdGFuY2Uub3B0aW9ucy5oYW5kbGUpOnRoaXMuaXRlbSkuYWRkQ2xhc3MoInVpLXNvcnRhYmxlLWhhbmRsZSIpfSl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zb3J0YWJsZSB1aS1zb3J0YWJsZS1kaXNhYmxlZCIpLmZpbmQoIi51aS1zb3J0YWJsZS1oYW5kbGUiKS5yZW1vdmVDbGFzcygidWktc29ydGFibGUtaGFuZGxlIiksdGhpcy5fbW91c2VEZXN0cm95KCk7Zm9yKHZhciBlPXRoaXMuaXRlbXMubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy5pdGVtc1tlXS5pdGVtLnJlbW92ZURhdGEodGhpcy53aWRnZXROYW1lKyItaXRlbSIpO3JldHVybiB0aGlzfSxfbW91c2VDYXB0dXJlOmZ1bmN0aW9uKHQsaSl7dmFyIHM9bnVsbCxuPSExLGE9dGhpcztyZXR1cm4gdGhpcy5yZXZlcnRpbmc/ITE6dGhpcy5vcHRpb25zLmRpc2FibGVkfHwic3RhdGljIj09PXRoaXMub3B0aW9ucy50eXBlPyExOih0aGlzLl9yZWZyZXNoSXRlbXModCksZSh0LnRhcmdldCkucGFyZW50cygpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gZS5kYXRhKHRoaXMsYS53aWRnZXROYW1lKyItaXRlbSIpPT09YT8ocz1lKHRoaXMpLCExKTp2b2lkIDB9KSxlLmRhdGEodC50YXJnZXQsYS53aWRnZXROYW1lKyItaXRlbSIpPT09YSYmKHM9ZSh0LnRhcmdldCkpLHM/IXRoaXMub3B0aW9ucy5oYW5kbGV8fGl8fChlKHRoaXMub3B0aW9ucy5oYW5kbGUscykuZmluZCgiKiIpLmFkZEJhY2soKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcz09PXQudGFyZ2V0JiYobj0hMCl9KSxuKT8odGhpcy5jdXJyZW50SXRlbT1zLHRoaXMuX3JlbW92ZUN1cnJlbnRzRnJvbUl0ZW1zKCksITApOiExOiExKX0sX21vdXNlU3RhcnQ6ZnVuY3Rpb24odCxpLHMpe3ZhciBuLGEsbz10aGlzLm9wdGlvbnM7aWYodGhpcy5jdXJyZW50Q29udGFpbmVyPXRoaXMsdGhpcy5yZWZyZXNoUG9zaXRpb25zKCksdGhpcy5oZWxwZXI9dGhpcy5fY3JlYXRlSGVscGVyKHQpLHRoaXMuX2NhY2hlSGVscGVyUHJvcG9ydGlvbnMoKSx0aGlzLl9jYWNoZU1hcmdpbnMoKSx0aGlzLnNjcm9sbFBhcmVudD10aGlzLmhlbHBlci5zY3JvbGxQYXJlbnQoKSx0aGlzLm9mZnNldD10aGlzLmN1cnJlbnRJdGVtLm9mZnNldCgpLHRoaXMub2Zmc2V0PXt0b3A6dGhpcy5vZmZzZXQudG9wLXRoaXMubWFyZ2lucy50b3AsbGVmdDp0aGlzLm9mZnNldC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0fSxlLmV4dGVuZCh0aGlzLm9mZnNldCx7Y2xpY2s6e2xlZnQ6dC5wYWdlWC10aGlzLm9mZnNldC5sZWZ0LHRvcDp0LnBhZ2VZLXRoaXMub2Zmc2V0LnRvcH0scGFyZW50OnRoaXMuX2dldFBhcmVudE9mZnNldCgpLHJlbGF0aXZlOnRoaXMuX2dldFJlbGF0aXZlT2Zmc2V0KCl9KSx0aGlzLmhlbHBlci5jc3MoInBvc2l0aW9uIiwiYWJzb2x1dGUiKSx0aGlzLmNzc1Bvc2l0aW9uPXRoaXMuaGVscGVyLmNzcygicG9zaXRpb24iKSx0aGlzLm9yaWdpbmFsUG9zaXRpb249dGhpcy5fZ2VuZXJhdGVQb3NpdGlvbih0KSx0aGlzLm9yaWdpbmFsUGFnZVg9dC5wYWdlWCx0aGlzLm9yaWdpbmFsUGFnZVk9dC5wYWdlWSxvLmN1cnNvckF0JiZ0aGlzLl9hZGp1c3RPZmZzZXRGcm9tSGVscGVyKG8uY3Vyc29yQXQpLHRoaXMuZG9tUG9zaXRpb249e3ByZXY6dGhpcy5jdXJyZW50SXRlbS5wcmV2KClbMF0scGFyZW50OnRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF19LHRoaXMuaGVscGVyWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmdGhpcy5jdXJyZW50SXRlbS5oaWRlKCksdGhpcy5fY3JlYXRlUGxhY2Vob2xkZXIoKSxvLmNvbnRhaW5tZW50JiZ0aGlzLl9zZXRDb250YWlubWVudCgpLG8uY3Vyc29yJiYiYXV0byIhPT1vLmN1cnNvciYmKGE9dGhpcy5kb2N1bWVudC5maW5kKCJib2R5IiksdGhpcy5zdG9yZWRDdXJzb3I9YS5jc3MoImN1cnNvciIpLGEuY3NzKCJjdXJzb3IiLG8uY3Vyc29yKSx0aGlzLnN0b3JlZFN0eWxlc2hlZXQ9ZSgiPHN0eWxlPip7IGN1cnNvcjogIitvLmN1cnNvcisiICFpbXBvcnRhbnQ7IH08L3N0eWxlPiIpLmFwcGVuZFRvKGEpKSxvLm9wYWNpdHkmJih0aGlzLmhlbHBlci5jc3MoIm9wYWNpdHkiKSYmKHRoaXMuX3N0b3JlZE9wYWNpdHk9dGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5IikpLHRoaXMuaGVscGVyLmNzcygib3BhY2l0eSIsby5vcGFjaXR5KSksby56SW5kZXgmJih0aGlzLmhlbHBlci5jc3MoInpJbmRleCIpJiYodGhpcy5fc3RvcmVkWkluZGV4PXRoaXMuaGVscGVyLmNzcygiekluZGV4IikpLHRoaXMuaGVscGVyLmNzcygiekluZGV4IixvLnpJbmRleCkpLHRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5kb2N1bWVudFswXSYmIkhUTUwiIT09dGhpcy5zY3JvbGxQYXJlbnRbMF0udGFnTmFtZSYmKHRoaXMub3ZlcmZsb3dPZmZzZXQ9dGhpcy5zY3JvbGxQYXJlbnQub2Zmc2V0KCkpLHRoaXMuX3RyaWdnZXIoInN0YXJ0Iix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLl9wcmVzZXJ2ZUhlbHBlclByb3BvcnRpb25zfHx0aGlzLl9jYWNoZUhlbHBlclByb3BvcnRpb25zKCksIXMpZm9yKG49dGhpcy5jb250YWluZXJzLmxlbmd0aC0xO24+PTA7bi0tKXRoaXMuY29udGFpbmVyc1tuXS5fdHJpZ2dlcigiYWN0aXZhdGUiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKTsKcmV0dXJuIGUudWkuZGRtYW5hZ2VyJiYoZS51aS5kZG1hbmFnZXIuY3VycmVudD10aGlzKSxlLnVpLmRkbWFuYWdlciYmIW8uZHJvcEJlaGF2aW91ciYmZS51aS5kZG1hbmFnZXIucHJlcGFyZU9mZnNldHModGhpcyx0KSx0aGlzLmRyYWdnaW5nPSEwLHRoaXMuaGVscGVyLmFkZENsYXNzKCJ1aS1zb3J0YWJsZS1oZWxwZXIiKSx0aGlzLl9tb3VzZURyYWcodCksITB9LF9tb3VzZURyYWc6ZnVuY3Rpb24odCl7dmFyIGkscyxuLGEsbz10aGlzLm9wdGlvbnMscj0hMTtmb3IodGhpcy5wb3NpdGlvbj10aGlzLl9nZW5lcmF0ZVBvc2l0aW9uKHQpLHRoaXMucG9zaXRpb25BYnM9dGhpcy5fY29udmVydFBvc2l0aW9uVG8oImFic29sdXRlIiksdGhpcy5sYXN0UG9zaXRpb25BYnN8fCh0aGlzLmxhc3RQb3NpdGlvbkFicz10aGlzLnBvc2l0aW9uQWJzKSx0aGlzLm9wdGlvbnMuc2Nyb2xsJiYodGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiYiSFRNTCIhPT10aGlzLnNjcm9sbFBhcmVudFswXS50YWdOYW1lPyh0aGlzLm92ZXJmbG93T2Zmc2V0LnRvcCt0aGlzLnNjcm9sbFBhcmVudFswXS5vZmZzZXRIZWlnaHQtdC5wYWdlWTxvLnNjcm9sbFNlbnNpdGl2aXR5P3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcCtvLnNjcm9sbFNwZWVkOnQucGFnZVktdGhpcy5vdmVyZmxvd09mZnNldC50b3A8by5zY3JvbGxTZW5zaXRpdml0eSYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcD1yPXRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbFRvcC1vLnNjcm9sbFNwZWVkKSx0aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQrdGhpcy5zY3JvbGxQYXJlbnRbMF0ub2Zmc2V0V2lkdGgtdC5wYWdlWDxvLnNjcm9sbFNlbnNpdGl2aXR5P3RoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0K28uc2Nyb2xsU3BlZWQ6dC5wYWdlWC10aGlzLm92ZXJmbG93T2Zmc2V0LmxlZnQ8by5zY3JvbGxTZW5zaXRpdml0eSYmKHRoaXMuc2Nyb2xsUGFyZW50WzBdLnNjcm9sbExlZnQ9cj10aGlzLnNjcm9sbFBhcmVudFswXS5zY3JvbGxMZWZ0LW8uc2Nyb2xsU3BlZWQpKToodC5wYWdlWS10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpPG8uc2Nyb2xsU2Vuc2l0aXZpdHk/cj10aGlzLmRvY3VtZW50LnNjcm9sbFRvcCh0aGlzLmRvY3VtZW50LnNjcm9sbFRvcCgpLW8uc2Nyb2xsU3BlZWQpOnRoaXMud2luZG93LmhlaWdodCgpLSh0LnBhZ2VZLXRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKCkpPG8uc2Nyb2xsU2Vuc2l0aXZpdHkmJihyPXRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKHRoaXMuZG9jdW1lbnQuc2Nyb2xsVG9wKCkrby5zY3JvbGxTcGVlZCkpLHQucGFnZVgtdGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCk8by5zY3JvbGxTZW5zaXRpdml0eT9yPXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCh0aGlzLmRvY3VtZW50LnNjcm9sbExlZnQoKS1vLnNjcm9sbFNwZWVkKTp0aGlzLndpbmRvdy53aWR0aCgpLSh0LnBhZ2VYLXRoaXMuZG9jdW1lbnQuc2Nyb2xsTGVmdCgpKTxvLnNjcm9sbFNlbnNpdGl2aXR5JiYocj10aGlzLmRvY3VtZW50LnNjcm9sbExlZnQodGhpcy5kb2N1bWVudC5zY3JvbGxMZWZ0KCkrby5zY3JvbGxTcGVlZCkpKSxyIT09ITEmJmUudWkuZGRtYW5hZ2VyJiYhby5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5wcmVwYXJlT2Zmc2V0cyh0aGlzLHQpKSx0aGlzLnBvc2l0aW9uQWJzPXRoaXMuX2NvbnZlcnRQb3NpdGlvblRvKCJhYnNvbHV0ZSIpLHRoaXMub3B0aW9ucy5heGlzJiYieSI9PT10aGlzLm9wdGlvbnMuYXhpc3x8KHRoaXMuaGVscGVyWzBdLnN0eWxlLmxlZnQ9dGhpcy5wb3NpdGlvbi5sZWZ0KyJweCIpLHRoaXMub3B0aW9ucy5heGlzJiYieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8KHRoaXMuaGVscGVyWzBdLnN0eWxlLnRvcD10aGlzLnBvc2l0aW9uLnRvcCsicHgiKSxpPXRoaXMuaXRlbXMubGVuZ3RoLTE7aT49MDtpLS0paWYocz10aGlzLml0ZW1zW2ldLG49cy5pdGVtWzBdLGE9dGhpcy5faW50ZXJzZWN0c1dpdGhQb2ludGVyKHMpLGEmJnMuaW5zdGFuY2U9PT10aGlzLmN1cnJlbnRDb250YWluZXImJm4hPT10aGlzLmN1cnJlbnRJdGVtWzBdJiZ0aGlzLnBsYWNlaG9sZGVyWzE9PT1hPyJuZXh0IjoicHJldiJdKClbMF0hPT1uJiYhZS5jb250YWlucyh0aGlzLnBsYWNlaG9sZGVyWzBdLG4pJiYoInNlbWktZHluYW1pYyI9PT10aGlzLm9wdGlvbnMudHlwZT8hZS5jb250YWlucyh0aGlzLmVsZW1lbnRbMF0sbik6ITApKXtpZih0aGlzLmRpcmVjdGlvbj0xPT09YT8iZG93biI6InVwIiwicG9pbnRlciIhPT10aGlzLm9wdGlvbnMudG9sZXJhbmNlJiYhdGhpcy5faW50ZXJzZWN0c1dpdGhTaWRlcyhzKSlicmVhazt0aGlzLl9yZWFycmFuZ2UodCxzKSx0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKCkpO2JyZWFrfXJldHVybiB0aGlzLl9jb250YWN0Q29udGFpbmVycyh0KSxlLnVpLmRkbWFuYWdlciYmZS51aS5kZG1hbmFnZXIuZHJhZyh0aGlzLHQpLHRoaXMuX3RyaWdnZXIoInNvcnQiLHQsdGhpcy5fdWlIYXNoKCkpLHRoaXMubGFzdFBvc2l0aW9uQWJzPXRoaXMucG9zaXRpb25BYnMsITF9LF9tb3VzZVN0b3A6ZnVuY3Rpb24odCxpKXtpZih0KXtpZihlLnVpLmRkbWFuYWdlciYmIXRoaXMub3B0aW9ucy5kcm9wQmVoYXZpb3VyJiZlLnVpLmRkbWFuYWdlci5kcm9wKHRoaXMsdCksdGhpcy5vcHRpb25zLnJldmVydCl7dmFyIHM9dGhpcyxuPXRoaXMucGxhY2Vob2xkZXIub2Zmc2V0KCksYT10aGlzLm9wdGlvbnMuYXhpcyxvPXt9O2EmJiJ4IiE9PWF8fChvLmxlZnQ9bi5sZWZ0LXRoaXMub2Zmc2V0LnBhcmVudC5sZWZ0LXRoaXMubWFyZ2lucy5sZWZ0Kyh0aGlzLm9mZnNldFBhcmVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbExlZnQpKSxhJiYieSIhPT1hfHwoby50b3A9bi50b3AtdGhpcy5vZmZzZXQucGFyZW50LnRvcC10aGlzLm1hcmdpbnMudG9wKyh0aGlzLm9mZnNldFBhcmVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYm9keT8wOnRoaXMub2Zmc2V0UGFyZW50WzBdLnNjcm9sbFRvcCkpLHRoaXMucmV2ZXJ0aW5nPSEwLGUodGhpcy5oZWxwZXIpLmFuaW1hdGUobyxwYXJzZUludCh0aGlzLm9wdGlvbnMucmV2ZXJ0LDEwKXx8NTAwLGZ1bmN0aW9uKCl7cy5fY2xlYXIodCl9KX1lbHNlIHRoaXMuX2NsZWFyKHQsaSk7cmV0dXJuITF9fSxjYW5jZWw6ZnVuY3Rpb24oKXtpZih0aGlzLmRyYWdnaW5nKXt0aGlzLl9tb3VzZVVwKHt0YXJnZXQ6bnVsbH0pLCJvcmlnaW5hbCI9PT10aGlzLm9wdGlvbnMuaGVscGVyP3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpOnRoaXMuY3VycmVudEl0ZW0uc2hvdygpO2Zvcih2YXIgdD10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7dD49MDt0LS0pdGhpcy5jb250YWluZXJzW3RdLl90cmlnZ2VyKCJkZWFjdGl2YXRlIixudWxsLHRoaXMuX3VpSGFzaCh0aGlzKSksdGhpcy5jb250YWluZXJzW3RdLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbdF0uX3RyaWdnZXIoIm91dCIsbnVsbCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1t0XS5jb250YWluZXJDYWNoZS5vdmVyPTApfXJldHVybiB0aGlzLnBsYWNlaG9sZGVyJiYodGhpcy5wbGFjZWhvbGRlclswXS5wYXJlbnROb2RlJiZ0aGlzLnBsYWNlaG9sZGVyWzBdLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSksIm9yaWdpbmFsIiE9PXRoaXMub3B0aW9ucy5oZWxwZXImJnRoaXMuaGVscGVyJiZ0aGlzLmhlbHBlclswXS5wYXJlbnROb2RlJiZ0aGlzLmhlbHBlci5yZW1vdmUoKSxlLmV4dGVuZCh0aGlzLHtoZWxwZXI6bnVsbCxkcmFnZ2luZzohMSxyZXZlcnRpbmc6ITEsX25vRmluYWxTb3J0Om51bGx9KSx0aGlzLmRvbVBvc2l0aW9uLnByZXY/ZSh0aGlzLmRvbVBvc2l0aW9uLnByZXYpLmFmdGVyKHRoaXMuY3VycmVudEl0ZW0pOmUodGhpcy5kb21Qb3NpdGlvbi5wYXJlbnQpLnByZXBlbmQodGhpcy5jdXJyZW50SXRlbSkpLHRoaXN9LHNlcmlhbGl6ZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLl9nZXRJdGVtc0FzalF1ZXJ5KHQmJnQuY29ubmVjdGVkKSxzPVtdO3JldHVybiB0PXR8fHt9LGUoaSkuZWFjaChmdW5jdGlvbigpe3ZhciBpPShlKHQuaXRlbXx8dGhpcykuYXR0cih0LmF0dHJpYnV0ZXx8ImlkIil8fCIiKS5tYXRjaCh0LmV4cHJlc3Npb258fC8oLispW1wtPV9dKC4rKS8pO2kmJnMucHVzaCgodC5rZXl8fGlbMV0rIltdIikrIj0iKyh0LmtleSYmdC5leHByZXNzaW9uP2lbMV06aVsyXSkpfSksIXMubGVuZ3RoJiZ0LmtleSYmcy5wdXNoKHQua2V5KyI9Iikscy5qb2luKCImIil9LHRvQXJyYXk6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5fZ2V0SXRlbXNBc2pRdWVyeSh0JiZ0LmNvbm5lY3RlZCkscz1bXTtyZXR1cm4gdD10fHx7fSxpLmVhY2goZnVuY3Rpb24oKXtzLnB1c2goZSh0Lml0ZW18fHRoaXMpLmF0dHIodC5hdHRyaWJ1dGV8fCJpZCIpfHwiIil9KSxzfSxfaW50ZXJzZWN0c1dpdGg6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LGk9dCt0aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLHM9dGhpcy5wb3NpdGlvbkFicy50b3Asbj1zK3RoaXMuaGVscGVyUHJvcG9ydGlvbnMuaGVpZ2h0LGE9ZS5sZWZ0LG89YStlLndpZHRoLHI9ZS50b3AsaD1yK2UuaGVpZ2h0LGw9dGhpcy5vZmZzZXQuY2xpY2sudG9wLHU9dGhpcy5vZmZzZXQuY2xpY2subGVmdCxkPSJ4Ij09PXRoaXMub3B0aW9ucy5heGlzfHxzK2w+ciYmaD5zK2wsYz0ieSI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dCt1PmEmJm8+dCt1LHA9ZCYmYztyZXR1cm4icG9pbnRlciI9PT10aGlzLm9wdGlvbnMudG9sZXJhbmNlfHx0aGlzLm9wdGlvbnMuZm9yY2VQb2ludGVyRm9yQ29udGFpbmVyc3x8InBvaW50ZXIiIT09dGhpcy5vcHRpb25zLnRvbGVyYW5jZSYmdGhpcy5oZWxwZXJQcm9wb3J0aW9uc1t0aGlzLmZsb2F0aW5nPyJ3aWR0aCI6ImhlaWdodCJdPmVbdGhpcy5mbG9hdGluZz8id2lkdGgiOiJoZWlnaHQiXT9wOnQrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy53aWR0aC8yPmEmJm8+aS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLzImJnMrdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMj5yJiZoPm4tdGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQvMn0sX2ludGVyc2VjdHNXaXRoUG9pbnRlcjpmdW5jdGlvbihlKXt2YXIgdD0ieCI9PT10aGlzLm9wdGlvbnMuYXhpc3x8dGhpcy5faXNPdmVyQXhpcyh0aGlzLnBvc2l0aW9uQWJzLnRvcCt0aGlzLm9mZnNldC5jbGljay50b3AsZS50b3AsZS5oZWlnaHQpLGk9InkiPT09dGhpcy5vcHRpb25zLmF4aXN8fHRoaXMuX2lzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsZS5sZWZ0LGUud2lkdGgpLHM9dCYmaSxuPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLGE9dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gcz90aGlzLmZsb2F0aW5nP2EmJiJyaWdodCI9PT1hfHwiZG93biI9PT1uPzI6MTpuJiYoImRvd24iPT09bj8yOjEpOiExfSxfaW50ZXJzZWN0c1dpdGhTaWRlczpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pc092ZXJBeGlzKHRoaXMucG9zaXRpb25BYnMudG9wK3RoaXMub2Zmc2V0LmNsaWNrLnRvcCxlLnRvcCtlLmhlaWdodC8yLGUuaGVpZ2h0KSxpPXRoaXMuX2lzT3ZlckF4aXModGhpcy5wb3NpdGlvbkFicy5sZWZ0K3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQsZS5sZWZ0K2Uud2lkdGgvMixlLndpZHRoKSxzPXRoaXMuX2dldERyYWdWZXJ0aWNhbERpcmVjdGlvbigpLG49dGhpcy5fZ2V0RHJhZ0hvcml6b250YWxEaXJlY3Rpb24oKTtyZXR1cm4gdGhpcy5mbG9hdGluZyYmbj8icmlnaHQiPT09biYmaXx8ImxlZnQiPT09biYmIWk6cyYmKCJkb3duIj09PXMmJnR8fCJ1cCI9PT1zJiYhdCl9LF9nZXREcmFnVmVydGljYWxEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBvc2l0aW9uQWJzLnRvcC10aGlzLmxhc3RQb3NpdGlvbkFicy50b3A7cmV0dXJuIDAhPT1lJiYoZT4wPyJkb3duIjoidXAiKX0sX2dldERyYWdIb3Jpem9udGFsRGlyZWN0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wb3NpdGlvbkFicy5sZWZ0LXRoaXMubGFzdFBvc2l0aW9uQWJzLmxlZnQ7cmV0dXJuIDAhPT1lJiYoZT4wPyJyaWdodCI6ImxlZnQiKX0scmVmcmVzaDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fcmVmcmVzaEl0ZW1zKGUpLHRoaXMuX3NldEhhbmRsZUNsYXNzTmFtZSgpLHRoaXMucmVmcmVzaFBvc2l0aW9ucygpLHRoaXN9LF9jb25uZWN0V2l0aDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3B0aW9ucztyZXR1cm4gZS5jb25uZWN0V2l0aC5jb25zdHJ1Y3Rvcj09PVN0cmluZz9bZS5jb25uZWN0V2l0aF06ZS5jb25uZWN0V2l0aH0sX2dldEl0ZW1zQXNqUXVlcnk6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaSgpe3IucHVzaCh0aGlzKX12YXIgcyxuLGEsbyxyPVtdLGg9W10sbD10aGlzLl9jb25uZWN0V2l0aCgpO2lmKGwmJnQpZm9yKHM9bC5sZW5ndGgtMTtzPj0wO3MtLSlmb3IoYT1lKGxbc10sdGhpcy5kb2N1bWVudFswXSksbj1hLmxlbmd0aC0xO24+PTA7bi0tKW89ZS5kYXRhKGFbbl0sdGhpcy53aWRnZXRGdWxsTmFtZSksbyYmbyE9PXRoaXMmJiFvLm9wdGlvbnMuZGlzYWJsZWQmJmgucHVzaChbZS5pc0Z1bmN0aW9uKG8ub3B0aW9ucy5pdGVtcyk/by5vcHRpb25zLml0ZW1zLmNhbGwoby5lbGVtZW50KTplKG8ub3B0aW9ucy5pdGVtcyxvLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksb10pO2ZvcihoLnB1c2goW2UuaXNGdW5jdGlvbih0aGlzLm9wdGlvbnMuaXRlbXMpP3RoaXMub3B0aW9ucy5pdGVtcy5jYWxsKHRoaXMuZWxlbWVudCxudWxsLHtvcHRpb25zOnRoaXMub3B0aW9ucyxpdGVtOnRoaXMuY3VycmVudEl0ZW19KTplKHRoaXMub3B0aW9ucy5pdGVtcyx0aGlzLmVsZW1lbnQpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpLm5vdCgiLnVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIiksdGhpc10pLHM9aC5sZW5ndGgtMTtzPj0wO3MtLSloW3NdWzBdLmVhY2goaSk7cmV0dXJuIGUocil9LF9yZW1vdmVDdXJyZW50c0Zyb21JdGVtczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY3VycmVudEl0ZW0uZmluZCgiOmRhdGEoIit0aGlzLndpZGdldE5hbWUrIi1pdGVtKSIpO3RoaXMuaXRlbXM9ZS5ncmVwKHRoaXMuaXRlbXMsZnVuY3Rpb24oZSl7Zm9yKHZhciBpPTA7dC5sZW5ndGg+aTtpKyspaWYodFtpXT09PWUuaXRlbVswXSlyZXR1cm4hMTtyZXR1cm4hMH0pfSxfcmVmcmVzaEl0ZW1zOmZ1bmN0aW9uKHQpe3RoaXMuaXRlbXM9W10sdGhpcy5jb250YWluZXJzPVt0aGlzXTt2YXIgaSxzLG4sYSxvLHIsaCxsLHU9dGhpcy5pdGVtcyxkPVtbZS5pc0Z1bmN0aW9uKHRoaXMub3B0aW9ucy5pdGVtcyk/dGhpcy5vcHRpb25zLml0ZW1zLmNhbGwodGhpcy5lbGVtZW50WzBdLHQse2l0ZW06dGhpcy5jdXJyZW50SXRlbX0pOmUodGhpcy5vcHRpb25zLml0ZW1zLHRoaXMuZWxlbWVudCksdGhpc11dLGM9dGhpcy5fY29ubmVjdFdpdGgoKTtpZihjJiZ0aGlzLnJlYWR5KWZvcihpPWMubGVuZ3RoLTE7aT49MDtpLS0pZm9yKG49ZShjW2ldLHRoaXMuZG9jdW1lbnRbMF0pLHM9bi5sZW5ndGgtMTtzPj0wO3MtLSlhPWUuZGF0YShuW3NdLHRoaXMud2lkZ2V0RnVsbE5hbWUpLGEmJmEhPT10aGlzJiYhYS5vcHRpb25zLmRpc2FibGVkJiYoZC5wdXNoKFtlLmlzRnVuY3Rpb24oYS5vcHRpb25zLml0ZW1zKT9hLm9wdGlvbnMuaXRlbXMuY2FsbChhLmVsZW1lbnRbMF0sdCx7aXRlbTp0aGlzLmN1cnJlbnRJdGVtfSk6ZShhLm9wdGlvbnMuaXRlbXMsYS5lbGVtZW50KSxhXSksdGhpcy5jb250YWluZXJzLnB1c2goYSkpO2ZvcihpPWQubGVuZ3RoLTE7aT49MDtpLS0pZm9yKG89ZFtpXVsxXSxyPWRbaV1bMF0scz0wLGw9ci5sZW5ndGg7bD5zO3MrKyloPWUocltzXSksaC5kYXRhKHRoaXMud2lkZ2V0TmFtZSsiLWl0ZW0iLG8pLHUucHVzaCh7aXRlbTpoLGluc3RhbmNlOm8sd2lkdGg6MCxoZWlnaHQ6MCxsZWZ0OjAsdG9wOjB9KX0scmVmcmVzaFBvc2l0aW9uczpmdW5jdGlvbih0KXt0aGlzLmZsb2F0aW5nPXRoaXMuaXRlbXMubGVuZ3RoPyJ4Ij09PXRoaXMub3B0aW9ucy5heGlzfHx0aGlzLl9pc0Zsb2F0aW5nKHRoaXMuaXRlbXNbMF0uaXRlbSk6ITEsdGhpcy5vZmZzZXRQYXJlbnQmJnRoaXMuaGVscGVyJiYodGhpcy5vZmZzZXQucGFyZW50PXRoaXMuX2dldFBhcmVudE9mZnNldCgpKTt2YXIgaSxzLG4sYTtmb3IoaT10aGlzLml0ZW1zLmxlbmd0aC0xO2k+PTA7aS0tKXM9dGhpcy5pdGVtc1tpXSxzLmluc3RhbmNlIT09dGhpcy5jdXJyZW50Q29udGFpbmVyJiZ0aGlzLmN1cnJlbnRDb250YWluZXImJnMuaXRlbVswXSE9PXRoaXMuY3VycmVudEl0ZW1bMF18fChuPXRoaXMub3B0aW9ucy50b2xlcmFuY2VFbGVtZW50P2UodGhpcy5vcHRpb25zLnRvbGVyYW5jZUVsZW1lbnQscy5pdGVtKTpzLml0ZW0sdHx8KHMud2lkdGg9bi5vdXRlcldpZHRoKCkscy5oZWlnaHQ9bi5vdXRlckhlaWdodCgpKSxhPW4ub2Zmc2V0KCkscy5sZWZ0PWEubGVmdCxzLnRvcD1hLnRvcCk7aWYodGhpcy5vcHRpb25zLmN1c3RvbSYmdGhpcy5vcHRpb25zLmN1c3RvbS5yZWZyZXNoQ29udGFpbmVycyl0aGlzLm9wdGlvbnMuY3VzdG9tLnJlZnJlc2hDb250YWluZXJzLmNhbGwodGhpcyk7ZWxzZSBmb3IoaT10aGlzLmNvbnRhaW5lcnMubGVuZ3RoLTE7aT49MDtpLS0pYT10aGlzLmNvbnRhaW5lcnNbaV0uZWxlbWVudC5vZmZzZXQoKSx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUubGVmdD1hLmxlZnQsdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLnRvcD1hLnRvcCx0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUud2lkdGg9dGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub3V0ZXJXaWR0aCgpLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5oZWlnaHQ9dGhpcy5jb250YWluZXJzW2ldLmVsZW1lbnQub3V0ZXJIZWlnaHQoKTtyZXR1cm4gdGhpc30sX2NyZWF0ZVBsYWNlaG9sZGVyOmZ1bmN0aW9uKHQpe3Q9dHx8dGhpczt2YXIgaSxzPXQub3B0aW9ucztzLnBsYWNlaG9sZGVyJiZzLnBsYWNlaG9sZGVyLmNvbnN0cnVjdG9yIT09U3RyaW5nfHwoaT1zLnBsYWNlaG9sZGVyLHMucGxhY2Vob2xkZXI9e2VsZW1lbnQ6ZnVuY3Rpb24oKXt2YXIgcz10LmN1cnJlbnRJdGVtWzBdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1lKCI8IitzKyI+Iix0LmRvY3VtZW50WzBdKS5hZGRDbGFzcyhpfHx0LmN1cnJlbnRJdGVtWzBdLmNsYXNzTmFtZSsiIHVpLXNvcnRhYmxlLXBsYWNlaG9sZGVyIikucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpO3JldHVybiJ0Ym9keSI9PT1zP3QuX2NyZWF0ZVRyUGxhY2Vob2xkZXIodC5jdXJyZW50SXRlbS5maW5kKCJ0ciIpLmVxKDApLGUoIjx0cj4iLHQuZG9jdW1lbnRbMF0pLmFwcGVuZFRvKG4pKToidHIiPT09cz90Ll9jcmVhdGVUclBsYWNlaG9sZGVyKHQuY3VycmVudEl0ZW0sbik6ImltZyI9PT1zJiZuLmF0dHIoInNyYyIsdC5jdXJyZW50SXRlbS5hdHRyKCJzcmMiKSksaXx8bi5jc3MoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxufSx1cGRhdGU6ZnVuY3Rpb24oZSxuKXsoIWl8fHMuZm9yY2VQbGFjZWhvbGRlclNpemUpJiYobi5oZWlnaHQoKXx8bi5oZWlnaHQodC5jdXJyZW50SXRlbS5pbm5lckhlaWdodCgpLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nVG9wIil8fDAsMTApLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nQm90dG9tIil8fDAsMTApKSxuLndpZHRoKCl8fG4ud2lkdGgodC5jdXJyZW50SXRlbS5pbm5lcldpZHRoKCktcGFyc2VJbnQodC5jdXJyZW50SXRlbS5jc3MoInBhZGRpbmdMZWZ0Iil8fDAsMTApLXBhcnNlSW50KHQuY3VycmVudEl0ZW0uY3NzKCJwYWRkaW5nUmlnaHQiKXx8MCwxMCkpKX19KSx0LnBsYWNlaG9sZGVyPWUocy5wbGFjZWhvbGRlci5lbGVtZW50LmNhbGwodC5lbGVtZW50LHQuY3VycmVudEl0ZW0pKSx0LmN1cnJlbnRJdGVtLmFmdGVyKHQucGxhY2Vob2xkZXIpLHMucGxhY2Vob2xkZXIudXBkYXRlKHQsdC5wbGFjZWhvbGRlcil9LF9jcmVhdGVUclBsYWNlaG9sZGVyOmZ1bmN0aW9uKHQsaSl7dmFyIHM9dGhpczt0LmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpe2UoIjx0ZD4mIzE2MDs8L3RkPiIscy5kb2N1bWVudFswXSkuYXR0cigiY29sc3BhbiIsZSh0aGlzKS5hdHRyKCJjb2xzcGFuIil8fDEpLmFwcGVuZFRvKGkpfSl9LF9jb250YWN0Q29udGFpbmVyczpmdW5jdGlvbih0KXt2YXIgaSxzLG4sYSxvLHIsaCxsLHUsZCxjPW51bGwscD1udWxsO2ZvcihpPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtpPj0wO2ktLSlpZighZS5jb250YWlucyh0aGlzLmN1cnJlbnRJdGVtWzBdLHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdKSlpZih0aGlzLl9pbnRlcnNlY3RzV2l0aCh0aGlzLmNvbnRhaW5lcnNbaV0uY29udGFpbmVyQ2FjaGUpKXtpZihjJiZlLmNvbnRhaW5zKHRoaXMuY29udGFpbmVyc1tpXS5lbGVtZW50WzBdLGMuZWxlbWVudFswXSkpY29udGludWU7Yz10aGlzLmNvbnRhaW5lcnNbaV0scD1pfWVsc2UgdGhpcy5jb250YWluZXJzW2ldLmNvbnRhaW5lckNhY2hlLm92ZXImJih0aGlzLmNvbnRhaW5lcnNbaV0uX3RyaWdnZXIoIm91dCIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1tpXS5jb250YWluZXJDYWNoZS5vdmVyPTApO2lmKGMpaWYoMT09PXRoaXMuY29udGFpbmVycy5sZW5ndGgpdGhpcy5jb250YWluZXJzW3BdLmNvbnRhaW5lckNhY2hlLm92ZXJ8fCh0aGlzLmNvbnRhaW5lcnNbcF0uX3RyaWdnZXIoIm92ZXIiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmNvbnRhaW5lcnNbcF0uY29udGFpbmVyQ2FjaGUub3Zlcj0xKTtlbHNle2ZvcihuPTFlNCxhPW51bGwsdT1jLmZsb2F0aW5nfHx0aGlzLl9pc0Zsb2F0aW5nKHRoaXMuY3VycmVudEl0ZW0pLG89dT8ibGVmdCI6InRvcCIscj11PyJ3aWR0aCI6ImhlaWdodCIsZD11PyJjbGllbnRYIjoiY2xpZW50WSIscz10aGlzLml0ZW1zLmxlbmd0aC0xO3M+PTA7cy0tKWUuY29udGFpbnModGhpcy5jb250YWluZXJzW3BdLmVsZW1lbnRbMF0sdGhpcy5pdGVtc1tzXS5pdGVtWzBdKSYmdGhpcy5pdGVtc1tzXS5pdGVtWzBdIT09dGhpcy5jdXJyZW50SXRlbVswXSYmKGg9dGhpcy5pdGVtc1tzXS5pdGVtLm9mZnNldCgpW29dLGw9ITEsdFtkXS1oPnRoaXMuaXRlbXNbc11bcl0vMiYmKGw9ITApLG4+TWF0aC5hYnModFtkXS1oKSYmKG49TWF0aC5hYnModFtkXS1oKSxhPXRoaXMuaXRlbXNbc10sdGhpcy5kaXJlY3Rpb249bD8idXAiOiJkb3duIikpO2lmKCFhJiYhdGhpcy5vcHRpb25zLmRyb3BPbkVtcHR5KXJldHVybjtpZih0aGlzLmN1cnJlbnRDb250YWluZXI9PT10aGlzLmNvbnRhaW5lcnNbcF0pcmV0dXJuIHRoaXMuY3VycmVudENvbnRhaW5lci5jb250YWluZXJDYWNoZS5vdmVyfHwodGhpcy5jb250YWluZXJzW3BdLl90cmlnZ2VyKCJvdmVyIix0LHRoaXMuX3VpSGFzaCgpKSx0aGlzLmN1cnJlbnRDb250YWluZXIuY29udGFpbmVyQ2FjaGUub3Zlcj0xKSx2b2lkIDA7YT90aGlzLl9yZWFycmFuZ2UodCxhLG51bGwsITApOnRoaXMuX3JlYXJyYW5nZSh0LG51bGwsdGhpcy5jb250YWluZXJzW3BdLmVsZW1lbnQsITApLHRoaXMuX3RyaWdnZXIoImNoYW5nZSIsdCx0aGlzLl91aUhhc2goKSksdGhpcy5jb250YWluZXJzW3BdLl90cmlnZ2VyKCJjaGFuZ2UiLHQsdGhpcy5fdWlIYXNoKHRoaXMpKSx0aGlzLmN1cnJlbnRDb250YWluZXI9dGhpcy5jb250YWluZXJzW3BdLHRoaXMub3B0aW9ucy5wbGFjZWhvbGRlci51cGRhdGUodGhpcy5jdXJyZW50Q29udGFpbmVyLHRoaXMucGxhY2Vob2xkZXIpLHRoaXMuY29udGFpbmVyc1twXS5fdHJpZ2dlcigib3ZlciIsdCx0aGlzLl91aUhhc2godGhpcykpLHRoaXMuY29udGFpbmVyc1twXS5jb250YWluZXJDYWNoZS5vdmVyPTF9fSxfY3JlYXRlSGVscGVyOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPWUuaXNGdW5jdGlvbihpLmhlbHBlcik/ZShpLmhlbHBlci5hcHBseSh0aGlzLmVsZW1lbnRbMF0sW3QsdGhpcy5jdXJyZW50SXRlbV0pKToiY2xvbmUiPT09aS5oZWxwZXI/dGhpcy5jdXJyZW50SXRlbS5jbG9uZSgpOnRoaXMuY3VycmVudEl0ZW07cmV0dXJuIHMucGFyZW50cygiYm9keSIpLmxlbmd0aHx8ZSgicGFyZW50IiE9PWkuYXBwZW5kVG8/aS5hcHBlbmRUbzp0aGlzLmN1cnJlbnRJdGVtWzBdLnBhcmVudE5vZGUpWzBdLmFwcGVuZENoaWxkKHNbMF0pLHNbMF09PT10aGlzLmN1cnJlbnRJdGVtWzBdJiYodGhpcy5fc3RvcmVkQ1NTPXt3aWR0aDp0aGlzLmN1cnJlbnRJdGVtWzBdLnN0eWxlLndpZHRoLGhlaWdodDp0aGlzLmN1cnJlbnRJdGVtWzBdLnN0eWxlLmhlaWdodCxwb3NpdGlvbjp0aGlzLmN1cnJlbnRJdGVtLmNzcygicG9zaXRpb24iKSx0b3A6dGhpcy5jdXJyZW50SXRlbS5jc3MoInRvcCIpLGxlZnQ6dGhpcy5jdXJyZW50SXRlbS5jc3MoImxlZnQiKX0pLCghc1swXS5zdHlsZS53aWR0aHx8aS5mb3JjZUhlbHBlclNpemUpJiZzLndpZHRoKHRoaXMuY3VycmVudEl0ZW0ud2lkdGgoKSksKCFzWzBdLnN0eWxlLmhlaWdodHx8aS5mb3JjZUhlbHBlclNpemUpJiZzLmhlaWdodCh0aGlzLmN1cnJlbnRJdGVtLmhlaWdodCgpKSxzfSxfYWRqdXN0T2Zmc2V0RnJvbUhlbHBlcjpmdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PXQuc3BsaXQoIiAiKSksZS5pc0FycmF5KHQpJiYodD17bGVmdDordFswXSx0b3A6K3RbMV18fDB9KSwibGVmdCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10LmxlZnQrdGhpcy5tYXJnaW5zLmxlZnQpLCJyaWdodCJpbiB0JiYodGhpcy5vZmZzZXQuY2xpY2subGVmdD10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXQucmlnaHQrdGhpcy5tYXJnaW5zLmxlZnQpLCJ0b3AiaW4gdCYmKHRoaXMub2Zmc2V0LmNsaWNrLnRvcD10LnRvcCt0aGlzLm1hcmdpbnMudG9wKSwiYm90dG9tImluIHQmJih0aGlzLm9mZnNldC5jbGljay50b3A9dGhpcy5oZWxwZXJQcm9wb3J0aW9ucy5oZWlnaHQtdC5ib3R0b20rdGhpcy5tYXJnaW5zLnRvcCl9LF9nZXRQYXJlbnRPZmZzZXQ6ZnVuY3Rpb24oKXt0aGlzLm9mZnNldFBhcmVudD10aGlzLmhlbHBlci5vZmZzZXRQYXJlbnQoKTt2YXIgdD10aGlzLm9mZnNldFBhcmVudC5vZmZzZXQoKTtyZXR1cm4iYWJzb2x1dGUiPT09dGhpcy5jc3NQb3NpdGlvbiYmdGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKSYmKHQubGVmdCs9dGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpLHQudG9wKz10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKSksKHRoaXMub2Zmc2V0UGFyZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5ib2R5fHx0aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lJiYiaHRtbCI9PT10aGlzLm9mZnNldFBhcmVudFswXS50YWdOYW1lLnRvTG93ZXJDYXNlKCkmJmUudWkuaWUpJiYodD17dG9wOjAsbGVmdDowfSkse3RvcDp0LnRvcCsocGFyc2VJbnQodGhpcy5vZmZzZXRQYXJlbnQuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCksbGVmdDp0LmxlZnQrKHBhcnNlSW50KHRoaXMub2Zmc2V0UGFyZW50LmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKX19LF9nZXRSZWxhdGl2ZU9mZnNldDpmdW5jdGlvbigpe2lmKCJyZWxhdGl2ZSI9PT10aGlzLmNzc1Bvc2l0aW9uKXt2YXIgZT10aGlzLmN1cnJlbnRJdGVtLnBvc2l0aW9uKCk7cmV0dXJue3RvcDplLnRvcC0ocGFyc2VJbnQodGhpcy5oZWxwZXIuY3NzKCJ0b3AiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpLGxlZnQ6ZS5sZWZ0LShwYXJzZUludCh0aGlzLmhlbHBlci5jc3MoImxlZnQiKSwxMCl8fDApK3RoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKX19cmV0dXJue3RvcDowLGxlZnQ6MH19LF9jYWNoZU1hcmdpbnM6ZnVuY3Rpb24oKXt0aGlzLm1hcmdpbnM9e2xlZnQ6cGFyc2VJbnQodGhpcy5jdXJyZW50SXRlbS5jc3MoIm1hcmdpbkxlZnQiKSwxMCl8fDAsdG9wOnBhcnNlSW50KHRoaXMuY3VycmVudEl0ZW0uY3NzKCJtYXJnaW5Ub3AiKSwxMCl8fDB9fSxfY2FjaGVIZWxwZXJQcm9wb3J0aW9uczpmdW5jdGlvbigpe3RoaXMuaGVscGVyUHJvcG9ydGlvbnM9e3dpZHRoOnRoaXMuaGVscGVyLm91dGVyV2lkdGgoKSxoZWlnaHQ6dGhpcy5oZWxwZXIub3V0ZXJIZWlnaHQoKX19LF9zZXRDb250YWlubWVudDpmdW5jdGlvbigpe3ZhciB0LGkscyxuPXRoaXMub3B0aW9uczsicGFyZW50Ij09PW4uY29udGFpbm1lbnQmJihuLmNvbnRhaW5tZW50PXRoaXMuaGVscGVyWzBdLnBhcmVudE5vZGUpLCgiZG9jdW1lbnQiPT09bi5jb250YWlubWVudHx8IndpbmRvdyI9PT1uLmNvbnRhaW5tZW50KSYmKHRoaXMuY29udGFpbm1lbnQ9WzAtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCwwLXRoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcC10aGlzLm9mZnNldC5wYXJlbnQudG9wLCJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50P3RoaXMuZG9jdW1lbnQud2lkdGgoKTp0aGlzLndpbmRvdy53aWR0aCgpLXRoaXMuaGVscGVyUHJvcG9ydGlvbnMud2lkdGgtdGhpcy5tYXJnaW5zLmxlZnQsKCJkb2N1bWVudCI9PT1uLmNvbnRhaW5tZW50P3RoaXMuZG9jdW1lbnQud2lkdGgoKTp0aGlzLndpbmRvdy5oZWlnaHQoKXx8dGhpcy5kb2N1bWVudFswXS5ib2R5LnBhcmVudE5vZGUuc2Nyb2xsSGVpZ2h0KS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSksL14oZG9jdW1lbnR8d2luZG93fHBhcmVudCkkLy50ZXN0KG4uY29udGFpbm1lbnQpfHwodD1lKG4uY29udGFpbm1lbnQpWzBdLGk9ZShuLmNvbnRhaW5tZW50KS5vZmZzZXQoKSxzPSJoaWRkZW4iIT09ZSh0KS5jc3MoIm92ZXJmbG93IiksdGhpcy5jb250YWlubWVudD1baS5sZWZ0KyhwYXJzZUludChlKHQpLmNzcygiYm9yZGVyTGVmdFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZSh0KS5jc3MoInBhZGRpbmdMZWZ0IiksMTApfHwwKS10aGlzLm1hcmdpbnMubGVmdCxpLnRvcCsocGFyc2VJbnQoZSh0KS5jc3MoImJvcmRlclRvcFdpZHRoIiksMTApfHwwKSsocGFyc2VJbnQoZSh0KS5jc3MoInBhZGRpbmdUb3AiKSwxMCl8fDApLXRoaXMubWFyZ2lucy50b3AsaS5sZWZ0KyhzP01hdGgubWF4KHQuc2Nyb2xsV2lkdGgsdC5vZmZzZXRXaWR0aCk6dC5vZmZzZXRXaWR0aCktKHBhcnNlSW50KGUodCkuY3NzKCJib3JkZXJMZWZ0V2lkdGgiKSwxMCl8fDApLShwYXJzZUludChlKHQpLmNzcygicGFkZGluZ1JpZ2h0IiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLndpZHRoLXRoaXMubWFyZ2lucy5sZWZ0LGkudG9wKyhzP01hdGgubWF4KHQuc2Nyb2xsSGVpZ2h0LHQub2Zmc2V0SGVpZ2h0KTp0Lm9mZnNldEhlaWdodCktKHBhcnNlSW50KGUodCkuY3NzKCJib3JkZXJUb3BXaWR0aCIpLDEwKXx8MCktKHBhcnNlSW50KGUodCkuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApfHwwKS10aGlzLmhlbHBlclByb3BvcnRpb25zLmhlaWdodC10aGlzLm1hcmdpbnMudG9wXSl9LF9jb252ZXJ0UG9zaXRpb25UbzpmdW5jdGlvbih0LGkpe2l8fChpPXRoaXMucG9zaXRpb24pO3ZhciBzPSJhYnNvbHV0ZSI9PT10PzE6LTEsbj0iYWJzb2x1dGUiIT09dGhpcy5jc3NQb3NpdGlvbnx8dGhpcy5zY3JvbGxQYXJlbnRbMF0hPT10aGlzLmRvY3VtZW50WzBdJiZlLmNvbnRhaW5zKHRoaXMuc2Nyb2xsUGFyZW50WzBdLHRoaXMub2Zmc2V0UGFyZW50WzBdKT90aGlzLnNjcm9sbFBhcmVudDp0aGlzLm9mZnNldFBhcmVudCxhPS8oaHRtbHxib2R5KS9pLnRlc3QoblswXS50YWdOYW1lKTtyZXR1cm57dG9wOmkudG9wK3RoaXMub2Zmc2V0LnJlbGF0aXZlLnRvcCpzK3RoaXMub2Zmc2V0LnBhcmVudC50b3Aqcy0oImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbFRvcCgpOmE/MDpuLnNjcm9sbFRvcCgpKSpzLGxlZnQ6aS5sZWZ0K3RoaXMub2Zmc2V0LnJlbGF0aXZlLmxlZnQqcyt0aGlzLm9mZnNldC5wYXJlbnQubGVmdCpzLSgiZml4ZWQiPT09dGhpcy5jc3NQb3NpdGlvbj8tdGhpcy5zY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdCgpOmE/MDpuLnNjcm9sbExlZnQoKSkqc319LF9nZW5lcmF0ZVBvc2l0aW9uOmZ1bmN0aW9uKHQpe3ZhciBpLHMsbj10aGlzLm9wdGlvbnMsYT10LnBhZ2VYLG89dC5wYWdlWSxyPSJhYnNvbHV0ZSIhPT10aGlzLmNzc1Bvc2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJmUuY29udGFpbnModGhpcy5zY3JvbGxQYXJlbnRbMF0sdGhpcy5vZmZzZXRQYXJlbnRbMF0pP3RoaXMuc2Nyb2xsUGFyZW50OnRoaXMub2Zmc2V0UGFyZW50LGg9LyhodG1sfGJvZHkpL2kudGVzdChyWzBdLnRhZ05hbWUpO3JldHVybiJyZWxhdGl2ZSIhPT10aGlzLmNzc1Bvc2l0aW9ufHx0aGlzLnNjcm9sbFBhcmVudFswXSE9PXRoaXMuZG9jdW1lbnRbMF0mJnRoaXMuc2Nyb2xsUGFyZW50WzBdIT09dGhpcy5vZmZzZXRQYXJlbnRbMF18fCh0aGlzLm9mZnNldC5yZWxhdGl2ZT10aGlzLl9nZXRSZWxhdGl2ZU9mZnNldCgpKSx0aGlzLm9yaWdpbmFsUG9zaXRpb24mJih0aGlzLmNvbnRhaW5tZW50JiYodC5wYWdlWC10aGlzLm9mZnNldC5jbGljay5sZWZ0PHRoaXMuY29udGFpbm1lbnRbMF0mJihhPXRoaXMuY29udGFpbm1lbnRbMF0rdGhpcy5vZmZzZXQuY2xpY2subGVmdCksdC5wYWdlWS10aGlzLm9mZnNldC5jbGljay50b3A8dGhpcy5jb250YWlubWVudFsxXSYmKG89dGhpcy5jb250YWlubWVudFsxXSt0aGlzLm9mZnNldC5jbGljay50b3ApLHQucGFnZVgtdGhpcy5vZmZzZXQuY2xpY2subGVmdD50aGlzLmNvbnRhaW5tZW50WzJdJiYoYT10aGlzLmNvbnRhaW5tZW50WzJdK3RoaXMub2Zmc2V0LmNsaWNrLmxlZnQpLHQucGFnZVktdGhpcy5vZmZzZXQuY2xpY2sudG9wPnRoaXMuY29udGFpbm1lbnRbM10mJihvPXRoaXMuY29udGFpbm1lbnRbM10rdGhpcy5vZmZzZXQuY2xpY2sudG9wKSksbi5ncmlkJiYoaT10aGlzLm9yaWdpbmFsUGFnZVkrTWF0aC5yb3VuZCgoby10aGlzLm9yaWdpbmFsUGFnZVkpL24uZ3JpZFsxXSkqbi5ncmlkWzFdLG89dGhpcy5jb250YWlubWVudD9pLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49dGhpcy5jb250YWlubWVudFsxXSYmaS10aGlzLm9mZnNldC5jbGljay50b3A8PXRoaXMuY29udGFpbm1lbnRbM10/aTppLXRoaXMub2Zmc2V0LmNsaWNrLnRvcD49dGhpcy5jb250YWlubWVudFsxXT9pLW4uZ3JpZFsxXTppK24uZ3JpZFsxXTppLHM9dGhpcy5vcmlnaW5hbFBhZ2VYK01hdGgucm91bmQoKGEtdGhpcy5vcmlnaW5hbFBhZ2VYKS9uLmdyaWRbMF0pKm4uZ3JpZFswXSxhPXRoaXMuY29udGFpbm1lbnQ/cy10aGlzLm9mZnNldC5jbGljay5sZWZ0Pj10aGlzLmNvbnRhaW5tZW50WzBdJiZzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ8PXRoaXMuY29udGFpbm1lbnRbMl0/czpzLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQ+PXRoaXMuY29udGFpbm1lbnRbMF0/cy1uLmdyaWRbMF06cytuLmdyaWRbMF06cykpLHt0b3A6by10aGlzLm9mZnNldC5jbGljay50b3AtdGhpcy5vZmZzZXQucmVsYXRpdmUudG9wLXRoaXMub2Zmc2V0LnBhcmVudC50b3ArKCJmaXhlZCI9PT10aGlzLmNzc1Bvc2l0aW9uPy10aGlzLnNjcm9sbFBhcmVudC5zY3JvbGxUb3AoKTpoPzA6ci5zY3JvbGxUb3AoKSksbGVmdDphLXRoaXMub2Zmc2V0LmNsaWNrLmxlZnQtdGhpcy5vZmZzZXQucmVsYXRpdmUubGVmdC10aGlzLm9mZnNldC5wYXJlbnQubGVmdCsoImZpeGVkIj09PXRoaXMuY3NzUG9zaXRpb24/LXRoaXMuc2Nyb2xsUGFyZW50LnNjcm9sbExlZnQoKTpoPzA6ci5zY3JvbGxMZWZ0KCkpfX0sX3JlYXJyYW5nZTpmdW5jdGlvbihlLHQsaSxzKXtpP2lbMF0uYXBwZW5kQ2hpbGQodGhpcy5wbGFjZWhvbGRlclswXSk6dC5pdGVtWzBdLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMucGxhY2Vob2xkZXJbMF0sImRvd24iPT09dGhpcy5kaXJlY3Rpb24/dC5pdGVtWzBdOnQuaXRlbVswXS5uZXh0U2libGluZyksdGhpcy5jb3VudGVyPXRoaXMuY291bnRlcj8rK3RoaXMuY291bnRlcjoxO3ZhciBuPXRoaXMuY291bnRlcjt0aGlzLl9kZWxheShmdW5jdGlvbigpe249PT10aGlzLmNvdW50ZXImJnRoaXMucmVmcmVzaFBvc2l0aW9ucyghcyl9KX0sX2NsZWFyOmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gaShlLHQsaSl7cmV0dXJuIGZ1bmN0aW9uKHMpe2kuX3RyaWdnZXIoZSxzLHQuX3VpSGFzaCh0KSl9fXRoaXMucmV2ZXJ0aW5nPSExO3ZhciBzLG49W107aWYoIXRoaXMuX25vRmluYWxTb3J0JiZ0aGlzLmN1cnJlbnRJdGVtLnBhcmVudCgpLmxlbmd0aCYmdGhpcy5wbGFjZWhvbGRlci5iZWZvcmUodGhpcy5jdXJyZW50SXRlbSksdGhpcy5fbm9GaW5hbFNvcnQ9bnVsbCx0aGlzLmhlbHBlclswXT09PXRoaXMuY3VycmVudEl0ZW1bMF0pe2ZvcihzIGluIHRoaXMuX3N0b3JlZENTUykoImF1dG8iPT09dGhpcy5fc3RvcmVkQ1NTW3NdfHwic3RhdGljIj09PXRoaXMuX3N0b3JlZENTU1tzXSkmJih0aGlzLl9zdG9yZWRDU1Nbc109IiIpO3RoaXMuY3VycmVudEl0ZW0uY3NzKHRoaXMuX3N0b3JlZENTUykucmVtb3ZlQ2xhc3MoInVpLXNvcnRhYmxlLWhlbHBlciIpfWVsc2UgdGhpcy5jdXJyZW50SXRlbS5zaG93KCk7Zm9yKHRoaXMuZnJvbU91dHNpZGUmJiF0JiZuLnB1c2goZnVuY3Rpb24oZSl7dGhpcy5fdHJpZ2dlcigicmVjZWl2ZSIsZSx0aGlzLl91aUhhc2godGhpcy5mcm9tT3V0c2lkZSkpfSksIXRoaXMuZnJvbU91dHNpZGUmJnRoaXMuZG9tUG9zaXRpb24ucHJldj09PXRoaXMuY3VycmVudEl0ZW0ucHJldigpLm5vdCgiLnVpLXNvcnRhYmxlLWhlbHBlciIpWzBdJiZ0aGlzLmRvbVBvc2l0aW9uLnBhcmVudD09PXRoaXMuY3VycmVudEl0ZW0ucGFyZW50KClbMF18fHR8fG4ucHVzaChmdW5jdGlvbihlKXt0aGlzLl90cmlnZ2VyKCJ1cGRhdGUiLGUsdGhpcy5fdWlIYXNoKCkpfSksdGhpcyE9PXRoaXMuY3VycmVudENvbnRhaW5lciYmKHR8fChuLnB1c2goZnVuY3Rpb24oZSl7dGhpcy5fdHJpZ2dlcigicmVtb3ZlIixlLHRoaXMuX3VpSGFzaCgpKX0pLG4ucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcigicmVjZWl2ZSIsdCx0aGlzLl91aUhhc2godGhpcykpfX0uY2FsbCh0aGlzLHRoaXMuY3VycmVudENvbnRhaW5lcikpLG4ucHVzaChmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZS5fdHJpZ2dlcigidXBkYXRlIix0LHRoaXMuX3VpSGFzaCh0aGlzKSl9fS5jYWxsKHRoaXMsdGhpcy5jdXJyZW50Q29udGFpbmVyKSkpKSxzPXRoaXMuY29udGFpbmVycy5sZW5ndGgtMTtzPj0wO3MtLSl0fHxuLnB1c2goaSgiZGVhY3RpdmF0ZSIsdGhpcyx0aGlzLmNvbnRhaW5lcnNbc10pKSx0aGlzLmNvbnRhaW5lcnNbc10uY29udGFpbmVyQ2FjaGUub3ZlciYmKG4ucHVzaChpKCJvdXQiLHRoaXMsdGhpcy5jb250YWluZXJzW3NdKSksdGhpcy5jb250YWluZXJzW3NdLmNvbnRhaW5lckNhY2hlLm92ZXI9MCk7aWYodGhpcy5zdG9yZWRDdXJzb3ImJih0aGlzLmRvY3VtZW50LmZpbmQoImJvZHkiKS5jc3MoImN1cnNvciIsdGhpcy5zdG9yZWRDdXJzb3IpLHRoaXMuc3RvcmVkU3R5bGVzaGVldC5yZW1vdmUoKSksdGhpcy5fc3RvcmVkT3BhY2l0eSYmdGhpcy5oZWxwZXIuY3NzKCJvcGFjaXR5Iix0aGlzLl9zdG9yZWRPcGFjaXR5KSx0aGlzLl9zdG9yZWRaSW5kZXgmJnRoaXMuaGVscGVyLmNzcygiekluZGV4IiwiYXV0byI9PT10aGlzLl9zdG9yZWRaSW5kZXg/IiI6dGhpcy5fc3RvcmVkWkluZGV4KSx0aGlzLmRyYWdnaW5nPSExLHR8fHRoaXMuX3RyaWdnZXIoImJlZm9yZVN0b3AiLGUsdGhpcy5fdWlIYXNoKCkpLHRoaXMucGxhY2Vob2xkZXJbMF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBsYWNlaG9sZGVyWzBdKSx0aGlzLmNhbmNlbEhlbHBlclJlbW92YWx8fCh0aGlzLmhlbHBlclswXSE9PXRoaXMuY3VycmVudEl0ZW1bMF0mJnRoaXMuaGVscGVyLnJlbW92ZSgpLHRoaXMuaGVscGVyPW51bGwpLCF0KXtmb3Iocz0wO24ubGVuZ3RoPnM7cysrKW5bc10uY2FsbCh0aGlzLGUpO3RoaXMuX3RyaWdnZXIoInN0b3AiLGUsdGhpcy5fdWlIYXNoKCkpfXJldHVybiB0aGlzLmZyb21PdXRzaWRlPSExLCF0aGlzLmNhbmNlbEhlbHBlclJlbW92YWx9LF90cmlnZ2VyOmZ1bmN0aW9uKCl7ZS5XaWRnZXQucHJvdG90eXBlLl90cmlnZ2VyLmFwcGx5KHRoaXMsYXJndW1lbnRzKT09PSExJiZ0aGlzLmNhbmNlbCgpfSxfdWlIYXNoOmZ1bmN0aW9uKHQpe3ZhciBpPXR8fHRoaXM7cmV0dXJue2hlbHBlcjppLmhlbHBlcixwbGFjZWhvbGRlcjppLnBsYWNlaG9sZGVyfHxlKFtdKSxwb3NpdGlvbjppLnBvc2l0aW9uLG9yaWdpbmFsUG9zaXRpb246aS5vcmlnaW5hbFBvc2l0aW9uLG9mZnNldDppLnBvc2l0aW9uQWJzLGl0ZW06aS5jdXJyZW50SXRlbSxzZW5kZXI6dD90LmVsZW1lbnQ6bnVsbH19fSksZS53aWRnZXQoInVpLnNwaW5uZXIiLHt2ZXJzaW9uOiIxLjExLjQiLGRlZmF1bHRFbGVtZW50OiI8aW5wdXQ+Iix3aWRnZXRFdmVudFByZWZpeDoic3BpbiIsb3B0aW9uczp7Y3VsdHVyZTpudWxsLGljb25zOntkb3duOiJ1aS1pY29uLXRyaWFuZ2xlLTEtcyIsdXA6InVpLWljb24tdHJpYW5nbGUtMS1uIn0saW5jcmVtZW50YWw6ITAsbWF4Om51bGwsbWluOm51bGwsbnVtYmVyRm9ybWF0Om51bGwscGFnZToxMCxzdGVwOjEsY2hhbmdlOm51bGwsc3BpbjpudWxsLHN0YXJ0Om51bGwsc3RvcDpudWxsfSxfY3JlYXRlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0T3B0aW9uKCJtYXgiLHRoaXMub3B0aW9ucy5tYXgpLHRoaXMuX3NldE9wdGlvbigibWluIix0aGlzLm9wdGlvbnMubWluKSx0aGlzLl9zZXRPcHRpb24oInN0ZXAiLHRoaXMub3B0aW9ucy5zdGVwKSwiIiE9PXRoaXMudmFsdWUoKSYmdGhpcy5fdmFsdWUodGhpcy5lbGVtZW50LnZhbCgpLCEwKSx0aGlzLl9kcmF3KCksdGhpcy5fb24odGhpcy5fZXZlbnRzKSx0aGlzLl9yZWZyZXNoKCksdGhpcy5fb24odGhpcy53aW5kb3cse2JlZm9yZXVubG9hZDpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKX19KX0sX2dldENyZWF0ZU9wdGlvbnM6ZnVuY3Rpb24oKXt2YXIgdD17fSxpPXRoaXMuZWxlbWVudDtyZXR1cm4gZS5lYWNoKFsibWluIiwibWF4Iiwic3RlcCJdLGZ1bmN0aW9uKGUscyl7dmFyIG49aS5hdHRyKHMpO3ZvaWQgMCE9PW4mJm4ubGVuZ3RoJiYodFtzXT1uKX0pLHR9LF9ldmVudHM6e2tleWRvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnQoZSkmJnRoaXMuX2tleWRvd24oZSkmJmUucHJldmVudERlZmF1bHQoKX0sa2V5dXA6Il9zdG9wIixmb2N1czpmdW5jdGlvbigpe3RoaXMucHJldmlvdXM9dGhpcy5lbGVtZW50LnZhbCgpfSxibHVyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNhbmNlbEJsdXI/KGRlbGV0ZSB0aGlzLmNhbmNlbEJsdXIsdm9pZCAwKToodGhpcy5fc3RvcCgpLHRoaXMuX3JlZnJlc2goKSx0aGlzLnByZXZpb3VzIT09dGhpcy5lbGVtZW50LnZhbCgpJiZ0aGlzLl90cmlnZ2VyKCJjaGFuZ2UiLGUpLHZvaWQgMCl9LG1vdXNld2hlZWw6ZnVuY3Rpb24oZSx0KXtpZih0KXtpZighdGhpcy5zcGlubmluZyYmIXRoaXMuX3N0YXJ0KGUpKXJldHVybiExO3RoaXMuX3NwaW4oKHQ+MD8xOi0xKSp0aGlzLm9wdGlvbnMuc3RlcCxlKSxjbGVhclRpbWVvdXQodGhpcy5tb3VzZXdoZWVsVGltZXIpLHRoaXMubW91c2V3aGVlbFRpbWVyPXRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5zcGlubmluZyYmdGhpcy5fc3RvcChlKX0sMTAwKSxlLnByZXZlbnREZWZhdWx0KCl9fSwibW91c2Vkb3duIC51aS1zcGlubmVyLWJ1dHRvbiI6ZnVuY3Rpb24odCl7ZnVuY3Rpb24gaSgpe3ZhciBlPXRoaXMuZWxlbWVudFswXT09PXRoaXMuZG9jdW1lbnRbMF0uYWN0aXZlRWxlbWVudDtlfHwodGhpcy5lbGVtZW50LmZvY3VzKCksdGhpcy5wcmV2aW91cz1zLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7dGhpcy5wcmV2aW91cz1zfSkpfXZhciBzO3M9dGhpcy5lbGVtZW50WzBdPT09dGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50P3RoaXMucHJldmlvdXM6dGhpcy5lbGVtZW50LnZhbCgpLHQucHJldmVudERlZmF1bHQoKSxpLmNhbGwodGhpcyksdGhpcy5jYW5jZWxCbHVyPSEwLHRoaXMuX2RlbGF5KGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMuY2FuY2VsQmx1cixpLmNhbGwodGhpcyl9KSx0aGlzLl9zdGFydCh0KSE9PSExJiZ0aGlzLl9yZXBlYXQobnVsbCxlKHQuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoInVpLXNwaW5uZXItdXAiKT8xOi0xLHQpfSwibW91c2V1cCAudWktc3Bpbm5lci1idXR0b24iOiJfc3RvcCIsIm1vdXNlZW50ZXIgLnVpLXNwaW5uZXItYnV0dG9uIjpmdW5jdGlvbih0KXtyZXR1cm4gZSh0LmN1cnJlbnRUYXJnZXQpLmhhc0NsYXNzKCJ1aS1zdGF0ZS1hY3RpdmUiKT90aGlzLl9zdGFydCh0KT09PSExPyExOih0aGlzLl9yZXBlYXQobnVsbCxlKHQuY3VycmVudFRhcmdldCkuaGFzQ2xhc3MoInVpLXNwaW5uZXItdXAiKT8xOi0xLHQpLHZvaWQgMCk6dm9pZCAwfSwibW91c2VsZWF2ZSAudWktc3Bpbm5lci1idXR0b24iOiJfc3RvcCJ9LF9kcmF3OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy51aVNwaW5uZXI9dGhpcy5lbGVtZW50LmFkZENsYXNzKCJ1aS1zcGlubmVyLWlucHV0IikuYXR0cigiYXV0b2NvbXBsZXRlIiwib2ZmIikud3JhcCh0aGlzLl91aVNwaW5uZXJIdG1sKCkpLnBhcmVudCgpLmFwcGVuZCh0aGlzLl9idXR0b25IdG1sKCkpO3RoaXMuZWxlbWVudC5hdHRyKCJyb2xlIiwic3BpbmJ1dHRvbiIpLHRoaXMuYnV0dG9ucz1lLmZpbmQoIi51aS1zcGlubmVyLWJ1dHRvbiIpLmF0dHIoInRhYkluZGV4IiwtMSkuYnV0dG9uKCkucmVtb3ZlQ2xhc3MoInVpLWNvcm5lci1hbGwiKSx0aGlzLmJ1dHRvbnMuaGVpZ2h0KCk+TWF0aC5jZWlsKC41KmUuaGVpZ2h0KCkpJiZlLmhlaWdodCgpPjAmJmUuaGVpZ2h0KGUuaGVpZ2h0KCkpLHRoaXMub3B0aW9ucy5kaXNhYmxlZCYmdGhpcy5kaXNhYmxlKCl9LF9rZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucyxzPWUudWkua2V5Q29kZTtzd2l0Y2godC5rZXlDb2RlKXtjYXNlIHMuVVA6cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLDEsdCksITA7Y2FzZSBzLkRPV046cmV0dXJuIHRoaXMuX3JlcGVhdChudWxsLC0xLHQpLCEwO2Nhc2Ugcy5QQUdFX1VQOnJldHVybiB0aGlzLl9yZXBlYXQobnVsbCxpLnBhZ2UsdCksITA7Y2FzZSBzLlBBR0VfRE9XTjpyZXR1cm4gdGhpcy5fcmVwZWF0KG51bGwsLWkucGFnZSx0KSwhMH1yZXR1cm4hMX0sX3VpU3Bpbm5lckh0bWw6ZnVuY3Rpb24oKXtyZXR1cm4iPHNwYW4gY2xhc3M9J3VpLXNwaW5uZXIgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwnPjwvc3Bhbj4ifSxfYnV0dG9uSHRtbDpmdW5jdGlvbigpe3JldHVybiI8YSBjbGFzcz0ndWktc3Bpbm5lci1idXR0b24gdWktc3Bpbm5lci11cCB1aS1jb3JuZXItdHInPjxzcGFuIGNsYXNzPSd1aS1pY29uICIrdGhpcy5vcHRpb25zLmljb25zLnVwKyInPiYjOTY1MDs8L3NwYW4+IisiPC9hPiIrIjxhIGNsYXNzPSd1aS1zcGlubmVyLWJ1dHRvbiB1aS1zcGlubmVyLWRvd24gdWktY29ybmVyLWJyJz4iKyI8c3BhbiBjbGFzcz0ndWktaWNvbiAiK3RoaXMub3B0aW9ucy5pY29ucy5kb3duKyInPiYjOTY2MDs8L3NwYW4+IisiPC9hPiJ9LF9zdGFydDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zcGlubmluZ3x8dGhpcy5fdHJpZ2dlcigic3RhcnQiLGUpIT09ITE/KHRoaXMuY291bnRlcnx8KHRoaXMuY291bnRlcj0xKSx0aGlzLnNwaW5uaW5nPSEwLCEwKTohMX0sX3JlcGVhdDpmdW5jdGlvbihlLHQsaSl7ZT1lfHw1MDAsY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLHRoaXMudGltZXI9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLl9yZXBlYXQoNDAsdCxpKX0sZSksdGhpcy5fc3Bpbih0KnRoaXMub3B0aW9ucy5zdGVwLGkpfSxfc3BpbjpmdW5jdGlvbihlLHQpe3ZhciBpPXRoaXMudmFsdWUoKXx8MDt0aGlzLmNvdW50ZXJ8fCh0aGlzLmNvdW50ZXI9MSksaT10aGlzLl9hZGp1c3RWYWx1ZShpK2UqdGhpcy5faW5jcmVtZW50KHRoaXMuY291bnRlcikpLHRoaXMuc3Bpbm5pbmcmJnRoaXMuX3RyaWdnZXIoInNwaW4iLHQse3ZhbHVlOml9KT09PSExfHwodGhpcy5fdmFsdWUoaSksdGhpcy5jb3VudGVyKyspfSxfaW5jcmVtZW50OmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5pbmNyZW1lbnRhbDtyZXR1cm4gaT9lLmlzRnVuY3Rpb24oaSk/aSh0KTpNYXRoLmZsb29yKHQqdCp0LzVlNC10KnQvNTAwKzE3KnQvMjAwKzEpOjF9LF9wcmVjaXNpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9wcmVjaXNpb25PZih0aGlzLm9wdGlvbnMuc3RlcCk7cmV0dXJuIG51bGwhPT10aGlzLm9wdGlvbnMubWluJiYoZT1NYXRoLm1heChlLHRoaXMuX3ByZWNpc2lvbk9mKHRoaXMub3B0aW9ucy5taW4pKSksZX0sX3ByZWNpc2lvbk9mOmZ1bmN0aW9uKGUpe3ZhciB0PSIiK2UsaT10LmluZGV4T2YoIi4iKTtyZXR1cm4tMT09PWk/MDp0Lmxlbmd0aC1pLTF9LF9hZGp1c3RWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdCxpLHM9dGhpcy5vcHRpb25zO3JldHVybiB0PW51bGwhPT1zLm1pbj9zLm1pbjowLGk9ZS10LGk9TWF0aC5yb3VuZChpL3Muc3RlcCkqcy5zdGVwLGU9dCtpLGU9cGFyc2VGbG9hdChlLnRvRml4ZWQodGhpcy5fcHJlY2lzaW9uKCkpKSxudWxsIT09cy5tYXgmJmU+cy5tYXg/cy5tYXg6bnVsbCE9PXMubWluJiZzLm1pbj5lP3MubWluOmV9LF9zdG9wOmZ1bmN0aW9uKGUpe3RoaXMuc3Bpbm5pbmcmJihjbGVhclRpbWVvdXQodGhpcy50aW1lciksY2xlYXJUaW1lb3V0KHRoaXMubW91c2V3aGVlbFRpbWVyKSx0aGlzLmNvdW50ZXI9MCx0aGlzLnNwaW5uaW5nPSExLHRoaXMuX3RyaWdnZXIoInN0b3AiLGUpKX0sX3NldE9wdGlvbjpmdW5jdGlvbihlLHQpe2lmKCJjdWx0dXJlIj09PWV8fCJudW1iZXJGb3JtYXQiPT09ZSl7dmFyIGk9dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKTtyZXR1cm4gdGhpcy5vcHRpb25zW2VdPXQsdGhpcy5lbGVtZW50LnZhbCh0aGlzLl9mb3JtYXQoaSkpLHZvaWQgMH0oIm1heCI9PT1lfHwibWluIj09PWV8fCJzdGVwIj09PWUpJiYic3RyaW5nIj09dHlwZW9mIHQmJih0PXRoaXMuX3BhcnNlKHQpKSwiaWNvbnMiPT09ZSYmKHRoaXMuYnV0dG9ucy5maXJzdCgpLmZpbmQoIi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLnVwKS5hZGRDbGFzcyh0LnVwKSx0aGlzLmJ1dHRvbnMubGFzdCgpLmZpbmQoIi51aS1pY29uIikucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmljb25zLmRvd24pLmFkZENsYXNzKHQuZG93bikpLHRoaXMuX3N1cGVyKGUsdCksImRpc2FibGVkIj09PWUmJih0aGlzLndpZGdldCgpLnRvZ2dsZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIsISF0KSx0aGlzLmVsZW1lbnQucHJvcCgiZGlzYWJsZWQiLCEhdCksdGhpcy5idXR0b25zLmJ1dHRvbih0PyJkaXNhYmxlIjoiZW5hYmxlIikpfSxfc2V0T3B0aW9uczpoKGZ1bmN0aW9uKGUpe3RoaXMuX3N1cGVyKGUpfSksX3BhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmIiIhPT1lJiYoZT13aW5kb3cuR2xvYmFsaXplJiZ0aGlzLm9wdGlvbnMubnVtYmVyRm9ybWF0P0dsb2JhbGl6ZS5wYXJzZUZsb2F0KGUsMTAsdGhpcy5vcHRpb25zLmN1bHR1cmUpOitlKSwiIj09PWV8fGlzTmFOKGUpP251bGw6ZX0sX2Zvcm1hdDpmdW5jdGlvbihlKXtyZXR1cm4iIj09PWU/IiI6d2luZG93Lkdsb2JhbGl6ZSYmdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdD9HbG9iYWxpemUuZm9ybWF0KGUsdGhpcy5vcHRpb25zLm51bWJlckZvcm1hdCx0aGlzLm9wdGlvbnMuY3VsdHVyZSk6ZX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLmVsZW1lbnQuYXR0cih7ImFyaWEtdmFsdWVtaW4iOnRoaXMub3B0aW9ucy5taW4sImFyaWEtdmFsdWVtYXgiOnRoaXMub3B0aW9ucy5tYXgsImFyaWEtdmFsdWVub3ciOnRoaXMuX3BhcnNlKHRoaXMuZWxlbWVudC52YWwoKSl9KX0saXNWYWxpZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMudmFsdWUoKTtyZXR1cm4gbnVsbD09PWU/ITE6ZT09PXRoaXMuX2FkanVzdFZhbHVlKGUpfSxfdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgaTsiIiE9PWUmJihpPXRoaXMuX3BhcnNlKGUpLG51bGwhPT1pJiYodHx8KGk9dGhpcy5fYWRqdXN0VmFsdWUoaSkpLGU9dGhpcy5fZm9ybWF0KGkpKSksdGhpcy5lbGVtZW50LnZhbChlKSx0aGlzLl9yZWZyZXNoKCl9LF9kZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCJ1aS1zcGlubmVyLWlucHV0IikucHJvcCgiZGlzYWJsZWQiLCExKS5yZW1vdmVBdHRyKCJhdXRvY29tcGxldGUiKS5yZW1vdmVBdHRyKCJyb2xlIikucmVtb3ZlQXR0cigiYXJpYS12YWx1ZW1pbiIpLnJlbW92ZUF0dHIoImFyaWEtdmFsdWVtYXgiKS5yZW1vdmVBdHRyKCJhcmlhLXZhbHVlbm93IiksdGhpcy51aVNwaW5uZXIucmVwbGFjZVdpdGgodGhpcy5lbGVtZW50KX0sc3RlcFVwOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKGUpfSksX3N0ZXBVcDpmdW5jdGlvbihlKXt0aGlzLl9zdGFydCgpJiYodGhpcy5fc3BpbigoZXx8MSkqdGhpcy5vcHRpb25zLnN0ZXApLHRoaXMuX3N0b3AoKSl9LHN0ZXBEb3duOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcERvd24oZSl9KSxfc3RlcERvd246ZnVuY3Rpb24oZSl7dGhpcy5fc3RhcnQoKSYmKHRoaXMuX3NwaW4oKGV8fDEpKi10aGlzLm9wdGlvbnMuc3RlcCksdGhpcy5fc3RvcCgpKX0scGFnZVVwOmgoZnVuY3Rpb24oZSl7dGhpcy5fc3RlcFVwKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSxwYWdlRG93bjpoKGZ1bmN0aW9uKGUpe3RoaXMuX3N0ZXBEb3duKChlfHwxKSp0aGlzLm9wdGlvbnMucGFnZSl9KSx2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaCh0aGlzLl92YWx1ZSkuY2FsbCh0aGlzLGUpLHZvaWQgMCk6dGhpcy5fcGFyc2UodGhpcy5lbGVtZW50LnZhbCgpKX0sd2lkZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudWlTcGlubmVyfX0pLGUud2lkZ2V0KCJ1aS50YWJzIix7dmVyc2lvbjoiMS4xMS40IixkZWxheTozMDAsb3B0aW9uczp7YWN0aXZlOm51bGwsY29sbGFwc2libGU6ITEsZXZlbnQ6ImNsaWNrIixoZWlnaHRTdHlsZToiY29udGVudCIsaGlkZTpudWxsLHNob3c6bnVsbCxhY3RpdmF0ZTpudWxsLGJlZm9yZUFjdGl2YXRlOm51bGwsYmVmb3JlTG9hZDpudWxsLGxvYWQ6bnVsbH0sX2lzTG9jYWw6ZnVuY3Rpb24oKXt2YXIgZT0vIy4qJC87cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBpLHM7dD10LmNsb25lTm9kZSghMSksaT10LmhyZWYucmVwbGFjZShlLCIiKSxzPWxvY2F0aW9uLmhyZWYucmVwbGFjZShlLCIiKTt0cnl7aT1kZWNvZGVVUklDb21wb25lbnQoaSl9Y2F0Y2gobil7fXRyeXtzPWRlY29kZVVSSUNvbXBvbmVudChzKX1jYXRjaChuKXt9cmV0dXJuIHQuaGFzaC5sZW5ndGg+MSYmaT09PXN9fSgpLF9jcmVhdGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5vcHRpb25zO3RoaXMucnVubmluZz0hMSx0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoInVpLXRhYnMgdWktd2lkZ2V0IHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1hbGwiKS50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsaS5jb2xsYXBzaWJsZSksdGhpcy5fcHJvY2Vzc1RhYnMoKSxpLmFjdGl2ZT10aGlzLl9pbml0aWFsQWN0aXZlKCksZS5pc0FycmF5KGkuZGlzYWJsZWQpJiYoaS5kaXNhYmxlZD1lLnVuaXF1ZShpLmRpc2FibGVkLmNvbmNhdChlLm1hcCh0aGlzLnRhYnMuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gdC50YWJzLmluZGV4KGUpfSkpKS5zb3J0KCkpLHRoaXMuYWN0aXZlPXRoaXMub3B0aW9ucy5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLl9maW5kQWN0aXZlKGkuYWN0aXZlKTplKCksdGhpcy5fcmVmcmVzaCgpLHRoaXMuYWN0aXZlLmxlbmd0aCYmdGhpcy5sb2FkKGkuYWN0aXZlKX0sX2luaXRpYWxBY3RpdmU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuYWN0aXZlLGk9dGhpcy5vcHRpb25zLmNvbGxhcHNpYmxlLHM9bG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSk7cmV0dXJuIG51bGw9PT10JiYocyYmdGhpcy50YWJzLmVhY2goZnVuY3Rpb24oaSxuKXtyZXR1cm4gZShuKS5hdHRyKCJhcmlhLWNvbnRyb2xzIik9PT1zPyh0PWksITEpOnZvaWQgMH0pLG51bGw9PT10JiYodD10aGlzLnRhYnMuaW5kZXgodGhpcy50YWJzLmZpbHRlcigiLnVpLXRhYnMtYWN0aXZlIikpKSwobnVsbD09PXR8fC0xPT09dCkmJih0PXRoaXMudGFicy5sZW5ndGg/MDohMSkpLHQhPT0hMSYmKHQ9dGhpcy50YWJzLmluZGV4KHRoaXMudGFicy5lcSh0KSksLTE9PT10JiYodD1pPyExOjApKSwhaSYmdD09PSExJiZ0aGlzLmFuY2hvcnMubGVuZ3RoJiYodD0wKSx0fSxfZ2V0Q3JlYXRlRXZlbnREYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3RhYjp0aGlzLmFjdGl2ZSxwYW5lbDp0aGlzLmFjdGl2ZS5sZW5ndGg/dGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpOmUoKX19LF90YWJLZXlkb3duOmZ1bmN0aW9uKHQpe3ZhciBpPWUodGhpcy5kb2N1bWVudFswXS5hY3RpdmVFbGVtZW50KS5jbG9zZXN0KCJsaSIpLHM9dGhpcy50YWJzLmluZGV4KGkpLG49ITA7aWYoIXRoaXMuX2hhbmRsZVBhZ2VOYXYodCkpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgZS51aS5rZXlDb2RlLlJJR0hUOmNhc2UgZS51aS5rZXlDb2RlLkRPV046cysrO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlVQOmNhc2UgZS51aS5rZXlDb2RlLkxFRlQ6bj0hMSxzLS07YnJlYWs7Y2FzZSBlLnVpLmtleUNvZGUuRU5EOnM9dGhpcy5hbmNob3JzLmxlbmd0aC0xO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLkhPTUU6cz0wO2JyZWFrO2Nhc2UgZS51aS5rZXlDb2RlLlNQQUNFOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocyksdm9pZCAwO2Nhc2UgZS51aS5rZXlDb2RlLkVOVEVSOnJldHVybiB0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuYWN0aXZhdGluZyksdGhpcy5fYWN0aXZhdGUocz09PXRoaXMub3B0aW9ucy5hY3RpdmU/ITE6cyksdm9pZCAwO2RlZmF1bHQ6cmV0dXJufXQucHJldmVudERlZmF1bHQoKSxjbGVhclRpbWVvdXQodGhpcy5hY3RpdmF0aW5nKSxzPXRoaXMuX2ZvY3VzTmV4dFRhYihzLG4pLHQuY3RybEtleXx8dC5tZXRhS2V5fHwoaS5hdHRyKCJhcmlhLXNlbGVjdGVkIiwiZmFsc2UiKSx0aGlzLnRhYnMuZXEocykuYXR0cigiYXJpYS1zZWxlY3RlZCIsInRydWUiKSx0aGlzLmFjdGl2YXRpbmc9dGhpcy5fZGVsYXkoZnVuY3Rpb24oKXt0aGlzLm9wdGlvbigiYWN0aXZlIixzKX0sdGhpcy5kZWxheSkpfX0sX3BhbmVsS2V5ZG93bjpmdW5jdGlvbih0KXt0aGlzLl9oYW5kbGVQYWdlTmF2KHQpfHx0LmN0cmxLZXkmJnQua2V5Q29kZT09PWUudWkua2V5Q29kZS5VUCYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLmFjdGl2ZS5mb2N1cygpKX0sX2hhbmRsZVBhZ2VOYXY6ZnVuY3Rpb24odCl7cmV0dXJuIHQuYWx0S2V5JiZ0LmtleUNvZGU9PT1lLnVpLmtleUNvZGUuUEFHRV9VUD8odGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUtMSwhMSkpLCEwKTp0LmFsdEtleSYmdC5rZXlDb2RlPT09ZS51aS5rZXlDb2RlLlBBR0VfRE9XTj8odGhpcy5fYWN0aXZhdGUodGhpcy5fZm9jdXNOZXh0VGFiKHRoaXMub3B0aW9ucy5hY3RpdmUrMSwhMCkpLCEwKTp2b2lkIDB9LF9maW5kTmV4dFRhYjpmdW5jdGlvbih0LGkpe2Z1bmN0aW9uIHMoKXtyZXR1cm4gdD5uJiYodD0wKSwwPnQmJih0PW4pLHR9Zm9yKHZhciBuPXRoaXMudGFicy5sZW5ndGgtMTstMSE9PWUuaW5BcnJheShzKCksdGhpcy5vcHRpb25zLmRpc2FibGVkKTspdD1pP3QrMTp0LTE7cmV0dXJuIHR9LF9mb2N1c05leHRUYWI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT10aGlzLl9maW5kTmV4dFRhYihlLHQpLHRoaXMudGFicy5lcShlKS5mb2N1cygpLGV9LF9zZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtyZXR1cm4iYWN0aXZlIj09PWU/KHRoaXMuX2FjdGl2YXRlKHQpLHZvaWQgMCk6ImRpc2FibGVkIj09PWU/KHRoaXMuX3NldHVwRGlzYWJsZWQodCksdm9pZCAwKToodGhpcy5fc3VwZXIoZSx0KSwiY29sbGFwc2libGUiPT09ZSYmKHRoaXMuZWxlbWVudC50b2dnbGVDbGFzcygidWktdGFicy1jb2xsYXBzaWJsZSIsdCksdHx8dGhpcy5vcHRpb25zLmFjdGl2ZSE9PSExfHx0aGlzLl9hY3RpdmF0ZSgwKSksImV2ZW50Ij09PWUmJnRoaXMuX3NldHVwRXZlbnRzKHQpLCJoZWlnaHRTdHlsZSI9PT1lJiZ0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHQpLHZvaWQgMCl9LF9zYW5pdGl6ZVNlbGVjdG9yOmZ1bmN0aW9uKGUpe3JldHVybiBlP2UucmVwbGFjZSgvWyEiJCUmJygpKissLlwvOjs8PT4/QFxbXF1cXmB7fH1+XS9nLCJcXCQmIik6IiJ9LHJlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMsaT10aGlzLnRhYmxpc3QuY2hpbGRyZW4oIjpoYXMoYVtocmVmXSkiKTt0LmRpc2FibGVkPWUubWFwKGkuZmlsdGVyKCIudWktc3RhdGUtZGlzYWJsZWQiKSxmdW5jdGlvbihlKXtyZXR1cm4gaS5pbmRleChlKX0pLHRoaXMuX3Byb2Nlc3NUYWJzKCksdC5hY3RpdmUhPT0hMSYmdGhpcy5hbmNob3JzLmxlbmd0aD90aGlzLmFjdGl2ZS5sZW5ndGgmJiFlLmNvbnRhaW5zKHRoaXMudGFibGlzdFswXSx0aGlzLmFjdGl2ZVswXSk/dGhpcy50YWJzLmxlbmd0aD09PXQuZGlzYWJsZWQubGVuZ3RoPyh0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpOnRoaXMuX2FjdGl2YXRlKHRoaXMuX2ZpbmROZXh0VGFiKE1hdGgubWF4KDAsdC5hY3RpdmUtMSksITEpKTp0LmFjdGl2ZT10aGlzLnRhYnMuaW5kZXgodGhpcy5hY3RpdmUpOih0LmFjdGl2ZT0hMSx0aGlzLmFjdGl2ZT1lKCkpLHRoaXMuX3JlZnJlc2goKX0sX3JlZnJlc2g6ZnVuY3Rpb24oKXt0aGlzLl9zZXR1cERpc2FibGVkKHRoaXMub3B0aW9ucy5kaXNhYmxlZCksdGhpcy5fc2V0dXBFdmVudHModGhpcy5vcHRpb25zLmV2ZW50KSx0aGlzLl9zZXR1cEhlaWdodFN0eWxlKHRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSksdGhpcy50YWJzLm5vdCh0aGlzLmFjdGl2ZSkuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSIsdGFiSW5kZXg6LTF9KSx0aGlzLnBhbmVscy5ub3QodGhpcy5fZ2V0UGFuZWxGb3JUYWIodGhpcy5hY3RpdmUpKS5oaWRlKCkuYXR0cih7ImFyaWEtaGlkZGVuIjoidHJ1ZSJ9KSx0aGlzLmFjdGl2ZS5sZW5ndGg/KHRoaXMuYWN0aXZlLmFkZENsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKS5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pLHRoaXMuX2dldFBhbmVsRm9yVGFiKHRoaXMuYWN0aXZlKS5zaG93KCkuYXR0cih7ImFyaWEtaGlkZGVuIjoiZmFsc2UifSkpOnRoaXMudGFicy5lcSgwKS5hdHRyKCJ0YWJJbmRleCIsMCl9LF9wcm9jZXNzVGFiczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsaT10aGlzLnRhYnMscz10aGlzLmFuY2hvcnMsbj10aGlzLnBhbmVsczsKdGhpcy50YWJsaXN0PXRoaXMuX2dldExpc3QoKS5hZGRDbGFzcygidWktdGFicy1uYXYgdWktaGVscGVyLXJlc2V0IHVpLWhlbHBlci1jbGVhcmZpeCB1aS13aWRnZXQtaGVhZGVyIHVpLWNvcm5lci1hbGwiKS5hdHRyKCJyb2xlIiwidGFibGlzdCIpLmRlbGVnYXRlKCI+IGxpIiwibW91c2Vkb3duIit0aGlzLmV2ZW50TmFtZXNwYWNlLGZ1bmN0aW9uKHQpe2UodGhpcykuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpJiZ0LnByZXZlbnREZWZhdWx0KCl9KS5kZWxlZ2F0ZSgiLnVpLXRhYnMtYW5jaG9yIiwiZm9jdXMiK3RoaXMuZXZlbnROYW1lc3BhY2UsZnVuY3Rpb24oKXtlKHRoaXMpLmNsb3Nlc3QoImxpIikuaXMoIi51aS1zdGF0ZS1kaXNhYmxlZCIpJiZ0aGlzLmJsdXIoKX0pLHRoaXMudGFicz10aGlzLnRhYmxpc3QuZmluZCgiPiBsaTpoYXMoYVtocmVmXSkiKS5hZGRDbGFzcygidWktc3RhdGUtZGVmYXVsdCB1aS1jb3JuZXItdG9wIikuYXR0cih7cm9sZToidGFiIix0YWJJbmRleDotMX0pLHRoaXMuYW5jaG9ycz10aGlzLnRhYnMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGUoImEiLHRoaXMpWzBdfSkuYWRkQ2xhc3MoInVpLXRhYnMtYW5jaG9yIikuYXR0cih7cm9sZToicHJlc2VudGF0aW9uIix0YWJJbmRleDotMX0pLHRoaXMucGFuZWxzPWUoKSx0aGlzLmFuY2hvcnMuZWFjaChmdW5jdGlvbihpLHMpe3ZhciBuLGEsbyxyPWUocykudW5pcXVlSWQoKS5hdHRyKCJpZCIpLGg9ZShzKS5jbG9zZXN0KCJsaSIpLGw9aC5hdHRyKCJhcmlhLWNvbnRyb2xzIik7dC5faXNMb2NhbChzKT8obj1zLmhhc2gsbz1uLnN1YnN0cmluZygxKSxhPXQuZWxlbWVudC5maW5kKHQuX3Nhbml0aXplU2VsZWN0b3IobikpKToobz1oLmF0dHIoImFyaWEtY29udHJvbHMiKXx8ZSh7fSkudW5pcXVlSWQoKVswXS5pZCxuPSIjIitvLGE9dC5lbGVtZW50LmZpbmQobiksYS5sZW5ndGh8fChhPXQuX2NyZWF0ZVBhbmVsKG8pLGEuaW5zZXJ0QWZ0ZXIodC5wYW5lbHNbaS0xXXx8dC50YWJsaXN0KSksYS5hdHRyKCJhcmlhLWxpdmUiLCJwb2xpdGUiKSksYS5sZW5ndGgmJih0LnBhbmVscz10LnBhbmVscy5hZGQoYSkpLGwmJmguZGF0YSgidWktdGFicy1hcmlhLWNvbnRyb2xzIixsKSxoLmF0dHIoeyJhcmlhLWNvbnRyb2xzIjpvLCJhcmlhLWxhYmVsbGVkYnkiOnJ9KSxhLmF0dHIoImFyaWEtbGFiZWxsZWRieSIscil9KSx0aGlzLnBhbmVscy5hZGRDbGFzcygidWktdGFicy1wYW5lbCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYm90dG9tIikuYXR0cigicm9sZSIsInRhYnBhbmVsIiksaSYmKHRoaXMuX29mZihpLm5vdCh0aGlzLnRhYnMpKSx0aGlzLl9vZmYocy5ub3QodGhpcy5hbmNob3JzKSksdGhpcy5fb2ZmKG4ubm90KHRoaXMucGFuZWxzKSkpfSxfZ2V0TGlzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRhYmxpc3R8fHRoaXMuZWxlbWVudC5maW5kKCJvbCx1bCIpLmVxKDApfSxfY3JlYXRlUGFuZWw6ZnVuY3Rpb24odCl7cmV0dXJuIGUoIjxkaXY+IikuYXR0cigiaWQiLHQpLmFkZENsYXNzKCJ1aS10YWJzLXBhbmVsIHVpLXdpZGdldC1jb250ZW50IHVpLWNvcm5lci1ib3R0b20iKS5kYXRhKCJ1aS10YWJzLWRlc3Ryb3kiLCEwKX0sX3NldHVwRGlzYWJsZWQ6ZnVuY3Rpb24odCl7ZS5pc0FycmF5KHQpJiYodC5sZW5ndGg/dC5sZW5ndGg9PT10aGlzLmFuY2hvcnMubGVuZ3RoJiYodD0hMCk6dD0hMSk7Zm9yKHZhciBpLHM9MDtpPXRoaXMudGFic1tzXTtzKyspdD09PSEwfHwtMSE9PWUuaW5BcnJheShzLHQpP2UoaSkuYWRkQ2xhc3MoInVpLXN0YXRlLWRpc2FibGVkIikuYXR0cigiYXJpYS1kaXNhYmxlZCIsInRydWUiKTplKGkpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpLnJlbW92ZUF0dHIoImFyaWEtZGlzYWJsZWQiKTt0aGlzLm9wdGlvbnMuZGlzYWJsZWQ9dH0sX3NldHVwRXZlbnRzOmZ1bmN0aW9uKHQpe3ZhciBpPXt9O3QmJmUuZWFjaCh0LnNwbGl0KCIgIiksZnVuY3Rpb24oZSx0KXtpW3RdPSJfZXZlbnRIYW5kbGVyIn0pLHRoaXMuX29mZih0aGlzLmFuY2hvcnMuYWRkKHRoaXMudGFicykuYWRkKHRoaXMucGFuZWxzKSksdGhpcy5fb24oITAsdGhpcy5hbmNob3JzLHtjbGljazpmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCl9fSksdGhpcy5fb24odGhpcy5hbmNob3JzLGkpLHRoaXMuX29uKHRoaXMudGFicyx7a2V5ZG93bjoiX3RhYktleWRvd24ifSksdGhpcy5fb24odGhpcy5wYW5lbHMse2tleWRvd246Il9wYW5lbEtleWRvd24ifSksdGhpcy5fZm9jdXNhYmxlKHRoaXMudGFicyksdGhpcy5faG92ZXJhYmxlKHRoaXMudGFicyl9LF9zZXR1cEhlaWdodFN0eWxlOmZ1bmN0aW9uKHQpe3ZhciBpLHM9dGhpcy5lbGVtZW50LnBhcmVudCgpOyJmaWxsIj09PXQ/KGk9cy5oZWlnaHQoKSxpLT10aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKS10aGlzLmVsZW1lbnQuaGVpZ2h0KCksdGhpcy5lbGVtZW50LnNpYmxpbmdzKCI6dmlzaWJsZSIpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpLHM9dC5jc3MoInBvc2l0aW9uIik7ImFic29sdXRlIiE9PXMmJiJmaXhlZCIhPT1zJiYoaS09dC5vdXRlckhlaWdodCghMCkpfSksdGhpcy5lbGVtZW50LmNoaWxkcmVuKCkubm90KHRoaXMucGFuZWxzKS5lYWNoKGZ1bmN0aW9uKCl7aS09ZSh0aGlzKS5vdXRlckhlaWdodCghMCl9KSx0aGlzLnBhbmVscy5lYWNoKGZ1bmN0aW9uKCl7ZSh0aGlzKS5oZWlnaHQoTWF0aC5tYXgoMCxpLWUodGhpcykuaW5uZXJIZWlnaHQoKStlKHRoaXMpLmhlaWdodCgpKSl9KS5jc3MoIm92ZXJmbG93IiwiYXV0byIpKToiYXV0byI9PT10JiYoaT0wLHRoaXMucGFuZWxzLmVhY2goZnVuY3Rpb24oKXtpPU1hdGgubWF4KGksZSh0aGlzKS5oZWlnaHQoIiIpLmhlaWdodCgpKX0pLmhlaWdodChpKSl9LF9ldmVudEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5vcHRpb25zLHM9dGhpcy5hY3RpdmUsbj1lKHQuY3VycmVudFRhcmdldCksYT1uLmNsb3Nlc3QoImxpIiksbz1hWzBdPT09c1swXSxyPW8mJmkuY29sbGFwc2libGUsaD1yP2UoKTp0aGlzLl9nZXRQYW5lbEZvclRhYihhKSxsPXMubGVuZ3RoP3RoaXMuX2dldFBhbmVsRm9yVGFiKHMpOmUoKSx1PXtvbGRUYWI6cyxvbGRQYW5lbDpsLG5ld1RhYjpyP2UoKTphLG5ld1BhbmVsOmh9O3QucHJldmVudERlZmF1bHQoKSxhLmhhc0NsYXNzKCJ1aS1zdGF0ZS1kaXNhYmxlZCIpfHxhLmhhc0NsYXNzKCJ1aS10YWJzLWxvYWRpbmciKXx8dGhpcy5ydW5uaW5nfHxvJiYhaS5jb2xsYXBzaWJsZXx8dGhpcy5fdHJpZ2dlcigiYmVmb3JlQWN0aXZhdGUiLHQsdSk9PT0hMXx8KGkuYWN0aXZlPXI/ITE6dGhpcy50YWJzLmluZGV4KGEpLHRoaXMuYWN0aXZlPW8/ZSgpOmEsdGhpcy54aHImJnRoaXMueGhyLmFib3J0KCksbC5sZW5ndGh8fGgubGVuZ3RofHxlLmVycm9yKCJqUXVlcnkgVUkgVGFiczogTWlzbWF0Y2hpbmcgZnJhZ21lbnQgaWRlbnRpZmllci4iKSxoLmxlbmd0aCYmdGhpcy5sb2FkKHRoaXMudGFicy5pbmRleChhKSx0KSx0aGlzLl90b2dnbGUodCx1KSl9LF90b2dnbGU6ZnVuY3Rpb24odCxpKXtmdW5jdGlvbiBzKCl7YS5ydW5uaW5nPSExLGEuX3RyaWdnZXIoImFjdGl2YXRlIix0LGkpfWZ1bmN0aW9uIG4oKXtpLm5ld1RhYi5jbG9zZXN0KCJsaSIpLmFkZENsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKSxvLmxlbmd0aCYmYS5vcHRpb25zLnNob3c/YS5fc2hvdyhvLGEub3B0aW9ucy5zaG93LHMpOihvLnNob3coKSxzKCkpfXZhciBhPXRoaXMsbz1pLm5ld1BhbmVsLHI9aS5vbGRQYW5lbDt0aGlzLnJ1bm5pbmc9ITAsci5sZW5ndGgmJnRoaXMub3B0aW9ucy5oaWRlP3RoaXMuX2hpZGUocix0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe2kub2xkVGFiLmNsb3Nlc3QoImxpIikucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYWN0aXZlIHVpLXN0YXRlLWFjdGl2ZSIpLG4oKX0pOihpLm9sZFRhYi5jbG9zZXN0KCJsaSIpLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWFjdGl2ZSB1aS1zdGF0ZS1hY3RpdmUiKSxyLmhpZGUoKSxuKCkpLHIuYXR0cigiYXJpYS1oaWRkZW4iLCJ0cnVlIiksaS5vbGRUYWIuYXR0cih7ImFyaWEtc2VsZWN0ZWQiOiJmYWxzZSIsImFyaWEtZXhwYW5kZWQiOiJmYWxzZSJ9KSxvLmxlbmd0aCYmci5sZW5ndGg/aS5vbGRUYWIuYXR0cigidGFiSW5kZXgiLC0xKTpvLmxlbmd0aCYmdGhpcy50YWJzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiAwPT09ZSh0aGlzKS5hdHRyKCJ0YWJJbmRleCIpfSkuYXR0cigidGFiSW5kZXgiLC0xKSxvLmF0dHIoImFyaWEtaGlkZGVuIiwiZmFsc2UiKSxpLm5ld1RhYi5hdHRyKHsiYXJpYS1zZWxlY3RlZCI6InRydWUiLCJhcmlhLWV4cGFuZGVkIjoidHJ1ZSIsdGFiSW5kZXg6MH0pfSxfYWN0aXZhdGU6ZnVuY3Rpb24odCl7dmFyIGkscz10aGlzLl9maW5kQWN0aXZlKHQpO3NbMF0hPT10aGlzLmFjdGl2ZVswXSYmKHMubGVuZ3RofHwocz10aGlzLmFjdGl2ZSksaT1zLmZpbmQoIi51aS10YWJzLWFuY2hvciIpWzBdLHRoaXMuX2V2ZW50SGFuZGxlcih7dGFyZ2V0OmksY3VycmVudFRhcmdldDppLHByZXZlbnREZWZhdWx0OmUubm9vcH0pKX0sX2ZpbmRBY3RpdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT0hMT9lKCk6dGhpcy50YWJzLmVxKHQpfSxfZ2V0SW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZT10aGlzLmFuY2hvcnMuaW5kZXgodGhpcy5hbmNob3JzLmZpbHRlcigiW2hyZWYkPSciK2UrIiddIikpKSxlfSxfZGVzdHJveTpmdW5jdGlvbigpe3RoaXMueGhyJiZ0aGlzLnhoci5hYm9ydCgpLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygidWktdGFicyB1aS13aWRnZXQgdWktd2lkZ2V0LWNvbnRlbnQgdWktY29ybmVyLWFsbCB1aS10YWJzLWNvbGxhcHNpYmxlIiksdGhpcy50YWJsaXN0LnJlbW92ZUNsYXNzKCJ1aS10YWJzLW5hdiB1aS1oZWxwZXItcmVzZXQgdWktaGVscGVyLWNsZWFyZml4IHVpLXdpZGdldC1oZWFkZXIgdWktY29ybmVyLWFsbCIpLnJlbW92ZUF0dHIoInJvbGUiKSx0aGlzLmFuY2hvcnMucmVtb3ZlQ2xhc3MoInVpLXRhYnMtYW5jaG9yIikucmVtb3ZlQXR0cigicm9sZSIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlVW5pcXVlSWQoKSx0aGlzLnRhYmxpc3QudW5iaW5kKHRoaXMuZXZlbnROYW1lc3BhY2UpLHRoaXMudGFicy5hZGQodGhpcy5wYW5lbHMpLmVhY2goZnVuY3Rpb24oKXtlLmRhdGEodGhpcywidWktdGFicy1kZXN0cm95Iik/ZSh0aGlzKS5yZW1vdmUoKTplKHRoaXMpLnJlbW92ZUNsYXNzKCJ1aS1zdGF0ZS1kZWZhdWx0IHVpLXN0YXRlLWFjdGl2ZSB1aS1zdGF0ZS1kaXNhYmxlZCB1aS1jb3JuZXItdG9wIHVpLWNvcm5lci1ib3R0b20gdWktd2lkZ2V0LWNvbnRlbnQgdWktdGFicy1hY3RpdmUgdWktdGFicy1wYW5lbCIpLnJlbW92ZUF0dHIoInRhYkluZGV4IikucmVtb3ZlQXR0cigiYXJpYS1saXZlIikucmVtb3ZlQXR0cigiYXJpYS1idXN5IikucmVtb3ZlQXR0cigiYXJpYS1zZWxlY3RlZCIpLnJlbW92ZUF0dHIoImFyaWEtbGFiZWxsZWRieSIpLnJlbW92ZUF0dHIoImFyaWEtaGlkZGVuIikucmVtb3ZlQXR0cigiYXJpYS1leHBhbmRlZCIpLnJlbW92ZUF0dHIoInJvbGUiKX0pLHRoaXMudGFicy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKSxpPXQuZGF0YSgidWktdGFicy1hcmlhLWNvbnRyb2xzIik7aT90LmF0dHIoImFyaWEtY29udHJvbHMiLGkpLnJlbW92ZURhdGEoInVpLXRhYnMtYXJpYS1jb250cm9scyIpOnQucmVtb3ZlQXR0cigiYXJpYS1jb250cm9scyIpfSksdGhpcy5wYW5lbHMuc2hvdygpLCJjb250ZW50IiE9PXRoaXMub3B0aW9ucy5oZWlnaHRTdHlsZSYmdGhpcy5wYW5lbHMuY3NzKCJoZWlnaHQiLCIiKX0sZW5hYmxlOmZ1bmN0aW9uKHQpe3ZhciBpPXRoaXMub3B0aW9ucy5kaXNhYmxlZDtpIT09ITEmJih2b2lkIDA9PT10P2k9ITE6KHQ9dGhpcy5fZ2V0SW5kZXgodCksaT1lLmlzQXJyYXkoaSk/ZS5tYXAoaSxmdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQ/ZTpudWxsfSk6ZS5tYXAodGhpcy50YWJzLGZ1bmN0aW9uKGUsaSl7cmV0dXJuIGkhPT10P2k6bnVsbH0pKSx0aGlzLl9zZXR1cERpc2FibGVkKGkpKX0sZGlzYWJsZTpmdW5jdGlvbih0KXt2YXIgaT10aGlzLm9wdGlvbnMuZGlzYWJsZWQ7aWYoaSE9PSEwKXtpZih2b2lkIDA9PT10KWk9ITA7ZWxzZXtpZih0PXRoaXMuX2dldEluZGV4KHQpLC0xIT09ZS5pbkFycmF5KHQsaSkpcmV0dXJuO2k9ZS5pc0FycmF5KGkpP2UubWVyZ2UoW3RdLGkpLnNvcnQoKTpbdF19dGhpcy5fc2V0dXBEaXNhYmxlZChpKX19LGxvYWQ6ZnVuY3Rpb24odCxpKXt0PXRoaXMuX2dldEluZGV4KHQpO3ZhciBzPXRoaXMsbj10aGlzLnRhYnMuZXEodCksYT1uLmZpbmQoIi51aS10YWJzLWFuY2hvciIpLG89dGhpcy5fZ2V0UGFuZWxGb3JUYWIobikscj17dGFiOm4scGFuZWw6b30saD1mdW5jdGlvbihlLHQpeyJhYm9ydCI9PT10JiZzLnBhbmVscy5zdG9wKCExLCEwKSxuLnJlbW92ZUNsYXNzKCJ1aS10YWJzLWxvYWRpbmciKSxvLnJlbW92ZUF0dHIoImFyaWEtYnVzeSIpLGU9PT1zLnhociYmZGVsZXRlIHMueGhyfTt0aGlzLl9pc0xvY2FsKGFbMF0pfHwodGhpcy54aHI9ZS5hamF4KHRoaXMuX2FqYXhTZXR0aW5ncyhhLGkscikpLHRoaXMueGhyJiYiY2FuY2VsZWQiIT09dGhpcy54aHIuc3RhdHVzVGV4dCYmKG4uYWRkQ2xhc3MoInVpLXRhYnMtbG9hZGluZyIpLG8uYXR0cigiYXJpYS1idXN5IiwidHJ1ZSIpLHRoaXMueGhyLmRvbmUoZnVuY3Rpb24oZSx0LG4pe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvLmh0bWwoZSkscy5fdHJpZ2dlcigibG9hZCIsaSxyKSxoKG4sdCl9LDEpfSkuZmFpbChmdW5jdGlvbihlLHQpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtoKGUsdCl9LDEpfSkpKX0sX2FqYXhTZXR0aW5nczpmdW5jdGlvbih0LGkscyl7dmFyIG49dGhpcztyZXR1cm57dXJsOnQuYXR0cigiaHJlZiIpLGJlZm9yZVNlbmQ6ZnVuY3Rpb24odCxhKXtyZXR1cm4gbi5fdHJpZ2dlcigiYmVmb3JlTG9hZCIsaSxlLmV4dGVuZCh7anFYSFI6dCxhamF4U2V0dGluZ3M6YX0scykpfX19LF9nZXRQYW5lbEZvclRhYjpmdW5jdGlvbih0KXt2YXIgaT1lKHQpLmF0dHIoImFyaWEtY29udHJvbHMiKTtyZXR1cm4gdGhpcy5lbGVtZW50LmZpbmQodGhpcy5fc2FuaXRpemVTZWxlY3RvcigiIyIraSkpfX0pLGUud2lkZ2V0KCJ1aS50b29sdGlwIix7dmVyc2lvbjoiMS4xMS40IixvcHRpb25zOntjb250ZW50OmZ1bmN0aW9uKCl7dmFyIHQ9ZSh0aGlzKS5hdHRyKCJ0aXRsZSIpfHwiIjtyZXR1cm4gZSgiPGE+IikudGV4dCh0KS5odG1sKCl9LGhpZGU6ITAsaXRlbXM6Ilt0aXRsZV06bm90KFtkaXNhYmxlZF0pIixwb3NpdGlvbjp7bXk6ImxlZnQgdG9wKzE1IixhdDoibGVmdCBib3R0b20iLGNvbGxpc2lvbjoiZmxpcGZpdCBmbGlwIn0sc2hvdzohMCx0b29sdGlwQ2xhc3M6bnVsbCx0cmFjazohMSxjbG9zZTpudWxsLG9wZW46bnVsbH0sX2FkZERlc2NyaWJlZEJ5OmZ1bmN0aW9uKHQsaSl7dmFyIHM9KHQuYXR0cigiYXJpYS1kZXNjcmliZWRieSIpfHwiIikuc3BsaXQoL1xzKy8pO3MucHVzaChpKSx0LmRhdGEoInVpLXRvb2x0aXAtaWQiLGkpLmF0dHIoImFyaWEtZGVzY3JpYmVkYnkiLGUudHJpbShzLmpvaW4oIiAiKSkpfSxfcmVtb3ZlRGVzY3JpYmVkQnk6ZnVuY3Rpb24odCl7dmFyIGk9dC5kYXRhKCJ1aS10b29sdGlwLWlkIikscz0odC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5Iil8fCIiKS5zcGxpdCgvXHMrLyksbj1lLmluQXJyYXkoaSxzKTstMSE9PW4mJnMuc3BsaWNlKG4sMSksdC5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLWlkIikscz1lLnRyaW0ocy5qb2luKCIgIikpLHM/dC5hdHRyKCJhcmlhLWRlc2NyaWJlZGJ5IixzKTp0LnJlbW92ZUF0dHIoImFyaWEtZGVzY3JpYmVkYnkiKX0sX2NyZWF0ZTpmdW5jdGlvbigpe3RoaXMuX29uKHttb3VzZW92ZXI6Im9wZW4iLGZvY3VzaW46Im9wZW4ifSksdGhpcy50b29sdGlwcz17fSx0aGlzLnBhcmVudHM9e30sdGhpcy5vcHRpb25zLmRpc2FibGVkJiZ0aGlzLl9kaXNhYmxlKCksdGhpcy5saXZlUmVnaW9uPWUoIjxkaXY+IikuYXR0cih7cm9sZToibG9nIiwiYXJpYS1saXZlIjoiYXNzZXJ0aXZlIiwiYXJpYS1yZWxldmFudCI6ImFkZGl0aW9ucyJ9KS5hZGRDbGFzcygidWktaGVscGVyLWhpZGRlbi1hY2Nlc3NpYmxlIikuYXBwZW5kVG8odGhpcy5kb2N1bWVudFswXS5ib2R5KX0sX3NldE9wdGlvbjpmdW5jdGlvbih0LGkpe3ZhciBzPXRoaXM7cmV0dXJuImRpc2FibGVkIj09PXQ/KHRoaXNbaT8iX2Rpc2FibGUiOiJfZW5hYmxlIl0oKSx0aGlzLm9wdGlvbnNbdF09aSx2b2lkIDApOih0aGlzLl9zdXBlcih0LGkpLCJjb250ZW50Ij09PXQmJmUuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKGUsdCl7cy5fdXBkYXRlQ29udGVudCh0LmVsZW1lbnQpfSksdm9pZCAwKX0sX2Rpc2FibGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2UuZWFjaCh0aGlzLnRvb2x0aXBzLGZ1bmN0aW9uKGkscyl7dmFyIG49ZS5FdmVudCgiYmx1ciIpO24udGFyZ2V0PW4uY3VycmVudFRhcmdldD1zLmVsZW1lbnRbMF0sdC5jbG9zZShuLCEwKX0pLHRoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuaXMoIlt0aXRsZV0iKSYmdC5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIix0LmF0dHIoInRpdGxlIikpLnJlbW92ZUF0dHIoInRpdGxlIil9KX0sX2VuYWJsZTpmdW5jdGlvbigpe3RoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy5pdGVtcykuYWRkQmFjaygpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1lKHRoaXMpO3QuZGF0YSgidWktdG9vbHRpcC10aXRsZSIpJiZ0LmF0dHIoInRpdGxlIix0LmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSl9KX0sb3BlbjpmdW5jdGlvbih0KXt2YXIgaT10aGlzLHM9ZSh0P3QudGFyZ2V0OnRoaXMuZWxlbWVudCkuY2xvc2VzdCh0aGlzLm9wdGlvbnMuaXRlbXMpO3MubGVuZ3RoJiYhcy5kYXRhKCJ1aS10b29sdGlwLWlkIikmJihzLmF0dHIoInRpdGxlIikmJnMuZGF0YSgidWktdG9vbHRpcC10aXRsZSIscy5hdHRyKCJ0aXRsZSIpKSxzLmRhdGEoInVpLXRvb2x0aXAtb3BlbiIsITApLHQmJiJtb3VzZW92ZXIiPT09dC50eXBlJiZzLnBhcmVudHMoKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQscz1lKHRoaXMpO3MuZGF0YSgidWktdG9vbHRpcC1vcGVuIikmJih0PWUuRXZlbnQoImJsdXIiKSx0LnRhcmdldD10LmN1cnJlbnRUYXJnZXQ9dGhpcyxpLmNsb3NlKHQsITApKSxzLmF0dHIoInRpdGxlIikmJihzLnVuaXF1ZUlkKCksaS5wYXJlbnRzW3RoaXMuaWRdPXtlbGVtZW50OnRoaXMsdGl0bGU6cy5hdHRyKCJ0aXRsZSIpfSxzLmF0dHIoInRpdGxlIiwiIikpfSksdGhpcy5fcmVnaXN0ZXJDbG9zZUhhbmRsZXJzKHQscyksdGhpcy5fdXBkYXRlQ29udGVudChzLHQpKX0sX3VwZGF0ZUNvbnRlbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgaSxzPXRoaXMub3B0aW9ucy5jb250ZW50LG49dGhpcyxhPXQ/dC50eXBlOm51bGw7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBzP3RoaXMuX29wZW4odCxlLHMpOihpPXMuY2FsbChlWzBdLGZ1bmN0aW9uKGkpe24uX2RlbGF5KGZ1bmN0aW9uKCl7ZS5kYXRhKCJ1aS10b29sdGlwLW9wZW4iKSYmKHQmJih0LnR5cGU9YSksdGhpcy5fb3Blbih0LGUsaSkpfSl9KSxpJiZ0aGlzLl9vcGVuKHQsZSxpKSx2b2lkIDApfSxfb3BlbjpmdW5jdGlvbih0LGkscyl7ZnVuY3Rpb24gbihlKXtsLm9mPWUsby5pcygiOmhpZGRlbiIpfHxvLnBvc2l0aW9uKGwpfXZhciBhLG8scixoLGw9ZS5leHRlbmQoe30sdGhpcy5vcHRpb25zLnBvc2l0aW9uKTtpZihzKXtpZihhPXRoaXMuX2ZpbmQoaSkpcmV0dXJuIGEudG9vbHRpcC5maW5kKCIudWktdG9vbHRpcC1jb250ZW50IikuaHRtbChzKSx2b2lkIDA7aS5pcygiW3RpdGxlXSIpJiYodCYmIm1vdXNlb3ZlciI9PT10LnR5cGU/aS5hdHRyKCJ0aXRsZSIsIiIpOmkucmVtb3ZlQXR0cigidGl0bGUiKSksYT10aGlzLl90b29sdGlwKGkpLG89YS50b29sdGlwLHRoaXMuX2FkZERlc2NyaWJlZEJ5KGksby5hdHRyKCJpZCIpKSxvLmZpbmQoIi51aS10b29sdGlwLWNvbnRlbnQiKS5odG1sKHMpLHRoaXMubGl2ZVJlZ2lvbi5jaGlsZHJlbigpLmhpZGUoKSxzLmNsb25lPyhoPXMuY2xvbmUoKSxoLnJlbW92ZUF0dHIoImlkIikuZmluZCgiW2lkXSIpLnJlbW92ZUF0dHIoImlkIikpOmg9cyxlKCI8ZGl2PiIpLmh0bWwoaCkuYXBwZW5kVG8odGhpcy5saXZlUmVnaW9uKSx0aGlzLm9wdGlvbnMudHJhY2smJnQmJi9ebW91c2UvLnRlc3QodC50eXBlKT8odGhpcy5fb24odGhpcy5kb2N1bWVudCx7bW91c2Vtb3ZlOm59KSxuKHQpKTpvLnBvc2l0aW9uKGUuZXh0ZW5kKHtvZjppfSx0aGlzLm9wdGlvbnMucG9zaXRpb24pKSxvLmhpZGUoKSx0aGlzLl9zaG93KG8sdGhpcy5vcHRpb25zLnNob3cpLHRoaXMub3B0aW9ucy5zaG93JiZ0aGlzLm9wdGlvbnMuc2hvdy5kZWxheSYmKHI9dGhpcy5kZWxheWVkU2hvdz1zZXRJbnRlcnZhbChmdW5jdGlvbigpe28uaXMoIjp2aXNpYmxlIikmJihuKGwub2YpLGNsZWFySW50ZXJ2YWwocikpfSxlLmZ4LmludGVydmFsKSksdGhpcy5fdHJpZ2dlcigib3BlbiIsdCx7dG9vbHRpcDpvfSl9fSxfcmVnaXN0ZXJDbG9zZUhhbmRsZXJzOmZ1bmN0aW9uKHQsaSl7dmFyIHM9e2tleXVwOmZ1bmN0aW9uKHQpe2lmKHQua2V5Q29kZT09PWUudWkua2V5Q29kZS5FU0NBUEUpe3ZhciBzPWUuRXZlbnQodCk7cy5jdXJyZW50VGFyZ2V0PWlbMF0sdGhpcy5jbG9zZShzLCEwKX19fTtpWzBdIT09dGhpcy5lbGVtZW50WzBdJiYocy5yZW1vdmU9ZnVuY3Rpb24oKXt0aGlzLl9yZW1vdmVUb29sdGlwKHRoaXMuX2ZpbmQoaSkudG9vbHRpcCl9KSx0JiYibW91c2VvdmVyIiE9PXQudHlwZXx8KHMubW91c2VsZWF2ZT0iY2xvc2UiKSx0JiYiZm9jdXNpbiIhPT10LnR5cGV8fChzLmZvY3Vzb3V0PSJjbG9zZSIpLHRoaXMuX29uKCEwLGkscyl9LGNsb3NlOmZ1bmN0aW9uKHQpe3ZhciBpLHM9dGhpcyxuPWUodD90LmN1cnJlbnRUYXJnZXQ6dGhpcy5lbGVtZW50KSxhPXRoaXMuX2ZpbmQobik7cmV0dXJuIGE/KGk9YS50b29sdGlwLGEuY2xvc2luZ3x8KGNsZWFySW50ZXJ2YWwodGhpcy5kZWxheWVkU2hvdyksbi5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikmJiFuLmF0dHIoInRpdGxlIikmJm4uYXR0cigidGl0bGUiLG4uZGF0YSgidWktdG9vbHRpcC10aXRsZSIpKSx0aGlzLl9yZW1vdmVEZXNjcmliZWRCeShuKSxhLmhpZGluZz0hMCxpLnN0b3AoITApLHRoaXMuX2hpZGUoaSx0aGlzLm9wdGlvbnMuaGlkZSxmdW5jdGlvbigpe3MuX3JlbW92ZVRvb2x0aXAoZSh0aGlzKSl9KSxuLnJlbW92ZURhdGEoInVpLXRvb2x0aXAtb3BlbiIpLHRoaXMuX29mZihuLCJtb3VzZWxlYXZlIGZvY3Vzb3V0IGtleXVwIiksblswXSE9PXRoaXMuZWxlbWVudFswXSYmdGhpcy5fb2ZmKG4sInJlbW92ZSIpLHRoaXMuX29mZih0aGlzLmRvY3VtZW50LCJtb3VzZW1vdmUiKSx0JiYibW91c2VsZWF2ZSI9PT10LnR5cGUmJmUuZWFjaCh0aGlzLnBhcmVudHMsZnVuY3Rpb24odCxpKXtlKGkuZWxlbWVudCkuYXR0cigidGl0bGUiLGkudGl0bGUpLGRlbGV0ZSBzLnBhcmVudHNbdF19KSxhLmNsb3Npbmc9ITAsdGhpcy5fdHJpZ2dlcigiY2xvc2UiLHQse3Rvb2x0aXA6aX0pLGEuaGlkaW5nfHwoYS5jbG9zaW5nPSExKSksdm9pZCAwKToobi5yZW1vdmVEYXRhKCJ1aS10b29sdGlwLW9wZW4iKSx2b2lkIDApfSxfdG9vbHRpcDpmdW5jdGlvbih0KXt2YXIgaT1lKCI8ZGl2PiIpLmF0dHIoInJvbGUiLCJ0b29sdGlwIikuYWRkQ2xhc3MoInVpLXRvb2x0aXAgdWktd2lkZ2V0IHVpLWNvcm5lci1hbGwgdWktd2lkZ2V0LWNvbnRlbnQgIisodGhpcy5vcHRpb25zLnRvb2x0aXBDbGFzc3x8IiIpKSxzPWkudW5pcXVlSWQoKS5hdHRyKCJpZCIpO3JldHVybiBlKCI8ZGl2PiIpLmFkZENsYXNzKCJ1aS10b29sdGlwLWNvbnRlbnQiKS5hcHBlbmRUbyhpKSxpLmFwcGVuZFRvKHRoaXMuZG9jdW1lbnRbMF0uYm9keSksdGhpcy50b29sdGlwc1tzXT17ZWxlbWVudDp0LHRvb2x0aXA6aX19LF9maW5kOmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YSgidWktdG9vbHRpcC1pZCIpO3JldHVybiB0P3RoaXMudG9vbHRpcHNbdF06bnVsbH0sX3JlbW92ZVRvb2x0aXA6ZnVuY3Rpb24oZSl7ZS5yZW1vdmUoKSxkZWxldGUgdGhpcy50b29sdGlwc1tlLmF0dHIoImlkIildfSxfZGVzdHJveTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ZS5lYWNoKHRoaXMudG9vbHRpcHMsZnVuY3Rpb24oaSxzKXt2YXIgbj1lLkV2ZW50KCJibHVyIiksYT1zLmVsZW1lbnQ7bi50YXJnZXQ9bi5jdXJyZW50VGFyZ2V0PWFbMF0sdC5jbG9zZShuLCEwKSxlKCIjIitpKS5yZW1vdmUoKSxhLmRhdGEoInVpLXRvb2x0aXAtdGl0bGUiKSYmKGEuYXR0cigidGl0bGUiKXx8YS5hdHRyKCJ0aXRsZSIsYS5kYXRhKCJ1aS10b29sdGlwLXRpdGxlIikpLGEucmVtb3ZlRGF0YSgidWktdG9vbHRpcC10aXRsZSIpKX0pLHRoaXMubGl2ZVJlZ2lvbi5yZW1vdmUoKX19KX0pOw==]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmKCB2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCc1LjQuMTEnKSA8IDAgKSB7CiAgICByZXR1cm4gIk1pbmltdW0gUEhQIHZlcnNpb24gb2YgNS40LjExIHJlcXVpcmVkIjsKfQoKJHRoaXMtPlJlZ2lzdGVyTGlicmFyaWVzKCk7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKClxDR0V4dGVuc2lvbnNcanNsb2FkZXJcanNsb2FkZXI6OnVucmVnaXN0ZXJfYnlfbW9kdWxlKCR0aGlzLT5HZXROYW1lKCkpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmKCB2ZXJzaW9uX2NvbXBhcmUocGhwdmVyc2lvbigpLCc1LjQuMTEnKSA8IDAgKSB7CiAgICByZXR1cm4gIk1pbmltdW0gUEhQIHZlcnNpb24gb2YgNS40LjExIHJlcXVpcmVkIjsKfQoKJHRoaXMtPlJlZ2lzdGVyTGlicmFyaWVzKHRydWUpOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9IEpRdWVyeVRvb2xzCnZlcnNpb24gPSAxLjQuMC4zCmRlc2NyaXB0aW9uID0gIiIKYXV0aG9yID0gY2FsZ3V5MTAwMAphdXRob3JlbWFpbCA9IGNhbGd1eTEwMDBAY21zbWFkZXNpbXBsZS5vcmcKbWluY21zdmVyc2lvbiA9IDIuMS41Cmxhenlsb2FkYWRtaW4gPSAwCmxhenlsb2FkZnJvbnRlbmQgPSAwCltkZXBlbmRzXQpDR0V4dGVuc2lvbnMgPSAxLjU0LjQK]]></data>
	</file>
	<file>
	  <filename>/skeleton.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0JFR0lOX0xJQ0VOU0UKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEpRdWVyeVRvb2xzIChjKSAyMDA4IGJ5IFJvYmVydCBDYW1wYmVsbCAKIyAgICAgICAgIChjYWxndXkxMDAwQGNtc21hZGVzaW1wbGUub3JnKQojICBBIHRvb2xib3ggb2YgY29udmVuaWVuY2VzIHRvIHByb3ZpZGUgZHluYW1pYyBqYXZhc2NyaXB0eSBmdW5jdGlvbmFsaXR5CiMgIGZvciBDTVMgbW9kdWxlcyBhbmQgd2Vic2l0ZSBkZXNpZ25lcnMuCiMgCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgSG93ZXZlciwgYXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMLCB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkCiMgYXMgYW4gYWRkb24gbW9kdWxlIHRvIENNUyBNYWRlIFNpbXBsZS4gIFlvdSBtYXkgbm90IHVzZSB0aGlzIHNvZnR3YXJlCiMgaW4gYW55IE5vbiBHUEwgdmVyc2lvbiBvZiBDTVMgTWFkZSBzaW1wbGUsIG9yIGluIGFueSB2ZXJzaW9uIG9mIENNUwojIE1hZGUgc2ltcGxlIHRoYXQgZG9lcyBub3QgaW5kaWNhdGUgY2xlYXJseSBhbmQgb2J2aW91c2x5IGluIGl0cyBhZG1pbiAKIyBzZWN0aW9uIHRoYXQgdGhlIHNpdGUgd2FzIGJ1aWx0IHdpdGggQ01TIE1hZGUgc2ltcGxlLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KI0VORF9MSUNFTlNFCgojCiMgRU9GCiMKPz4=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/datepicker_plugin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gYW4gZXh0ZW5zaW9uIG9uIHRoZSBqcXVlcnkgdWkgZGF0ZXBpY2tlciwgZm9yIGxvY2FsaXphdGlvbiBwdXJwb3NlcwooZnVuY3Rpb24oJCkgewogICAgJC5kYXRlcGlja2VyLnNldERlZmF1bHRzKHsKCWN1cnJlbnRUZXh0OiAneyRtb2QtPkxhbmcoJ2RwX3RvZGF5Jyl9JywKCWNsb3NlVGV4dDogJ3skbW9kLT5MYW5nKCdkcF9jbG9zZScpfScsCglidXR0b25UZXh0OiAneyRtb2QtPkxhbmcoJ2RiX2Nob29zZScpfScsCgluZXh0VGV4dDogJ3skbW9kLT5MYW5nKCdkYl9uZXh0Jyl9JywKCXByZXZUZXh0OiAneyRtb2QtPkxhbmcoJ2RiX3ByZXYnKX0nLAoJZGF0ZUZvcm1hdDogJ3skZGF0ZWZvcm1hdH0nLAoJZGF5TmFtZXM6IHtqc29uX2VuY29kZSgkbG9jYWxlSW5mby5kYXlOYW1lcyl9LAoJZGF5TmFtZXNTaG9ydDoge2pzb25fZW5jb2RlKCRsb2NhbGVJbmZvLmRheU5hbWVzU2hvcnQpfSwKCW1vbnRoTmFtZXM6IHtqc29uX2VuY29kZSgkbG9jYWxlSW5mby5tb250aE5hbWVzKX0sCgltb250aE5hbWVzU2hvcnQ6IHtqc29uX2VuY29kZSgkbG9jYWxlSW5mby5tb250aE5hbWVzU2hvcnQpfSwKCW51bWJlck9mTW9udGhzOiAzLAoJc2hvd0N1cnJlbnRBdFBvczogMSwKCXNob3dCdXR0b25QYW5lbDogdHJ1ZSwKCWNoYW5nZVllYXI6IHRydWUsCgl5ZWFyUmFuZ2U6ICdjLTEwOmMrMTAnCiAgICB9KTsKfSkgKGpRdWVyeSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/templates/incjs.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSB7JEpRdWVyeVRvb2xzLT5HZXROYW1lKCl9IHZlcnNpb24geyRKUXVlcnlUb29scy0+R2V0VmVyc2lvbigpfSAtLT4Ke2lmIGlzc2V0KCRsaWJzKX0Ke2ZvcmVhY2ggZnJvbT0kbGlicyBpdGVtPSdvbmUnfQo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJ7JG9uZX0iPjwvc2NyaXB0Pgp7L2ZvcmVhY2h9CnsvaWZ9CntpZiBpc3NldCgkY3NzKX0Ke2ZvcmVhY2ggZnJvbT0kY3NzIGl0ZW09J29uZSd9CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Inskb25lfSIgbWVkaWE9InNjcmVlbiIgLz4Key9mb3JlYWNofQp7L2lmfQ==]]></data>
	</file>
	<file>
	  <filename>/templates/ready.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyogaGVyZSB3ZSBzZXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGF0dHJpYnV0ZXMgZm9yIHRoZSBsaWJzIHRoYXQgYXJlIGxvYWRlZC4gKn0Ke2NhcHR1cmUgYXNzaWduPSdvdXQnfXtzdHJpcH0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy50YWJsZXNvcnRlcil9CmlmKCAkLnRhYmxlc29ydGVyICkgeyAkKCIuY21zX3NvcnRhYmxlIikudGFibGVzb3J0ZXIoeyB3aWR0aEZpeGVkOiB0cnVlLCB3aWRnZXRzOiBbJ3plYnJhJ10sIHNvcnRMaXN0OiBbWzAsMF1dIH0pIH0Key9pZn0KaWYoICQudWkgKSB7ICAkKCdkaXYuYWNjb3JkaW9uJykuYWNjb3JkaW9uKCk7IH0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy5saWdodGJveCl9aWYoICQubGlnaHRib3ggKSB7ICQoJ2EubGlnaHRib3gnKS5saWdodEJveCgpOyB9ey9pZn0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy5mYW5jeWJveCl9aWYoICQuZmFuY3lib3ggKSB7ICQoJ2EuZmFuY3lib3gnKS5mYW5jeWJveCgpOyB9ey9pZn0Ke2lmIGlzc2V0KCRqcXVlcnlfbGlicy5jbHVldGlwKX1pZiggJC5jbHVldGlwICkgeyAkKCJhLnRvb2x0aXAiKS5jbHVldGlwKHsgbG9jYWw6dHJ1ZSwgY3Vyc29yOiAncG9pbnRlcicgfSk7IH0gey9pZn0Key9zdHJpcH17L2NhcHR1cmV9CntpZiBzdHJsZW4oJG91dCl9CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBW3tqc21pbn0KJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oJCkgeyB7JG91dH0gfSk7ICAvL2VuZAp7L2pzbWlufS8vXV0+PC9zY3JpcHQ+CnsvaWZ9Cg==]]></data>
	</file>
</module>
